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
This commit is contained in:
Winson Chung
2022-08-05 20:14:24 +00:00
parent cc5e0d2b62
commit df8bbef557
6 changed files with 47 additions and 23 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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() {