Merge "Remove unstarted freeze surface before starting new freeze" into sc-v2-dev am: d0e86ae51b
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16183025 Change-Id: Ib15c4dbf940a4c5e0c22a32c99e5343b92e0efc7
This commit is contained in:
@@ -75,6 +75,7 @@ class SurfaceFreezer {
|
|||||||
*/
|
*/
|
||||||
void freeze(SurfaceControl.Transaction t, Rect startBounds, Point relativePosition,
|
void freeze(SurfaceControl.Transaction t, Rect startBounds, Point relativePosition,
|
||||||
@Nullable SurfaceControl freezeTarget) {
|
@Nullable SurfaceControl freezeTarget) {
|
||||||
|
reset(t);
|
||||||
mFreezeBounds.set(startBounds);
|
mFreezeBounds.set(startBounds);
|
||||||
|
|
||||||
mLeash = SurfaceAnimator.createAnimationLeash(mAnimatable, mAnimatable.getSurfaceControl(),
|
mLeash = SurfaceAnimator.createAnimationLeash(mAnimatable, mAnimatable.getSurfaceControl(),
|
||||||
@@ -139,6 +140,22 @@ class SurfaceFreezer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Resets the snapshot before taking another one if the animation hasn't been started yet. */
|
||||||
|
private void reset(SurfaceControl.Transaction t) {
|
||||||
|
// Those would have been taken by the SurfaceAnimator if the animation has been started, so
|
||||||
|
// we can remove the leash directly.
|
||||||
|
// No need to reset the mAnimatable leash, as this is called before a new animation leash is
|
||||||
|
// created, so another #onAnimationLeashCreated will be called.
|
||||||
|
if (mSnapshot != null) {
|
||||||
|
mSnapshot.destroy(t);
|
||||||
|
mSnapshot = null;
|
||||||
|
}
|
||||||
|
if (mLeash != null) {
|
||||||
|
t.remove(mLeash);
|
||||||
|
mLeash = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void setLayer(SurfaceControl.Transaction t, int layer) {
|
void setLayer(SurfaceControl.Transaction t, int layer) {
|
||||||
if (mLeash != null) {
|
if (mLeash != null) {
|
||||||
t.setLayer(mLeash, layer);
|
t.setLayer(mLeash, layer);
|
||||||
|
|||||||
@@ -1173,6 +1173,33 @@ public class WindowContainerTests extends WindowTestsBase {
|
|||||||
assertNull(surfaceAnimator.mSnapshot);
|
assertNull(surfaceAnimator.mSnapshot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRemoveUnstartedFreezeSurfaceWhenFreezeAgain() {
|
||||||
|
final WindowContainer container = createTaskFragmentWithParentTask(
|
||||||
|
createTask(mDisplayContent), false);
|
||||||
|
container.mSurfaceControl = mock(SurfaceControl.class);
|
||||||
|
final SurfaceFreezer surfaceFreezer = container.mSurfaceFreezer;
|
||||||
|
final SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class);
|
||||||
|
spyOn(container);
|
||||||
|
doReturn(t).when(container).getPendingTransaction();
|
||||||
|
doReturn(t).when(container).getSyncTransaction();
|
||||||
|
|
||||||
|
// Leash and snapshot created for change transition.
|
||||||
|
container.initializeChangeTransition(new Rect(0, 0, 1000, 2000));
|
||||||
|
|
||||||
|
assertNotNull(surfaceFreezer.mLeash);
|
||||||
|
|
||||||
|
// Can't really take a snapshot, manually set one.
|
||||||
|
final SurfaceFreezer.Snapshot snapshot = mock(SurfaceFreezer.Snapshot.class);
|
||||||
|
surfaceFreezer.mSnapshot = snapshot;
|
||||||
|
final SurfaceControl prevLeash = surfaceFreezer.mLeash;
|
||||||
|
|
||||||
|
container.initializeChangeTransition(new Rect(0, 0, 1500, 2500));
|
||||||
|
|
||||||
|
verify(t).remove(prevLeash);
|
||||||
|
verify(snapshot).destroy(t);
|
||||||
|
}
|
||||||
|
|
||||||
/* Used so we can gain access to some protected members of the {@link WindowContainer} class */
|
/* Used so we can gain access to some protected members of the {@link WindowContainer} class */
|
||||||
private static class TestWindowContainer extends WindowContainer<TestWindowContainer> {
|
private static class TestWindowContainer extends WindowContainer<TestWindowContainer> {
|
||||||
private final int mLayer;
|
private final int mLayer;
|
||||||
|
|||||||
Reference in New Issue
Block a user