diff options
7 files changed, 91 insertions, 28 deletions
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 77fb3e7dfd9c..40864572fc62 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 @@ fun NavController.navigateToSinglePasswordScreen() { 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 c3919a03316f..680a0d222c80 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 @@ sealed class Screen( 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 f8e22eed90f0..f7158e89a5cd 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.rememberSwipeDismissableNavController 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 @@ fun WearApp( 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 @@ fun WearApp( navController.navigateToLoading() } } - is CredentialSelectorUiState.Get -> { handleGetNavigation( navController = navController, @@ -103,7 +129,21 @@ private fun handleGetNavigation( ) { 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 44a838d51a04..5898a40d2edd 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.CredentialType 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 @@ fun Request.Get.toGet(isPrimary: Boolean): CredentialSelectorUiState.Get { } 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 1697e0f7ce20..b2595a1e500c 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.android.credentialmanager.ui.screens.UiState 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 @@ fun SinglePasskeyScreen( UiState.CredentialScreen -> { SinglePasskeyScreen( credentialSelectorUiState.entry, - screenIcon, columnState, modifier, viewModel @@ -96,7 +102,6 @@ fun SinglePasskeyScreen( @Composable fun SinglePasskeyScreen( entry: CredentialEntryInfo, - screenIcon: Drawable?, columnState: ScalingLazyColumnState, modifier: Modifier = Modifier, viewModel: SinglePasskeyScreenViewModel, @@ -104,7 +109,7 @@ fun SinglePasskeyScreen( 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 29b9572f7d95..4c7f583fcb09 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.android.credentialmanager.ui.screens.single.UiState 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 @@ fun SinglePasswordScreen( UiState.CredentialScreen -> { SinglePasswordScreen( credentialSelectorUiState.entry, - screenIcon, columnState, modifier, viewModel @@ -96,7 +102,6 @@ fun SinglePasswordScreen( @Composable private fun SinglePasswordScreen( entry: CredentialEntryInfo, - screenIcon: Drawable?, columnState: ScalingLazyColumnState, modifier: Modifier = Modifier, viewModel: SinglePasswordScreenViewModel, @@ -104,7 +109,7 @@ private fun SinglePasswordScreen( 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 8c2c0814e3ae..b0ece0d0453a 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 @@ import com.google.android.horologist.compose.layout.ScalingLazyColumnState * 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 @@ import com.google.android.horologist.compose.layout.ScalingLazyColumnState @Composable fun SignInWithProviderScreen( credentialSelectorUiState: CredentialSelectorUiState.Get.SingleEntry, - screenIcon: Drawable?, columnState: ScalingLazyColumnState, modifier: Modifier = Modifier, viewModel: SignInWithProviderViewModel = hiltViewModel(), @@ -72,7 +69,6 @@ fun SignInWithProviderScreen( UiState.CredentialScreen -> { SignInWithProviderScreen( credentialSelectorUiState.entry, - screenIcon, columnState, modifier, viewModel @@ -104,7 +100,6 @@ fun SignInWithProviderScreen( @Composable fun SignInWithProviderScreen( entry: CredentialEntryInfo, - screenIcon: Drawable?, columnState: ScalingLazyColumnState, modifier: Modifier = Modifier, viewModel: SignInWithProviderViewModel, @@ -112,7 +107,7 @@ fun SignInWithProviderScreen( SingleAccountScreen( headerContent = { SignInHeader( - icon = screenIcon, + icon = entry.icon, title = stringResource(R.string.use_sign_in_with_provider_title, entry.providerDisplayName), ) |