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
This commit is contained in:
lumark
2019-12-26 22:05:12 +08:00
parent e8bab7970d
commit 8571866ccd
2 changed files with 18 additions and 8 deletions

View File

@@ -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) {

View File

@@ -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 =