summaryrefslogtreecommitdiffhomepage
path: root/android/app/src/main
diff options
context:
space:
mode:
authorsaber safavi <saber.safavi@codic.se>2023-07-06 11:19:46 +0200
committersaber safavi <saber.safavi@codic.se>2023-07-28 16:36:18 +0200
commitc6607d4238566f38fc6474bc3217d3f5278b0133 (patch)
treece786b5551df92c57cb74d46ef01d2ef1dce183d /android/app/src/main
parent0b97f69a01998bbfb6f0fddbc255981c183a69d7 (diff)
downloadmullvadvpn-c6607d4238566f38fc6474bc3217d3f5278b0133.tar.xz
mullvadvpn-c6607d4238566f38fc6474bc3217d3f5278b0133.zip
Add ViewModel and related MVVM parts
Diffstat (limited to 'android/app/src/main')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/AccountUiState.kt9
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt12
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/DateExtensions.kt4
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt65
4 files changed, 85 insertions, 5 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/AccountUiState.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/AccountUiState.kt
new file mode 100644
index 0000000000..a952795571
--- /dev/null
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/AccountUiState.kt
@@ -0,0 +1,9 @@
+package net.mullvad.mullvadvpn.compose.state
+
+import org.joda.time.DateTime
+
+data class AccountUiState(
+ val deviceName: String,
+ val accountNumber: String,
+ val accountExpiry: DateTime?
+)
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 ba27a1bd18..76060b8340 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
@@ -21,6 +21,7 @@ import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager
import net.mullvad.mullvadvpn.ui.serviceconnection.SplitTunneling
import net.mullvad.mullvadvpn.util.ChangelogDataProvider
import net.mullvad.mullvadvpn.util.IChangelogDataProvider
+import net.mullvad.mullvadvpn.viewmodel.AccountViewModel
import net.mullvad.mullvadvpn.viewmodel.ChangelogViewModel
import net.mullvad.mullvadvpn.viewmodel.ConnectViewModel
import net.mullvad.mullvadvpn.viewmodel.DeviceListViewModel
@@ -78,17 +79,18 @@ val uiModule = module {
single<IChangelogDataProvider> { ChangelogDataProvider(get()) }
// View models
- viewModel { ConnectViewModel(get()) }
- viewModel { DeviceRevokedViewModel(get(), get()) }
- viewModel { DeviceListViewModel(get(), get()) }
- viewModel { LoginViewModel(get(), get()) }
+ viewModel { AccountViewModel(get(), get(), get()) }
viewModel {
ChangelogViewModel(get(), BuildConfig.VERSION_CODE, BuildConfig.ALWAYS_SHOW_CHANGELOG)
}
+ viewModel { ConnectViewModel(get()) }
+ viewModel { DeviceListViewModel(get(), get()) }
+ viewModel { DeviceRevokedViewModel(get(), get()) }
+ viewModel { LoginViewModel(get(), get()) }
viewModel { PrivacyDisclaimerViewModel(get()) }
- viewModel { VpnSettingsViewModel(get(), get(), get(), get()) }
viewModel { SelectLocationViewModel(get()) }
viewModel { SettingsViewModel(get(), get()) }
+ viewModel { VpnSettingsViewModel(get(), get(), get(), get()) }
}
const val SELF_PACKAGE_NAME = "SELF_PACKAGE_NAME"
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/DateExtensions.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/DateExtensions.kt
index 614c758794..d3be3e09aa 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/DateExtensions.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/DateExtensions.kt
@@ -1,6 +1,10 @@
package net.mullvad.mullvadvpn.util
+import java.text.DateFormat
import org.joda.time.DateTime
import org.joda.time.format.ISODateTimeFormat
fun DateTime.formatDate(): String = ISODateTimeFormat.date().print(this)
+
+fun DateTime.toExpiryDateString(): String =
+ DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT).format(this.toDate())
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt
new file mode 100644
index 0000000000..79d7ae5428
--- /dev/null
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt
@@ -0,0 +1,65 @@
+package net.mullvad.mullvadvpn.viewmodel
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.asSharedFlow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.stateIn
+import kotlinx.coroutines.launch
+import net.mullvad.mullvadvpn.compose.state.AccountUiState
+import net.mullvad.mullvadvpn.repository.AccountRepository
+import net.mullvad.mullvadvpn.repository.DeviceRepository
+import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager
+import net.mullvad.mullvadvpn.ui.serviceconnection.authTokenCache
+
+class AccountViewModel(
+ private var accountRepository: AccountRepository,
+ private var serviceConnectionManager: ServiceConnectionManager,
+ deviceRepository: DeviceRepository
+) : ViewModel() {
+
+ private val _viewActions = MutableSharedFlow<ViewAction>(extraBufferCapacity = 1)
+ val viewActions = _viewActions.asSharedFlow()
+
+ private val vmState: StateFlow<AccountUiState> =
+ combine(deviceRepository.deviceState, accountRepository.accountExpiryState) {
+ deviceState,
+ accountExpiry ->
+ AccountUiState(
+ deviceName = deviceState.deviceName() ?: "",
+ accountNumber = deviceState.token() ?: "",
+ accountExpiry = accountExpiry.date()
+ )
+ }
+ .stateIn(
+ viewModelScope,
+ SharingStarted.WhileSubscribed(),
+ AccountUiState(deviceName = "", accountNumber = "", accountExpiry = null)
+ )
+ val uiState =
+ vmState.stateIn(
+ viewModelScope,
+ SharingStarted.WhileSubscribed(),
+ AccountUiState(deviceName = "", accountNumber = "", accountExpiry = null)
+ )
+
+ fun onManageAccountClick() {
+ viewModelScope.launch {
+ _viewActions.tryEmit(
+ ViewAction.OpenAccountView(
+ serviceConnectionManager.authTokenCache()?.fetchAuthToken() ?: ""
+ )
+ )
+ }
+ }
+ fun onLogoutClick() {
+ accountRepository.logout()
+ }
+
+ sealed class ViewAction {
+ data class OpenAccountView(val token: String) : ViewAction()
+ }
+}