diff --git a/packages/CredentialManager/res/values/strings.xml b/packages/CredentialManager/res/values/strings.xml index dd3c96726eba1..1ee2a26d3acf5 100644 --- a/packages/CredentialManager/res/values/strings.xml +++ b/packages/CredentialManager/res/values/strings.xml @@ -7,6 +7,7 @@ Create in another place Save to another place Use another device + Save to another device No thanks A simple way to sign in safely Use your fingerprint, face or screen lock to sign in with a unique passkey that can’t be forgotten or stolen. Learn more diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt index 8bff8bcd27a1d..2bede9acaed21 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt @@ -172,6 +172,7 @@ class CredentialManagerRepo( {CreateScreenState.PASSKEY_INTRO} else {CreateScreenState.PROVIDER_SELECTION} } else {CreateScreenState.CREATION_OPTION_SELECTION}, requestDisplayInfo, + false, if (hasDefault) { ActiveEntry(defaultProvider, defaultProvider.createOptions.first()) } else null diff --git a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt index 87d8a73b8f531..9f73aefa52b22 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt @@ -80,14 +80,16 @@ fun CreateCredentialScreen( enabledProviderList = uiState.enabledProviders, disabledProviderList = uiState.disabledProviders, onCancel = viewModel::onCancel, - onOptionSelected = viewModel::onMoreOptionsRowSelectedForFirstUse, + onOptionSelected = viewModel::onEntrySelectedFromFirstUseScreen, onDisabledPasswordManagerSelected = viewModel::onDisabledPasswordManagerSelected, + onRemoteEntrySelected = selectEntryCallback, ) CreateScreenState.CREATION_OPTION_SELECTION -> CreationSelectionCard( requestDisplayInfo = uiState.requestDisplayInfo, enabledProviderList = uiState.enabledProviders, providerInfo = uiState.activeEntry?.activeProvider!!, createOptionInfo = uiState.activeEntry.activeEntryInfo as CreateOptionInfo, + showActiveEntryOnly = uiState.showActiveEntryOnly, onOptionSelected = selectEntryCallback, onConfirm = confirmEntryCallback, onCancel = viewModel::onCancel, @@ -98,7 +100,7 @@ fun CreateCredentialScreen( enabledProviderList = uiState.enabledProviders, disabledProviderList = uiState.disabledProviders, onBackButtonSelected = viewModel::onBackButtonSelected, - onOptionSelected = viewModel::onMoreOptionsRowSelected, + onOptionSelected = viewModel::onEntrySelectedFromMoreOptionScreen, onDisabledPasswordManagerSelected = viewModel::onDisabledPasswordManagerSelected, onRemoteEntrySelected = selectEntryCallback, ) @@ -184,7 +186,8 @@ fun ProviderSelectionCard( disabledProviderList: List?, onOptionSelected: (ActiveEntry) -> Unit, onDisabledPasswordManagerSelected: () -> Unit, - onCancel: () -> Unit + onCancel: () -> Unit, + onRemoteEntrySelected: (EntryInfo) -> Unit, ) { Card() { Column() { @@ -254,10 +257,23 @@ fun ProviderSelectionCard( } } } - Divider( - thickness = 24.dp, - color = Color.Transparent - ) + // TODO: handle the error situation that if multiple remoteInfos exists + enabledProviderList.forEach { enabledProvider -> + if (enabledProvider.remoteEntry != null) { + TextButton( + onClick = { + onRemoteEntrySelected(enabledProvider.remoteEntry!!) }, + modifier = Modifier + .padding(horizontal = 24.dp) + .align(alignment = Alignment.CenterHorizontally) + ) { + Text( + text = stringResource(R.string.string_save_to_another_device), + textAlign = TextAlign.Center, + ) + } + } + } Row( horizontalArrangement = Arrangement.Start, modifier = Modifier.fillMaxWidth().padding(horizontal = 24.dp) @@ -416,6 +432,7 @@ fun CreationSelectionCard( enabledProviderList: List, providerInfo: EnabledProviderInfo, createOptionInfo: CreateOptionInfo, + showActiveEntryOnly: Boolean, onOptionSelected: (EntryInfo) -> Unit, onConfirm: () -> Unit, onCancel: () -> Unit, @@ -473,41 +490,43 @@ fun CreationSelectionCard( onOptionSelected = onOptionSelected ) } - var createOptionsSize = 0 - enabledProviderList.forEach{ - enabledProvider -> createOptionsSize += enabledProvider.createOptions.size} - if (createOptionsSize > 1) { - TextButton( - onClick = onMoreOptionsSelected, - modifier = Modifier - .padding(horizontal = 24.dp) - .align(alignment = Alignment.CenterHorizontally)){ - Text( - text = - when (requestDisplayInfo.type) { - TYPE_PUBLIC_KEY_CREDENTIAL -> - stringResource(R.string.string_create_in_another_place) - else -> stringResource(R.string.string_save_to_another_place)}, - textAlign = TextAlign.Center, - ) - } - } else if ( - requestDisplayInfo.type == TYPE_PUBLIC_KEY_CREDENTIAL - ) { - // TODO: handle the error situation that if multiple remoteInfos exists - enabledProviderList.forEach { enabledProvider -> - if (enabledProvider.remoteEntry != null) { - TextButton( - onClick = { - onOptionSelected(enabledProvider.remoteEntry!!) }, - modifier = Modifier - .padding(horizontal = 24.dp) - .align(alignment = Alignment.CenterHorizontally) - ) { - Text( - text = stringResource(R.string.string_use_another_device), - textAlign = TextAlign.Center, - ) + if (!showActiveEntryOnly) { + var createOptionsSize = 0 + enabledProviderList.forEach{ + enabledProvider -> createOptionsSize += enabledProvider.createOptions.size} + if (createOptionsSize > 1) { + TextButton( + onClick = onMoreOptionsSelected, + modifier = Modifier + .padding(horizontal = 24.dp) + .align(alignment = Alignment.CenterHorizontally)){ + Text( + text = + when (requestDisplayInfo.type) { + TYPE_PUBLIC_KEY_CREDENTIAL -> + stringResource(R.string.string_create_in_another_place) + else -> stringResource(R.string.string_save_to_another_place)}, + textAlign = TextAlign.Center, + ) + } + } else if ( + requestDisplayInfo.type == TYPE_PUBLIC_KEY_CREDENTIAL + ) { + // TODO: handle the error situation that if multiple remoteInfos exists + enabledProviderList.forEach { enabledProvider -> + if (enabledProvider.remoteEntry != null) { + TextButton( + onClick = { + onOptionSelected(enabledProvider.remoteEntry!!) }, + modifier = Modifier + .padding(horizontal = 24.dp) + .align(alignment = Alignment.CenterHorizontally) + ) { + Text( + text = stringResource(R.string.string_use_another_device), + textAlign = TextAlign.Center, + ) + } } } } diff --git a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialViewModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialViewModel.kt index f7e9fd0e49649..0f685a1043297 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialViewModel.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialViewModel.kt @@ -36,6 +36,7 @@ data class CreateCredentialUiState( val disabledProviders: List? = null, val currentScreenState: CreateScreenState, val requestDisplayInfo: RequestDisplayInfo, + val showActiveEntryOnly: Boolean, val activeEntry: ActiveEntry? = null, val selectedEntry: EntryInfo? = null, ) @@ -56,13 +57,18 @@ class CreateCredentialViewModel( } fun onConfirmIntro() { - if (uiState.enabledProviders.size > 1) { - uiState = uiState.copy( - currentScreenState = CreateScreenState.PROVIDER_SELECTION + var createOptionSize = 0 + uiState.enabledProviders.forEach { + enabledProvider -> createOptionSize += enabledProvider.createOptions.size} + uiState = if (createOptionSize > 1) { + uiState.copy( + currentScreenState = CreateScreenState.PROVIDER_SELECTION, + showActiveEntryOnly = true ) - } else if (uiState.enabledProviders.size == 1){ - uiState = uiState.copy( + } else if (createOptionSize == 1){ + uiState.copy( currentScreenState = CreateScreenState.CREATION_OPTION_SELECTION, + showActiveEntryOnly = false, activeEntry = ActiveEntry(uiState.enabledProviders.first(), uiState.enabledProviders.first().createOptions.first() ) @@ -90,16 +96,18 @@ class CreateCredentialViewModel( ) } - fun onMoreOptionsRowSelected(activeEntry: ActiveEntry) { + fun onEntrySelectedFromMoreOptionScreen(activeEntry: ActiveEntry) { uiState = uiState.copy( currentScreenState = CreateScreenState.MORE_OPTIONS_ROW_INTRO, + showActiveEntryOnly = false, activeEntry = activeEntry ) } - fun onMoreOptionsRowSelectedForFirstUse(activeEntry: ActiveEntry) { + fun onEntrySelectedFromFirstUseScreen(activeEntry: ActiveEntry) { uiState = uiState.copy( currentScreenState = CreateScreenState.CREATION_OPTION_SELECTION, + showActiveEntryOnly = true, activeEntry = activeEntry ) }