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),
             )