Revert "Remove getSfInstance usage from ViewRootImpl"
This reverts commit a825a5c0d9.
Reason for revert: regression as b/228282275
Bug: 222696368
Bug: 228282275
Change-Id: Iba99b5a9ab53a829ce4928cccc47293e62f76162
This commit is contained in:
@@ -273,8 +273,14 @@ public class SurfaceControlViewHost {
|
||||
/** @hide */
|
||||
public SurfaceControlViewHost(@NonNull Context c, @NonNull Display d,
|
||||
@NonNull WindowlessWindowManager wwm) {
|
||||
this(c, d, wwm, false /* useSfChoreographer */);
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
public SurfaceControlViewHost(@NonNull Context c, @NonNull Display d,
|
||||
@NonNull WindowlessWindowManager wwm, boolean useSfChoreographer) {
|
||||
mWm = wwm;
|
||||
mViewRoot = new ViewRootImpl(c, d, mWm);
|
||||
mViewRoot = new ViewRootImpl(c, d, mWm, useSfChoreographer);
|
||||
addConfigCallback(c, d);
|
||||
|
||||
WindowManagerGlobal.getInstance().addWindowlessRoot(mViewRoot);
|
||||
|
||||
@@ -854,10 +854,16 @@ public final class ViewRootImpl implements ViewParent,
|
||||
private String mTag = TAG;
|
||||
|
||||
public ViewRootImpl(Context context, Display display) {
|
||||
this(context, display, WindowManagerGlobal.getWindowSession());
|
||||
this(context, display, WindowManagerGlobal.getWindowSession(),
|
||||
false /* useSfChoreographer */);
|
||||
}
|
||||
|
||||
public ViewRootImpl(@UiContext Context context, Display display, IWindowSession session) {
|
||||
this(context, display, session, false /* useSfChoreographer */);
|
||||
}
|
||||
|
||||
public ViewRootImpl(@UiContext Context context, Display display, IWindowSession session,
|
||||
boolean useSfChoreographer) {
|
||||
mContext = context;
|
||||
mWindowSession = session;
|
||||
mDisplay = display;
|
||||
@@ -889,7 +895,8 @@ public final class ViewRootImpl implements ViewParent,
|
||||
mNoncompatDensity = context.getResources().getDisplayMetrics().noncompatDensityDpi;
|
||||
mFallbackEventHandler = new PhoneFallbackEventHandler(context);
|
||||
// TODO(b/222696368): remove getSfInstance usage and use vsyncId for transactions
|
||||
mChoreographer = Choreographer.getInstance();
|
||||
mChoreographer = useSfChoreographer
|
||||
? Choreographer.getSfInstance() : Choreographer.getInstance();
|
||||
mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
|
||||
mInsetsController = new InsetsController(new ViewRootInsetsControllerHost(this));
|
||||
mHandwritingInitiator = new HandwritingInitiator(mViewConfiguration,
|
||||
|
||||
@@ -221,7 +221,8 @@ public class SystemWindows {
|
||||
}
|
||||
final Display display = mDisplayController.getDisplay(mDisplayId);
|
||||
SurfaceControlViewHost viewRoot =
|
||||
new SurfaceControlViewHost(view.getContext(), display, wwm);
|
||||
new SurfaceControlViewHost(
|
||||
view.getContext(), display, wwm, true /* useSfChoreographer */);
|
||||
attrs.flags |= FLAG_HARDWARE_ACCELERATED;
|
||||
viewRoot.setView(view, attrs);
|
||||
mViewRoots.put(view, viewRoot);
|
||||
|
||||
@@ -19,6 +19,7 @@ package com.android.wm.shell.dagger;
|
||||
import static android.os.Process.THREAD_PRIORITY_DISPLAY;
|
||||
import static android.os.Process.THREAD_PRIORITY_TOP_APP_BOOST;
|
||||
|
||||
import android.animation.AnimationHandler;
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
@@ -28,9 +29,11 @@ import android.os.Trace;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.internal.graphics.SfVsyncFrameCallbackProvider;
|
||||
import com.android.wm.shell.R;
|
||||
import com.android.wm.shell.common.HandlerExecutor;
|
||||
import com.android.wm.shell.common.ShellExecutor;
|
||||
import com.android.wm.shell.common.annotations.ChoreographerSfVsync;
|
||||
import com.android.wm.shell.common.annotations.ExternalMainThread;
|
||||
import com.android.wm.shell.common.annotations.ShellAnimationThread;
|
||||
import com.android.wm.shell.common.annotations.ShellMainThread;
|
||||
@@ -168,4 +171,28 @@ public abstract class WMShellConcurrencyModule {
|
||||
shellSplashscreenThread.start();
|
||||
return new HandlerExecutor(shellSplashscreenThread.getThreadHandler());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide a Shell main-thread AnimationHandler. The AnimationHandler can be set on
|
||||
* {@link android.animation.ValueAnimator}s and will ensure that the animation will run on
|
||||
* the Shell main-thread with the SF vsync.
|
||||
*/
|
||||
@WMSingleton
|
||||
@Provides
|
||||
@ChoreographerSfVsync
|
||||
public static AnimationHandler provideShellMainExecutorSfVsyncAnimationHandler(
|
||||
@ShellMainThread ShellExecutor mainExecutor) {
|
||||
try {
|
||||
AnimationHandler handler = new AnimationHandler();
|
||||
mainExecutor.executeBlocking(() -> {
|
||||
// This is called on the animation thread since it calls
|
||||
// Choreographer.getSfInstance() which returns a thread-local Choreographer instance
|
||||
// that uses the SF vsync
|
||||
handler.setProvider(new SfVsyncFrameCallbackProvider());
|
||||
});
|
||||
return handler;
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException("Failed to initialize SfVsync animation handler in 1s", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.android.wm.shell.dagger;
|
||||
|
||||
import android.animation.AnimationHandler;
|
||||
import android.content.Context;
|
||||
import android.content.pm.LauncherApps;
|
||||
import android.os.Handler;
|
||||
@@ -41,6 +42,7 @@ import com.android.wm.shell.common.SyncTransactionQueue;
|
||||
import com.android.wm.shell.common.SystemWindows;
|
||||
import com.android.wm.shell.common.TaskStackListenerImpl;
|
||||
import com.android.wm.shell.common.TransactionPool;
|
||||
import com.android.wm.shell.common.annotations.ChoreographerSfVsync;
|
||||
import com.android.wm.shell.common.annotations.ShellMainThread;
|
||||
import com.android.wm.shell.draganddrop.DragAndDropController;
|
||||
import com.android.wm.shell.freeform.FreeformTaskListener;
|
||||
@@ -182,10 +184,11 @@ public class WMShellModule {
|
||||
DisplayImeController displayImeController, TransactionPool transactionPool,
|
||||
ShellTaskOrganizer shellTaskOrganizer, SyncTransactionQueue syncQueue,
|
||||
TaskStackListenerImpl taskStackListener, Transitions transitions,
|
||||
@ShellMainThread ShellExecutor mainExecutor) {
|
||||
@ShellMainThread ShellExecutor mainExecutor,
|
||||
@ChoreographerSfVsync AnimationHandler sfVsyncAnimationHandler) {
|
||||
return new LegacySplitScreenController(context, displayController, systemWindows,
|
||||
displayImeController, transactionPool, shellTaskOrganizer, syncQueue,
|
||||
taskStackListener, transitions, mainExecutor);
|
||||
taskStackListener, transitions, mainExecutor, sfVsyncAnimationHandler);
|
||||
}
|
||||
|
||||
@WMSingleton
|
||||
|
||||
@@ -25,6 +25,7 @@ import static com.android.wm.shell.animation.Interpolators.SLOWDOWN_INTERPOLATOR
|
||||
import static com.android.wm.shell.common.split.DividerView.TOUCH_ANIMATION_DURATION;
|
||||
import static com.android.wm.shell.common.split.DividerView.TOUCH_RELEASE_ANIMATION_DURATION;
|
||||
|
||||
import android.animation.AnimationHandler;
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.ValueAnimator;
|
||||
@@ -140,6 +141,7 @@ public class DividerView extends FrameLayout implements OnTouchListener,
|
||||
private DividerImeController mImeController;
|
||||
private DividerCallbacks mCallback;
|
||||
|
||||
private AnimationHandler mSfVsyncAnimationHandler;
|
||||
private ValueAnimator mCurrentAnimator;
|
||||
private boolean mEntranceAnimationRunning;
|
||||
private boolean mExitAnimationRunning;
|
||||
@@ -260,6 +262,10 @@ public class DividerView extends FrameLayout implements OnTouchListener,
|
||||
mDefaultDisplay = displayManager.getDisplay(Display.DEFAULT_DISPLAY);
|
||||
}
|
||||
|
||||
public void setAnimationHandler(AnimationHandler sfVsyncAnimationHandler) {
|
||||
mSfVsyncAnimationHandler = sfVsyncAnimationHandler;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
@@ -651,6 +657,7 @@ public class DividerView extends FrameLayout implements OnTouchListener,
|
||||
}
|
||||
});
|
||||
mCurrentAnimator = anim;
|
||||
mCurrentAnimator.setAnimationHandler(mSfVsyncAnimationHandler);
|
||||
return anim;
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
|
||||
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
|
||||
import static android.view.Display.DEFAULT_DISPLAY;
|
||||
|
||||
import android.animation.AnimationHandler;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.ActivityManager.RunningTaskInfo;
|
||||
import android.app.ActivityTaskManager;
|
||||
@@ -81,6 +82,7 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays
|
||||
private final DividerState mDividerState = new DividerState();
|
||||
private final ForcedResizableInfoActivityController mForcedResizableController;
|
||||
private final ShellExecutor mMainExecutor;
|
||||
private final AnimationHandler mSfVsyncAnimationHandler;
|
||||
private final LegacySplitScreenTaskListener mSplits;
|
||||
private final SystemWindows mSystemWindows;
|
||||
final TransactionPool mTransactionPool;
|
||||
@@ -116,12 +118,13 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays
|
||||
DisplayImeController imeController, TransactionPool transactionPool,
|
||||
ShellTaskOrganizer shellTaskOrganizer, SyncTransactionQueue syncQueue,
|
||||
TaskStackListenerImpl taskStackListener, Transitions transitions,
|
||||
ShellExecutor mainExecutor) {
|
||||
ShellExecutor mainExecutor, AnimationHandler sfVsyncAnimationHandler) {
|
||||
mContext = context;
|
||||
mDisplayController = displayController;
|
||||
mSystemWindows = systemWindows;
|
||||
mImeController = imeController;
|
||||
mMainExecutor = mainExecutor;
|
||||
mSfVsyncAnimationHandler = sfVsyncAnimationHandler;
|
||||
mForcedResizableController = new ForcedResizableInfoActivityController(context, this,
|
||||
mainExecutor);
|
||||
mTransactionPool = transactionPool;
|
||||
@@ -311,6 +314,7 @@ public class LegacySplitScreenController implements DisplayController.OnDisplays
|
||||
Context dctx = mDisplayController.getDisplayContext(mContext.getDisplayId());
|
||||
mView = (DividerView)
|
||||
LayoutInflater.from(dctx).inflate(R.layout.docked_stack_divider, null);
|
||||
mView.setAnimationHandler(mSfVsyncAnimationHandler);
|
||||
DisplayLayout displayLayout = mDisplayController.getDisplayLayout(mContext.getDisplayId());
|
||||
mView.injectDependencies(this, mWindowManager, mDividerState, mForcedResizableController,
|
||||
mSplits, mSplitLayout, mImePositionProcessor, mWindowManagerProxy);
|
||||
|
||||
@@ -138,7 +138,7 @@ constructor(
|
||||
|
||||
ensureOverlayRemoved()
|
||||
|
||||
val newRoot = SurfaceControlViewHost(context, context.display!!, wwm)
|
||||
val newRoot = SurfaceControlViewHost(context, context.display!!, wwm, false)
|
||||
val newView =
|
||||
LightRevealScrim(context, null).apply {
|
||||
revealEffect = createLightRevealEffect()
|
||||
|
||||
Reference in New Issue
Block a user