Fix crash from PipMenuActivityController when auto-pip's enabled

Deprecates also the SystemWindow reference in PipTaskOrganizer

Bug: 172274913
Bug: 172275014
Test: manually enter PiP with auto-pip enabled
Change-Id: I0c817a51fd3c24036151deec0cf1487759573d44
This commit is contained in:
Hongwei Wang
2020-11-02 13:24:40 -08:00
parent c0850b8e6d
commit 12477f3fd5
5 changed files with 23 additions and 23 deletions

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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();
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}