summaryrefslogtreecommitdiffhomepage
path: root/android/app/src
diff options
context:
space:
mode:
Diffstat (limited to 'android/app/src')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt106
1 files changed, 66 insertions, 40 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt
index e0f619550c..710f894044 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/SettingsFragment.kt
@@ -11,23 +11,35 @@ import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.flow.debounce
+import kotlinx.coroutines.flow.emptyFlow
+import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.launch
import net.mullvad.mullvadvpn.R
import net.mullvad.mullvadvpn.model.DeviceState
+import net.mullvad.mullvadvpn.ui.fragments.BaseFragment
import net.mullvad.mullvadvpn.ui.serviceconnection.AccountRepository
-import net.mullvad.mullvadvpn.ui.serviceconnection.AppVersionInfoCache
import net.mullvad.mullvadvpn.ui.serviceconnection.DeviceRepository
-import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionContainer
+import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager
+import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionState
+import net.mullvad.mullvadvpn.ui.serviceconnection.appVersionInfoCache
import net.mullvad.mullvadvpn.ui.widget.AccountCell
import net.mullvad.mullvadvpn.ui.widget.AppVersionCell
import net.mullvad.mullvadvpn.ui.widget.NavigateCell
+import net.mullvad.mullvadvpn.util.JobTracker
+import net.mullvad.mullvadvpn.util.UNKNOWN_STATE_DEBOUNCE_DELAY_MILLISECONDS
+import net.mullvad.mullvadvpn.util.addDebounceForUnknownState
+import net.mullvad.mullvadvpn.util.appVersionCallbackFlow
import org.koin.android.ext.android.inject
-class SettingsFragment : ServiceAwareFragment(), StatusBarPainter, NavigationBarPainter {
+class SettingsFragment : BaseFragment(), StatusBarPainter, NavigationBarPainter {
+
+ // Injected dependencies
private val accountRepository: AccountRepository by inject()
private val deviceRepository: DeviceRepository by inject()
+ private val serviceConnectionManager: ServiceConnectionManager by inject()
private lateinit var accountMenu: AccountCell
private lateinit var appVersionMenu: AppVersionCell
@@ -35,20 +47,12 @@ class SettingsFragment : ServiceAwareFragment(), StatusBarPainter, NavigationBar
private lateinit var advancedMenu: View
private lateinit var titleController: CollapsibleTitleController
- private var active = false
-
- private var versionInfoCache: AppVersionInfoCache? = null
-
- override fun onNewServiceConnection(serviceConnectionContainer: ServiceConnectionContainer) {
- versionInfoCache = serviceConnectionContainer.appVersionInfoCache
-
- if (active) {
- configureListeners()
- }
- }
+ @Deprecated("Refactor code to instead rely on Lifecycle.")
+ private val jobTracker = JobTracker()
- override fun onNoServiceConnection() {
- versionInfoCache = null
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ lifecycleScope.launchUiSubscriptionsOnResume()
}
override fun onCreateView(
@@ -86,7 +90,7 @@ class SettingsFragment : ServiceAwareFragment(), StatusBarPainter, NavigationBar
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- lifecycleScope.launchUiSubscriptionsOnResume()
+ initializeUiState()
}
override fun onResume() {
@@ -94,25 +98,38 @@ class SettingsFragment : ServiceAwareFragment(), StatusBarPainter, NavigationBar
paintNavigationBar(ContextCompat.getColor(requireContext(), R.color.darkBlue))
}
- override fun onStart() {
- super.onStart()
-
- configureListeners()
- active = true
- }
-
override fun onStop() {
- active = false
- versionInfoCache?.onUpdate = null
-
jobTracker.cancelAllJobs()
-
super.onStop()
}
override fun onDestroyView() {
- super.onDestroyView()
titleController.onDestroy()
+ super.onDestroyView()
+ }
+
+ private fun initializeUiState() {
+ updateLoggedInStatus(deviceRepository.deviceState.value is DeviceState.LoggedIn)
+ accountMenu.accountExpiry = accountRepository.accountExpiryState.value.date()
+ serviceConnectionManager.appVersionInfoCache().let { cache ->
+ updateVersionInfo(
+ if (cache != null) {
+ VersionInfo(
+ currentVersion = cache.version,
+ upgradeVersion = cache.upgradeVersion,
+ isOutdated = cache.isOutdated,
+ isSupported = cache.isSupported
+ )
+ } else {
+ VersionInfo(
+ currentVersion = null,
+ upgradeVersion = null,
+ isOutdated = false,
+ isSupported = true
+ )
+ }
+ )
+ }
}
private fun CoroutineScope.launchUiSubscriptionsOnResume() = launch {
@@ -120,6 +137,7 @@ class SettingsFragment : ServiceAwareFragment(), StatusBarPainter, NavigationBar
launchPaintStatusBarAfterTransition()
luanchConfigureMenuOnDeviceChanges()
launchUpdateExpiryTextOnExpiryChanges()
+ launchVersionInfoSubscription()
}
}
@@ -131,6 +149,9 @@ class SettingsFragment : ServiceAwareFragment(), StatusBarPainter, NavigationBar
private fun CoroutineScope.luanchConfigureMenuOnDeviceChanges() = launch {
deviceRepository.deviceState
+ .debounce {
+ it.addDebounceForUnknownState(UNKNOWN_STATE_DEBOUNCE_DELAY_MILLISECONDS)
+ }
.collect { device ->
updateLoggedInStatus(device is DeviceState.LoggedIn)
}
@@ -145,12 +166,18 @@ class SettingsFragment : ServiceAwareFragment(), StatusBarPainter, NavigationBar
}
}
- private fun configureListeners() {
- versionInfoCache?.onUpdate = {
- jobTracker.newUiJob("updateVersionInfo") {
- updateVersionInfo()
+ private fun CoroutineScope.launchVersionInfoSubscription() = launch {
+ serviceConnectionManager.connectionState
+ .flatMapLatest { state ->
+ if (state is ServiceConnectionState.ConnectedReady) {
+ state.container.appVersionInfoCache.appVersionCallbackFlow()
+ } else {
+ emptyFlow()
+ }
+ }
+ .collect { versionInfo ->
+ updateVersionInfo(versionInfo)
}
- }
}
private fun updateLoggedInStatus(loggedIn: Boolean) {
@@ -165,11 +192,10 @@ class SettingsFragment : ServiceAwareFragment(), StatusBarPainter, NavigationBar
advancedMenu.visibility = visibility
}
- private fun updateVersionInfo() {
- val isOutdated = versionInfoCache?.isOutdated ?: false
- val isSupported = versionInfoCache?.isSupported ?: true
-
- appVersionMenu.updateAvailable = isOutdated || !isSupported
- appVersionMenu.version = versionInfoCache?.version ?: ""
+ private fun updateVersionInfo(
+ versionInfo: VersionInfo
+ ) {
+ appVersionMenu.updateAvailable = versionInfo.isOutdated || !versionInfo.isSupported
+ appVersionMenu.version = versionInfo.currentVersion ?: ""
}
}