diff options
| author | 2022-08-05 20:14:24 +0000 | |
|---|---|---|
| committer | 2022-08-05 20:48:55 +0000 | |
| commit | df8bbef557279d84dfefd4bff86ccbc0d96b9cf2 (patch) | |
| tree | 33269303c466e8c62e9ad0ae7cf39a38d6652f55 | |
| parent | cc5e0d2b629e6fafadf6ff2c911a4b26be1bca9b (diff) | |
Ensure PipTransitionController initializes in order
- This is the only transition controller that isn't using ShellInit,
which means that it currently adds itself as a handler too early.
Bug: 238217847
Test: atest PinnedStackTests
Test: atest WMShellFlickerTests:com.android.wm.shell.flicker.pip.AutoEnterPipOnGoToHomeTest
Change-Id: Ia6dd437d52b8e7f249c86ed4b013fcbf04c31265
6 files changed, 47 insertions, 23 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java index 81904e291ad1..e22c9517f4ab 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java @@ -49,6 +49,7 @@ import com.android.wm.shell.pip.tv.TvPipTaskOrganizer; import com.android.wm.shell.pip.tv.TvPipTransition; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.sysui.ShellController; +import com.android.wm.shell.sysui.ShellInit; import com.android.wm.shell.transition.Transitions; import java.util.Optional; @@ -138,12 +139,14 @@ public abstract class TvPipModule { @WMSingleton @Provides static PipTransitionController provideTvPipTransition( - Transitions transitions, ShellTaskOrganizer shellTaskOrganizer, + ShellInit shellInit, + ShellTaskOrganizer shellTaskOrganizer, + Transitions transitions, PipAnimationController pipAnimationController, TvPipBoundsAlgorithm tvPipBoundsAlgorithm, TvPipBoundsState tvPipBoundsState, TvPipMenuController pipMenuController) { - return new TvPipTransition(tvPipBoundsState, pipMenuController, - tvPipBoundsAlgorithm, pipAnimationController, transitions, shellTaskOrganizer); + return new TvPipTransition(shellInit, shellTaskOrganizer, transitions, tvPipBoundsState, + pipMenuController, tvPipBoundsAlgorithm, pipAnimationController); } @WMSingleton diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index e2bf7678f4b4..d53451aa6034 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -409,15 +409,15 @@ public abstract class WMShellModule { @WMSingleton @Provides static PipTransitionController providePipTransitionController(Context context, - Transitions transitions, ShellTaskOrganizer shellTaskOrganizer, + ShellInit shellInit, ShellTaskOrganizer shellTaskOrganizer, Transitions transitions, PipAnimationController pipAnimationController, PipBoundsAlgorithm pipBoundsAlgorithm, PipBoundsState pipBoundsState, PipTransitionState pipTransitionState, PhonePipMenuController pipMenuController, PipSurfaceTransactionHelper pipSurfaceTransactionHelper, Optional<SplitScreenController> splitScreenOptional) { - return new PipTransition(context, pipBoundsState, pipTransitionState, pipMenuController, - pipBoundsAlgorithm, pipAnimationController, transitions, shellTaskOrganizer, - pipSurfaceTransactionHelper, splitScreenOptional); + return new PipTransition(context, shellInit, shellTaskOrganizer, transitions, + pipBoundsState, pipTransitionState, pipMenuController, pipBoundsAlgorithm, + pipAnimationController, pipSurfaceTransactionHelper, splitScreenOptional); } @WMSingleton diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java index 51be2a534dd7..2858e874741c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java @@ -66,6 +66,7 @@ import com.android.wm.shell.R; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.protolog.ShellProtoLogGroup; import com.android.wm.shell.splitscreen.SplitScreenController; +import com.android.wm.shell.sysui.ShellInit; import com.android.wm.shell.transition.CounterRotatorHelper; import com.android.wm.shell.transition.Transitions; @@ -107,17 +108,18 @@ public class PipTransition extends PipTransitionController { private boolean mHasFadeOut; public PipTransition(Context context, + @NonNull ShellInit shellInit, + @NonNull ShellTaskOrganizer shellTaskOrganizer, + @NonNull Transitions transitions, PipBoundsState pipBoundsState, PipTransitionState pipTransitionState, PipMenuController pipMenuController, PipBoundsAlgorithm pipBoundsAlgorithm, PipAnimationController pipAnimationController, - Transitions transitions, - @NonNull ShellTaskOrganizer shellTaskOrganizer, PipSurfaceTransactionHelper pipSurfaceTransactionHelper, Optional<SplitScreenController> splitScreenOptional) { - super(pipBoundsState, pipMenuController, pipBoundsAlgorithm, - pipAnimationController, transitions, shellTaskOrganizer); + super(shellInit, shellTaskOrganizer, transitions, pipBoundsState, pipMenuController, + pipBoundsAlgorithm, pipAnimationController); mContext = context; mPipTransitionState = pipTransitionState; mEnterExitAnimationDuration = context.getResources() diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java index 90a2695bdf90..f51e247fe112 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransitionController.java @@ -38,6 +38,7 @@ import android.window.WindowContainerTransaction; import androidx.annotation.NonNull; import com.android.wm.shell.ShellTaskOrganizer; +import com.android.wm.shell.sysui.ShellInit; import com.android.wm.shell.transition.Transitions; import java.util.ArrayList; @@ -131,10 +132,13 @@ public abstract class PipTransitionController implements Transitions.TransitionH public void onFixedRotationStarted() { } - public PipTransitionController(PipBoundsState pipBoundsState, + public PipTransitionController( + @NonNull ShellInit shellInit, + @NonNull ShellTaskOrganizer shellTaskOrganizer, + @NonNull Transitions transitions, + PipBoundsState pipBoundsState, PipMenuController pipMenuController, PipBoundsAlgorithm pipBoundsAlgorithm, - PipAnimationController pipAnimationController, Transitions transitions, - @android.annotation.NonNull ShellTaskOrganizer shellTaskOrganizer) { + PipAnimationController pipAnimationController) { mPipBoundsState = pipBoundsState; mPipMenuController = pipMenuController; mShellTaskOrganizer = shellTaskOrganizer; @@ -142,10 +146,14 @@ public abstract class PipTransitionController implements Transitions.TransitionH mPipAnimationController = pipAnimationController; mTransitions = transitions; if (Transitions.ENABLE_SHELL_TRANSITIONS) { - transitions.addHandler(this); + shellInit.addInitCallback(this::onInit, this); } } + private void onInit() { + mTransitions.addHandler(this); + } + void setPipOrganizer(PipTaskOrganizer pto) { mPipOrganizer = pto; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipTransition.java index 5062cc436461..8ebcf63f36e9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipTransition.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipTransition.java @@ -32,6 +32,7 @@ import com.android.wm.shell.pip.PipAnimationController; import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipMenuController; import com.android.wm.shell.pip.PipTransitionController; +import com.android.wm.shell.sysui.ShellInit; import com.android.wm.shell.transition.Transitions; /** @@ -39,14 +40,16 @@ import com.android.wm.shell.transition.Transitions; * TODO: Implement animation once TV is using Transitions. */ public class TvPipTransition extends PipTransitionController { - public TvPipTransition(PipBoundsState pipBoundsState, + public TvPipTransition( + @NonNull ShellInit shellInit, + @NonNull ShellTaskOrganizer shellTaskOrganizer, + @NonNull Transitions transitions, + PipBoundsState pipBoundsState, PipMenuController pipMenuController, TvPipBoundsAlgorithm tvPipBoundsAlgorithm, - PipAnimationController pipAnimationController, - Transitions transitions, - @NonNull ShellTaskOrganizer shellTaskOrganizer) { - super(pipBoundsState, pipMenuController, tvPipBoundsAlgorithm, pipAnimationController, - transitions, shellTaskOrganizer); + PipAnimationController pipAnimationController) { + super(shellInit, shellTaskOrganizer, transitions, pipBoundsState, pipMenuController, + tvPipBoundsAlgorithm, pipAnimationController); } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java index 0f997f906b8f..d3fd10bf233c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java @@ -158,9 +158,11 @@ public class Transitions implements RemoteCallable<Transitions> { private void onInit() { // The very last handler (0 in the list) should be the default one. - mHandlers.add(0, mDefaultTransitionHandler); + mHandlers.add(mDefaultTransitionHandler); + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "addHandler: Default"); // Next lowest priority is remote transitions. - mHandlers.add(1, mRemoteTransitionHandler); + mHandlers.add(mRemoteTransitionHandler); + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "addHandler: Remote"); ContentResolver resolver = mContext.getContentResolver(); mTransitionAnimationScaleSetting = Settings.Global.getFloat(resolver, @@ -206,7 +208,13 @@ public class Transitions implements RemoteCallable<Transitions> { * @see TransitionHandler */ public void addHandler(@NonNull TransitionHandler handler) { + if (mHandlers.isEmpty()) { + throw new RuntimeException("Unexpected handler added prior to initialization, please " + + "use ShellInit callbacks to ensure proper ordering"); + } mHandlers.add(handler); + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "addHandler: %s", + handler.getClass().getSimpleName()); } public ShellExecutor getMainExecutor() { |