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

Commit 640e9b9b authored by Dake Gu's avatar Dake Gu Committed by Felipe Leme
Browse files

autofill: fix window location in splitwindow and dialog

autofill should use relative location to app window as PopupWindow
is based on relative location.

The fixed reverted changes made in compatibility mode CL that made
autofill window TYPE_SYSTEM_DIALOG.

Changing PopupWindow to use absolute screen location is another fix
choice, but it does not allow autofill window to be automatically
moved when app window changes location (e.g. adjust split window
separator or bring up IME)

The autofill window switches to TYPE_APPLICATION_ABOVE_SUB_PANEL with
IME disabled. So it still appears above IME and most other app
windows, unless app window is TYPE_APPLICATION_ABOVE_SUB_PANEL too.

Fixes: 73555917
Bug: 77587135
Test: manually tested compability mode with chrome amazon login
      manually tested splitted window
      atest CtsAutoFillServiceTestCases

Change-Id: I6b8ecf3fe7a91cebea1f7a868f4b15fbed8b0051
parent fd533c75
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -79,6 +79,12 @@ public class AutofillPopupWindow extends PopupWindow {
    public AutofillPopupWindow(@NonNull IAutofillWindowPresenter presenter) {
        mWindowPresenter = new WindowPresenter(presenter);

        // Here is a bit of voodoo - we want to show the window as system
        // controlled one so it covers app windows, but at the same time it has to be
        // an application type (so it's contained inside the application area).
        // Hence, we set it to the application type with the highest z-order, which currently
        // is TYPE_APPLICATION_ABOVE_SUB_PANEL.
        setWindowLayoutType(WindowManager.LayoutParams.TYPE_APPLICATION_ABOVE_SUB_PANEL);
        setTouchModal(false);
        setOutsideTouchable(true);
        setInputMethodMode(INPUT_METHOD_NOT_NEEDED);
+7 −5
Original line number Diff line number Diff line
@@ -656,6 +656,8 @@ final class FillUi {
        private final WindowManager mWm;
        private final View mContentView;
        private boolean mShowing;
        // Used on dump only
        private WindowManager.LayoutParams mShowParams;

        /**
         * Constructor.
@@ -672,16 +674,13 @@ final class FillUi {
         * Shows the window.
         */
        public void show(WindowManager.LayoutParams params) {
            mShowParams = params;
            if (sVerbose) {
                Slog.v(TAG, "show(): showing=" + mShowing + ", params=" + paramsToString(params));
            }
            try {
                // Okay here is a bit of voodoo - we want to show the window as system
                // controlled one so it covers app windows - adjust the params accordingly.
                params.type = WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;
                params.token = null;
                params.packageName = "android";
                params.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
                params.setTitle("Autofill UI"); // Title is set for debugging purposes
                if (!mShowing) {
                    params.accessibilityTitle = mContentView.getContext()
                            .getString(R.string.autofill_picker_accessibility_title);
@@ -760,6 +759,9 @@ final class FillUi {
            pw.println();
            pw.print(prefix2); pw.print("showing: "); pw.println(mWindow.mShowing);
            pw.print(prefix2); pw.print("view: "); pw.println(mWindow.mContentView);
            if (mWindow.mShowParams != null) {
                pw.print(prefix2); pw.print("params: "); pw.println(mWindow.mShowParams);
            }
            pw.print(prefix2); pw.print("screen coordinates: ");
            if (mWindow.mContentView == null) {
                pw.println("N/A");