diff options
| author | 2019-12-26 22:05:12 +0800 | |
|---|---|---|
| committer | 2020-01-14 01:15:17 +0800 | |
| commit | 8571866ccd956557aa70baa497cb328d249bdbe0 (patch) | |
| tree | 071d00fef9cd87419940e7cd0f15b1303746f0da | |
| parent | e8bab7970d38449763e698fb8f8c9a8c2d49f23c (diff) | |
Fix some cases when enabling hierarchical animation
- Fix split-screen primary stack's thumbnail won't animate:
- in ActivityRecord#attachThumbnailAnimation, using WC#getAnimatingContainer
to align the current animating layer.
- Fix animation surface position shifted when launching activity in
split-screen secondary stack:
- Using WC#getRelativeDisplayedPosition in WC#getAnimationAdapter
to get relative position of leash parent.
Also, refined below logics:
- Refine logics in WindowContainer#getAnimationBounds with
getDisplayBounds for fixing a regression issue that launching activity
from split screen secondary stack the animation will moving to top stack rather
then moving to bottom stack.
Bug: 142617871
Bug: 131661052
Test: Refectoring CL, all existing tests passed.
Test: Manual testing for:
1) Enable hierarchical animation flag by using adb command:
adb shell setprop persist.wm.hierarchical_animations 1
2) Entering split-screen mode from recents app.
3) Make sure task scroll-up thumbnail animation for split-screen primary
stack can animated.
4) Launch app to split-screen secondary stack, make sure launching
animation position will right below divider instead going to top-side
of screen.
Change-Id: I3ccc39ab1f3f02cecff8631512dc94f2f01c4be3
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityRecord.java | 17 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowContainer.java | 9 |
2 files changed, 18 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 26d76a8d6e28..320be2d7cdbd 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -5934,7 +5934,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mAnimationBoundsLayer = createAnimationBoundsLayer(t); // Crop to stack bounds. - t.setWindowCrop(mAnimationBoundsLayer, mTmpRect); + if (!WindowManagerService.sHierarchicalAnimations) { + // For Hierarchical animation, we don't need to set window crop since the leash + // surface size has already same as the animating container. + t.setWindowCrop(mAnimationBoundsLayer, mTmpRect); + } t.setLayer(mAnimationBoundsLayer, layer); // Reparent leash to animation bounds layer. @@ -5982,9 +5986,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return; } clearThumbnail(); + final Transaction transaction = getAnimatingContainer().getPendingTransaction(); mThumbnail = new WindowContainerThumbnail(mWmService.mSurfaceFactory, - getPendingTransaction(), this, thumbnailHeader); - mThumbnail.startAnimation(getPendingTransaction(), loadThumbnailAnimation(thumbnailHeader)); + transaction, getAnimatingContainer(), thumbnailHeader); + mThumbnail.startAnimation(transaction, loadThumbnailAnimation(thumbnailHeader)); } /** @@ -6011,13 +6016,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (thumbnail == null) { return; } + final Transaction transaction = getAnimatingContainer().getPendingTransaction(); mThumbnail = new WindowContainerThumbnail(mWmService.mSurfaceFactory, - getPendingTransaction(), this, thumbnail); + transaction, getAnimatingContainer(), thumbnail); final Animation animation = getDisplayContent().mAppTransition.createCrossProfileAppsThumbnailAnimationLocked( win.getFrameLw()); - mThumbnail.startAnimation(getPendingTransaction(), animation, new Point(frame.left, - frame.top)); + mThumbnail.startAnimation(transaction, animation, new Point(frame.left, frame.top)); } private Animation loadThumbnailAnimation(GraphicBuffer thumbnailHeader) { diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 8ac212f7ef03..25c0797b4e5f 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -42,6 +42,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.logWithStack; +import static com.android.server.wm.WindowManagerService.sHierarchicalAnimations; import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM; import android.annotation.CallSuper; @@ -1855,7 +1856,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< // TODO: Remove this and use #getBounds() instead once we set an app transition animation // on TaskStack. Rect getAnimationBounds(int appStackClipMode) { - return getBounds(); + return getDisplayedBounds(); } /** @@ -1929,7 +1930,11 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< // Separate position and size for use in animators. mTmpRect.set(getAnimationBounds(appStackClipMode)); - mTmpPoint.set(mTmpRect.left, mTmpRect.top); + if (sHierarchicalAnimations) { + getRelativeDisplayedPosition(mTmpPoint); + } else { + mTmpPoint.set(mTmpRect.left, mTmpRect.top); + } mTmpRect.offsetTo(0, 0); final RemoteAnimationController controller = |