Merge "Set animation layer for SurfaceFreezer leash" into sc-v2-dev

This commit is contained in:
Chris Li
2021-09-28 03:50:28 +00:00
committed by Android (Google) Code Review
3 changed files with 65 additions and 8 deletions

View File

@@ -123,6 +123,18 @@ class SurfaceFreezer {
}
}
void setLayer(SurfaceControl.Transaction t, int layer) {
if (mLeash != null) {
t.setLayer(mLeash, layer);
}
}
void setRelativeLayer(SurfaceControl.Transaction t, SurfaceControl relativeTo, int layer) {
if (mLeash != null) {
t.setRelativeLayer(mLeash, relativeTo, layer);
}
}
boolean hasLeash() {
return mLeash != null;
}

View File

@@ -2334,10 +2334,15 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
protected void setLayer(Transaction t, int layer) {
// Route through surface animator to accommodate that our surface control might be
// attached to the leash, and leash is attached to parent container.
mSurfaceAnimator.setLayer(t, layer);
if (mSurfaceFreezer.hasLeash()) {
// When the freezer has created animation leash parent for the window, set the layer
// there instead.
mSurfaceFreezer.setLayer(t, layer);
} else {
// Route through surface animator to accommodate that our surface control might be
// attached to the leash, and leash is attached to parent container.
mSurfaceAnimator.setLayer(t, layer);
}
}
int getLastLayer() {
@@ -2345,10 +2350,15 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
protected void setRelativeLayer(Transaction t, SurfaceControl relativeTo, int layer) {
// Route through surface animator to accommodate that our surface control might be
// attached to the leash, and leash is attached to parent container.
mSurfaceAnimator.setRelativeLayer(t, relativeTo, layer);
if (mSurfaceFreezer.hasLeash()) {
// When the freezer has created animation leash parent for the window, set the layer
// there instead.
mSurfaceFreezer.setRelativeLayer(t, relativeTo, layer);
} else {
// Route through surface animator to accommodate that our surface control might be
// attached to the leash, and leash is attached to parent container.
mSurfaceAnimator.setRelativeLayer(t, relativeTo, layer);
}
}
protected void reparentSurfaceControl(Transaction t, SurfaceControl newParent) {

View File

@@ -1071,6 +1071,41 @@ public class WindowContainerTests extends WindowTestsBase {
verify(surfaceAnimator).setRelativeLayer(t, relativeParent, 1 /* layer */);
}
@Test
public void testAssignAnimationLayer() {
final WindowContainer container = new WindowContainer(mWm);
container.mSurfaceControl = mock(SurfaceControl.class);
final SurfaceAnimator surfaceAnimator = container.mSurfaceAnimator;
final SurfaceFreezer surfaceFreezer = container.mSurfaceFreezer;
final SurfaceControl relativeParent = mock(SurfaceControl.class);
final SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class);
spyOn(container);
spyOn(surfaceAnimator);
spyOn(surfaceFreezer);
container.setLayer(t, 1);
container.setRelativeLayer(t, relativeParent, 2);
// Set through surfaceAnimator if surfaceFreezer doesn't have leash.
verify(surfaceAnimator).setLayer(t, 1);
verify(surfaceAnimator).setRelativeLayer(t, relativeParent, 2);
verify(surfaceFreezer, never()).setLayer(any(), anyInt());
verify(surfaceFreezer, never()).setRelativeLayer(any(), any(), anyInt());
clearInvocations(surfaceAnimator);
clearInvocations(surfaceFreezer);
doReturn(true).when(surfaceFreezer).hasLeash();
container.setLayer(t, 1);
container.setRelativeLayer(t, relativeParent, 2);
// Set through surfaceFreezer if surfaceFreezer has leash.
verify(surfaceFreezer).setLayer(t, 1);
verify(surfaceFreezer).setRelativeLayer(t, relativeParent, 2);
verify(surfaceAnimator, never()).setLayer(any(), anyInt());
verify(surfaceAnimator, never()).setRelativeLayer(any(), any(), anyInt());
}
/* Used so we can gain access to some protected members of the {@link WindowContainer} class */
private static class TestWindowContainer extends WindowContainer<TestWindowContainer> {
private final int mLayer;