summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author lumark <lumark@google.com> 2019-12-26 22:05:12 +0800
committer lumark <lumark@google.com> 2020-01-14 01:15:17 +0800
commit8571866ccd956557aa70baa497cb328d249bdbe0 (patch)
tree071d00fef9cd87419940e7cd0f15b1303746f0da
parente8bab7970d38449763e698fb8f8c9a8c2d49f23c (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.java17
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java9
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 =