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:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user