Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9e57dafd authored by Helen Qin's avatar Helen Qin Committed by Automerger Merge Worker
Browse files

Merge "Revise the save-flow" into udc-dev am: 91c9f5b7 am: 69093fc8 am: 440c3327

parents 0307e6b1 440c3327
Loading
Loading
Loading
Loading
+0 −9
Original line number Original line Diff line number Diff line
@@ -42,15 +42,6 @@
        android:excludeFromRecents="true"
        android:excludeFromRecents="true"
        android:theme="@style/Theme.CredentialSelector">
        android:theme="@style/Theme.CredentialSelector">
    </activity>
    </activity>

    <receiver
        android:name=".CredentialProviderReceiver"
        android:exported="true"
        android:permission="android.permission.LAUNCH_CREDENTIAL_SELECTOR">
        <intent-filter>
            <action android:name="android.credentials.ui.action.CREDMAN_ENABLED_PROVIDERS_UPDATED"/>
        </intent-filter>
    </receiver>
  </application>
  </application>


</manifest>
</manifest>
+2 −2
Original line number Original line Diff line number Diff line
@@ -107,7 +107,6 @@ class CredentialManagerRepo(


        initialUiState = when (requestInfo?.type) {
        initialUiState = when (requestInfo?.type) {
            RequestInfo.TYPE_CREATE -> {
            RequestInfo.TYPE_CREATE -> {
                val defaultProviderIdSetByUser = userConfigRepo.getDefaultProviderId()
                val isPasskeyFirstUse = userConfigRepo.getIsPasskeyFirstUse()
                val isPasskeyFirstUse = userConfigRepo.getIsPasskeyFirstUse()
                val providerEnableListUiState = getCreateProviderEnableListInitialUiState()
                val providerEnableListUiState = getCreateProviderEnableListInitialUiState()
                val providerDisableListUiState = getCreateProviderDisableListInitialUiState()
                val providerDisableListUiState = getCreateProviderDisableListInitialUiState()
@@ -119,7 +118,8 @@ class CredentialManagerRepo(
                        disabledProviders = providerDisableListUiState,
                        disabledProviders = providerDisableListUiState,
                        defaultProviderIdPreferredByApp =
                        defaultProviderIdPreferredByApp =
                        requestDisplayInfoUiState.appPreferredDefaultProviderId,
                        requestDisplayInfoUiState.appPreferredDefaultProviderId,
                        defaultProviderIdSetByUser = defaultProviderIdSetByUser,
                        defaultProviderIdsSetByUser =
                        requestDisplayInfoUiState.userSetDefaultProviderIds,
                        requestDisplayInfo = requestDisplayInfoUiState,
                        requestDisplayInfo = requestDisplayInfoUiState,
                        isOnPasskeyIntroStateAlready = false,
                        isOnPasskeyIntroStateAlready = false,
                        isPasskeyFirstUse = isPasskeyFirstUse,
                        isPasskeyFirstUse = isPasskeyFirstUse,
+0 −35
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.credentialmanager

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
import com.android.credentialmanager.common.Constants


class CredentialProviderReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context?, intent: Intent?) {
        Log.d(Constants.LOG_TAG, "Received intent in CredentialProviderReceiver")

        val sharedPreferences = context?.getSharedPreferences(context?.packageName,
                Context.MODE_PRIVATE)
        sharedPreferences?.edit()?.remove(UserConfigRepo.DEFAULT_PROVIDER)?.commit()
    }
}
 No newline at end of file
+7 −53
Original line number Original line Diff line number Diff line
@@ -255,7 +255,8 @@ class CredentialSelectorViewModel(
            disabledProviders = prevUiState.disabledProviders,
            disabledProviders = prevUiState.disabledProviders,
            defaultProviderIdPreferredByApp =
            defaultProviderIdPreferredByApp =
            prevUiState.requestDisplayInfo.appPreferredDefaultProviderId,
            prevUiState.requestDisplayInfo.appPreferredDefaultProviderId,
            defaultProviderIdSetByUser = userConfigRepo.getDefaultProviderId(),
            defaultProviderIdsSetByUser =
            prevUiState.requestDisplayInfo.userSetDefaultProviderIds,
            requestDisplayInfo = prevUiState.requestDisplayInfo,
            requestDisplayInfo = prevUiState.requestDisplayInfo,
            isOnPasskeyIntroStateAlready = true,
            isOnPasskeyIntroStateAlready = true,
            isPasskeyFirstUse = userConfigRepo.getIsPasskeyFirstUse()
            isPasskeyFirstUse = userConfigRepo.getIsPasskeyFirstUse()
@@ -269,28 +270,10 @@ class CredentialSelectorViewModel(
        userConfigRepo.setIsPasskeyFirstUse(false)
        userConfigRepo.setIsPasskeyFirstUse(false)
    }
    }


    fun createFlowOnMoreOptionsSelectedOnProviderSelection() {
        uiState = uiState.copy(
            createCredentialUiState = uiState.createCredentialUiState?.copy(
                currentScreenState = CreateScreenState.MORE_OPTIONS_SELECTION,
                isFromProviderSelection = true
            )
        )
    }

    fun createFlowOnMoreOptionsSelectedOnCreationSelection() {
    fun createFlowOnMoreOptionsSelectedOnCreationSelection() {
        uiState = uiState.copy(
        uiState = uiState.copy(
            createCredentialUiState = uiState.createCredentialUiState?.copy(
            createCredentialUiState = uiState.createCredentialUiState?.copy(
                currentScreenState = CreateScreenState.MORE_OPTIONS_SELECTION,
                currentScreenState = CreateScreenState.MORE_OPTIONS_SELECTION,
                isFromProviderSelection = false
            )
        )
    }

    fun createFlowOnBackProviderSelectionButtonSelected() {
        uiState = uiState.copy(
            createCredentialUiState = uiState.createCredentialUiState?.copy(
                currentScreenState = CreateScreenState.PROVIDER_SELECTION,
            )
            )
        )
        )
    }
    }
@@ -315,7 +298,10 @@ class CredentialSelectorViewModel(
        uiState = uiState.copy(
        uiState = uiState.copy(
            createCredentialUiState = uiState.createCredentialUiState?.copy(
            createCredentialUiState = uiState.createCredentialUiState?.copy(
                currentScreenState =
                currentScreenState =
                if (activeEntry.activeProvider.id == userConfigRepo.getDefaultProviderId() ||
                if (uiState.createCredentialUiState?.requestDisplayInfo?.userSetDefaultProviderIds
                        ?.contains(activeEntry.activeProvider.id) ?: true ||
                    !(uiState.createCredentialUiState?.foundCandidateFromUserDefaultProvider
                    ?: false) ||
                    !TextUtils.isEmpty(uiState.createCredentialUiState?.requestDisplayInfo
                    !TextUtils.isEmpty(uiState.createCredentialUiState?.requestDisplayInfo
                        ?.appPreferredDefaultProviderId))
                        ?.appPreferredDefaultProviderId))
                    CreateScreenState.CREATION_OPTION_SELECTION
                    CreateScreenState.CREATION_OPTION_SELECTION
@@ -325,18 +311,7 @@ class CredentialSelectorViewModel(
        )
        )
    }
    }


    fun createFlowOnEntrySelectedFromFirstUseScreen(activeEntry: ActiveEntry) {
    fun createFlowOnLaunchSettings() {
        val providerId = activeEntry.activeProvider.id
        createFlowOnDefaultChanged(providerId)
        uiState = uiState.copy(
            createCredentialUiState = uiState.createCredentialUiState?.copy(
                currentScreenState = CreateScreenState.CREATION_OPTION_SELECTION,
                activeEntry = activeEntry
            )
        )
    }

    fun createFlowOnDisabledProvidersSelected() {
        credManRepo.onSettingLaunchCancel()
        credManRepo.onSettingLaunchCancel()
        uiState = uiState.copy(dialogState = DialogState.CANCELED_FOR_SETTINGS)
        uiState = uiState.copy(dialogState = DialogState.CANCELED_FOR_SETTINGS)
    }
    }
@@ -349,16 +324,6 @@ class CredentialSelectorViewModel(
        )
        )
    }
    }


    fun createFlowOnChangeDefaultSelected() {
        uiState = uiState.copy(
            createCredentialUiState = uiState.createCredentialUiState?.copy(
                currentScreenState = CreateScreenState.CREATION_OPTION_SELECTION,
            )
        )
        val providerId = uiState.createCredentialUiState?.activeEntry?.activeProvider?.id
        createFlowOnDefaultChanged(providerId)
    }

    fun createFlowOnUseOnceSelected() {
    fun createFlowOnUseOnceSelected() {
        uiState = uiState.copy(
        uiState = uiState.copy(
            createCredentialUiState = uiState.createCredentialUiState?.copy(
            createCredentialUiState = uiState.createCredentialUiState?.copy(
@@ -367,17 +332,6 @@ class CredentialSelectorViewModel(
        )
        )
    }
    }


    fun createFlowOnDefaultChanged(providerId: String?) {
        if (providerId != null) {
            Log.d(
                Constants.LOG_TAG, "Default provider changed to: " +
                " {provider=$providerId")
            userConfigRepo.setDefaultProvider(providerId)
        } else {
            Log.w(Constants.LOG_TAG, "Null provider is being changed")
        }
    }

    fun createFlowOnEntrySelected(selectedEntry: BaseEntry) {
    fun createFlowOnEntrySelected(selectedEntry: BaseEntry) {
        val providerId = selectedEntry.providerId
        val providerId = selectedEntry.providerId
        val entryKey = selectedEntry.entryKey
        val entryKey = selectedEntry.entryKey
+52 −50
Original line number Original line Diff line number Diff line
@@ -61,6 +61,7 @@ import androidx.credentials.provider.PasswordCredentialEntry
import androidx.credentials.provider.PublicKeyCredentialEntry
import androidx.credentials.provider.PublicKeyCredentialEntry
import androidx.credentials.provider.RemoteEntry
import androidx.credentials.provider.RemoteEntry
import org.json.JSONObject
import org.json.JSONObject
import java.time.Instant


// TODO: remove all !! checks
// TODO: remove all !! checks
fun getAppLabel(
fun getAppLabel(
@@ -420,7 +421,7 @@ class CreateFlowUtils {
                    id = it.providerFlattenedComponentName,
                    id = it.providerFlattenedComponentName,
                    displayName = providerLabel,
                    displayName = providerLabel,
                    icon = providerIcon,
                    icon = providerIcon,
                    createOptions = toCreationOptionInfoList(
                    sortedCreateOptions = toSortedCreationOptionInfoList(
                        it.providerFlattenedComponentName, it.saveEntries, context
                        it.providerFlattenedComponentName, it.saveEntries, context
                    ),
                    ),
                    remoteEntry = toRemoteInfo(it.providerFlattenedComponentName, it.remoteEntry),
                    remoteEntry = toRemoteInfo(it.providerFlattenedComponentName, it.remoteEntry),
@@ -483,6 +484,7 @@ class CreateFlowUtils {
                    context.getDrawable(R.drawable.ic_password_24) ?: return null,
                    context.getDrawable(R.drawable.ic_password_24) ?: return null,
                    preferImmediatelyAvailableCredentials = false,
                    preferImmediatelyAvailableCredentials = false,
                    appPreferredDefaultProviderId = appPreferredDefaultProviderId,
                    appPreferredDefaultProviderId = appPreferredDefaultProviderId,
                    userSetDefaultProviderIds = requestInfo.defaultProviderIds.toSet(),
                )
                )
                is CreatePublicKeyCredentialRequest -> {
                is CreatePublicKeyCredentialRequest -> {
                    newRequestDisplayInfoFromPasskeyJson(
                    newRequestDisplayInfoFromPasskeyJson(
@@ -492,6 +494,7 @@ class CreateFlowUtils {
                        preferImmediatelyAvailableCredentials =
                        preferImmediatelyAvailableCredentials =
                        createCredentialRequestJetpack.preferImmediatelyAvailableCredentials,
                        createCredentialRequestJetpack.preferImmediatelyAvailableCredentials,
                        appPreferredDefaultProviderId = appPreferredDefaultProviderId,
                        appPreferredDefaultProviderId = appPreferredDefaultProviderId,
                        userSetDefaultProviderIds = requestInfo.defaultProviderIds.toSet(),
                    )
                    )
                }
                }
                is CreateCustomCredentialRequest -> {
                is CreateCustomCredentialRequest -> {
@@ -508,6 +511,7 @@ class CreateFlowUtils {
                            ?: context.getDrawable(R.drawable.ic_other_sign_in_24) ?: return null,
                            ?: context.getDrawable(R.drawable.ic_other_sign_in_24) ?: return null,
                        preferImmediatelyAvailableCredentials = false,
                        preferImmediatelyAvailableCredentials = false,
                        appPreferredDefaultProviderId = appPreferredDefaultProviderId,
                        appPreferredDefaultProviderId = appPreferredDefaultProviderId,
                        userSetDefaultProviderIds = requestInfo.defaultProviderIds.toSet(),
                    )
                    )
                }
                }
                else -> null
                else -> null
@@ -518,13 +522,13 @@ class CreateFlowUtils {
            enabledProviders: List<EnabledProviderInfo>,
            enabledProviders: List<EnabledProviderInfo>,
            disabledProviders: List<DisabledProviderInfo>?,
            disabledProviders: List<DisabledProviderInfo>?,
            defaultProviderIdPreferredByApp: String?,
            defaultProviderIdPreferredByApp: String?,
            defaultProviderIdSetByUser: String?,
            defaultProviderIdsSetByUser: Set<String>,
            requestDisplayInfo: RequestDisplayInfo,
            requestDisplayInfo: RequestDisplayInfo,
            isOnPasskeyIntroStateAlready: Boolean,
            isOnPasskeyIntroStateAlready: Boolean,
            isPasskeyFirstUse: Boolean,
            isPasskeyFirstUse: Boolean,
        ): CreateCredentialUiState? {
        ): CreateCredentialUiState? {
            var lastSeenProviderWithNonEmptyCreateOptions: EnabledProviderInfo? = null
            var remoteEntry: RemoteInfo? = null
            var remoteEntry: RemoteInfo? = null
            var remoteEntryProvider: EnabledProviderInfo? = null
            var defaultProviderPreferredByApp: EnabledProviderInfo? = null
            var defaultProviderPreferredByApp: EnabledProviderInfo? = null
            var defaultProviderSetByUser: EnabledProviderInfo? = null
            var defaultProviderSetByUser: EnabledProviderInfo? = null
            var createOptionsPairs:
            var createOptionsPairs:
@@ -535,14 +539,24 @@ class CreateFlowUtils {
                        defaultProviderPreferredByApp = enabledProvider
                        defaultProviderPreferredByApp = enabledProvider
                    }
                    }
                }
                }
                if (defaultProviderIdSetByUser != null) {
                if (enabledProvider.sortedCreateOptions.isNotEmpty() &&
                    if (enabledProvider.id == defaultProviderIdSetByUser) {
                    defaultProviderIdsSetByUser.contains(enabledProvider.id)) {
                    if (defaultProviderSetByUser == null) {
                        defaultProviderSetByUser = enabledProvider
                        defaultProviderSetByUser = enabledProvider
                    } else {
                        val newLastUsedTime = enabledProvider.sortedCreateOptions.firstOrNull()
                          ?.lastUsedTime
                        val curLastUsedTime = defaultProviderSetByUser?.sortedCreateOptions
                        ?.firstOrNull()?.lastUsedTime ?: Instant.MIN
                        if (newLastUsedTime != null) {
                            if (curLastUsedTime == null || newLastUsedTime > curLastUsedTime) {
                                defaultProviderSetByUser = enabledProvider
                            }
                        }
                        }
                    }
                    }
                if (enabledProvider.createOptions.isNotEmpty()) {
                }
                    lastSeenProviderWithNonEmptyCreateOptions = enabledProvider
                if (enabledProvider.sortedCreateOptions.isNotEmpty()) {
                    enabledProvider.createOptions.forEach {
                    enabledProvider.sortedCreateOptions.forEach {
                        createOptionsPairs.add(Pair(it, enabledProvider))
                        createOptionsPairs.add(Pair(it, enabledProvider))
                    }
                    }
                }
                }
@@ -554,6 +568,7 @@ class CreateFlowUtils {
                        return null
                        return null
                    }
                    }
                    remoteEntry = currRemoteEntry
                    remoteEntry = currRemoteEntry
                    remoteEntryProvider = enabledProvider
                }
                }
            }
            }
            val defaultProvider = defaultProviderPreferredByApp ?: defaultProviderSetByUser
            val defaultProvider = defaultProviderPreferredByApp ?: defaultProviderSetByUser
@@ -561,27 +576,26 @@ class CreateFlowUtils {
                createOptionSize = createOptionsPairs.size,
                createOptionSize = createOptionsPairs.size,
                isOnPasskeyIntroStateAlready = isOnPasskeyIntroStateAlready,
                isOnPasskeyIntroStateAlready = isOnPasskeyIntroStateAlready,
                requestDisplayInfo = requestDisplayInfo,
                requestDisplayInfo = requestDisplayInfo,
                defaultProvider = defaultProvider,
                remoteEntry = remoteEntry,
                remoteEntry = remoteEntry,
                isPasskeyFirstUse = isPasskeyFirstUse
                isPasskeyFirstUse = isPasskeyFirstUse
            ) ?: return null
            ) ?: return null
            val sortedCreateOptionsPairs = createOptionsPairs.sortedWith(
                compareByDescending { it.first.lastUsedTime }
            )
            return CreateCredentialUiState(
            return CreateCredentialUiState(
                enabledProviders = enabledProviders,
                enabledProviders = enabledProviders,
                disabledProviders = disabledProviders,
                disabledProviders = disabledProviders,
                currentScreenState = initialScreenState,
                currentScreenState = initialScreenState,
                requestDisplayInfo = requestDisplayInfo,
                requestDisplayInfo = requestDisplayInfo,
                sortedCreateOptionsPairs = createOptionsPairs.sortedWith(
                sortedCreateOptionsPairs = sortedCreateOptionsPairs,
                    compareByDescending { it.first.lastUsedTime }
                ),
                hasDefaultProvider = defaultProvider != null,
                activeEntry = toActiveEntry(
                activeEntry = toActiveEntry(
                    /*defaultProvider=*/defaultProvider,
                    defaultProvider = defaultProvider,
                    /*createOptionSize=*/createOptionsPairs.size,
                    sortedCreateOptionsPairs = sortedCreateOptionsPairs,
                    /*lastSeenProviderWithNonEmptyCreateOptions=*/
                    remoteEntry = remoteEntry,
                    lastSeenProviderWithNonEmptyCreateOptions,
                    remoteEntryProvider = remoteEntryProvider,
                    /*remoteEntry=*/remoteEntry
                ),
                ),
                remoteEntry = remoteEntry,
                remoteEntry = remoteEntry,
                foundCandidateFromUserDefaultProvider = defaultProviderSetByUser != null,
            )
            )
        }
        }


@@ -589,59 +603,43 @@ class CreateFlowUtils {
            createOptionSize: Int,
            createOptionSize: Int,
            isOnPasskeyIntroStateAlready: Boolean,
            isOnPasskeyIntroStateAlready: Boolean,
            requestDisplayInfo: RequestDisplayInfo,
            requestDisplayInfo: RequestDisplayInfo,
            defaultProvider: EnabledProviderInfo?,
            remoteEntry: RemoteInfo?,
            remoteEntry: RemoteInfo?,
            isPasskeyFirstUse: Boolean,
            isPasskeyFirstUse: Boolean,
        ): CreateScreenState? {
        ): CreateScreenState? {
            return if (isPasskeyFirstUse && requestDisplayInfo.type ==
            return if (isPasskeyFirstUse && requestDisplayInfo.type == CredentialType.PASSKEY &&
                CredentialType.PASSKEY && !isOnPasskeyIntroStateAlready) {
                !isOnPasskeyIntroStateAlready) {
                CreateScreenState.PASSKEY_INTRO
                CreateScreenState.PASSKEY_INTRO
            } else if ((defaultProvider == null || defaultProvider.createOptions.isEmpty()) &&
                createOptionSize > 1) {
                CreateScreenState.PROVIDER_SELECTION
            } else if (((defaultProvider == null || defaultProvider.createOptions.isEmpty()) &&
                    createOptionSize == 1) || (defaultProvider != null &&
                    defaultProvider.createOptions.isNotEmpty())) {
                CreateScreenState.CREATION_OPTION_SELECTION
            } else if (createOptionSize == 0 && remoteEntry != null) {
            } else if (createOptionSize == 0 && remoteEntry != null) {
                CreateScreenState.EXTERNAL_ONLY_SELECTION
                CreateScreenState.EXTERNAL_ONLY_SELECTION
            } else {
            } else {
                Log.d(
                CreateScreenState.CREATION_OPTION_SELECTION
                    Constants.LOG_TAG,
                    "Unexpected failure: the screen state failed to instantiate" +
                        " because the provider list is empty."
                )
                null
            }
            }
        }
        }


        private fun toActiveEntry(
        private fun toActiveEntry(
            defaultProvider: EnabledProviderInfo?,
            defaultProvider: EnabledProviderInfo?,
            createOptionSize: Int,
            sortedCreateOptionsPairs: List<Pair<CreateOptionInfo, EnabledProviderInfo>>,
            lastSeenProviderWithNonEmptyCreateOptions: EnabledProviderInfo?,
            remoteEntry: RemoteInfo?,
            remoteEntry: RemoteInfo?,
            remoteEntryProvider: EnabledProviderInfo?,
        ): ActiveEntry? {
        ): ActiveEntry? {
            return if (
            return if (
                defaultProvider != null && defaultProvider.createOptions.isEmpty() &&
                sortedCreateOptionsPairs.isEmpty() && remoteEntry != null &&
                remoteEntry != null
                remoteEntryProvider != null
            ) {
                ActiveEntry(defaultProvider, remoteEntry)
            } else if (
                defaultProvider != null && defaultProvider.createOptions.isNotEmpty()
            ) {
            ) {
                ActiveEntry(defaultProvider, defaultProvider.createOptions.first())
                ActiveEntry(remoteEntryProvider, remoteEntry)
            } else if (createOptionSize == 1) {
            } else if (defaultProvider != null &&
                ActiveEntry(
                defaultProvider.sortedCreateOptions.isNotEmpty()) {
                    lastSeenProviderWithNonEmptyCreateOptions!!,
                ActiveEntry(defaultProvider, defaultProvider.sortedCreateOptions.first())
                    lastSeenProviderWithNonEmptyCreateOptions.createOptions.first()
            } else if (sortedCreateOptionsPairs.isNotEmpty()) {
                )
                val (topEntry, topEntryProvider) = sortedCreateOptionsPairs.first()
                ActiveEntry(topEntryProvider, topEntry)
            } else null
            } else null
        }
        }


        /**
        /**
         * Note: caller required handle empty list due to parsing error.
         * Note: caller required handle empty list due to parsing error.
         */
         */
        private fun toCreationOptionInfoList(
        private fun toSortedCreationOptionInfoList(
            providerId: String,
            providerId: String,
            creationEntries: List<Entry>,
            creationEntries: List<Entry>,
            context: Context,
            context: Context,
@@ -664,7 +662,9 @@ class CreateFlowUtils {
                    footerDescription = createEntry.description?.toString()
                    footerDescription = createEntry.description?.toString()
                ))
                ))
            }
            }
            return result
            return result.sortedWith(
                compareByDescending { it.lastUsedTime }
            )
        }
        }


        private fun toRemoteInfo(
        private fun toRemoteInfo(
@@ -690,6 +690,7 @@ class CreateFlowUtils {
            context: Context,
            context: Context,
            preferImmediatelyAvailableCredentials: Boolean,
            preferImmediatelyAvailableCredentials: Boolean,
            appPreferredDefaultProviderId: String?,
            appPreferredDefaultProviderId: String?,
            userSetDefaultProviderIds: Set<String>,
        ): RequestDisplayInfo? {
        ): RequestDisplayInfo? {
            val json = JSONObject(requestJson)
            val json = JSONObject(requestJson)
            var passkeyUsername = ""
            var passkeyUsername = ""
@@ -711,6 +712,7 @@ class CreateFlowUtils {
                context.getDrawable(R.drawable.ic_passkey_24) ?: return null,
                context.getDrawable(R.drawable.ic_passkey_24) ?: return null,
                preferImmediatelyAvailableCredentials,
                preferImmediatelyAvailableCredentials,
                appPreferredDefaultProviderId,
                appPreferredDefaultProviderId,
                userSetDefaultProviderIds,
            )
            )
        }
        }
    }
    }
Loading