diff options
| author | Albin <albin@mullvad.net> | 2022-08-31 11:28:26 +0200 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2022-09-01 07:57:25 +0200 |
| commit | fd5fb2b82578497326ebc1c0fc0c7f491b5f2786 (patch) | |
| tree | b83ed6febba9a4ae7cc185d534f28e1f05efe41b /android/app/src | |
| parent | af06f424d3dbd843f4201af4e652b8322ce9e9e9 (diff) | |
| download | mullvadvpn-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')
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() + } +} |
