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

Commit 53b0e832 authored by Hongwei Wang's avatar Hongwei Wang Committed by Android (Google) Code Review
Browse files

Merge "Fix crash from PipMenuActivityController when auto-pip's enabled"

parents b4fbce22 12477f3f
Loading
Loading
Loading
Loading
+16 −11
Original line number Diff line number Diff line
@@ -63,7 +63,6 @@ import com.android.internal.os.SomeArgs;
import com.android.wm.shell.R;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.SystemWindows;
import com.android.wm.shell.pip.phone.PipMenuActivityController;
import com.android.wm.shell.pip.phone.PipMotionHelper;
import com.android.wm.shell.pip.phone.PipUpdateThread;
@@ -137,7 +136,6 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
    private final PipBoundsState mPipBoundsState;
    private final PipBoundsHandler mPipBoundsHandler;
    private final PipMenuActivityController mMenuActivityController;
    private final SystemWindows mSystemWindows;
    private final PipAnimationController mPipAnimationController;
    private final PipUiEventLogger mPipUiEventLoggerLogger;
    private final List<PipTransitionCallback> mPipTransitionCallbacks = new ArrayList<>();
@@ -270,14 +268,12 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
            Optional<SplitScreen> splitScreenOptional,
            @NonNull DisplayController displayController,
            @NonNull PipUiEventLogger pipUiEventLogger,
            @NonNull ShellTaskOrganizer shellTaskOrganizer,
            @NonNull SystemWindows systemWindows) {
            @NonNull ShellTaskOrganizer shellTaskOrganizer) {
        mMainHandler = new Handler(Looper.getMainLooper());
        mUpdateHandler = new Handler(PipUpdateThread.get().getLooper(), mUpdateCallbacks);
        mPipBoundsState = pipBoundsState;
        mPipBoundsHandler = boundsHandler;
        mMenuActivityController = menuActivityController;
        mSystemWindows = systemWindows;
        mEnterExitAnimationDuration = context.getResources()
                .getInteger(R.integer.config_pipResizeAnimationDuration);
        mSurfaceTransactionHelper = surfaceTransactionHelper;
@@ -499,9 +495,13 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
        }

        if (mShouldIgnoreEnteringPipTransition) {
            final Rect destinationBounds = mPipBoundsState.getBounds();
            // animation is finished in the Launcher and here we directly apply the final touch.
            applyEnterPipSyncTransaction(mPipBoundsState.getBounds(),
                    () -> sendOnPipTransitionFinished(TRANSITION_DIRECTION_TO_PIP));
            applyEnterPipSyncTransaction(destinationBounds, () -> {
                // ensure menu's settled in its final bounds first
                finishResizeForMenu(destinationBounds);
                sendOnPipTransitionFinished(TRANSITION_DIRECTION_TO_PIP);
            });
            mShouldIgnoreEnteringPipTransition = false;
            return;
        }
@@ -995,16 +995,21 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
            return;
        } else if (isInPipDirection(direction) && type == ANIM_TYPE_ALPHA) {
            // TODO: Synchronize this correctly in #applyEnterPipSyncTransaction
            runOnMainHandler(() -> {
                mMenuActivityController.movePipMenu(null, null, destinationBounds);
                mMenuActivityController.updateMenuBounds(destinationBounds);
            });
            finishResizeForMenu(destinationBounds);
            return;
        }

        WindowContainerTransaction wct = new WindowContainerTransaction();
        prepareFinishResizeTransaction(destinationBounds, direction, tx, wct);
        applyFinishBoundsResize(wct, direction);
        finishResizeForMenu(destinationBounds);
    }

    private void finishResizeForMenu(Rect destinationBounds) {
        if (mMenuActivityController == null) {
            if (DEBUG) Log.d(TAG, "mMenuActivityController is null");
            return;
        }
        runOnMainHandler(() -> {
            mMenuActivityController.movePipMenu(null, null, destinationBounds);
            mMenuActivityController.updateMenuBounds(destinationBounds);
+2 −2
Original line number Diff line number Diff line
@@ -305,8 +305,8 @@ public class PipMenuActivityController {
    }

    private boolean maybeCreateSyncApplier() {
        if (mPipMenuView == null) {
            Log.v(TAG, "Not going to move PiP since the menu is not created.");
        if (mPipMenuView == null || mPipMenuView.getViewRootImpl() == null) {
            Log.v(TAG, "Not going to move PiP, either menu or its parent is not created.");
            return false;
        }

+1 −3
Original line number Diff line number Diff line
@@ -41,7 +41,6 @@ import android.window.WindowContainerToken;

import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.SystemWindows;
import com.android.wm.shell.pip.phone.PipMenuActivityController;
import com.android.wm.shell.splitscreen.SplitScreen;

@@ -69,7 +68,6 @@ public class PipTaskOrganizerTest extends PipTestCase {
    @Mock private PipUiEventLogger mMockPipUiEventLogger;
    @Mock private Optional<SplitScreen> mMockOptionalSplitScreen;
    @Mock private ShellTaskOrganizer mMockShellTaskOrganizer;
    @Mock private SystemWindows mSystemWindows;
    private PipBoundsState mPipBoundsState;

    private ComponentName mComponent1;
@@ -84,7 +82,7 @@ public class PipTaskOrganizerTest extends PipTestCase {
        mSpiedPipTaskOrganizer = spy(new PipTaskOrganizer(mContext, mPipBoundsState,
                mMockPipBoundsHandler, mMenuActivityController, mMockPipSurfaceTransactionHelper,
                mMockOptionalSplitScreen, mMockdDisplayController, mMockPipUiEventLogger,
                mMockShellTaskOrganizer, mSystemWindows));
                mMockShellTaskOrganizer));
        preparePipTaskOrg();
    }

+2 −4
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ import com.android.systemui.dagger.WMSingleton;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.WindowManagerShellWrapper;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.SystemWindows;
import com.android.wm.shell.pip.Pip;
import com.android.wm.shell.pip.PipBoundsHandler;
import com.android.wm.shell.pip.PipBoundsState;
@@ -107,10 +106,9 @@ public abstract class TvPipModule {
            PipBoundsHandler pipBoundsHandler,
            PipSurfaceTransactionHelper pipSurfaceTransactionHelper,
            Optional<SplitScreen> splitScreenOptional, DisplayController displayController,
            PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer,
            SystemWindows systemWindows) {
            PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer) {
        return new PipTaskOrganizer(context, pipBoundsState, pipBoundsHandler,
                null /* menuActivityController */, pipSurfaceTransactionHelper, splitScreenOptional,
                displayController, pipUiEventLogger, shellTaskOrganizer, systemWindows);
                displayController, pipUiEventLogger, shellTaskOrganizer);
    }
}
+2 −3
Original line number Diff line number Diff line
@@ -131,10 +131,9 @@ public class WMShellModule {
            PipMenuActivityController menuActivityController,
            PipSurfaceTransactionHelper pipSurfaceTransactionHelper,
            Optional<SplitScreen> splitScreenOptional, DisplayController displayController,
            PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer,
            SystemWindows systemWindows) {
            PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer) {
        return new PipTaskOrganizer(context, pipBoundsState, pipBoundsHandler,
                menuActivityController, pipSurfaceTransactionHelper, splitScreenOptional,
                displayController, pipUiEventLogger, shellTaskOrganizer, systemWindows);
                displayController, pipUiEventLogger, shellTaskOrganizer);
    }
}