diff options
Diffstat (limited to 'android')
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() + } +} |
