diff options
9 files changed, 139 insertions, 132 deletions
diff --git a/packages/CredentialManager/res/drawable/autofill_light_selectable_item_background.xml b/packages/CredentialManager/res/drawable/autofill_light_selectable_item_background.xml deleted file mode 100644 index 9d16f32db932..000000000000 --- a/packages/CredentialManager/res/drawable/autofill_light_selectable_item_background.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<!-- - ~ 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. - --> - -<!-- Copied from //frameworks/base/core/res/res/drawable/item_background_material.xml --> -<ripple xmlns:android="http://schemas.android.com/apk/res/android" - android:color="@color/autofill_light_colorControlHighlight"> - <item android:id="@android:id/mask"> - <color android:color="@android:color/white"/> - </item> -</ripple>
\ No newline at end of file diff --git a/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_one.xml b/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_one.xml index 2f0c83b6556a..5becc86927d2 100644 --- a/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_one.xml +++ b/packages/CredentialManager/res/drawable/fill_dialog_dynamic_list_item_one.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <!-- - ~ Copyright (C) 2023 The Android Open Source Project + ~ Copyright (C) 2024 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. @@ -23,8 +23,8 @@ android:shape="rectangle" android:top="1dp"> <shape> - <corners android:radius="28dp" /> - <solid android:color="@android:color/system_surface_container_high_light" /> + <corners android:radius="16dp" /> + <solid android:color="@color/dropdown_container" /> </shape> </item> </ripple>
\ No newline at end of file diff --git a/packages/CredentialManager/res/layout/autofill_dataset_left_with_item_tag_hint.xml b/packages/CredentialManager/res/layout/autofill_dataset_left_with_item_tag_hint.xml deleted file mode 100644 index e4e9f7ac85a9..000000000000 --- a/packages/CredentialManager/res/layout/autofill_dataset_left_with_item_tag_hint.xml +++ /dev/null @@ -1,37 +0,0 @@ -<!-- - ~ 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. - --> - -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@android:id/content" - android:layout_width="match_parent" - android:layout_height="wrap_content" - style="@style/autofill.Dataset"> - <ImageView - android:id="@android:id/icon1" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_centerVertical="true" - android:layout_alignParentStart="true" - android:background="@null"/> - <TextView - android:id="@android:id/text1" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentTop="true" - android:layout_toEndOf="@android:id/icon1" - style="@style/autofill.TextAppearance"/> - -</RelativeLayout> diff --git a/packages/CredentialManager/res/layout/credman_dropdown_presentation_layout.xml b/packages/CredentialManager/res/layout/credman_dropdown_presentation_layout.xml new file mode 100644 index 000000000000..cb6c6b473244 --- /dev/null +++ b/packages/CredentialManager/res/layout/credman_dropdown_presentation_layout.xml @@ -0,0 +1,45 @@ +<!-- + ~ 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. + --> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@android:id/content" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:maxWidth="@dimen/autofill_dropdown_layout_width" + android:elevation="3dp"> + + <ImageView + android:id="@android:id/icon1" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_alignParentStart="true" + android:background="@null"/> + <TextView + android:id="@android:id/text1" + android:layout_width="@dimen/autofill_dropdown_text_width" + android:layout_height="wrap_content" + android:layout_alignParentTop="true" + android:layout_toEndOf="@android:id/icon1" + style="@style/autofill.TextTitle"/> + <TextView + android:id="@android:id/text2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@android:id/text1" + android:layout_toEndOf="@android:id/icon1" + style="@style/autofill.TextSubtitle"/> + +</RelativeLayout> diff --git a/packages/CredentialManager/res/values/colors.xml b/packages/CredentialManager/res/values/colors.xml index 63b9f24d9033..dcb7ef9c3ed8 100644 --- a/packages/CredentialManager/res/values/colors.xml +++ b/packages/CredentialManager/res/values/colors.xml @@ -16,23 +16,8 @@ <!-- Color palette --> <resources> - <color name="autofill_light_colorPrimary">@color/primary_material_light</color> - <color name="autofill_light_colorAccent">@color/accent_material_light</color> - <color name="autofill_light_colorControlHighlight">@color/ripple_material_light</color> - <color name="autofill_light_colorButtonNormal">@color/button_material_light</color> - - <!-- Text colors --> - <color name="autofill_light_textColorPrimary">@color/abc_primary_text_material_light</color> - <color name="autofill_light_textColorSecondary">@color/abc_secondary_text_material_light</color> - <color name="autofill_light_textColorHint">@color/abc_hint_foreground_material_light</color> - <color name="autofill_light_textColorHintInverse">@color/abc_hint_foreground_material_dark - </color> - <color name="autofill_light_textColorHighlight">@color/highlighted_text_material_light</color> - <color name="autofill_light_textColorLink">@color/autofill_light_colorAccent</color> - <!-- These colors are used for Remote Views. --> - <color name="background_dark_mode">#0E0C0B</color> - <color name="background">#F1F3F4</color> - <color name="text_primary_dark_mode">#DFDEDB</color> - <color name="text_primary">#202124</color> + <color name="text_primary">#1A1B20</color> + <color name="text_secondary">#44474F</color> + <color name="dropdown_container">#F3F3FA</color> </resources>
\ No newline at end of file diff --git a/packages/CredentialManager/res/values/dimens.xml b/packages/CredentialManager/res/values/dimens.xml index 67003a330974..2a4719d027e2 100644 --- a/packages/CredentialManager/res/values/dimens.xml +++ b/packages/CredentialManager/res/values/dimens.xml @@ -17,6 +17,12 @@ --> <resources> - <dimen name="autofill_view_padding">16dp</dimen> - <dimen name="autofill_icon_size">16dp</dimen> + <dimen name="autofill_view_top_padding">12dp</dimen> + <dimen name="autofill_view_right_padding">24dp</dimen> + <dimen name="autofill_view_bottom_padding">12dp</dimen> + <dimen name="autofill_view_left_padding">16dp</dimen> + <dimen name="autofill_view_icon_to_text_padding">10dp</dimen> + <dimen name="autofill_icon_size">24dp</dimen> + <dimen name="autofill_dropdown_layout_width">296dp</dimen> + <dimen name="autofill_dropdown_text_width">240dp</dimen> </resources>
\ No newline at end of file diff --git a/packages/CredentialManager/res/values/styles.xml b/packages/CredentialManager/res/values/styles.xml index 4a5761acdd83..7de941ebd4a5 100644 --- a/packages/CredentialManager/res/values/styles.xml +++ b/packages/CredentialManager/res/values/styles.xml @@ -15,24 +15,13 @@ --> <resources> - <style name="autofill.TextAppearance.Small" parent="@style/autofill.TextAppearance"> - <item name="android:textSize">12sp</item> - </style> - - - <style name="autofill.Dataset" parent=""> - <item name="android:background">@drawable/autofill_light_selectable_item_background</item> - </style> - - <style name="autofill.TextAppearance" parent=""> - <item name="android:textColor">@color/autofill_light_textColorPrimary</item> - <item name="android:textColorHint">@color/autofill_light_textColorHint</item> - <item name="android:textColorHighlight">@color/autofill_light_textColorHighlight</item> - <item name="android:textColorLink">@color/autofill_light_textColorLink</item> + <style name="autofill.TextTitle" parent=""> + <item name="android:fontFamily">google-sans-medium</item> <item name="android:textSize">14sp</item> </style> - <style name="autofill.TextAppearance.Primary"> - <item name="android:textColor">@color/autofill_light_textColorPrimary</item> + <style name="autofill.TextSubtitle" parent=""> + <item name="android:fontFamily">google-sans-text</item> + <item name="android:textSize">12sp</item> </style> </resources>
\ No newline at end of file diff --git a/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt b/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt index b2c23a401117..58467afe43a4 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/autofill/CredentialAutofillService.kt @@ -57,6 +57,7 @@ import com.android.credentialmanager.common.ui.RemoteViewsFactory import com.android.credentialmanager.getflow.ProviderDisplayInfo import com.android.credentialmanager.getflow.toProviderDisplayInfo import com.android.credentialmanager.ktx.credentialEntry +import com.android.credentialmanager.model.CredentialType import com.android.credentialmanager.model.get.CredentialEntryInfo import com.android.credentialmanager.model.get.ProviderInfo import org.json.JSONException @@ -313,12 +314,14 @@ class CredentialAutofillService : AutofillService() { var i = 0 var datasetAdded = false - val duplicateDisplayNames: MutableMap<String, Boolean> = mutableMapOf() + val duplicateDisplayNamesForPasskeys: MutableMap<String, Boolean> = mutableMapOf() providerDisplayInfo.sortedUserNameToCredentialEntryList.forEach { val credentialEntry = it.sortedCredentialEntryList.first() - credentialEntry.displayName?.let {displayName -> - val duplicateEntry = duplicateDisplayNames.contains(displayName) - duplicateDisplayNames[displayName] = duplicateEntry + if (credentialEntry.credentialType == CredentialType.PASSKEY) { + credentialEntry.displayName?.let { displayName -> + val duplicateEntry = duplicateDisplayNamesForPasskeys.contains(displayName) + duplicateDisplayNamesForPasskeys[displayName] = duplicateEntry + } } } providerDisplayInfo.sortedUserNameToCredentialEntryList.forEach usernameLoop@{ @@ -355,12 +358,19 @@ class CredentialAutofillService : AutofillService() { } else { spec = inlinePresentationSpecs[inlinePresentationSpecsCount - 1] } - val displayName : String = primaryEntry.displayName ?: primaryEntry.userName + val displayName: String = if (primaryEntry.credentialType == CredentialType.PASSKEY + && primaryEntry.displayName != null) { + primaryEntry.displayName!! + } else { + primaryEntry.userName + } val sliceBuilder = InlineSuggestionUi .newContentBuilder(pendingIntent) .setTitle(displayName) sliceBuilder.setStartIcon(icon) - if (duplicateDisplayNames[displayName] == true) { + if (primaryEntry.credentialType == + CredentialType.PASSKEY && duplicateDisplayNamesForPasskeys[displayName] + == true) { sliceBuilder.setSubtitle(primaryEntry.userName) } inlinePresentation = InlinePresentation( diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/RemoteViewsFactory.kt b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/RemoteViewsFactory.kt index 4dc7f00c1550..e039dead043e 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/RemoteViewsFactory.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/RemoteViewsFactory.kt @@ -21,6 +21,7 @@ import android.content.res.Configuration import android.widget.RemoteViews import androidx.core.content.ContextCompat import com.android.credentialmanager.model.get.CredentialEntryInfo +import com.android.credentialmanager.model.CredentialType import android.graphics.drawable.Icon class RemoteViewsFactory { @@ -29,48 +30,87 @@ class RemoteViewsFactory { private const val setAdjustViewBoundsMethodName = "setAdjustViewBounds" private const val setMaxHeightMethodName = "setMaxHeight" private const val setBackgroundResourceMethodName = "setBackgroundResource" + private const val bulletPoint = "\u2022" + private const val passwordCharacterLength = 15 fun createDropdownPresentation( context: Context, icon: Icon, credentialEntryInfo: CredentialEntryInfo ): RemoteViews { - val padding = context.resources.getDimensionPixelSize(com.android - .credentialmanager.R.dimen.autofill_view_padding) var layoutId: Int = com.android.credentialmanager.R.layout - .autofill_dataset_left_with_item_tag_hint + .credman_dropdown_presentation_layout val remoteViews = RemoteViews(context.packageName, layoutId) - setRemoteViewsPaddings(remoteViews, padding) - val textColorPrimary = getTextColorPrimary(isDarkMode(context), context); - remoteViews.setTextColor(android.R.id.text1, textColorPrimary); - remoteViews.setTextViewText(android.R.id.text1, credentialEntryInfo.userName) - + if (credentialEntryInfo.credentialType == CredentialType.UNKNOWN) { + return remoteViews + } + setRemoteViewsPaddings(remoteViews, context) + if (credentialEntryInfo.credentialType == CredentialType.PASSKEY) { + val displayName = credentialEntryInfo.displayName ?: credentialEntryInfo.userName + remoteViews.setTextViewText(android.R.id.text1, displayName) + val secondaryText = if (credentialEntryInfo.displayName != null) + (credentialEntryInfo.userName + " " + bulletPoint + " " + + credentialEntryInfo.credentialTypeDisplayName + + " " + bulletPoint + " " + credentialEntryInfo.providerDisplayName) + else (credentialEntryInfo.credentialTypeDisplayName + " " + bulletPoint + " " + + credentialEntryInfo.providerDisplayName) + remoteViews.setTextViewText(android.R.id.text2, secondaryText) + } else { + remoteViews.setTextViewText(android.R.id.text1, credentialEntryInfo.userName) + remoteViews.setTextViewText(android.R.id.text2, + bulletPoint.repeat(passwordCharacterLength)) + } + val textColorPrimary = ContextCompat.getColor(context, + com.android.credentialmanager.R.color.text_primary) + remoteViews.setTextColor(android.R.id.text1, textColorPrimary) + val textColorSecondary = ContextCompat.getColor(context, com.android + .credentialmanager.R.color.text_secondary) + remoteViews.setTextColor(android.R.id.text2, textColorSecondary) remoteViews.setImageViewIcon(android.R.id.icon1, icon); remoteViews.setBoolean( android.R.id.icon1, setAdjustViewBoundsMethodName, true); remoteViews.setInt( android.R.id.icon1, - setMaxHeightMethodName, + setMaxHeightMethodName, context.resources.getDimensionPixelSize( com.android.credentialmanager.R.dimen.autofill_icon_size)); - val drawableId = if (isDarkMode(context)) - com.android.credentialmanager.R.drawable.fill_dialog_dynamic_list_item_one_dark - else com.android.credentialmanager.R.drawable.fill_dialog_dynamic_list_item_one + val drawableId = + com.android.credentialmanager.R.drawable.fill_dialog_dynamic_list_item_one remoteViews.setInt( android.R.id.content, setBackgroundResourceMethodName, drawableId); return remoteViews } private fun setRemoteViewsPaddings( - remoteViews: RemoteViews, - padding: Int) { - val halfPadding = padding / 2 + remoteViews: RemoteViews, context: Context) { + val leftPadding = context.resources.getDimensionPixelSize( + com.android.credentialmanager.R.dimen.autofill_view_left_padding) + val iconToTextPadding = context.resources.getDimensionPixelSize( + com.android.credentialmanager.R.dimen.autofill_view_icon_to_text_padding) + val rightPadding = context.resources.getDimensionPixelSize( + com.android.credentialmanager.R.dimen.autofill_view_right_padding) + val topPadding = context.resources.getDimensionPixelSize( + com.android.credentialmanager.R.dimen.autofill_view_top_padding) + val bottomPadding = context.resources.getDimensionPixelSize( + com.android.credentialmanager.R.dimen.autofill_view_bottom_padding) + remoteViews.setViewPadding( + android.R.id.icon1, + leftPadding, + /* top=*/0, + /* right=*/0, + /* bottom=*/0) remoteViews.setViewPadding( android.R.id.text1, - halfPadding, - halfPadding, - halfPadding, - halfPadding) + iconToTextPadding, + /* top=*/topPadding, + /* right=*/rightPadding, + /* bottom=*/0) + remoteViews.setViewPadding( + android.R.id.text2, + iconToTextPadding, + /* top=*/0, + /* right=*/rightPadding, + /* bottom=*/bottomPadding) } private fun isDarkMode(context: Context): Boolean { @@ -78,11 +118,5 @@ class RemoteViewsFactory { Configuration.UI_MODE_NIGHT_MASK return currentNightMode == Configuration.UI_MODE_NIGHT_YES } - - private fun getTextColorPrimary(darkMode: Boolean, context: Context): Int { - return if (darkMode) ContextCompat.getColor( - context, com.android.credentialmanager.R.color.text_primary_dark_mode) - else ContextCompat.getColor(context, com.android.credentialmanager.R.color.text_primary) - } } } |