summaryrefslogtreecommitdiffhomepage
path: root/android/app/src
diff options
context:
space:
mode:
authorAlbin <albin@mullvad.net>2022-08-31 11:28:26 +0200
committerAlbin <albin@mullvad.net>2022-09-01 07:57:25 +0200
commitfd5fb2b82578497326ebc1c0fc0c7f491b5f2786 (patch)
treeb83ed6febba9a4ae7cc185d534f28e1f05efe41b /android/app/src
parentaf06f424d3dbd843f4201af4e652b8322ce9e9e9 (diff)
downloadmullvadvpn-fd5fb2b82578497326ebc1c0fc0c7f491b5f2786.tar.xz
mullvadvpn-fd5fb2b82578497326ebc1c0fc0c7f491b5f2786.zip
Fix tunnel info expansion state on resume
Ensures that the tunnel info expansion state is remembered across the pause/resume flow. This is done by replacing the previous state handling with a view model.
Diffstat (limited to 'android/app/src')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt6
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt25
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/LocationInfo.kt18
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt14
4 files changed, 44 insertions, 19 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt
index e71dcb8416..1309a0e6cf 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt
@@ -13,6 +13,7 @@ import net.mullvad.mullvadvpn.ui.serviceconnection.AccountRepository
import net.mullvad.mullvadvpn.ui.serviceconnection.DeviceRepository
import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager
import net.mullvad.mullvadvpn.ui.serviceconnection.SplitTunneling
+import net.mullvad.mullvadvpn.viewmodel.ConnectViewModel
import net.mullvad.mullvadvpn.viewmodel.DeviceListViewModel
import net.mullvad.mullvadvpn.viewmodel.DeviceRevokedViewModel
import net.mullvad.mullvadvpn.viewmodel.LoginViewModel
@@ -49,9 +50,12 @@ val uiModule = module {
single { AccountRepository(get()) }
single { DeviceRepository(get()) }
- viewModel { LoginViewModel(get(), get()) }
+
+ // View models
+ viewModel { ConnectViewModel() }
viewModel { DeviceRevokedViewModel(get(), get()) }
viewModel { DeviceListViewModel(get(), get()) }
+ viewModel { LoginViewModel(get(), get()) }
}
const val APPS_SCOPE = "APPS_SCOPE"
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt
index fdb0adaf13..37fb6108a6 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConnectFragment.kt
@@ -43,16 +43,17 @@ import net.mullvad.mullvadvpn.ui.widget.SwitchLocationButton
import net.mullvad.mullvadvpn.util.JobTracker
import net.mullvad.mullvadvpn.util.appVersionCallbackFlow
import net.mullvad.mullvadvpn.util.callbackFlowFromNotifier
+import net.mullvad.mullvadvpn.viewmodel.ConnectViewModel
import org.joda.time.DateTime
import org.koin.android.ext.android.inject
-
-val KEY_IS_TUNNEL_INFO_EXPANDED = "is_tunnel_info_expanded"
+import org.koin.androidx.viewmodel.ext.android.viewModel
class ConnectFragment : BaseFragment(), NavigationBarPainter {
// Injected dependencies
private val accountRepository: AccountRepository by inject()
private val accountExpiryNotification: AccountExpiryNotification by inject()
+ private val connectViewModel: ConnectViewModel by viewModel()
private val serviceConnectionManager: ServiceConnectionManager by inject()
private val tunnelStateNotification: TunnelStateNotification by inject()
private val versionInfoNotification: VersionInfoNotification by inject()
@@ -64,17 +65,11 @@ class ConnectFragment : BaseFragment(), NavigationBarPainter {
private lateinit var status: ConnectionStatus
private lateinit var locationInfo: LocationInfo
- private var isTunnelInfoExpanded = false
-
@Deprecated("Refactor code to instead rely on Lifecycle.")
private val jobTracker = JobTracker()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
-
- isTunnelInfoExpanded =
- savedInstanceState?.getBoolean(KEY_IS_TUNNEL_INFO_EXPANDED, false) ?: false
-
lifecycleScope.launchUiSubscriptionsOnResume()
}
@@ -108,8 +103,9 @@ class ConnectFragment : BaseFragment(), NavigationBarPainter {
status = ConnectionStatus(view, requireMainActivity())
- locationInfo = LocationInfo(view, requireContext())
- locationInfo.isTunnelInfoExpanded = isTunnelInfoExpanded
+ locationInfo = LocationInfo(view, requireContext()) {
+ connectViewModel.toggleTunnelInfoExpansion()
+ }
actionButton = ConnectActionButton(view)
@@ -129,7 +125,6 @@ class ConnectFragment : BaseFragment(), NavigationBarPainter {
override fun onStart() {
super.onStart()
- locationInfo.isTunnelInfoExpanded = isTunnelInfoExpanded
notificationBanner.onResume()
}
@@ -156,6 +151,7 @@ class ConnectFragment : BaseFragment(), NavigationBarPainter {
launchTunnelStateSubscription()
launchVersionInfoSubscription()
launchAccountExpirySubscription()
+ launchTunnelInfoExpansionSubscription()
}
}
@@ -225,6 +221,13 @@ class ConnectFragment : BaseFragment(), NavigationBarPainter {
}
}
+ private fun CoroutineScope.launchTunnelInfoExpansionSubscription() = launch {
+ connectViewModel.isTunnelInfoExpanded
+ .collect { isExpanded ->
+ locationInfo.isTunnelInfoExpanded = isExpanded
+ }
+ }
+
private fun updateTunnelState(uiState: TunnelState, realState: TunnelState) {
locationInfo.state = realState
headerBar.tunnelState = realState
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/LocationInfo.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/LocationInfo.kt
index d5bbba1915..f12985157c 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/LocationInfo.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/LocationInfo.kt
@@ -9,7 +9,11 @@ import net.mullvad.mullvadvpn.model.TunnelState
import net.mullvad.talpid.net.Endpoint
import net.mullvad.talpid.net.TransportProtocol
-class LocationInfo(val parentView: View, val context: Context) {
+class LocationInfo(
+ parentView: View,
+ private val context: Context,
+ private val onToggleTunnelInfo: () -> Unit
+) {
private val hostnameColorCollapsed = context.getColor(R.color.white40)
private val hostnameColorExpanded = context.getColor(R.color.white)
@@ -24,7 +28,12 @@ class LocationInfo(val parentView: View, val context: Context) {
private var endpoint: Endpoint? = null
private var isTunnelInfoVisible = false
+
var isTunnelInfoExpanded = false
+ set(value) {
+ field = value
+ updateTunnelInfo()
+ }
var location: GeoIpLocation? = null
set(value) {
@@ -60,12 +69,7 @@ class LocationInfo(val parentView: View, val context: Context) {
}
init {
- tunnelInfo.setOnClickListener { toggleTunnelInfo() }
- }
-
- private fun toggleTunnelInfo() {
- isTunnelInfoExpanded = !isTunnelInfoExpanded
- updateTunnelInfo()
+ tunnelInfo.setOnClickListener { onToggleTunnelInfo() }
}
private fun updateTunnelInfo() {
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt
new file mode 100644
index 0000000000..2be343b6fa
--- /dev/null
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt
@@ -0,0 +1,14 @@
+package net.mullvad.mullvadvpn.viewmodel
+
+import androidx.lifecycle.ViewModel
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+
+class ConnectViewModel : ViewModel() {
+ private val _isTunnelInfoExpanded = MutableStateFlow(false)
+ val isTunnelInfoExpanded = _isTunnelInfoExpanded.asStateFlow()
+
+ fun toggleTunnelInfoExpansion() {
+ _isTunnelInfoExpanded.value = _isTunnelInfoExpanded.value.not()
+ }
+}