summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorsaber safavi <saber.safavi@codic.se>2023-05-26 10:13:43 +0200
committersaber safavi <saber.safavi@codic.se>2023-07-13 14:49:50 +0200
commit9dc4ac6e340474524cb7bc88164cdae951ee9c05 (patch)
treeeec07ce8775903989eb39bdde5d9126708569de0
parentdcb9fb5dd324fe4f538efd74445eda71066c794a (diff)
downloadmullvadvpn-9dc4ac6e340474524cb7bc88164cdae951ee9c05.tar.xz
mullvadvpn-9dc4ac6e340474524cb7bc88164cdae951ee9c05.zip
Add ViewModel and related MVVM parts
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/SettingsUiState.kt7
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SettingsViewModel.kt43
3 files changed, 52 insertions, 0 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/SettingsUiState.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/SettingsUiState.kt
new file mode 100644
index 0000000000..06bd0749eb
--- /dev/null
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/SettingsUiState.kt
@@ -0,0 +1,7 @@
+package net.mullvad.mullvadvpn.compose.state
+
+data class SettingsUiState(
+ val appVersion: String,
+ val isLoggedIn: Boolean,
+ val isUpdateAvailable: Boolean
+)
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 2244438ef0..0e10278ac3 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
@@ -28,6 +28,7 @@ import net.mullvad.mullvadvpn.viewmodel.DeviceRevokedViewModel
import net.mullvad.mullvadvpn.viewmodel.LoginViewModel
import net.mullvad.mullvadvpn.viewmodel.PrivacyDisclaimerViewModel
import net.mullvad.mullvadvpn.viewmodel.SelectLocationViewModel
+import net.mullvad.mullvadvpn.viewmodel.SettingsViewModel
import net.mullvad.mullvadvpn.viewmodel.SplitTunnelingViewModel
import net.mullvad.mullvadvpn.viewmodel.VpnSettingsViewModel
import org.apache.commons.validator.routines.InetAddressValidator
@@ -87,6 +88,7 @@ val uiModule = module {
viewModel { PrivacyDisclaimerViewModel(get()) }
viewModel { VpnSettingsViewModel(get(), get(), get(), get()) }
viewModel { SelectLocationViewModel(get()) }
+ viewModel { SettingsViewModel(get(), get()) }
}
const val SELF_PACKAGE_NAME = "SELF_PACKAGE_NAME"
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SettingsViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SettingsViewModel.kt
new file mode 100644
index 0000000000..8ef85cfca8
--- /dev/null
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/SettingsViewModel.kt
@@ -0,0 +1,43 @@
+package net.mullvad.mullvadvpn.viewmodel
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.stateIn
+import net.mullvad.mullvadvpn.compose.state.SettingsUiState
+import net.mullvad.mullvadvpn.model.DeviceState
+import net.mullvad.mullvadvpn.repository.DeviceRepository
+import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager
+
+class SettingsViewModel(
+ deviceRepository: DeviceRepository,
+ serviceConnectionManager: ServiceConnectionManager
+) : ViewModel() {
+
+ private val vmState: StateFlow<SettingsUiState> =
+ combine(deviceRepository.deviceState, serviceConnectionManager.connectionState) {
+ deviceState,
+ versionInfo ->
+ val cachedVersionInfo = versionInfo.readyContainer()?.appVersionInfoCache
+ SettingsUiState(
+ isLoggedIn = deviceState is DeviceState.LoggedIn,
+ appVersion = cachedVersionInfo?.version ?: "",
+ isUpdateAvailable =
+ cachedVersionInfo?.let { it.isSupported.not() || it.isOutdated } ?: false
+ )
+ }
+ .stateIn(
+ viewModelScope,
+ SharingStarted.WhileSubscribed(),
+ SettingsUiState(appVersion = "", isLoggedIn = false, isUpdateAvailable = false)
+ )
+
+ val uiState =
+ vmState.stateIn(
+ viewModelScope,
+ SharingStarted.WhileSubscribed(),
+ SettingsUiState(appVersion = "", isLoggedIn = false, isUpdateAvailable = false)
+ )
+}