From 235a5dac767b2a6ed8397f12d295196437f65f14 Mon Sep 17 00:00:00 2001 From: Arnau Mora Gras Date: Tue, 17 Sep 2024 15:11:03 +0200 Subject: [PATCH] Added state storage Signed-off-by: Arnau Mora Gras --- .../davdroid/ui/setup/LoginScreenModel.kt | 30 ++++++++++++++----- .../davdroid/ui/setup/NextcloudLoginModel.kt | 25 +++++++++++----- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/LoginScreenModel.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/LoginScreenModel.kt index 816c85f9f..4bb4fcc81 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/LoginScreenModel.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/LoginScreenModel.kt @@ -37,8 +37,10 @@ import kotlinx.coroutines.runInterruptible import kotlinx.coroutines.withContext import kotlinx.parcelize.Parcelize +@OptIn(SavedStateHandleSaveableApi::class) @HiltViewModel(assistedFactory = LoginScreenModel.Factory::class) class LoginScreenModel @AssistedInject constructor( + savedStateHandle: SavedStateHandle, @Assisted val initialLoginType: LoginType, @Assisted val skipLoginTypePage: Boolean, @Assisted val initialLoginInfo: LoginInfo, @@ -71,10 +73,14 @@ class LoginScreenModel @AssistedInject constructor( else Page.LoginType - var page by mutableStateOf(startPage) + var page by savedStateHandle.saveable { + mutableStateOf(startPage) + } private set - var finish by mutableStateOf(false) + var finish by savedStateHandle.saveable { + mutableStateOf(false) + } private set @@ -146,7 +152,9 @@ class LoginScreenModel @AssistedInject constructor( val loginType: LoginType ): Parcelable - var loginTypeUiState by mutableStateOf(LoginTypeUiState(loginType = initialLoginType)) + var loginTypeUiState by savedStateHandle.saveable { + mutableStateOf(LoginTypeUiState(loginType = initialLoginType)) + } private set fun selectLoginType(loginType: LoginType) { @@ -166,10 +174,14 @@ class LoginScreenModel @AssistedInject constructor( val loginInfo: LoginInfo ): Parcelable - var loginDetailsUiState by mutableStateOf(LoginDetailsUiState( - loginType = initialLoginType, - loginInfo = loginInfo - )) + var loginDetailsUiState by savedStateHandle.saveable { + mutableStateOf( + LoginDetailsUiState( + loginType = initialLoginType, + loginInfo = loginInfo + ) + ) + } private set fun updateLoginInfo(loginInfo: LoginInfo) { @@ -187,7 +199,9 @@ class LoginScreenModel @AssistedInject constructor( val logs: String? = null ): Parcelable - var detectResourcesUiState by mutableStateOf(DetectResourcesUiState()) + var detectResourcesUiState by savedStateHandle.saveable { + mutableStateOf(DetectResourcesUiState()) + } private set private var foundConfig: DavResourceFinder.Configuration? = null diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/NextcloudLoginModel.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/NextcloudLoginModel.kt index 39f1599a8..38ce1770b 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/NextcloudLoginModel.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/setup/NextcloudLoginModel.kt @@ -8,6 +8,7 @@ import android.content.Context import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import at.bitfire.davdroid.network.NextcloudLoginFlow @@ -16,18 +17,18 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext +import java.util.logging.Level +import java.util.logging.Logger import kotlinx.coroutines.launch import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrlOrNull -import java.util.logging.Level -import java.util.logging.Logger @HiltViewModel(assistedFactory = NextcloudLoginModel.Factory::class) class NextcloudLoginModel @AssistedInject constructor( @Assisted val initialLoginInfo: LoginInfo, @ApplicationContext val context: Context, - private val logger: Logger - //val state: SavedStateHandle + private val logger: Logger, + val state: SavedStateHandle ): ViewModel() { @AssistedFactory @@ -35,10 +36,10 @@ class NextcloudLoginModel @AssistedInject constructor( fun create(loginInfo: LoginInfo): NextcloudLoginModel } - /*companion object { + companion object { const val STATE_POLL_URL = "poll_url" const val STATE_TOKEN = "token" - }*/ + } data class UiState( val baseUrl: String = "", @@ -93,7 +94,8 @@ class NextcloudLoginModel @AssistedInject constructor( val loginFlow = NextcloudLoginFlow(context) // Login flow state - /*private var pollUrl: HttpUrl? + // Login flow state + private var pollUrl: HttpUrl? get() = state.get(STATE_POLL_URL)?.toHttpUrlOrNull() set(value) { state[STATE_POLL_URL] = value.toString() @@ -102,7 +104,7 @@ class NextcloudLoginModel @AssistedInject constructor( get() = state.get(STATE_TOKEN) set(value) { state[STATE_TOKEN] = value - }*/ + } override fun onCleared() { loginFlow.close() @@ -126,6 +128,10 @@ class NextcloudLoginModel @AssistedInject constructor( try { val loginUrl = loginFlow.initiate(baseUrl) + // Those values get initialized by loginFlow.initiate + pollUrl = loginFlow.pollUrl + token = loginFlow.token + uiState = uiState.copy( loginUrl = loginUrl, inProgress = false @@ -155,6 +161,9 @@ class NextcloudLoginModel @AssistedInject constructor( inProgress = true ) + pollUrl?.let { loginFlow.pollUrl = it } + token?.let { loginFlow.token = it } + val loginInfo = try { loginFlow.fetchLoginInfo() } catch (e: Exception) {