diff options
| author | saber safavi <saber.safavi@codic.se> | 2023-07-06 11:19:46 +0200 |
|---|---|---|
| committer | saber safavi <saber.safavi@codic.se> | 2023-07-28 16:36:18 +0200 |
| commit | c6607d4238566f38fc6474bc3217d3f5278b0133 (patch) | |
| tree | ce786b5551df92c57cb74d46ef01d2ef1dce183d /android/app/src/main | |
| parent | 0b97f69a01998bbfb6f0fddbc255981c183a69d7 (diff) | |
| download | mullvadvpn-c6607d4238566f38fc6474bc3217d3f5278b0133.tar.xz mullvadvpn-c6607d4238566f38fc6474bc3217d3f5278b0133.zip | |
Add ViewModel and related MVVM parts
Diffstat (limited to 'android/app/src/main')
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() + } +} |
