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

Commit d6958dde authored by Merissa Mitchell's avatar Merissa Mitchell
Browse files

[PiP on CD] Add multidisplay handling for PiP input.

Bug: 390280408
Bug: 113087003
Test: Manually check that PiP on external display is consuming input on
PiP menu and dragging on PiP window is WAI
Test: atest PipResizeGestureHandlerTest PipTouchHandlerTest
Flag: com.android.window.flags.enable_connected_displays_pip

Change-Id: I036e817ef847f53c1af08894fa12615d3f760204
parent 47fbb62f
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -159,11 +159,12 @@ public abstract class Pip2Module {
            PipUiEventLogger pipUiEventLogger,
            PipTaskListener pipTaskListener,
            @NonNull PipTransitionState pipTransitionState,
            @NonNull PipDisplayLayoutState pipDisplayLayoutState,
            @ShellMainThread ShellExecutor mainExecutor,
            @ShellMainThread Handler mainHandler) {
        return new PhonePipMenuController(context, pipBoundsState, pipMediaController,
                systemWindows, pipUiEventLogger, pipTaskListener, pipTransitionState, mainExecutor,
                mainHandler);
                systemWindows, pipUiEventLogger, pipTaskListener, pipTransitionState,
                pipDisplayLayoutState, mainExecutor, mainHandler);
    }


@@ -178,6 +179,7 @@ public abstract class Pip2Module {
            @NonNull PipTransitionState pipTransitionState,
            @NonNull PipScheduler pipScheduler,
            @NonNull SizeSpecSource sizeSpecSource,
            @NonNull PipDisplayLayoutState pipDisplayLayoutState,
            PipMotionHelper pipMotionHelper,
            FloatingContentCoordinator floatingContentCoordinator,
            PipUiEventLogger pipUiEventLogger,
@@ -185,8 +187,8 @@ public abstract class Pip2Module {
            Optional<PipPerfHintController> pipPerfHintControllerOptional) {
        return new PipTouchHandler(context, shellInit, shellCommandHandler, menuPhoneController,
                pipBoundsAlgorithm, pipBoundsState, pipTransitionState, pipScheduler,
                sizeSpecSource, pipMotionHelper, floatingContentCoordinator, pipUiEventLogger,
                mainExecutor, pipPerfHintControllerOptional);
                sizeSpecSource, pipDisplayLayoutState, pipMotionHelper, floatingContentCoordinator,
                pipUiEventLogger, mainExecutor, pipPerfHintControllerOptional);
    }

    @WMSingleton
+8 −2
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import com.android.internal.protolog.ProtoLog;
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;
@@ -121,6 +122,9 @@ public class PhonePipMenuController implements PipMenuController,
    @NonNull
    private final PipTransitionState mPipTransitionState;

    @NonNull
    private final PipDisplayLayoutState mPipDisplayLayoutState;

    private SurfaceControl mLeash;

    private ActionListener mMediaActionListener = new ActionListener() {
@@ -134,7 +138,8 @@ public class PhonePipMenuController implements PipMenuController,
    public PhonePipMenuController(Context context, PipBoundsState pipBoundsState,
            PipMediaController mediaController, SystemWindows systemWindows,
            PipUiEventLogger pipUiEventLogger, PipTaskListener pipTaskListener,
            @NonNull PipTransitionState pipTransitionState, ShellExecutor mainExecutor,
            @NonNull PipTransitionState pipTransitionState,
            @NonNull PipDisplayLayoutState pipDisplayLayoutState, ShellExecutor mainExecutor,
            Handler mainHandler) {
        mContext = context;
        mPipBoundsState = pipBoundsState;
@@ -142,6 +147,7 @@ public class PhonePipMenuController implements PipMenuController,
        mSystemWindows = systemWindows;
        mPipTaskListener = pipTaskListener;
        mPipTransitionState = pipTransitionState;
        mPipDisplayLayoutState = pipDisplayLayoutState;
        mMainExecutor = mainExecutor;
        mMainHandler = mainHandler;
        mPipUiEventLogger = pipUiEventLogger;
@@ -218,7 +224,7 @@ public class PhonePipMenuController implements PipMenuController,

        mSystemWindows.addView(mPipMenuView,
                getPipMenuLayoutParams(mContext, MENU_WINDOW_TITLE, 0 /* width */, 0 /* height */),
                0, SHELL_ROOT_LAYER_PIP);
                mPipDisplayLayoutState.getDisplayId(), SHELL_ROOT_LAYER_PIP);
        setShellRootAccessibilityWindow();

        // Make sure the initial actions are set
+18 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.wm.shell.pip2.phone;
import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
import static android.view.Display.DEFAULT_DISPLAY;

import android.annotation.NonNull;
import android.app.ActivityManager;
@@ -219,6 +220,7 @@ public class PipController implements ConfigurationChangeListener,
        mPipDisplayLayoutState.setDisplayLayout(layout);

        mDisplayController.addDisplayChangingController(this);
        mDisplayController.addDisplayWindowListener(this);
        mDisplayInsetsController.addInsetsChangedListener(mPipDisplayLayoutState.getDisplayId(),
                new ImeListener(mDisplayController, mPipDisplayLayoutState.getDisplayId()) {
                    @Override
@@ -297,6 +299,22 @@ public class PipController implements ConfigurationChangeListener,
        setDisplayLayout(mDisplayController.getDisplayLayout(displayId));
    }

    @Override
    public void onDisplayRemoved(int displayId) {
        // If PiP was active on an external display that is removed, clean up states and set
        // {@link PipDisplayLayoutState} to DEFAULT_DISPLAY.
        if (Flags.enableConnectedDisplaysPip() && mPipTransitionState.isInPip()
                && displayId == mPipDisplayLayoutState.getDisplayId()
                && displayId != DEFAULT_DISPLAY) {
            mPipTransitionState.setState(PipTransitionState.EXITING_PIP);
            mPipTransitionState.setState(PipTransitionState.EXITED_PIP);

            mPipDisplayLayoutState.setDisplayId(DEFAULT_DISPLAY);
            mPipDisplayLayoutState.setDisplayLayout(
                    mDisplayController.getDisplayLayout(DEFAULT_DISPLAY));
        }
    }

    /**
     * A callback for any observed transition that contains a display change in its
     * {@link android.window.TransitionRequestInfo},
+8 −8
Original line number Diff line number Diff line
@@ -16,8 +16,6 @@

package com.android.wm.shell.pip2.phone;

import static android.view.Display.DEFAULT_DISPLAY;

import android.os.Binder;
import android.os.IBinder;
import android.os.Looper;
@@ -30,6 +28,7 @@ import android.view.InputEvent;

import com.android.internal.protolog.ProtoLog;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.pip.PipDisplayLayoutState;
import com.android.wm.shell.protolog.ShellProtoLogGroup;

import java.io.PrintWriter;
@@ -84,6 +83,7 @@ public class PipInputConsumer {
    private final IWindowManager mWindowManager;
    private final IBinder mToken;
    private final String mName;
    private final PipDisplayLayoutState mPipDisplayLayoutState;
    private final ShellExecutor mMainExecutor;

    private InputEventReceiver mInputEventReceiver;
@@ -94,10 +94,11 @@ public class PipInputConsumer {
     * @param name the name corresponding to the input consumer that is defined in the system.
     */
    public PipInputConsumer(IWindowManager windowManager, String name,
            ShellExecutor mainExecutor) {
            PipDisplayLayoutState pipDisplayLayoutState, ShellExecutor mainExecutor) {
        mWindowManager = windowManager;
        mToken = new Binder();
        mName = name;
        mPipDisplayLayoutState = pipDisplayLayoutState;
        mMainExecutor = mainExecutor;
    }

@@ -138,9 +139,9 @@ public class PipInputConsumer {
        }
        final InputChannel inputChannel = new InputChannel();
        try {
            // TODO(b/113087003): Support Picture-in-picture in multi-display.
            mWindowManager.destroyInputConsumer(mToken, DEFAULT_DISPLAY);
            mWindowManager.createInputConsumer(mToken, mName, DEFAULT_DISPLAY, inputChannel);
            final int displayId = mPipDisplayLayoutState.getDisplayId();
            mWindowManager.destroyInputConsumer(mToken, displayId);
            mWindowManager.createInputConsumer(mToken, mName, displayId, inputChannel);
        } catch (RemoteException e) {
            ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
                    "%s: Failed to create input consumer, %s", TAG, e);
@@ -162,8 +163,7 @@ public class PipInputConsumer {
            return;
        }
        try {
            // TODO(b/113087003): Support Picture-in-picture in multi-display.
            mWindowManager.destroyInputConsumer(mToken, DEFAULT_DISPLAY);
            mWindowManager.destroyInputConsumer(mToken, mPipDisplayLayoutState.getDisplayId());
        } catch (RemoteException e) {
            ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
                    "%s: Failed to destroy input consumer, %s", TAG, e);
+5 −3
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import com.android.wm.shell.R;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.pip.PipBoundsAlgorithm;
import com.android.wm.shell.common.pip.PipBoundsState;
import com.android.wm.shell.common.pip.PipDisplayLayoutState;
import com.android.wm.shell.common.pip.PipPerfHintController;
import com.android.wm.shell.common.pip.PipPinchResizingAlgorithm;
import com.android.wm.shell.common.pip.PipUiEventLogger;
@@ -70,9 +71,9 @@ public class PipResizeGestureHandler implements
    private final PipScheduler mPipScheduler;
    private final PipTransitionState mPipTransitionState;
    private final PhonePipMenuController mPhonePipMenuController;
    private final PipDisplayLayoutState mPipDisplayLayoutState;
    private final PipUiEventLogger mPipUiEventLogger;
    private final PipPinchResizingAlgorithm mPinchResizingAlgorithm;
    private final int mDisplayId;
    private final ShellExecutor mMainExecutor;

    private final PointF mDownPoint = new PointF();
@@ -120,10 +121,10 @@ public class PipResizeGestureHandler implements
            PipTransitionState pipTransitionState,
            PipUiEventLogger pipUiEventLogger,
            PhonePipMenuController menuActivityController,
            PipDisplayLayoutState pipDisplayLayoutState,
            ShellExecutor mainExecutor,
            @Nullable PipPerfHintController pipPerfHintController) {
        mContext = context;
        mDisplayId = context.getDisplayId();
        mMainExecutor = mainExecutor;
        mPipPerfHintController = pipPerfHintController;
        mPipBoundsAlgorithm = pipBoundsAlgorithm;
@@ -135,6 +136,7 @@ public class PipResizeGestureHandler implements
        mPipTransitionState.addPipTransitionStateChangedListener(this);

        mPhonePipMenuController = menuActivityController;
        mPipDisplayLayoutState = pipDisplayLayoutState;
        mPipUiEventLogger = pipUiEventLogger;
        mPinchResizingAlgorithm = new PipPinchResizingAlgorithm();
    }
@@ -197,7 +199,7 @@ public class PipResizeGestureHandler implements
        if (mIsEnabled) {
            // Register input event receiver
            mInputMonitor = mContext.getSystemService(InputManager.class).monitorGestureInput(
                    "pip-resize", mDisplayId);
                    "pip-resize", mPipDisplayLayoutState.getDisplayId());
            try {
                mMainExecutor.executeBlocking(() -> {
                    mInputEventReceiver = new PipResizeInputEventReceiver(
Loading