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

Commit 33571fb8 authored by TYM Tsai's avatar TYM Tsai Committed by Ahaan Ugale
Browse files

Add bottom sheet fill UI for Autofill

Create the fill dialog UI. Its layout is similar to FillUi but uses
dialog styles similar to SaveUi.

Bug: 210926084
Test: Manual
Change-Id: I9e5dfcc1cd0afdc8cc26ede401418dbfa2467d23
parent 2e6dda88
Loading
Loading
Loading
Loading
+115 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2022 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.
-->

<!-- NOTE: outer layout is required to provide proper shadow. -->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/autofill_dialog_picker"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/autofill_save_outer_top_margin"
    android:padding="@dimen/autofill_save_outer_top_padding"
    android:elevation="@dimen/autofill_elevation"
    android:background="?android:attr/colorBackground"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:paddingStart="@dimen/autofill_save_inner_padding"
        android:paddingEnd="@dimen/autofill_save_inner_padding"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/autofill_service_icon"
            android:scaleType="fitStart"
            android:visibility="gone"
            android:layout_width="@dimen/autofill_dialog_icon_size"
            android:layout_height="@dimen/autofill_dialog_icon_size"/>

        <LinearLayout
            android:id="@+id/autofill_dialog_header"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:paddingStart="@dimen/autofill_save_inner_padding"
            android:paddingEnd="@dimen/autofill_save_inner_padding"
            android:visibility="gone"
            android:foreground="?attr/listChoiceBackgroundIndicator"
            style="@style/AutofillDatasetPicker" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/autofill_dialog_container"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:paddingStart="@dimen/autofill_save_inner_padding"
        android:paddingEnd="@dimen/autofill_save_inner_padding"
        android:visibility="gone"
        android:foreground="?attr/listChoiceBackgroundIndicator"
        style="@style/AutofillDatasetPicker" />

    <ListView
        android:id="@+id/autofill_dialog_list"
        android:layout_weight="1"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:drawSelectorOnTop="true"
        android:clickable="true"
        android:divider="@null"
        android:visibility="gone"
        android:paddingStart="@dimen/autofill_save_inner_padding"
        android:paddingEnd="@dimen/autofill_save_inner_padding"
        android:foreground="?attr/listChoiceBackgroundIndicator"
        style="@style/AutofillDatasetPicker" />

    <com.android.internal.widget.ButtonBarLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end"
        android:padding="@dimen/autofill_save_button_bar_padding"
        android:clipToPadding="false"
        android:orientation="horizontal">

        <Button
            android:id="@+id/autofill_dialog_no"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="?android:attr/buttonBarButtonStyle"
            android:text="@string/dismiss_action">
        </Button>

        <Space
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:visibility="invisible">
        </Space>

        <Button
            android:id="@+id/autofill_dialog_yes"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@style/Widget.DeviceDefault.Button.Colored"
            android:text="@string/autofill_save_yes"
            android:visibility="gone" >
        </Button>

    </com.android.internal.widget.ButtonBarLayout>

</LinearLayout>
+3 −0
Original line number Diff line number Diff line
@@ -877,6 +877,9 @@
    <!-- Maximum number of datasets that are visible in the UX picker without scrolling -->
    <integer name="autofill_max_visible_datasets">3</integer>

    <!-- Size of an icon in the Autolfill fill dialog -->
    <dimen name="autofill_dialog_icon_size">56dp</dimen>

    <!-- Size of a slice shortcut view -->
    <dimen name="slice_shortcut_size">56dp</dimen>
    <!-- Size of action icons in a slice -->
+8 −0
Original line number Diff line number Diff line
@@ -3504,6 +3504,7 @@
  <java-symbol type="layout" name="autofill_dataset_picker"/>
  <java-symbol type="layout" name="autofill_dataset_picker_fullscreen"/>
  <java-symbol type="layout" name="autofill_dataset_picker_header_footer"/>
  <java-symbol type="layout" name="autofill_fill_dialog"/>
  <java-symbol type="id" name="autofill" />
  <java-symbol type="id" name="autofill_dataset_footer"/>
  <java-symbol type="id" name="autofill_dataset_header"/>
@@ -3516,6 +3517,13 @@
  <java-symbol type="id" name="autofill_save_no" />
  <java-symbol type="id" name="autofill_save_title" />
  <java-symbol type="id" name="autofill_save_yes" />
  <java-symbol type="id" name="autofill_service_icon" />
  <java-symbol type="id" name="autofill_dialog_picker"/>
  <java-symbol type="id" name="autofill_dialog_header"/>
  <java-symbol type="id" name="autofill_dialog_container"/>
  <java-symbol type="id" name="autofill_dialog_list"/>
  <java-symbol type="id" name="autofill_dialog_no" />
  <java-symbol type="id" name="autofill_dialog_yes" />
  <java-symbol type="string" name="autofill_error_cannot_autofill" />
  <java-symbol type="string" name="autofill_picker_no_suggestions" />
  <java-symbol type="string" name="autofill_picker_some_suggestions" />
+54 −4
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ public final class AutoFillUI {

    private @Nullable FillUi mFillUi;
    private @Nullable SaveUi mSaveUi;
    private @Nullable DialogFillUi mFillDialog;

    private @Nullable AutoFillUiCallback mCallback;

@@ -387,7 +388,48 @@ public final class AutoFillUI {
                    + componentName.toShortString() + ": " + response);
        }

        // TODO show fill dialog
        // TODO: enable LogMaker

        mHandler.post(() -> {
            if (callback != mCallback) {
                return;
            }
            hideAllUiThread(callback);
            mFillDialog = new DialogFillUi(mContext, response, focusedId, filterText,
                    serviceIcon, servicePackageName, componentName, mOverlayControl,
                    mUiModeMgr.isNightMode(), new DialogFillUi.UiCallback() {
                        @Override
                        public void onResponsePicked(FillResponse response) {
                            hideFillDialogUiThread(callback);
                            if (mCallback != null) {
                                mCallback.authenticate(response.getRequestId(),
                                        AutofillManager.AUTHENTICATION_ID_DATASET_ID_UNDEFINED,
                                        response.getAuthentication(), response.getClientState(),
                                        /* authenticateInline= */ false);
                            }
                        }

                        @Override
                        public void onDatasetPicked(Dataset dataset) {
                            hideFillDialogUiThread(callback);
                            if (mCallback != null) {
                                final int datasetIndex = response.getDatasets().indexOf(dataset);
                                mCallback.fill(response.getRequestId(), datasetIndex, dataset);
                            }
                        }

                        @Override
                        public void onCanceled() {
                            hideFillDialogUiThread(callback);
                            callback.requestShowSoftInput(focusedId);
                        }

                        @Override
                        public void startIntentSender(IntentSender intentSender) {
                            mCallback.startIntentSenderAndFinishSession(intentSender);
                        }
                    });
        });
    }

    /**
@@ -423,8 +465,7 @@ public final class AutoFillUI {
    }

    public boolean isFillDialogShowing() {
        // TODO
        return false;
        return mFillDialog == null ? false : mFillDialog.isShowing();
    }

    public void dump(PrintWriter pw) {
@@ -444,6 +485,12 @@ public final class AutoFillUI {
        } else {
            pw.print(prefix); pw.println("showsSaveUi: false");
        }
        if (mFillDialog != null) {
            pw.print(prefix); pw.println("showsFillDialog: true");
            mFillDialog.dump(pw, prefix2);
        } else {
            pw.print(prefix); pw.println("showsFillDialog: false");
        }
    }

    @android.annotation.UiThread
@@ -470,7 +517,10 @@ public final class AutoFillUI {

    @android.annotation.UiThread
    private void hideFillDialogUiThread(@Nullable AutoFillUiCallback callback) {
        // TODO
        if (mFillDialog != null && (callback == null || callback == mCallback)) {
            mFillDialog.destroy();
            mFillDialog = null;
        }
    }

    @android.annotation.UiThread
+629 −0

File added.

Preview size limit exceeded, changes collapsed.