Merge "[Re-land] Remove getSfInstance usage from ViewRootImpl" into tm-qpr-dev
This commit is contained in:
@@ -28,8 +28,8 @@ import android.os.Parcel;
|
|||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.window.WindowTokenClient;
|
|
||||||
import android.view.accessibility.IAccessibilityEmbeddedConnection;
|
import android.view.accessibility.IAccessibilityEmbeddedConnection;
|
||||||
|
import android.window.WindowTokenClient;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@@ -271,14 +271,8 @@ public class SurfaceControlViewHost {
|
|||||||
/** @hide */
|
/** @hide */
|
||||||
public SurfaceControlViewHost(@NonNull Context c, @NonNull Display d,
|
public SurfaceControlViewHost(@NonNull Context c, @NonNull Display d,
|
||||||
@NonNull WindowlessWindowManager wwm) {
|
@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;
|
mWm = wwm;
|
||||||
mViewRoot = new ViewRootImpl(c, d, mWm, new WindowlessWindowLayout(), useSfChoreographer);
|
mViewRoot = new ViewRootImpl(c, d, mWm, new WindowlessWindowLayout());
|
||||||
addConfigCallback(c, d);
|
addConfigCallback(c, d);
|
||||||
|
|
||||||
WindowManagerGlobal.getInstance().addWindowlessRoot(mViewRoot);
|
WindowManagerGlobal.getInstance().addWindowlessRoot(mViewRoot);
|
||||||
|
|||||||
@@ -905,17 +905,11 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
private String mTag = TAG;
|
private String mTag = TAG;
|
||||||
|
|
||||||
public ViewRootImpl(Context context, Display display) {
|
public ViewRootImpl(Context context, Display display) {
|
||||||
this(context, display, WindowManagerGlobal.getWindowSession(), new WindowLayout(),
|
this(context, display, WindowManagerGlobal.getWindowSession(), new WindowLayout());
|
||||||
false /* useSfChoreographer */);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ViewRootImpl(@UiContext Context context, Display display, IWindowSession session,
|
public ViewRootImpl(@UiContext Context context, Display display, IWindowSession session,
|
||||||
WindowLayout windowLayout) {
|
WindowLayout windowLayout) {
|
||||||
this(context, display, session, windowLayout, false /* useSfChoreographer */);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ViewRootImpl(@UiContext Context context, Display display, IWindowSession session,
|
|
||||||
WindowLayout windowLayout, boolean useSfChoreographer) {
|
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mWindowSession = session;
|
mWindowSession = session;
|
||||||
mWindowLayout = windowLayout;
|
mWindowLayout = windowLayout;
|
||||||
@@ -947,8 +941,7 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
mNoncompatDensity = context.getResources().getDisplayMetrics().noncompatDensityDpi;
|
mNoncompatDensity = context.getResources().getDisplayMetrics().noncompatDensityDpi;
|
||||||
mFallbackEventHandler = new PhoneFallbackEventHandler(context);
|
mFallbackEventHandler = new PhoneFallbackEventHandler(context);
|
||||||
// TODO(b/222696368): remove getSfInstance usage and use vsyncId for transactions
|
// TODO(b/222696368): remove getSfInstance usage and use vsyncId for transactions
|
||||||
mChoreographer = useSfChoreographer
|
mChoreographer = Choreographer.getInstance();
|
||||||
? Choreographer.getSfInstance() : Choreographer.getInstance();
|
|
||||||
mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
|
mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
|
||||||
mInsetsController = new InsetsController(new ViewRootInsetsControllerHost(this));
|
mInsetsController = new InsetsController(new ViewRootInsetsControllerHost(this));
|
||||||
mHandwritingInitiator = new HandwritingInitiator(mViewConfiguration,
|
mHandwritingInitiator = new HandwritingInitiator(mViewConfiguration,
|
||||||
|
|||||||
@@ -221,8 +221,7 @@ public class SystemWindows {
|
|||||||
}
|
}
|
||||||
final Display display = mDisplayController.getDisplay(mDisplayId);
|
final Display display = mDisplayController.getDisplay(mDisplayId);
|
||||||
SurfaceControlViewHost viewRoot =
|
SurfaceControlViewHost viewRoot =
|
||||||
new SurfaceControlViewHost(
|
new SurfaceControlViewHost(view.getContext(), display, wwm);
|
||||||
view.getContext(), display, wwm, true /* useSfChoreographer */);
|
|
||||||
attrs.flags |= FLAG_HARDWARE_ACCELERATED;
|
attrs.flags |= FLAG_HARDWARE_ACCELERATED;
|
||||||
viewRoot.setView(view, attrs);
|
viewRoot.setView(view, attrs);
|
||||||
mViewRoots.put(view, viewRoot);
|
mViewRoots.put(view, viewRoot);
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import static android.os.Process.THREAD_PRIORITY_BACKGROUND;
|
|||||||
import static android.os.Process.THREAD_PRIORITY_DISPLAY;
|
import static android.os.Process.THREAD_PRIORITY_DISPLAY;
|
||||||
import static android.os.Process.THREAD_PRIORITY_TOP_APP_BOOST;
|
import static android.os.Process.THREAD_PRIORITY_TOP_APP_BOOST;
|
||||||
|
|
||||||
import android.animation.AnimationHandler;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@@ -31,11 +30,9 @@ import android.view.Choreographer;
|
|||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import com.android.internal.graphics.SfVsyncFrameCallbackProvider;
|
|
||||||
import com.android.wm.shell.R;
|
import com.android.wm.shell.R;
|
||||||
import com.android.wm.shell.common.HandlerExecutor;
|
import com.android.wm.shell.common.HandlerExecutor;
|
||||||
import com.android.wm.shell.common.ShellExecutor;
|
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.ExternalMainThread;
|
||||||
import com.android.wm.shell.common.annotations.ShellAnimationThread;
|
import com.android.wm.shell.common.annotations.ShellAnimationThread;
|
||||||
import com.android.wm.shell.common.annotations.ShellBackgroundThread;
|
import com.android.wm.shell.common.annotations.ShellBackgroundThread;
|
||||||
@@ -194,30 +191,6 @@ public abstract class WMShellConcurrencyModule {
|
|||||||
return new HandlerExecutor(shellSplashscreenThread.getThreadHandler());
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides a Shell background thread Handler for low priority background tasks.
|
* Provides a Shell background thread Handler for low priority background tasks.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -248,7 +248,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
|
|||||||
lp.setTrustedOverlay();
|
lp.setTrustedOverlay();
|
||||||
if (mViewHost == null) {
|
if (mViewHost == null) {
|
||||||
mViewHost = mSurfaceControlViewHostFactory.create(mDecorWindowContext, mDisplay,
|
mViewHost = mSurfaceControlViewHostFactory.create(mDecorWindowContext, mDisplay,
|
||||||
mCaptionWindowManager, true);
|
mCaptionWindowManager);
|
||||||
mViewHost.setView(outResult.mRootView, lp);
|
mViewHost.setView(outResult.mRootView, lp);
|
||||||
} else {
|
} else {
|
||||||
mViewHost.relayout(lp);
|
mViewHost.relayout(lp);
|
||||||
@@ -345,9 +345,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface SurfaceControlViewHostFactory {
|
interface SurfaceControlViewHostFactory {
|
||||||
default SurfaceControlViewHost create(
|
default SurfaceControlViewHost create(Context c, Display d, WindowlessWindowManager wmm) {
|
||||||
Context c, Display d, WindowlessWindowManager wmm, boolean useSfChoreographer) {
|
return new SurfaceControlViewHost(c, d, wmm);
|
||||||
return new SurfaceControlViewHost(c, d, wmm, useSfChoreographer);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ import static com.google.common.truth.Truth.assertThat;
|
|||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.mockito.Mockito.any;
|
import static org.mockito.Mockito.any;
|
||||||
import static org.mockito.Mockito.anyBoolean;
|
|
||||||
import static org.mockito.Mockito.argThat;
|
import static org.mockito.Mockito.argThat;
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.eq;
|
import static org.mockito.Mockito.eq;
|
||||||
@@ -107,7 +106,7 @@ public class WindowDecorationTests extends ShellTestCase {
|
|||||||
mMockSurfaceControlFinishT = createMockSurfaceControlTransaction();
|
mMockSurfaceControlFinishT = createMockSurfaceControlTransaction();
|
||||||
|
|
||||||
doReturn(mMockSurfaceControlViewHost).when(mMockSurfaceControlViewHostFactory)
|
doReturn(mMockSurfaceControlViewHost).when(mMockSurfaceControlViewHostFactory)
|
||||||
.create(any(), any(), any(), anyBoolean());
|
.create(any(), any(), any());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -148,8 +147,7 @@ public class WindowDecorationTests extends ShellTestCase {
|
|||||||
|
|
||||||
verify(decorContainerSurfaceBuilder, never()).build();
|
verify(decorContainerSurfaceBuilder, never()).build();
|
||||||
verify(taskBackgroundSurfaceBuilder, never()).build();
|
verify(taskBackgroundSurfaceBuilder, never()).build();
|
||||||
verify(mMockSurfaceControlViewHostFactory, never())
|
verify(mMockSurfaceControlViewHostFactory, never()).create(any(), any(), any());
|
||||||
.create(any(), any(), any(), anyBoolean());
|
|
||||||
|
|
||||||
verify(mMockSurfaceControlFinishT).hide(taskSurface);
|
verify(mMockSurfaceControlFinishT).hide(taskSurface);
|
||||||
|
|
||||||
@@ -207,8 +205,7 @@ public class WindowDecorationTests extends ShellTestCase {
|
|||||||
verify(mMockSurfaceControlStartT).setLayer(taskBackgroundSurface, -1);
|
verify(mMockSurfaceControlStartT).setLayer(taskBackgroundSurface, -1);
|
||||||
verify(mMockSurfaceControlStartT).show(taskBackgroundSurface);
|
verify(mMockSurfaceControlStartT).show(taskBackgroundSurface);
|
||||||
|
|
||||||
verify(mMockSurfaceControlViewHostFactory)
|
verify(mMockSurfaceControlViewHostFactory).create(any(), eq(defaultDisplay), any());
|
||||||
.create(any(), eq(defaultDisplay), any(), anyBoolean());
|
|
||||||
verify(mMockSurfaceControlViewHost)
|
verify(mMockSurfaceControlViewHost)
|
||||||
.setView(same(mMockView),
|
.setView(same(mMockView),
|
||||||
argThat(lp -> lp.height == 64
|
argThat(lp -> lp.height == 64
|
||||||
@@ -326,8 +323,7 @@ public class WindowDecorationTests extends ShellTestCase {
|
|||||||
verify(mMockDisplayController).removeDisplayWindowListener(same(listener));
|
verify(mMockDisplayController).removeDisplayWindowListener(same(listener));
|
||||||
|
|
||||||
assertThat(mRelayoutResult.mRootView).isSameInstanceAs(mMockView);
|
assertThat(mRelayoutResult.mRootView).isSameInstanceAs(mMockView);
|
||||||
verify(mMockSurfaceControlViewHostFactory)
|
verify(mMockSurfaceControlViewHostFactory).create(any(), eq(mockDisplay), any());
|
||||||
.create(any(), eq(mockDisplay), any(), anyBoolean());
|
|
||||||
verify(mMockSurfaceControlViewHost).setView(same(mMockView), any());
|
verify(mMockSurfaceControlViewHost).setView(same(mMockView), any());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ constructor(
|
|||||||
|
|
||||||
ensureOverlayRemoved()
|
ensureOverlayRemoved()
|
||||||
|
|
||||||
val newRoot = SurfaceControlViewHost(context, context.display!!, wwm, false)
|
val newRoot = SurfaceControlViewHost(context, context.display!!, wwm)
|
||||||
val newView =
|
val newView =
|
||||||
LightRevealScrim(context, null).apply {
|
LightRevealScrim(context, null).apply {
|
||||||
revealEffect = createLightRevealEffect()
|
revealEffect = createLightRevealEffect()
|
||||||
|
|||||||
Reference in New Issue
Block a user