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

Commit 4e7f5949 authored by Hongwei Wang's avatar Hongwei Wang
Browse files

Do not request focus on PiP menu if IME is up

Do not request focus on PiP menu window explicitly which can conflict
with an active IME.

Flag: EXEMPT bugfix
Bug: 381024863
Video: http://recall/-/aaaaaabFQoRHlzixHdtY/ersOMXu1r6PSPBPzDFr3JR
Test: Manual test, tap on PiP window when IME is up, see Video
Test: Manual test, make sure a11y works properly
Change-Id: Ie65d7e7e7c3d113c53890c3aa5880e1b11eaed25
parent cd7550be
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -123,11 +123,15 @@ public abstract class Pip1Module {
    static PhonePipMenuController providesPipPhoneMenuController(Context context,
            PipBoundsState pipBoundsState, PipMediaController pipMediaController,
            SystemWindows systemWindows,
            DisplayController displayController,
            DisplayInsetsController displayInsetsController,
            PipDisplayLayoutState pipDisplayLayoutState,
            PipUiEventLogger pipUiEventLogger,
            @ShellMainThread ShellExecutor mainExecutor,
            @ShellMainThread Handler mainHandler) {
        return new PhonePipMenuController(context, pipBoundsState, pipMediaController,
                systemWindows, pipUiEventLogger, mainExecutor, mainHandler);
                systemWindows, displayController, displayInsetsController, pipDisplayLayoutState,
                pipUiEventLogger, mainExecutor, mainHandler);
    }

    @WMSingleton
+4 −1
Original line number Diff line number Diff line
@@ -183,12 +183,15 @@ public abstract class Pip2Module {
            PipUiEventLogger pipUiEventLogger,
            PipTaskListener pipTaskListener,
            @NonNull PipTransitionState pipTransitionState,
            @NonNull DisplayController displayController,
            @NonNull DisplayInsetsController displayInsetsController,
            @NonNull PipDisplayLayoutState pipDisplayLayoutState,
            @ShellMainThread ShellExecutor mainExecutor,
            @ShellMainThread Handler mainHandler) {
        return new PhonePipMenuController(context, pipBoundsState, pipMediaController,
                systemWindows, pipUiEventLogger, pipTaskListener, pipTransitionState,
                pipDisplayLayoutState, mainExecutor, mainHandler);
                displayController, displayInsetsController, pipDisplayLayoutState,
                mainExecutor, mainHandler);
    }


+23 −2
Original line number Diff line number Diff line
@@ -33,9 +33,13 @@ import android.view.ViewRootImpl;
import android.view.WindowManagerGlobal;

import com.android.internal.protolog.ProtoLog;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayInsetsController;
import com.android.wm.shell.common.ImeListener;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SystemWindows;
import com.android.wm.shell.common.pip.PipBoundsState;
import com.android.wm.shell.common.pip.PipDisplayLayoutState;
import com.android.wm.shell.common.pip.PipMediaController;
import com.android.wm.shell.common.pip.PipMediaController.ActionListener;
import com.android.wm.shell.common.pip.PipMenuController;
@@ -106,6 +110,7 @@ public class PhonePipMenuController implements PipMenuController {
    private final ArrayList<Listener> mListeners = new ArrayList<>();
    private final SystemWindows mSystemWindows;
    private final PipUiEventLogger mPipUiEventLogger;
    private final PipDisplayLayoutState mPipDisplayLayoutState;

    private List<RemoteAction> mAppActions;
    private RemoteAction mCloseAction;
@@ -117,6 +122,8 @@ public class PhonePipMenuController implements PipMenuController {

    private SurfaceControl mLeash;

    private boolean mIsImeVisible;

    private ActionListener mMediaActionListener = new ActionListener() {
        @Override
        public void onMediaActionsChanged(List<RemoteAction> mediaActions) {
@@ -127,15 +134,27 @@ public class PhonePipMenuController implements PipMenuController {

    public PhonePipMenuController(Context context, PipBoundsState pipBoundsState,
            PipMediaController mediaController, SystemWindows systemWindows,
            DisplayController displayController,
            DisplayInsetsController displayInsetsController,
            PipDisplayLayoutState pipDisplayLayoutState,
            PipUiEventLogger pipUiEventLogger,
            ShellExecutor mainExecutor, Handler mainHandler) {
        mContext = context;
        mPipBoundsState = pipBoundsState;
        mMediaController = mediaController;
        mSystemWindows = systemWindows;
        mPipDisplayLayoutState = pipDisplayLayoutState;
        mMainExecutor = mainExecutor;
        mMainHandler = mainHandler;
        mPipUiEventLogger = pipUiEventLogger;

        displayInsetsController.addInsetsChangedListener(mPipDisplayLayoutState.getDisplayId(),
                new ImeListener(displayController, mPipDisplayLayoutState.getDisplayId()) {
                    @Override
                    protected void onImeVisibilityChanged(boolean imeVisible, int imeHeight) {
                        mIsImeVisible = imeVisible;
                    }
                });
    }

    public boolean isMenuVisible() {
@@ -506,10 +525,12 @@ public class PhonePipMenuController implements PipMenuController {
                mMediaController.removeActionListener(mMediaActionListener);
            }

            // Do not grant focus if IME is visible, which can cause the focus being granted
            // back and forth in between the IME and PiP menu, and causes flicker.
            final boolean grantFocus = !mIsImeVisible && (menuState != MENU_STATE_NONE);
            try {
                WindowManagerGlobal.getWindowSession().grantEmbeddedWindowFocus(null /* window */,
                        mSystemWindows.getFocusGrantToken(mPipMenuView),
                        menuState != MENU_STATE_NONE /* grantFocus */);
                        mSystemWindows.getFocusGrantToken(mPipMenuView), grantFocus);
            } catch (RemoteException e) {
                ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
                        "%s: Unable to update focus as menu appears/disappears, %s", TAG, e);
+19 −2
Original line number Diff line number Diff line
@@ -35,6 +35,9 @@ import android.view.ViewRootImpl;
import android.view.WindowManagerGlobal;

import com.android.internal.protolog.ProtoLog;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayInsetsController;
import com.android.wm.shell.common.ImeListener;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SystemWindows;
import com.android.wm.shell.common.pip.PipBoundsState;
@@ -128,6 +131,8 @@ public class PhonePipMenuController implements PipMenuController,

    private SurfaceControl mLeash;

    private boolean mIsImeVisible;

    private ActionListener mMediaActionListener = new ActionListener() {
        @Override
        public void onMediaActionsChanged(List<RemoteAction> mediaActions) {
@@ -140,6 +145,8 @@ public class PhonePipMenuController implements PipMenuController,
            PipMediaController mediaController, SystemWindows systemWindows,
            PipUiEventLogger pipUiEventLogger, PipTaskListener pipTaskListener,
            @NonNull PipTransitionState pipTransitionState,
            @NonNull DisplayController displayController,
            @NonNull DisplayInsetsController displayInsetsController,
            @NonNull PipDisplayLayoutState pipDisplayLayoutState, ShellExecutor mainExecutor,
            Handler mainHandler) {
        mContext = context;
@@ -166,6 +173,13 @@ public class PhonePipMenuController implements PipMenuController,
                setAppActions(actions, closeAction);
            }
        });
        displayInsetsController.addInsetsChangedListener(mPipDisplayLayoutState.getDisplayId(),
                new ImeListener(displayController, mPipDisplayLayoutState.getDisplayId()) {
                    @Override
                    protected void onImeVisibilityChanged(boolean imeVisible, int imeHeight) {
                        mIsImeVisible = imeVisible;
                    }
                });
    }

    public boolean isMenuVisible() {
@@ -541,10 +555,13 @@ public class PhonePipMenuController implements PipMenuController,
                mMediaController.removeActionListener(mMediaActionListener);
            }

            // Do not grant focus if IME is visible, which can cause the focus being granted
            // back and forth in between the IME and PiP menu, and causes flicker.
            final boolean grantFocus = !mIsImeVisible && (menuState != MENU_STATE_NONE);
            if (mIsImeVisible) return;
            try {
                WindowManagerGlobal.getWindowSession().grantEmbeddedWindowFocus(null /* window */,
                        mSystemWindows.getFocusGrantToken(mPipMenuView),
                        menuState != MENU_STATE_NONE /* grantFocus */);
                        mSystemWindows.getFocusGrantToken(mPipMenuView), grantFocus);
            } catch (RemoteException e) {
                ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
                        "%s: Unable to update focus as menu appears/disappears, %s", TAG, e);