Keep fixed rotation transformed surface position for animation leash

The orientation of the target window can be different than who controls
the leash. In order to let the animator use the leash without additional
transformation, the current position of surface needs to be preserved.

Also fix a flaky test due to the display was frozen.

Fixes: 153561756
Fixes: 154030098
Test: atest DisplayContentTests#testApplyTopFixedRotationTransform
      ActivityRecordTests#testActivityOnCancelFixedRotationTransform
Change-Id: I4b75e830b4d63143c6825f0fa5ccbf333b2ba6ff
This commit is contained in:
Riddle Hsu
2020-04-09 17:58:50 +08:00
parent b86e5a77a1
commit 3d0aa4f3d0
5 changed files with 30 additions and 13 deletions

View File

@@ -2304,14 +2304,18 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
}
void resetSurfacePositionForAnimationLeash(Transaction t) {
t.setPosition(mSurfaceControl, 0, 0);
mLastSurfacePosition.set(0, 0);
}
@Override
public void onAnimationLeashCreated(Transaction t, SurfaceControl leash) {
mLastLayer = -1;
reassignLayer(t);
// Leash is now responsible for position, so set our position to 0.
t.setPosition(mSurfaceControl, 0, 0);
mLastSurfacePosition.set(0, 0);
resetSurfacePositionForAnimationLeash(t);
}
@Override

View File

@@ -5249,16 +5249,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
super.prepareSurfaces();
}
@Override
public void onAnimationLeashCreated(Transaction t, SurfaceControl leash) {
super.onAnimationLeashCreated(t, leash);
}
@Override
public void onAnimationLeashLost(Transaction t) {
super.onAnimationLeashLost(t);
}
@Override
@VisibleForTesting
void updateSurfacePosition(Transaction t) {

View File

@@ -632,6 +632,15 @@ class WindowToken extends WindowContainer<WindowState> {
}
}
@Override
void resetSurfacePositionForAnimationLeash(SurfaceControl.Transaction t) {
// Keep the transformed position to animate because the surface will show in different
// rotation than the animator of leash.
if (!isFixedRotationTransforming()) {
super.resetSurfacePositionForAnimationLeash(t);
}
}
/**
* Gives a chance to this {@link WindowToken} to adjust the {@link
* android.view.WindowManager.LayoutParams} of its windows.

View File

@@ -1324,7 +1324,7 @@ public class ActivityRecordTests extends ActivityTestsBase {
display.rotateInDifferentOrientationIfNeeded(mActivity);
display.mFixedRotationLaunchingApp = mActivity;
displayRotation.updateRotationUnchecked(false /* forceUpdate */);
displayRotation.updateRotationUnchecked(true /* forceUpdate */);
assertTrue(displayRotation.isRotatingSeamlessly());

View File

@@ -90,6 +90,7 @@ import android.view.ISystemGestureExclusionListener;
import android.view.IWindowManager;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.SurfaceControl.Transaction;
import android.view.ViewRootImpl;
import android.view.WindowManager;
import android.view.test.InsetsModeSession;
@@ -1040,6 +1041,12 @@ public class DisplayContentTests extends WindowTestsBase {
assertEquals(config90.orientation, app.getConfiguration().orientation);
assertEquals(config90.windowConfiguration.getBounds(), app.getBounds());
// Make wallaper laid out with the fixed rotation transform.
final WindowToken wallpaperToken = mWallpaperWindow.mToken;
wallpaperToken.linkFixedRotationTransform(app);
mWallpaperWindow.mLayoutNeeded = true;
performLayout(mDisplayContent);
// Force the negative offset to verify it can be updated.
mWallpaperWindow.mWinAnimator.mXOffset = mWallpaperWindow.mWinAnimator.mYOffset = -1;
assertTrue(mDisplayContent.mWallpaperController.updateWallpaperOffset(mWallpaperWindow,
@@ -1047,6 +1054,13 @@ public class DisplayContentTests extends WindowTestsBase {
assertThat(mWallpaperWindow.mWinAnimator.mXOffset).isGreaterThan(-1);
assertThat(mWallpaperWindow.mWinAnimator.mYOffset).isGreaterThan(-1);
// The wallpaper need to animate with transformed position, so its surface position should
// not be reset.
final Transaction t = wallpaperToken.getPendingTransaction();
spyOn(t);
mWallpaperWindow.mToken.onAnimationLeashCreated(t, null /* leash */);
verify(t, never()).setPosition(any(), eq(0), eq(0));
mDisplayContent.mAppTransition.notifyAppTransitionFinishedLocked(app.token);
// The animation in old rotation should be cancelled.