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

Commit 01249642 authored by Merissa Mitchell's avatar Merissa Mitchell Committed by Android (Google) Code Review
Browse files

Merge changes I08615d90,I036e817e into main

* changes:
  [PiP on CD] Fix PiP dismiss target on external display.
  [PiP on CD] Add multidisplay handling for PiP input.
parents 7ba7384e 14ad6b49
Loading
Loading
Loading
Loading
+8 −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,8 @@ public abstract class Pip2Module {
            @NonNull PipTransitionState pipTransitionState,
            @NonNull PipScheduler pipScheduler,
            @NonNull SizeSpecSource sizeSpecSource,
            @NonNull PipDisplayLayoutState pipDisplayLayoutState,
            DisplayController displayController,
            PipMotionHelper pipMotionHelper,
            FloatingContentCoordinator floatingContentCoordinator,
            PipUiEventLogger pipUiEventLogger,
@@ -185,8 +188,9 @@ 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, displayController, 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},
+30 −4
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.content.res.Resources;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.Rect;
import android.view.Display;
import android.view.MotionEvent;
import android.view.SurfaceControl;
import android.view.View;
@@ -34,7 +35,9 @@ import androidx.annotation.NonNull;

import com.android.wm.shell.R;
import com.android.wm.shell.bubbles.DismissViewUtils;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.pip.PipDisplayLayoutState;
import com.android.wm.shell.common.pip.PipUiEventLogger;
import com.android.wm.shell.shared.bubbles.DismissCircleView;
import com.android.wm.shell.shared.bubbles.DismissView;
@@ -50,6 +53,9 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen
    /* The multiplier to apply scale the target size by when applying the magnetic field radius */
    private static final float MAGNETIC_FIELD_RADIUS_MULTIPLIER = 1.25f;

    /* The window type to apply to the display */
    private static final int WINDOW_TYPE = WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;

    /**
     * MagnetizedObject wrapper for PIP. This allows the magnetic target library to locate and move
     * PIP.
@@ -84,16 +90,22 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen
    private final Context mContext;
    private final PipMotionHelper mMotionHelper;
    private final PipUiEventLogger mPipUiEventLogger;
    private final WindowManager mWindowManager;
    private WindowManager mWindowManager;
    /** The display id for the display that is associated with mWindowManager. */
    private int mWindowManagerDisplayId = -1;
    private final PipDisplayLayoutState mPipDisplayLayoutState;
    private final DisplayController mDisplayController;
    private final ShellExecutor mMainExecutor;

    public PipDismissTargetHandler(Context context, PipUiEventLogger pipUiEventLogger,
            PipMotionHelper motionHelper, ShellExecutor mainExecutor) {
            PipMotionHelper motionHelper, PipDisplayLayoutState pipDisplayLayoutState,
            DisplayController displayController, ShellExecutor mainExecutor) {
        mContext = context;
        mPipUiEventLogger = pipUiEventLogger;
        mMotionHelper = motionHelper;
        mPipDisplayLayoutState = pipDisplayLayoutState;
        mDisplayController = displayController;
        mMainExecutor = mainExecutor;
        mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    }

    void init() {
@@ -240,6 +252,8 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen

    /** Adds the magnetic target view to the WindowManager so it's ready to be animated in. */
    public void createOrUpdateDismissTarget() {
        getWindowManager();

        if (mTargetViewContainer.getParent() == null) {
            mTargetViewContainer.cancelAnimators();

@@ -262,7 +276,7 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen
                WindowManager.LayoutParams.MATCH_PARENT,
                height,
                0, windowSize.y - height,
                WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
                WINDOW_TYPE,
                WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                        | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
@@ -308,4 +322,16 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen
            mWindowManager.removeViewImmediate(mTargetViewContainer);
        }
    }

    /** Sets mWindowManager to WindowManager associated with the display where PiP is active on. */
    private void getWindowManager() {
        final int pipDisplayId = mPipDisplayLayoutState.getDisplayId();
        if (mWindowManager != null && pipDisplayId == mWindowManagerDisplayId) {
            return;
        }
        mWindowManagerDisplayId = pipDisplayId;
        Display display = mDisplayController.getDisplay(mWindowManagerDisplayId);
        Context uiContext = mContext.createWindowContext(display, WINDOW_TYPE, null);
        mWindowManager = uiContext.getSystemService(WindowManager.class);
    }
}
+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);
Loading