Loading packages/CredentialManager/Android.bp +0 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ android_app { "androidx.lifecycle_lifecycle-livedata", "androidx.lifecycle_lifecycle-runtime-ktx", "androidx.lifecycle_lifecycle-viewmodel-compose", "androidx.navigation_navigation-compose", "androidx.recyclerview_recyclerview", ], Loading packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt +84 −64 Original line number Diff line number Diff line Loading @@ -2,14 +2,19 @@ package com.android.credentialmanager import android.content.Context import com.android.credentialmanager.createflow.CreateOptionInfo import com.android.credentialmanager.createflow.CreatePasskeyUiState import com.android.credentialmanager.createflow.CreateScreenState import com.android.credentialmanager.createflow.ProviderInfo import com.android.credentialmanager.createflow.ProviderList import com.android.credentialmanager.getflow.CredentialOptionInfo import com.android.credentialmanager.getflow.GetCredentialUiState import com.android.credentialmanager.getflow.GetScreenState // Consider repo per screen, similar to view model? class CredentialManagerRepo( private val context: Context ) { fun getCredentialProviderList(): List<com.android.credentialmanager.getflow.ProviderInfo> { private fun getCredentialProviderList(): List<com.android.credentialmanager.getflow.ProviderInfo> { return listOf( com.android.credentialmanager.getflow.ProviderInfo( icon = context.getDrawable(R.drawable.ic_passkey)!!, Loading Loading @@ -62,9 +67,8 @@ class CredentialManagerRepo( ) } fun createCredentialProviderList(): ProviderList { return ProviderList( listOf( private fun createCredentialProviderList(): List<ProviderInfo> { return listOf( ProviderInfo( icon = context.getDrawable(R.drawable.ic_passkey)!!, name = "Google Password Manager", Loading Loading @@ -114,6 +118,22 @@ class CredentialManagerRepo( ) ), ) } fun getCredentialInitialUiState(): GetCredentialUiState { val providerList = getCredentialProviderList() return GetCredentialUiState( providerList, GetScreenState.CREDENTIAL_SELECTION, providerList.first() ) } fun createPasskeyInitialUiState(): CreatePasskeyUiState { val providerList = createCredentialProviderList() return CreatePasskeyUiState( providers = providerList, currentScreenState = CreateScreenState.PASSKEY_INTRO, ) } Loading packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt +24 −35 Original line number Diff line number Diff line package com.android.credentialmanager import android.os.Bundle import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController import com.android.credentialmanager.createflow.CreatePasskeyViewModel import com.android.credentialmanager.createflow.createPasskeyGraph import com.android.credentialmanager.getflow.GetCredentialViewModel import com.android.credentialmanager.getflow.getCredentialsGraph import com.android.credentialmanager.common.DialogType import com.android.credentialmanager.createflow.CreatePasskeyScreen import com.android.credentialmanager.getflow.GetCredentialScreen import com.android.credentialmanager.ui.theme.CredentialSelectorTheme @ExperimentalMaterialApi Loading @@ -22,42 +18,35 @@ class CredentialSelectorActivity : ComponentActivity() { CredentialManagerRepo.setup(this) val startDestination = intent.extras?.getString( "start_destination", "getCredentials" ) ?: "getCredentials" "CREATE_PASSKEY" ) ?: "CREATE_PASSKEY" setContent { CredentialSelectorTheme { AppNavHost( startDestination = startDestination, onCancel = {this.finish()} ) CredentialManagerBottomSheet(startDestination) } } } @ExperimentalMaterialApi @Composable fun AppNavHost( modifier: Modifier = Modifier, navController: NavHostController = rememberNavController(), startDestination: String, onCancel: () -> Unit, ) { NavHost( modifier = modifier, navController = navController, startDestination = startDestination ) { createPasskeyGraph( navController = navController, viewModel = CreatePasskeyViewModel(CredentialManagerRepo.repo), onCancel = onCancel ) getCredentialsGraph( navController = navController, viewModel = GetCredentialViewModel(CredentialManagerRepo.repo), onCancel = onCancel ) fun CredentialManagerBottomSheet(operationType: String) { val dialogType = DialogType.toDialogType(operationType) when (dialogType) { DialogType.CREATE_PASSKEY -> { CreatePasskeyScreen(cancelActivity = onCancel) } DialogType.GET_CREDENTIALS -> { GetCredentialScreen(cancelActivity = onCancel) } else -> { Log.w("AccountSelector", "Unknown type, not rendering any UI") this.finish() } } } private val onCancel = { this@CredentialSelectorActivity.finish() } } packages/CredentialManager/src/com/android/credentialmanager/common/DialogType.kt 0 → 100644 +18 −0 Original line number Diff line number Diff line package com.android.credentialmanager.common enum class DialogType { CREATE_PASSKEY, GET_CREDENTIALS, CREATE_PASSWORD, UNKNOWN; companion object { fun toDialogType(value: String): DialogType { return try { valueOf(value) } catch (e: IllegalArgumentException) { UNKNOWN } } } } packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt +7 −4 Original line number Diff line number Diff line Loading @@ -10,13 +10,16 @@ data class ProviderInfo( val createOptions: List<CreateOptionInfo>, ) data class ProviderList( val providers: List<ProviderInfo>, ) data class CreateOptionInfo( val icon: Drawable, val title: String, val subtitle: String, val id: String, ) /** The name of the current screen. */ enum class CreateScreenState { PASSKEY_INTRO, PROVIDER_SELECTION, CREATION_OPTION_SELECTION, } Loading
packages/CredentialManager/Android.bp +0 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ android_app { "androidx.lifecycle_lifecycle-livedata", "androidx.lifecycle_lifecycle-runtime-ktx", "androidx.lifecycle_lifecycle-viewmodel-compose", "androidx.navigation_navigation-compose", "androidx.recyclerview_recyclerview", ], Loading
packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt +84 −64 Original line number Diff line number Diff line Loading @@ -2,14 +2,19 @@ package com.android.credentialmanager import android.content.Context import com.android.credentialmanager.createflow.CreateOptionInfo import com.android.credentialmanager.createflow.CreatePasskeyUiState import com.android.credentialmanager.createflow.CreateScreenState import com.android.credentialmanager.createflow.ProviderInfo import com.android.credentialmanager.createflow.ProviderList import com.android.credentialmanager.getflow.CredentialOptionInfo import com.android.credentialmanager.getflow.GetCredentialUiState import com.android.credentialmanager.getflow.GetScreenState // Consider repo per screen, similar to view model? class CredentialManagerRepo( private val context: Context ) { fun getCredentialProviderList(): List<com.android.credentialmanager.getflow.ProviderInfo> { private fun getCredentialProviderList(): List<com.android.credentialmanager.getflow.ProviderInfo> { return listOf( com.android.credentialmanager.getflow.ProviderInfo( icon = context.getDrawable(R.drawable.ic_passkey)!!, Loading Loading @@ -62,9 +67,8 @@ class CredentialManagerRepo( ) } fun createCredentialProviderList(): ProviderList { return ProviderList( listOf( private fun createCredentialProviderList(): List<ProviderInfo> { return listOf( ProviderInfo( icon = context.getDrawable(R.drawable.ic_passkey)!!, name = "Google Password Manager", Loading Loading @@ -114,6 +118,22 @@ class CredentialManagerRepo( ) ), ) } fun getCredentialInitialUiState(): GetCredentialUiState { val providerList = getCredentialProviderList() return GetCredentialUiState( providerList, GetScreenState.CREDENTIAL_SELECTION, providerList.first() ) } fun createPasskeyInitialUiState(): CreatePasskeyUiState { val providerList = createCredentialProviderList() return CreatePasskeyUiState( providers = providerList, currentScreenState = CreateScreenState.PASSKEY_INTRO, ) } Loading
packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt +24 −35 Original line number Diff line number Diff line package com.android.credentialmanager import android.os.Bundle import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController import com.android.credentialmanager.createflow.CreatePasskeyViewModel import com.android.credentialmanager.createflow.createPasskeyGraph import com.android.credentialmanager.getflow.GetCredentialViewModel import com.android.credentialmanager.getflow.getCredentialsGraph import com.android.credentialmanager.common.DialogType import com.android.credentialmanager.createflow.CreatePasskeyScreen import com.android.credentialmanager.getflow.GetCredentialScreen import com.android.credentialmanager.ui.theme.CredentialSelectorTheme @ExperimentalMaterialApi Loading @@ -22,42 +18,35 @@ class CredentialSelectorActivity : ComponentActivity() { CredentialManagerRepo.setup(this) val startDestination = intent.extras?.getString( "start_destination", "getCredentials" ) ?: "getCredentials" "CREATE_PASSKEY" ) ?: "CREATE_PASSKEY" setContent { CredentialSelectorTheme { AppNavHost( startDestination = startDestination, onCancel = {this.finish()} ) CredentialManagerBottomSheet(startDestination) } } } @ExperimentalMaterialApi @Composable fun AppNavHost( modifier: Modifier = Modifier, navController: NavHostController = rememberNavController(), startDestination: String, onCancel: () -> Unit, ) { NavHost( modifier = modifier, navController = navController, startDestination = startDestination ) { createPasskeyGraph( navController = navController, viewModel = CreatePasskeyViewModel(CredentialManagerRepo.repo), onCancel = onCancel ) getCredentialsGraph( navController = navController, viewModel = GetCredentialViewModel(CredentialManagerRepo.repo), onCancel = onCancel ) fun CredentialManagerBottomSheet(operationType: String) { val dialogType = DialogType.toDialogType(operationType) when (dialogType) { DialogType.CREATE_PASSKEY -> { CreatePasskeyScreen(cancelActivity = onCancel) } DialogType.GET_CREDENTIALS -> { GetCredentialScreen(cancelActivity = onCancel) } else -> { Log.w("AccountSelector", "Unknown type, not rendering any UI") this.finish() } } } private val onCancel = { this@CredentialSelectorActivity.finish() } }
packages/CredentialManager/src/com/android/credentialmanager/common/DialogType.kt 0 → 100644 +18 −0 Original line number Diff line number Diff line package com.android.credentialmanager.common enum class DialogType { CREATE_PASSKEY, GET_CREDENTIALS, CREATE_PASSWORD, UNKNOWN; companion object { fun toDialogType(value: String): DialogType { return try { valueOf(value) } catch (e: IllegalArgumentException) { UNKNOWN } } } }
packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateModel.kt +7 −4 Original line number Diff line number Diff line Loading @@ -10,13 +10,16 @@ data class ProviderInfo( val createOptions: List<CreateOptionInfo>, ) data class ProviderList( val providers: List<ProviderInfo>, ) data class CreateOptionInfo( val icon: Drawable, val title: String, val subtitle: String, val id: String, ) /** The name of the current screen. */ enum class CreateScreenState { PASSKEY_INTRO, PROVIDER_SELECTION, CREATION_OPTION_SELECTION, }