Skip to content

Commit

Permalink
[PwdMessageDialog] Introduce editable dropdown to input username for
Browse files Browse the repository at this point in the history
update password dialog

There are 2 parts in this CL:
1. It splits PasswordEditDialogView int 2 separate classes:
one is used as the old view (when the feature flag is off), and
the other as the new one.
They share common parent class, which is also used in the binder.
2. AutoCompleteTextView is introduced in the new view, it allows
both to type in the username and to edit it.
It still needs to be styled appropriately to look more like spinner.
This is work in progress.

P. S. Username selection for the new PasswordEditDialogWithDetailsView
is not implemented in this CL, because it requires changing the int
parameter selectedUsernameId to String (because the goal is to allow
typing in new usernames).
The dropdown button will also be added in a separate CL.

Bug: 1315916
Change-Id: I5f295b3d5798d7c48b0d783b239cea34b4b58dc7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3613277
Reviewed-by: Ioana Pandele <ioanap@chromium.org>
Commit-Queue: Anna Tsvirchkova <atsvirchkova@google.com>
Cr-Commit-Position: refs/heads/main@{#1001446}
  • Loading branch information
Anna Tsvirchkova authored and Chromium LUCI CQ committed May 10, 2022
1 parent 7a34967 commit 0eb5648
Show file tree
Hide file tree
Showing 13 changed files with 608 additions and 408 deletions.
10 changes: 8 additions & 2 deletions chrome/browser/password_edit_dialog/android/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,14 @@ source_set("android") {

android_library("java") {
sources = [
"java/src/org/chromium/chrome/browser/password_edit_dialog/NoFilterArrayAdapter.java",
"java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogBridge.java",
"java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogCoordinator.java",
"java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogProperties.java",
"java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogView.java",
"java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogViewBinder.java",
"java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogWithDetailsView.java",
"java/src/org/chromium/chrome/browser/password_edit_dialog/UsernameSelectionConfirmationView.java",
]

deps = [
Expand Down Expand Up @@ -86,12 +90,14 @@ java_library("junit") {
android_library("javatests") {
testonly = true

sources = [ "java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogViewTest.java" ]
sources = [
"java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogWithDetailsViewTest.java",
"java/src/org/chromium/chrome/browser/password_edit_dialog/UsernameSelectionConfirmationViewTest.java",
]

deps = [
":java",
"//base:base_java_test_support",
"//chrome/browser/flags:java",
"//chrome/test/android:chrome_java_test_support",
"//content/public/test/android:content_java_test_support",
"//third_party/android_deps:material_design_java",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. -->

<org.chromium.chrome.browser.password_edit_dialog.PasswordEditDialogView
<org.chromium.chrome.browser.password_edit_dialog.UsernameSelectionConfirmationView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
Expand Down Expand Up @@ -39,29 +39,6 @@
android:layout_marginEnd="@dimen/password_edit_field_horizontal_margin"
android:layout_marginBottom="@dimen/password_edit_large_bottom_margin"/>

<!-- Password -->
<com.google.android.material.textfield.TextInputLayout
android:labelFor="@+id/password"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_marginTop="@dimen/password_edit_field_vertical_margin"
android:layout_marginBottom="@dimen/password_edit_field_vertical_margin"
android:visibility="gone"
app:endIconMode="password_toggle">

<EditText
tools:ignore="LabelFor"
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:imeOptions="flagNoExtractUi"
android:enabled="false"
android:focusable="false"
android:hint="@string/password_manager_password_label"
android:importantForAutofill="noExcludeDescendants"/>
</com.google.android.material.textfield.TextInputLayout>

<TextView
android:id="@+id/footer"
android:layout_width="match_parent"
Expand All @@ -72,4 +49,4 @@
android:layout_marginStart="@dimen/password_edit_field_horizontal_margin"
android:layout_marginEnd="@dimen/password_edit_field_horizontal_margin"
android:textAppearance="@style/TextAppearance.TextSmall.Secondary"/>
</org.chromium.chrome.browser.password_edit_dialog.PasswordEditDialogView>
</org.chromium.chrome.browser.password_edit_dialog.UsernameSelectionConfirmationView>
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file. -->

<org.chromium.chrome.browser.password_edit_dialog.PasswordEditDialogView
<org.chromium.chrome.browser.password_edit_dialog.PasswordEditDialogWithDetailsView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
Expand All @@ -13,34 +13,28 @@
style="@style/AlertDialogContent">

<!-- Usernames -->
<TextView
android:labelFor="@+id/usernames_spinner"
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/username_input_layout"
android:labelFor="@+id/username_view"
android:layout_marginBottom="@dimen/password_edit_field_vertical_margin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/password_edit_field_vertical_margin"
android:layout_marginStart="@dimen/password_edit_field_horizontal_margin"
android:layout_marginEnd="@dimen/password_edit_field_horizontal_margin"
android:textAppearance="@style/TextAppearance.TextMedium.Primary"
android:text="@string/password_manager_username_label" />
android:hint="@string/password_manager_username_label"
app:hintTextAppearance="@style/TextAppearance.TextMedium.Primary"
app:endIconTint="@color/default_icon_color_tint_list">

<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/usernames_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/password_edit_field_vertical_margin"
android:layout_marginStart="@dimen/password_edit_field_horizontal_margin"
android:layout_marginEnd="@dimen/password_edit_field_horizontal_margin"
android:textAppearance="@style/TextAppearance.TextLarge.Primary"
android:focusable="true"
android:focusableInTouchMode="true"/>
<AutoCompleteTextView
android:id="@+id/username_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/password_edit_field_padding_top"
android:focusableInTouchMode="true"
android:textAppearance="@style/TextAppearance.TextLarge.Primary"
android:inputType="text" />

<View style="@style/PreferenceSpinnerUnderlineView"
android:layout_marginStart="@dimen/password_edit_field_horizontal_margin"
android:layout_marginEnd="@dimen/password_edit_field_horizontal_margin"
android:layout_marginBottom="@dimen/password_edit_large_bottom_margin"/>
</com.google.android.material.textfield.TextInputLayout>

<!-- Password -->

<com.google.android.material.textfield.TextInputLayout
android:id="@+id/password_text_input_layout"
android:labelFor="@+id/password"
Expand Down Expand Up @@ -73,4 +67,4 @@
android:layout_marginStart="@dimen/password_edit_field_horizontal_margin"
android:layout_marginEnd="@dimen/password_edit_field_horizontal_margin"
android:textAppearance="@style/TextAppearance.TextSmall.Secondary"/>
</org.chromium.chrome.browser.password_edit_dialog.PasswordEditDialogView>
</org.chromium.chrome.browser.password_edit_dialog.PasswordEditDialogWithDetailsView>
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@
-->
<dimen name="password_edit_field_horizontal_margin">4dp</dimen>
<dimen name="password_edit_field_vertical_margin">8dp</dimen>
<dimen name="password_edit_field_padding_top">12dp</dimen>
<dimen name="password_edit_large_bottom_margin">16dp</dimen>
</resources>
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// Copyright 2022 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.chrome.browser.password_edit_dialog;

import android.content.Context;
import android.widget.ArrayAdapter;
import android.widget.Filter;

import androidx.annotation.NonNull;

import java.util.List;

/**
* This is subclass of ArrayAdapter, which discards any filtering.
* Can be used in {@link android.widget.AutoCompleteTextView} to show all string items,
* no matter if those items have any overlapping with user-typed string.
* @param <T> type of list-based item
*/
class NoFilterArrayAdapter<T> extends ArrayAdapter<T> {
private List<T> mItems;
private NoFilter mFilter;

public NoFilterArrayAdapter(@NonNull Context context, int resource, List<T> objects) {
super(context, resource, objects);
mItems = objects;
mFilter = new NoFilter();
}

@NonNull
@Override
public Filter getFilter() {
return mFilter;
}

class NoFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence arg0) {
FilterResults result = new FilterResults();
result.values = mItems;
result.count = mItems.size();
return result;
}

@Override
protected void publishResults(CharSequence arg0, FilterResults arg1) {
notifyDataSetChanged();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,15 +68,17 @@ interface Delegate {
static PasswordEditDialogCoordinator create(
@NonNull WindowAndroid windowAndroid, @NonNull Delegate delegate) {
Context context = windowAndroid.getContext().get();
PasswordEditDialogView dialogView =
(PasswordEditDialogView) LayoutInflater.from(context).inflate(
ChromeFeatureList.isEnabled(
ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
? R.layout.password_edit_dialog_with_details
: R.layout.password_edit_dialog,
null);
return new PasswordEditDialogCoordinator(
context, windowAndroid.getModalDialogManager(), dialogView, delegate);

return new PasswordEditDialogCoordinator(context, windowAndroid.getModalDialogManager(),
createPasswordEditDialogView(context), delegate);
}

private static PasswordEditDialogView createPasswordEditDialogView(Context context) {
return ChromeFeatureList.isEnabled(ChromeFeatureList.PASSWORD_EDIT_DIALOG_WITH_DETAILS)
? (PasswordEditDialogWithDetailsView) LayoutInflater.from(context).inflate(
R.layout.password_edit_dialog_with_details, null)
: (UsernameSelectionConfirmationView) LayoutInflater.from(context).inflate(
R.layout.password_edit_dialog, null);
}

/**
Expand Down Expand Up @@ -113,7 +115,7 @@ void show(@NonNull String[] usernames, int selectedUsernameIndex, @NonNull Strin
@NonNull String origin, @Nullable String account) {
createDialogViewModel(usernames, selectedUsernameIndex, password, account);
PropertyModelChangeProcessor.create(
mDialogViewModel, mDialogView, PasswordEditDialogView::bind);
mDialogViewModel, mDialogView, PasswordEditDialogViewBinder::bind);

createModelDialogModel();
mModalDialogManager.showDialog(mDialogModel, ModalDialogManager.ModalDialogType.TAB);
Expand Down

0 comments on commit 0eb5648

Please sign in to comment.