Merge "Navigation related wear credential app changes" into main
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/Navigation.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/Navigation.kt
index 77fb3e7..4086457 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/Navigation.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/Navigation.kt
@@ -26,6 +26,22 @@
navigateToAsRoot(Screen.SinglePasswordScreen.route)
}
+fun NavController.navigateToSinglePasskeyScreen() {
+ navigateToAsRoot(Screen.SinglePasskeyScreen.route)
+}
+
+fun NavController.navigateToSignInWithProviderScreen() {
+ navigateToAsRoot(Screen.SignInWithProviderScreen.route)
+}
+
+fun NavController.navigateToMultipleCredentialsFoldScreen() {
+ navigateToAsRoot(Screen.MultipleCredentialsScreenFold.route)
+}
+
+fun NavController.navigateToMultipleCredentialsFlattenScreen() {
+ navigateToAsRoot(Screen.MultipleCredentialsScreenFlatten.route)
+}
+
fun NavController.navigateToAsRoot(route: String) {
popBackStack()
navigate(route)
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/Screen.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/Screen.kt
index c3919a0..680a0d2 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/Screen.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/Screen.kt
@@ -22,4 +22,12 @@
data object Loading : Screen("loading")
data object SinglePasswordScreen : Screen("singlePasswordScreen")
+
+ data object SinglePasskeyScreen : Screen("singlePasskeyScreen")
+
+ data object SignInWithProviderScreen : Screen("signInWithProviderScreen")
+
+ data object MultipleCredentialsScreenFold : Screen("multipleCredentialsScreenFold")
+
+ data object MultipleCredentialsScreenFlatten : Screen("multipleCredentialsScreenFlatten")
}
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 f8e22ee..f7158e8 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/WearApp.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/WearApp.kt
@@ -27,14 +27,20 @@
import androidx.wear.compose.navigation.rememberSwipeDismissableNavHostState
import com.android.credentialmanager.CredentialSelectorUiState
import com.android.credentialmanager.CredentialSelectorUiState.Get.SingleEntry
+import com.android.credentialmanager.CredentialSelectorUiState.Get.MultipleEntry
import com.android.credentialmanager.CredentialSelectorViewModel
import com.android.credentialmanager.ui.screens.LoadingScreen
+import com.android.credentialmanager.ui.screens.single.passkey.SinglePasskeyScreen
import com.android.credentialmanager.ui.screens.single.password.SinglePasswordScreen
+import com.android.credentialmanager.ui.screens.single.signInWithProvider.SignInWithProviderScreen
import com.google.android.horologist.annotations.ExperimentalHorologistApi
import com.google.android.horologist.compose.navscaffold.WearNavScaffold
import com.google.android.horologist.compose.navscaffold.composable
import com.google.android.horologist.compose.navscaffold.scrollable
+import com.android.credentialmanager.model.CredentialType
+import com.android.credentialmanager.ui.screens.multiple.MultiCredentialsFoldScreen
+@OptIn(ExperimentalHorologistApi::class)
@Composable
fun WearApp(
viewModel: CredentialSelectorViewModel,
@@ -59,10 +65,31 @@
scrollable(Screen.SinglePasswordScreen.route) {
SinglePasswordScreen(
credentialSelectorUiState = viewModel.uiState.value as SingleEntry,
- screenIcon = null,
columnState = it.columnState,
)
}
+
+ scrollable(Screen.SinglePasskeyScreen.route) {
+ SinglePasskeyScreen(
+ credentialSelectorUiState = viewModel.uiState.value as SingleEntry,
+ columnState = it.columnState,
+ )
+ }
+
+ scrollable(Screen.SignInWithProviderScreen.route) {
+ SignInWithProviderScreen(
+ credentialSelectorUiState = viewModel.uiState.value as SingleEntry,
+ columnState = it.columnState,
+ )
+ }
+
+ scrollable(Screen.MultipleCredentialsScreenFold.route) {
+ MultiCredentialsFoldScreen(
+ credentialSelectorUiState = viewModel.uiState.value as MultipleEntry,
+ screenIcon = null,
+ columnState = it.columnState,
+ )
+ }
}
when (val state = uiState) {
@@ -71,7 +98,6 @@
navController.navigateToLoading()
}
}
-
is CredentialSelectorUiState.Get -> {
handleGetNavigation(
navController = navController,
@@ -103,7 +129,21 @@
) {
when (state) {
is SingleEntry -> {
- navController.navigateToSinglePasswordScreen()
+ when (state.entry.credentialType) {
+ CredentialType.UNKNOWN -> {
+ navController.navigateToSignInWithProviderScreen()
+ }
+ CredentialType.PASSKEY -> {
+ navController.navigateToSinglePasskeyScreen()
+ }
+ CredentialType.PASSWORD -> {
+ navController.navigateToSinglePasswordScreen()
+ }
+ }
+ }
+
+ is CredentialSelectorUiState.Get.MultipleEntry -> {
+ navController.navigateToMultipleCredentialsFoldScreen()
}
else -> {
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/mappers/CredentialSelectorUiStateGetMapper.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/mappers/CredentialSelectorUiStateGetMapper.kt
index 44a838d..5898a40 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/mappers/CredentialSelectorUiStateGetMapper.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/mappers/CredentialSelectorUiStateGetMapper.kt
@@ -23,17 +23,12 @@
import com.android.credentialmanager.model.get.CredentialEntryInfo
fun Request.Get.toGet(isPrimary: Boolean): CredentialSelectorUiState.Get {
- // TODO: b/301206470 returning a hard coded state for MVP
- if (true) return CredentialSelectorUiState.Get.SingleEntry(
- providerInfos
- .flatMap { it.credentialEntryList }
- .first { it.credentialType == CredentialType.PASSWORD }
- )
val accounts = providerInfos
.flatMap { it.credentialEntryList }
.groupBy { it.userName}
.entries
.toList()
+
return if (isPrimary) {
if (accounts.size == 1) {
CredentialSelectorUiState.Get.SingleEntry(
@@ -57,6 +52,5 @@
}
val comparator = compareBy<CredentialEntryInfo> { entryInfo ->
// Passkey type always go first
- entryInfo.credentialType.let{ if (it == CredentialType.PASSKEY) 0 else 1 }
-}
- .thenByDescending{ it.lastUsedTimeMillis }
+ entryInfo.credentialType.let { if (it == CredentialType.PASSKEY) 0 else 1 }
+}.thenByDescending { it.lastUsedTimeMillis ?: 0 }
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/passkey/SinglePasskeyScreen.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/passkey/SinglePasskeyScreen.kt
index 1697e0f..b2595a1 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/passkey/SinglePasskeyScreen.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/passkey/SinglePasskeyScreen.kt
@@ -18,7 +18,6 @@
package com.android.credentialmanager.ui.screens.single.passkey
-import android.graphics.drawable.Drawable
import androidx.compose.foundation.layout.Column
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.compose.foundation.layout.padding
@@ -46,11 +45,19 @@
import com.google.android.horologist.annotations.ExperimentalHorologistApi
import com.google.android.horologist.compose.layout.ScalingLazyColumnState
+/**
+ * Screen that shows sign in with provider credential.
+ *
+ * @param credentialSelectorUiState The app bar view model.
+ * @param columnState ScalingLazyColumn configuration to be be applied to SingleAccountScreen
+ * @param modifier styling for composable
+ * @param viewModel ViewModel that updates ui state for this screen
+ * @param navController handles navigation events from this screen
+ */
@OptIn(ExperimentalHorologistApi::class)
@Composable
fun SinglePasskeyScreen(
credentialSelectorUiState: CredentialSelectorUiState.Get.SingleEntry,
- screenIcon: Drawable?,
columnState: ScalingLazyColumnState,
modifier: Modifier = Modifier,
viewModel: SinglePasskeyScreenViewModel = hiltViewModel(),
@@ -64,7 +71,6 @@
UiState.CredentialScreen -> {
SinglePasskeyScreen(
credentialSelectorUiState.entry,
- screenIcon,
columnState,
modifier,
viewModel
@@ -96,7 +102,6 @@
@Composable
fun SinglePasskeyScreen(
entry: CredentialEntryInfo,
- screenIcon: Drawable?,
columnState: ScalingLazyColumnState,
modifier: Modifier = Modifier,
viewModel: SinglePasskeyScreenViewModel,
@@ -104,7 +109,7 @@
SingleAccountScreen(
headerContent = {
SignInHeader(
- icon = screenIcon,
+ icon = entry.icon,
title = stringResource(R.string.use_passkey_title),
)
},
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/password/SinglePasswordScreen.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/password/SinglePasswordScreen.kt
index 29b9572..4c7f583 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/password/SinglePasswordScreen.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/password/SinglePasswordScreen.kt
@@ -18,7 +18,6 @@
package com.android.credentialmanager.ui.screens.single.password
-import android.graphics.drawable.Drawable
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
@@ -46,11 +45,19 @@
import com.google.android.horologist.annotations.ExperimentalHorologistApi
import com.google.android.horologist.compose.layout.ScalingLazyColumnState
+/**
+ * Screen that shows sign in with provider credential.
+ *
+ * @param credentialSelectorUiState The app bar view model.
+ * @param columnState ScalingLazyColumn configuration to be be applied to SingleAccountScreen
+ * @param modifier styling for composable
+ * @param viewModel ViewModel that updates ui state for this screen
+ * @param navController handles navigation events from this screen
+ */
@OptIn(ExperimentalHorologistApi::class)
@Composable
fun SinglePasswordScreen(
credentialSelectorUiState: CredentialSelectorUiState.Get.SingleEntry,
- screenIcon: Drawable?,
columnState: ScalingLazyColumnState,
modifier: Modifier = Modifier,
viewModel: SinglePasswordScreenViewModel = hiltViewModel(),
@@ -64,7 +71,6 @@
UiState.CredentialScreen -> {
SinglePasswordScreen(
credentialSelectorUiState.entry,
- screenIcon,
columnState,
modifier,
viewModel
@@ -96,7 +102,6 @@
@Composable
private fun SinglePasswordScreen(
entry: CredentialEntryInfo,
- screenIcon: Drawable?,
columnState: ScalingLazyColumnState,
modifier: Modifier = Modifier,
viewModel: SinglePasswordScreenViewModel,
@@ -104,7 +109,7 @@
SingleAccountScreen(
headerContent = {
SignInHeader(
- icon = screenIcon,
+ icon = entry.icon,
title = stringResource(R.string.use_password_title),
)
},
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/signInWithProvider/SignInWithProviderScreen.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/signInWithProvider/SignInWithProviderScreen.kt
index 8c2c081..b0ece0d 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/signInWithProvider/SignInWithProviderScreen.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/screens/single/signInWithProvider/SignInWithProviderScreen.kt
@@ -16,7 +16,6 @@
package com.android.credentialmanager.ui.screens.single.signInWithProvider
-import android.graphics.drawable.Drawable
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
@@ -48,7 +47,6 @@
* Screen that shows sign in with provider credential.
*
* @param credentialSelectorUiState The app bar view model.
- * @param screenIcon The view model corresponding to the home page.
* @param columnState ScalingLazyColumn configuration to be be applied to SingleAccountScreen
* @param modifier styling for composable
* @param viewModel ViewModel that updates ui state for this screen
@@ -58,7 +56,6 @@
@Composable
fun SignInWithProviderScreen(
credentialSelectorUiState: CredentialSelectorUiState.Get.SingleEntry,
- screenIcon: Drawable?,
columnState: ScalingLazyColumnState,
modifier: Modifier = Modifier,
viewModel: SignInWithProviderViewModel = hiltViewModel(),
@@ -72,7 +69,6 @@
UiState.CredentialScreen -> {
SignInWithProviderScreen(
credentialSelectorUiState.entry,
- screenIcon,
columnState,
modifier,
viewModel
@@ -104,7 +100,6 @@
@Composable
fun SignInWithProviderScreen(
entry: CredentialEntryInfo,
- screenIcon: Drawable?,
columnState: ScalingLazyColumnState,
modifier: Modifier = Modifier,
viewModel: SignInWithProviderViewModel,
@@ -112,7 +107,7 @@
SingleAccountScreen(
headerContent = {
SignInHeader(
- icon = screenIcon,
+ icon = entry.icon,
title = stringResource(R.string.use_sign_in_with_provider_title,
entry.providerDisplayName),
)