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

Commit 4a02bacc authored by Hongwei Wang's avatar Hongwei Wang Committed by Automerger Merge Worker
Browse files

Merge "Revert "PiP: support direct entering split from PiP."" into sc-v2-dev am: d43748f3

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16216955

Change-Id: I6419720e0ca7bee2ca479127d8097ef05f82ad9b
parents f1480b3b d43748f3
Loading
Loading
Loading
Loading
+4 −17
Original line number Original line Diff line number Diff line
@@ -65,28 +65,25 @@
    <LinearLayout
    <LinearLayout
        android:id="@+id/top_end_container"
        android:id="@+id/top_end_container"
        android:layout_gravity="top|end"
        android:layout_gravity="top|end"
        android:layout_width="match_parent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        android:orientation="horizontal">

        <ImageButton
        <ImageButton
            android:id="@+id/settings"
            android:id="@+id/settings"
            android:layout_width="@dimen/pip_action_size"
            android:layout_width="@dimen/pip_action_size"
            android:layout_height="@dimen/pip_action_size"
            android:layout_height="@dimen/pip_action_size"
            android:contentDescription="@string/pip_phone_settings"
            android:contentDescription="@string/pip_phone_settings"
            android:layout_gravity="top|start"
            android:gravity="center"
            android:gravity="center"
            android:src="@drawable/pip_ic_settings"
            android:src="@drawable/pip_ic_settings"
            android:background="?android:selectableItemBackgroundBorderless" />
            android:background="?android:selectableItemBackgroundBorderless" />


        <ImageButton
        <ImageButton
            android:id="@+id/enter_split"
            android:id="@+id/dismiss"
            android:layout_width="@dimen/pip_action_size"
            android:layout_width="@dimen/pip_action_size"
            android:layout_height="@dimen/pip_action_size"
            android:layout_height="@dimen/pip_action_size"
            android:layout_gravity="top|start"
            android:contentDescription="@string/pip_phone_close"
            android:gravity="center"
            android:gravity="center"
            android:contentDescription="@string/pip_phone_enter_split"
            android:src="@drawable/pip_ic_close_white"
            android:src="@drawable/pip_expand"
            android:background="?android:selectableItemBackgroundBorderless" />
            android:background="?android:selectableItemBackgroundBorderless" />
    </LinearLayout>
    </LinearLayout>


@@ -100,14 +97,4 @@
        android:padding="@dimen/pip_resize_handle_padding"
        android:padding="@dimen/pip_resize_handle_padding"
        android:src="@drawable/pip_resize_handle"
        android:src="@drawable/pip_resize_handle"
        android:background="?android:selectableItemBackgroundBorderless" />
        android:background="?android:selectableItemBackgroundBorderless" />

    <ImageButton
        android:id="@+id/dismiss"
        android:layout_width="@dimen/pip_action_size"
        android:layout_height="@dimen/pip_action_size"
        android:contentDescription="@string/pip_phone_close"
        android:layout_gravity="top|end"
        android:gravity="center"
        android:src="@drawable/pip_ic_close_white"
        android:background="?android:selectableItemBackgroundBorderless" />
</FrameLayout>
</FrameLayout>
+0 −3
Original line number Original line Diff line number Diff line
@@ -24,9 +24,6 @@
    <!-- Label for PIP settings button [CHAR LIMIT=NONE]-->
    <!-- Label for PIP settings button [CHAR LIMIT=NONE]-->
    <string name="pip_phone_settings">Settings</string>
    <string name="pip_phone_settings">Settings</string>


    <!-- Label for the PIP enter split button [CHAR LIMIT=NONE] -->
    <string name="pip_phone_enter_split">Enter split screen</string>

    <!-- Title of menu shown over picture-in-picture. Used for accessibility. -->
    <!-- Title of menu shown over picture-in-picture. Used for accessibility. -->
    <string name="pip_menu_title">Menu</string>
    <string name="pip_menu_title">Menu</string>


+2 −4
Original line number Original line Diff line number Diff line
@@ -43,7 +43,6 @@ import com.android.wm.shell.pip.tv.TvPipController;
import com.android.wm.shell.pip.tv.TvPipMenuController;
import com.android.wm.shell.pip.tv.TvPipMenuController;
import com.android.wm.shell.pip.tv.TvPipNotificationController;
import com.android.wm.shell.pip.tv.TvPipNotificationController;
import com.android.wm.shell.pip.tv.TvPipTransition;
import com.android.wm.shell.pip.tv.TvPipTransition;
import com.android.wm.shell.splitscreen.SplitScreenController;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.transition.Transitions;


import java.util.Optional;
import java.util.Optional;
@@ -161,14 +160,13 @@ public abstract class TvPipModule {
            PipTransitionController pipTransitionController,
            PipTransitionController pipTransitionController,
            PipSurfaceTransactionHelper pipSurfaceTransactionHelper,
            PipSurfaceTransactionHelper pipSurfaceTransactionHelper,
            Optional<LegacySplitScreenController> splitScreenOptional,
            Optional<LegacySplitScreenController> splitScreenOptional,
            Optional<SplitScreenController> newSplitScreenOptional,
            DisplayController displayController,
            DisplayController displayController,
            PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer,
            PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer,
            @ShellMainThread ShellExecutor mainExecutor) {
            @ShellMainThread ShellExecutor mainExecutor) {
        return new PipTaskOrganizer(context,
        return new PipTaskOrganizer(context,
                syncTransactionQueue, pipTransitionState, pipBoundsState, pipBoundsAlgorithm,
                syncTransactionQueue, pipTransitionState, pipBoundsState, pipBoundsAlgorithm,
                tvPipMenuController, pipAnimationController, pipSurfaceTransactionHelper,
                tvPipMenuController, pipAnimationController, pipSurfaceTransactionHelper,
                pipTransitionController, splitScreenOptional, newSplitScreenOptional,
                pipTransitionController, splitScreenOptional, displayController, pipUiEventLogger,
                displayController, pipUiEventLogger, shellTaskOrganizer, mainExecutor);
                shellTaskOrganizer, mainExecutor);
    }
    }
}
}
+2 −4
Original line number Original line Diff line number Diff line
@@ -55,7 +55,6 @@ import com.android.wm.shell.pip.phone.PipAppOpsListener;
import com.android.wm.shell.pip.phone.PipController;
import com.android.wm.shell.pip.phone.PipController;
import com.android.wm.shell.pip.phone.PipMotionHelper;
import com.android.wm.shell.pip.phone.PipMotionHelper;
import com.android.wm.shell.pip.phone.PipTouchHandler;
import com.android.wm.shell.pip.phone.PipTouchHandler;
import com.android.wm.shell.splitscreen.SplitScreenController;
import com.android.wm.shell.startingsurface.StartingWindowTypeAlgorithm;
import com.android.wm.shell.startingsurface.StartingWindowTypeAlgorithm;
import com.android.wm.shell.startingsurface.phone.PhoneStartingWindowTypeAlgorithm;
import com.android.wm.shell.startingsurface.phone.PhoneStartingWindowTypeAlgorithm;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.transition.Transitions;
@@ -216,15 +215,14 @@ public class WMShellModule {
            PipSurfaceTransactionHelper pipSurfaceTransactionHelper,
            PipSurfaceTransactionHelper pipSurfaceTransactionHelper,
            PipTransitionController pipTransitionController,
            PipTransitionController pipTransitionController,
            Optional<LegacySplitScreenController> splitScreenOptional,
            Optional<LegacySplitScreenController> splitScreenOptional,
            Optional<SplitScreenController> newSplitScreenOptional,
            DisplayController displayController,
            DisplayController displayController,
            PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer,
            PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer,
            @ShellMainThread ShellExecutor mainExecutor) {
            @ShellMainThread ShellExecutor mainExecutor) {
        return new PipTaskOrganizer(context,
        return new PipTaskOrganizer(context,
                syncTransactionQueue, pipTransitionState, pipBoundsState, pipBoundsAlgorithm,
                syncTransactionQueue, pipTransitionState, pipBoundsState, pipBoundsAlgorithm,
                menuPhoneController, pipAnimationController, pipSurfaceTransactionHelper,
                menuPhoneController, pipAnimationController, pipSurfaceTransactionHelper,
                pipTransitionController, splitScreenOptional, newSplitScreenOptional,
                pipTransitionController, splitScreenOptional, displayController, pipUiEventLogger,
                displayController, pipUiEventLogger, shellTaskOrganizer, mainExecutor);
                shellTaskOrganizer, mainExecutor);
    }
    }


    @WMSingleton
    @WMSingleton
+16 −49
Original line number Original line Diff line number Diff line
@@ -77,7 +77,6 @@ import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.annotations.ShellMainThread;
import com.android.wm.shell.common.annotations.ShellMainThread;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController;
import com.android.wm.shell.pip.phone.PipMotionHelper;
import com.android.wm.shell.pip.phone.PipMotionHelper;
import com.android.wm.shell.splitscreen.SplitScreenController;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.transition.Transitions;


import java.io.PrintWriter;
import java.io.PrintWriter;
@@ -127,8 +126,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
    private final int mExitAnimationDuration;
    private final int mExitAnimationDuration;
    private final int mCrossFadeAnimationDuration;
    private final int mCrossFadeAnimationDuration;
    private final PipSurfaceTransactionHelper mSurfaceTransactionHelper;
    private final PipSurfaceTransactionHelper mSurfaceTransactionHelper;
    private final Optional<LegacySplitScreenController> mLegacySplitScreenOptional;
    private final Optional<LegacySplitScreenController> mSplitScreenOptional;
    private final Optional<SplitScreenController> mSplitScreenOptional;
    protected final ShellTaskOrganizer mTaskOrganizer;
    protected final ShellTaskOrganizer mTaskOrganizer;
    protected final ShellExecutor mMainExecutor;
    protected final ShellExecutor mMainExecutor;


@@ -254,8 +252,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
            @NonNull PipAnimationController pipAnimationController,
            @NonNull PipAnimationController pipAnimationController,
            @NonNull PipSurfaceTransactionHelper surfaceTransactionHelper,
            @NonNull PipSurfaceTransactionHelper surfaceTransactionHelper,
            @NonNull PipTransitionController pipTransitionController,
            @NonNull PipTransitionController pipTransitionController,
            Optional<LegacySplitScreenController> legacySplitScreenOptional,
            Optional<LegacySplitScreenController> splitScreenOptional,
            Optional<SplitScreenController> splitScreenOptional,
            @NonNull DisplayController displayController,
            @NonNull DisplayController displayController,
            @NonNull PipUiEventLogger pipUiEventLogger,
            @NonNull PipUiEventLogger pipUiEventLogger,
            @NonNull ShellTaskOrganizer shellTaskOrganizer,
            @NonNull ShellTaskOrganizer shellTaskOrganizer,
@@ -277,7 +274,6 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
        mPipAnimationController = pipAnimationController;
        mPipAnimationController = pipAnimationController;
        mPipUiEventLoggerLogger = pipUiEventLogger;
        mPipUiEventLoggerLogger = pipUiEventLogger;
        mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;
        mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new;
        mLegacySplitScreenOptional = legacySplitScreenOptional;
        mSplitScreenOptional = splitScreenOptional;
        mSplitScreenOptional = splitScreenOptional;
        mTaskOrganizer = shellTaskOrganizer;
        mTaskOrganizer = shellTaskOrganizer;
        mMainExecutor = mainExecutor;
        mMainExecutor = mainExecutor;
@@ -377,11 +373,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
     *   activity render it's final configuration while the Task is still in PiP.
     *   activity render it's final configuration while the Task is still in PiP.
     * - setWindowingMode to undefined at the end of transition
     * - setWindowingMode to undefined at the end of transition
     * @param animationDurationMs duration in millisecond for the exiting PiP transition
     * @param animationDurationMs duration in millisecond for the exiting PiP transition
     * @param requestEnterSplit whether the enterSplit button is pressed on PiP or not.
     *                             Indicate the user wishes to directly put PiP into split screen
     *                             mode.
     */
     */
    public void exitPip(int animationDurationMs, boolean requestEnterSplit) {
    public void exitPip(int animationDurationMs) {
        if (!mPipTransitionState.isInPip()
        if (!mPipTransitionState.isInPip()
                || mPipTransitionState.getTransitionState() == PipTransitionState.EXITING_PIP
                || mPipTransitionState.getTransitionState() == PipTransitionState.EXITING_PIP
                || mToken == null) {
                || mToken == null) {
@@ -394,7 +387,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
                PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_EXPAND_TO_FULLSCREEN);
                PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_EXPAND_TO_FULLSCREEN);
        final WindowContainerTransaction wct = new WindowContainerTransaction();
        final WindowContainerTransaction wct = new WindowContainerTransaction();
        final Rect destinationBounds = mPipBoundsState.getDisplayBounds();
        final Rect destinationBounds = mPipBoundsState.getDisplayBounds();
        final int direction = syncWithSplitScreenBounds(destinationBounds, requestEnterSplit)
        final int direction = syncWithSplitScreenBounds(destinationBounds)
                ? TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN
                ? TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN
                : TRANSITION_DIRECTION_LEAVE_PIP;
                : TRANSITION_DIRECTION_LEAVE_PIP;
        final SurfaceControl.Transaction tx = mSurfaceControlTransactionFactory.getTransaction();
        final SurfaceControl.Transaction tx = mSurfaceControlTransactionFactory.getTransaction();
@@ -403,7 +396,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
        // We set to fullscreen here for now, but later it will be set to UNDEFINED for
        // We set to fullscreen here for now, but later it will be set to UNDEFINED for
        // the proper windowing mode to take place. See #applyWindowingModeChangeOnExit.
        // the proper windowing mode to take place. See #applyWindowingModeChangeOnExit.
        wct.setActivityWindowingMode(mToken,
        wct.setActivityWindowingMode(mToken,
                direction == TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN && !requestEnterSplit
                direction == TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN
                        ? WINDOWING_MODE_SPLIT_SCREEN_SECONDARY
                        ? WINDOWING_MODE_SPLIT_SCREEN_SECONDARY
                        : WINDOWING_MODE_FULLSCREEN);
                        : WINDOWING_MODE_FULLSCREEN);
        wct.setBounds(mToken, destinationBounds);
        wct.setBounds(mToken, destinationBounds);
@@ -442,7 +435,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
        wct.setWindowingMode(mToken, getOutPipWindowingMode());
        wct.setWindowingMode(mToken, getOutPipWindowingMode());
        // Simply reset the activity mode set prior to the animation running.
        // Simply reset the activity mode set prior to the animation running.
        wct.setActivityWindowingMode(mToken, WINDOWING_MODE_UNDEFINED);
        wct.setActivityWindowingMode(mToken, WINDOWING_MODE_UNDEFINED);
        mLegacySplitScreenOptional.ifPresent(splitScreen -> {
        mSplitScreenOptional.ifPresent(splitScreen -> {
            if (direction == TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN) {
            if (direction == TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN) {
                wct.reparent(mToken, splitScreen.getSecondaryRoot(), true /* onTop */);
                wct.reparent(mToken, splitScreen.getSecondaryRoot(), true /* onTop */);
            }
            }
@@ -1172,7 +1165,6 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
            @PipAnimationController.TransitionDirection int direction,
            @PipAnimationController.TransitionDirection int direction,
            @PipAnimationController.AnimationType int type) {
            @PipAnimationController.AnimationType int type) {
        final Rect preResizeBounds = new Rect(mPipBoundsState.getBounds());
        final Rect preResizeBounds = new Rect(mPipBoundsState.getBounds());
        final boolean isPipTopLeft = isPipTopLeft();
        mPipBoundsState.setBounds(destinationBounds);
        mPipBoundsState.setBounds(destinationBounds);
        if (direction == TRANSITION_DIRECTION_REMOVE_STACK) {
        if (direction == TRANSITION_DIRECTION_REMOVE_STACK) {
            removePipImmediately();
            removePipImmediately();
@@ -1218,10 +1210,10 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
                            null /* callback */, false /* withStartDelay */);
                            null /* callback */, false /* withStartDelay */);
                });
                });
            } else {
            } else {
                applyFinishBoundsResize(wct, direction, isPipTopLeft);
                applyFinishBoundsResize(wct, direction);
            }
            }
        } else {
        } else {
            applyFinishBoundsResize(wct, direction, isPipTopLeft);
            applyFinishBoundsResize(wct, direction);
        }
        }


        finishResizeForMenu(destinationBounds);
        finishResizeForMenu(destinationBounds);
@@ -1249,11 +1241,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
        } else if (isOutPipDirection(direction)) {
        } else if (isOutPipDirection(direction)) {
            // If we are animating to fullscreen or split screen, then we need to reset the
            // If we are animating to fullscreen or split screen, then we need to reset the
            // override bounds on the task to ensure that the task "matches" the parent's bounds.
            // override bounds on the task to ensure that the task "matches" the parent's bounds.
            if (direction == TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN) {
                taskBounds = destinationBounds;
            } else {
            taskBounds = null;
            taskBounds = null;
            }
            applyWindowingModeChangeOnExit(wct, direction);
            applyWindowingModeChangeOnExit(wct, direction);
        } else {
        } else {
            // Just a resize in PIP
            // Just a resize in PIP
@@ -1273,21 +1261,9 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
     * applying it.
     * applying it.
     */
     */
    public void applyFinishBoundsResize(@NonNull WindowContainerTransaction wct,
    public void applyFinishBoundsResize(@NonNull WindowContainerTransaction wct,
            @PipAnimationController.TransitionDirection int direction, boolean wasPipTopLeft) {
            @PipAnimationController.TransitionDirection int direction) {
        if (direction == TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN) {
            mSplitScreenOptional.get().enterSplitScreen(mTaskInfo.taskId, wasPipTopLeft, wct);
        } else {
        mTaskOrganizer.applyTransaction(wct);
        mTaskOrganizer.applyTransaction(wct);
    }
    }
    }

    private boolean isPipTopLeft() {
        final Rect topLeft = new Rect();
        final Rect bottomRight = new Rect();
        mSplitScreenOptional.get().getStageBounds(topLeft, bottomRight);

        return topLeft.contains(mPipBoundsState.getBounds());
    }


    /**
    /**
     * The windowing mode to restore to when resizing out of PIP direction. Defaults to undefined
     * The windowing mode to restore to when resizing out of PIP direction. Defaults to undefined
@@ -1371,27 +1347,18 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
    }
    }


    /**
    /**
     * Sync with {@link LegacySplitScreenController} or {@link SplitScreenController} on destination
     * Sync with {@link LegacySplitScreenController} on destination bounds if PiP is going to split
     * bounds if PiP is going to split screen.
     * screen.
     *
     *
     * @param destinationBoundsOut contain the updated destination bounds if applicable
     * @param destinationBoundsOut contain the updated destination bounds if applicable
     * @return {@code true} if destinationBounds is altered for split screen
     * @return {@code true} if destinationBounds is altered for split screen
     */
     */
    private boolean syncWithSplitScreenBounds(Rect destinationBoundsOut, boolean enterSplit) {
    private boolean syncWithSplitScreenBounds(Rect destinationBoundsOut) {
        if (enterSplit && mSplitScreenOptional.isPresent()) {
        if (!mSplitScreenOptional.isPresent()) {
            final Rect topLeft = new Rect();
            final Rect bottomRight = new Rect();
            mSplitScreenOptional.get().getStageBounds(topLeft, bottomRight);
            final boolean isPipTopLeft = isPipTopLeft();
            destinationBoundsOut.set(isPipTopLeft ? topLeft : bottomRight);
            return true;
        }

        if (!mLegacySplitScreenOptional.isPresent()) {
            return false;
            return false;
        }
        }


        LegacySplitScreenController legacySplitScreen = mLegacySplitScreenOptional.get();
        LegacySplitScreenController legacySplitScreen = mSplitScreenOptional.get();
        if (!legacySplitScreen.isDividerVisible()) {
        if (!legacySplitScreen.isDividerVisible()) {
            // fail early if system is not in split screen mode
            // fail early if system is not in split screen mode
            return false;
            return false;
Loading