summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author shuanghao <shuanghao@google.com> 2024-03-20 18:35:47 +0000
committer shuanghao <shuanghao@google.com> 2024-03-22 08:01:37 +0000
commita67783c80728c0860170ad0fed6034319b1be8fa (patch)
treefd01fdfed87db84203124f924fc161fe77f8b7e1
parent49ed0bfe289ce2cb449875a7bab625179d5a5a4f (diff)
Move UI state from ViewModel to FlowEngine.
WearApp has then no directly dependency to activity ViewModel BUG: 301206470 Test: Manual. Change-Id: I133c4308675ff9bead2306c58fba4c50ca6ca188
-rw-r--r--packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorActivity.kt2
-rw-r--r--packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorViewModel.kt31
-rw-r--r--packages/CredentialManager/wear/src/com/android/credentialmanager/FlowEngine.kt42
-rw-r--r--packages/CredentialManager/wear/src/com/android/credentialmanager/ui/WearApp.kt8
4 files changed, 47 insertions, 36 deletions
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorActivity.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorActivity.kt
index 283dc7d6fe08..0fe35e695047 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorActivity.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorActivity.kt
@@ -38,7 +38,7 @@ class CredentialSelectorActivity : Hilt_CredentialSelectorActivity() {
setContent {
MaterialTheme {
WearApp(
- viewModel = viewModel,
+ flowEngine = viewModel,
onCloseApp = { finish() },
)
}
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorViewModel.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorViewModel.kt
index 9d9776301518..b7fa33e9372f 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorViewModel.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/CredentialSelectorViewModel.kt
@@ -24,9 +24,6 @@ import com.android.credentialmanager.CredentialSelectorUiState.Get
import com.android.credentialmanager.model.Request
import com.android.credentialmanager.client.CredentialManagerClient
import com.android.credentialmanager.model.EntryInfo
-import com.android.credentialmanager.model.get.ActionEntryInfo
-import com.android.credentialmanager.model.get.AuthenticationEntryInfo
-import com.android.credentialmanager.model.get.CredentialEntryInfo
import com.android.credentialmanager.ui.mappers.toGet
import android.util.Log
import androidx.activity.compose.rememberLauncherForActivityResult
@@ -53,7 +50,7 @@ class CredentialSelectorViewModel @Inject constructor(
private val shouldClose = MutableStateFlow(false)
private lateinit var selectedEntry: EntryInfo
private var isAutoSelected: Boolean = false
- val uiState: StateFlow<CredentialSelectorUiState> =
+ override val uiState: StateFlow<CredentialSelectorUiState> =
combine(
credentialManagerClient.requests,
isPrimaryScreen,
@@ -137,29 +134,3 @@ class CredentialSelectorViewModel @Inject constructor(
}
}
-sealed class CredentialSelectorUiState {
- data object Idle : CredentialSelectorUiState()
- sealed class Get : CredentialSelectorUiState() {
- data class SingleEntry(val entry: CredentialEntryInfo) : Get()
- data class SingleEntryPerAccount(
- val sortedEntries: List<CredentialEntryInfo>,
- val authenticationEntryList: List<AuthenticationEntryInfo>,
- ) : Get()
- data class MultipleEntry(
- val accounts: List<PerUserNameEntries>,
- val actionEntryList: List<ActionEntryInfo>,
- val authenticationEntryList: List<AuthenticationEntryInfo>,
- ) : Get() {
- data class PerUserNameEntries(
- val userName: String,
- val sortedCredentialEntryList: List<CredentialEntryInfo>,
- )
- }
-
- // TODO: b/301206470 add the remaining states
- }
-
- data object Create : CredentialSelectorUiState()
- data class Cancel(val appName: String) : CredentialSelectorUiState()
- data object Close : CredentialSelectorUiState()
-}
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/FlowEngine.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/FlowEngine.kt
index 2e80a7c672f4..c05fc93b8223 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/FlowEngine.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/FlowEngine.kt
@@ -20,9 +20,15 @@ import android.content.Intent
import androidx.activity.result.IntentSenderRequest
import androidx.compose.runtime.Composable
import com.android.credentialmanager.model.EntryInfo
+import com.android.credentialmanager.model.get.ActionEntryInfo
+import com.android.credentialmanager.model.get.AuthenticationEntryInfo
+import com.android.credentialmanager.model.get.CredentialEntryInfo
+import kotlinx.coroutines.flow.StateFlow
/** Engine of the credential selecting flow. */
interface FlowEngine {
+ /** UI state of the selector app */
+ val uiState: StateFlow<CredentialSelectorUiState>
/** Back from previous stage. */
fun back()
/** Cancels the selection flow. */
@@ -54,4 +60,40 @@ interface FlowEngine {
*/
@Composable
fun getEntrySelector(): (entry: EntryInfo, isAutoSelected: Boolean) -> Unit
+}
+
+/** UI state of the selector app */
+sealed class CredentialSelectorUiState {
+ /** Idle UI state, no request is going on. */
+ data object Idle : CredentialSelectorUiState()
+ /** Getting credential UI state. */
+ sealed class Get : CredentialSelectorUiState() {
+ /** Getting credential UI state when there is only one credential available. */
+ data class SingleEntry(val entry: CredentialEntryInfo) : Get()
+ /**
+ * Getting credential UI state when there is only one account while with multiple
+ * credentials, with different types(eg, passkey vs password) or providers.
+ */
+ data class SingleEntryPerAccount(
+ val sortedEntries: List<CredentialEntryInfo>,
+ val authenticationEntryList: List<AuthenticationEntryInfo>,
+ ) : Get()
+ /** Getting credential UI state when there are multiple accounts available. */
+ data class MultipleEntry(
+ val accounts: List<PerUserNameEntries>,
+ val actionEntryList: List<ActionEntryInfo>,
+ val authenticationEntryList: List<AuthenticationEntryInfo>,
+ ) : Get() {
+ data class PerUserNameEntries(
+ val userName: String,
+ val sortedCredentialEntryList: List<CredentialEntryInfo>,
+ )
+ }
+ }
+ /** Creating credential UI state. */
+ data object Create : CredentialSelectorUiState()
+ /** Request is cancelling by [appName]. */
+ data class Cancel(val appName: String) : CredentialSelectorUiState()
+ /** Request is closed peacefully. */
+ data object Close : CredentialSelectorUiState()
} \ No newline at end of file
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/WearApp.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/WearApp.kt
index bf4c988679b9..018db6899f6e 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/WearApp.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/WearApp.kt
@@ -32,7 +32,6 @@ import com.android.credentialmanager.CredentialSelectorUiState
import com.android.credentialmanager.CredentialSelectorUiState.Get.SingleEntryPerAccount
import com.android.credentialmanager.CredentialSelectorUiState.Get.SingleEntry
import com.android.credentialmanager.CredentialSelectorUiState.Get.MultipleEntry
-import com.android.credentialmanager.CredentialSelectorViewModel
import com.android.credentialmanager.FlowEngine
import com.android.credentialmanager.TAG
import com.android.credentialmanager.ui.screens.LoadingScreen
@@ -52,8 +51,7 @@ import com.android.credentialmanager.ui.screens.multiple.MultiCredentialsFlatten
@OptIn(ExperimentalHorologistApi::class)
@Composable
fun WearApp(
- viewModel: CredentialSelectorViewModel,
- flowEngine: FlowEngine = viewModel,
+ flowEngine: FlowEngine,
onCloseApp: () -> Unit,
) {
val navController = rememberSwipeDismissableNavController()
@@ -62,7 +60,7 @@ fun WearApp(
rememberSwipeDismissableNavHostState(swipeToDismissBoxState = swipeToDismissBoxState)
val selectEntry = flowEngine.getEntrySelector()
- val uiState by viewModel.uiState.collectAsStateWithLifecycle()
+ val uiState by flowEngine.uiState.collectAsStateWithLifecycle()
WearNavScaffold(
startDestination = Screen.Loading.route,
navController = navController,
@@ -112,7 +110,7 @@ fun WearApp(
}
}
BackHandler(true) {
- viewModel.back()
+ flowEngine.back()
}
Log.d(TAG, "uiState change, state: $uiState")
when (val state = uiState) {