Set animation layer for SurfaceFreezer leash

Before, when #onAnimationLeashCreated is called, it will set layer
through SurfaceAnimator. However, that doesn't cover the case when the
layer is created by the SurfaceFreezer, and has not been taken by the
SurfaceAnimator.

Bug: 196173550
Test: atest WmTests:WindowContainerTests#testAssignAnimationLayer
Change-Id: Ia3cc0eca3550e29fee00fafa8ddf356d00512df7
This commit is contained in:
Chris Li
2021-09-27 18:04:10 +08:00
parent 4650065c80
commit 993e922788
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

@@ -2320,10 +2320,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() {
@@ -2331,10 +2336,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;