Merge "Fix wallpaper zoom effect with shell transition"

This commit is contained in:
Riddle Hsu
2021-12-21 11:46:52 +00:00
committed by Android (Google) Code Review
3 changed files with 28 additions and 12 deletions

View File

@@ -298,9 +298,9 @@ class WallpaperController {
}
boolean updateWallpaperOffset(WindowState wallpaperWin, boolean sync) {
final Rect parentFrame = wallpaperWin.getParentFrame();
final int dw = parentFrame.width();
final int dh = parentFrame.height();
final Rect bounds = wallpaperWin.getLastReportedBounds();
final int dw = bounds.width();
final int dh = bounds.height();
int xOffset = 0;
int yOffset = 0;
@@ -448,6 +448,13 @@ class WallpaperController {
private void updateWallpaperOffsetLocked(WindowState changingTarget, boolean sync) {
WindowState target = mWallpaperTarget;
if (target == null && changingTarget.mToken.isVisible()
&& changingTarget.mTransitionController.inTransition()) {
// If the wallpaper target was cleared during transition, still allows the visible
// window which may have been requested to be invisible to update the offset, e.g.
// zoom effect from home.
target = changingTarget;
}
if (target != null) {
if (target.mWallpaperX >= 0) {
mLastWallpaperX = target.mWallpaperX;

View File

@@ -2882,6 +2882,12 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
return mLastReportedConfiguration.getMergedConfiguration();
}
/** Returns the last window configuration bounds reported to the client. */
Rect getLastReportedBounds() {
final Rect bounds = getLastReportedConfiguration().windowConfiguration.getBounds();
return !bounds.isEmpty() ? bounds : getBounds();
}
void adjustStartingWindowFlags() {
if (mAttrs.type == TYPE_BASE_APPLICATION && mActivityRecord != null
&& mActivityRecord.mStartingWindow != null) {
@@ -5230,6 +5236,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// Child window follows parent's scale.
return;
}
if (!isVisibleRequested() && !(mIsWallpaper && mToken.isVisible())) {
// Skip if it is requested to be invisible, but if it is wallpaper, it may be in
// transition that still needs to update the scale for zoom effect.
return;
}
float newHScale = mHScale * mGlobalScale * mWallpaperScale;
float newVScale = mVScale * mGlobalScale * mWallpaperScale;
if (mLastHScale != newHScale ||
@@ -5249,7 +5260,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
updateSurfacePositionNonOrganized();
// Send information to SurfaceFlinger about the priority of the current window.
updateFrameRateSelectionPriorityIfNeeded();
if (isVisibleRequested()) updateScaleIfNeeded();
updateScaleIfNeeded();
mWinAnimator.prepareSurfaceLocked(getSyncTransaction());
super.prepareSurfaces();
@@ -5275,11 +5286,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mSurfacePosition);
if (mWallpaperScale != 1f) {
DisplayInfo displayInfo = getDisplayInfo();
final Rect bounds = getLastReportedBounds();
Matrix matrix = mTmpMatrix;
matrix.setTranslate(mXOffset, mYOffset);
matrix.postScale(mWallpaperScale, mWallpaperScale, displayInfo.logicalWidth / 2f,
displayInfo.logicalHeight / 2f);
matrix.postScale(mWallpaperScale, mWallpaperScale, bounds.exactCenterX(),
bounds.exactCenterY());
matrix.getValues(mTmpMatrixArray);
mSurfacePosition.offset(Math.round(mTmpMatrixArray[Matrix.MTRANS_X]),
Math.round(mTmpMatrixArray[Matrix.MTRANS_Y]));

View File

@@ -1422,18 +1422,16 @@ 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.
// Associate wallpaper 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.mXOffset = mWallpaperWindow.mYOffset = -1;
assertTrue(mDisplayContent.mWallpaperController.updateWallpaperOffset(mWallpaperWindow,
false /* sync */));
assertThat(mWallpaperWindow.mXOffset).isGreaterThan(-1);
assertThat(mWallpaperWindow.mYOffset).isGreaterThan(-1);
assertThat(mWallpaperWindow.mXOffset).isNotEqualTo(-1);
assertThat(mWallpaperWindow.mYOffset).isNotEqualTo(-1);
// The wallpaper need to animate with transformed position, so its surface position should
// not be reset.