Loading libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java +4 −3 Original line number Diff line number Diff line Loading @@ -720,9 +720,10 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { if (a != null) { if (!a.isInitialized()) { final int width = endBounds.width(); final int height = endBounds.height(); a.initialize(width, height, width, height); final Rect animationRange = TransitionUtil.isClosingType(changeMode) ? change.getStartAbsBounds() : change.getEndAbsBounds(); a.initialize(animationRange.width(), animationRange.height(), endBounds.width(), endBounds.height()); } a.restrictDuration(MAX_ANIMATION_DURATION); a.scaleCurrentDuration(mTransitionAnimationScaleSetting); Loading services/core/java/com/android/server/wm/Task.java +25 −8 Original line number Diff line number Diff line Loading @@ -3290,6 +3290,12 @@ class Task extends TaskFragment { scheduleAnimation(); } // Let organizer manage task visibility for shell transition. So don't change it's // visibility during collecting. if (mTransitionController.isCollecting() && mCreatedByOrganizer) { return; } // We intend to let organizer manage task visibility but it doesn't // have enough information until we finish shell transitions. // In the mean time we do an easy fix here. Loading Loading @@ -5687,6 +5693,13 @@ class Task extends TaskFragment { } private boolean moveTaskToBackInner(@NonNull Task task) { if (mTransitionController.isShellTransitionsEnabled()) { // Preventing from update surface position for WindowState if configuration changed, // because the position is depends on WindowFrame, so update the position before // relayout will only update it to "old" position. mAtmService.deferWindowLayout(); } try { moveToBack("moveTaskToBackInner", task); if (inPinnedWindowingMode()) { Loading @@ -5697,7 +5710,11 @@ class Task extends TaskFragment { mRootWindowContainer.ensureVisibilityAndConfig(null /* starting */, mDisplayContent.mDisplayId, false /* markFrozenIfConfigChanged */, false /* deferResume */); } finally { if (mTransitionController.isShellTransitionsEnabled()) { mAtmService.continueWindowLayout(); } } ActivityRecord topActivity = getDisplayArea().topRunningActivity(); Task topRootTask = topActivity.getRootTask(); if (topRootTask != null && topRootTask != this && topActivity.isState(RESUMED)) { Loading services/core/java/com/android/server/wm/Transition.java +23 −3 Original line number Diff line number Diff line Loading @@ -2244,11 +2244,17 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { WindowContainer<?> ancestor = findCommonAncestor(sortedTargets, wc); // Make leash based on highest (z-order) direct child of ancestor with a participant. // Check whether the ancestor is belonged to last parent, shouldn't happen. final boolean hasReparent = !wc.isDescendantOf(ancestor); WindowContainer leashReference = wc; if (hasReparent) { Slog.e(TAG, "Did not find common ancestor! Ancestor= " + ancestor + " target= " + wc); } else { while (leashReference.getParent() != ancestor) { leashReference = leashReference.getParent(); } } final SurfaceControl rootLeash = leashReference.makeAnimationLeash().setName( "Transition Root: " + leashReference.getName()).build(); rootLeash.setUnreleasedWarningCallSite("Transition.calculateTransitionRoots"); Loading Loading @@ -2453,6 +2459,20 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { // Skip the non-app window or windows on a different display continue; } // Re-initiate the last parent as the initial ancestor instead of the top target. // When move a leaf task from organized task to display area, try to keep the transition // root be the original organized task for close transition animation. // Otherwise, shell will use wrong root layer to play animation. // Note: Since the target is sorted, so only need to do this at the lowest target. if (change.mStartParent != null && wc.getParent() != null && change.mStartParent.isAttached() && wc.getParent() != change.mStartParent && i == targets.size() - 1) { final int transitionMode = change.getTransitMode(wc); if (transitionMode == TRANSIT_CLOSE || transitionMode == TRANSIT_TO_BACK) { ancestor = change.mStartParent; continue; } } while (!wc.isDescendantOf(ancestor)) { ancestor = ancestor.getParent(); } Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java +4 −3 Original line number Diff line number Diff line Loading @@ -720,9 +720,10 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { if (a != null) { if (!a.isInitialized()) { final int width = endBounds.width(); final int height = endBounds.height(); a.initialize(width, height, width, height); final Rect animationRange = TransitionUtil.isClosingType(changeMode) ? change.getStartAbsBounds() : change.getEndAbsBounds(); a.initialize(animationRange.width(), animationRange.height(), endBounds.width(), endBounds.height()); } a.restrictDuration(MAX_ANIMATION_DURATION); a.scaleCurrentDuration(mTransitionAnimationScaleSetting); Loading
services/core/java/com/android/server/wm/Task.java +25 −8 Original line number Diff line number Diff line Loading @@ -3290,6 +3290,12 @@ class Task extends TaskFragment { scheduleAnimation(); } // Let organizer manage task visibility for shell transition. So don't change it's // visibility during collecting. if (mTransitionController.isCollecting() && mCreatedByOrganizer) { return; } // We intend to let organizer manage task visibility but it doesn't // have enough information until we finish shell transitions. // In the mean time we do an easy fix here. Loading Loading @@ -5687,6 +5693,13 @@ class Task extends TaskFragment { } private boolean moveTaskToBackInner(@NonNull Task task) { if (mTransitionController.isShellTransitionsEnabled()) { // Preventing from update surface position for WindowState if configuration changed, // because the position is depends on WindowFrame, so update the position before // relayout will only update it to "old" position. mAtmService.deferWindowLayout(); } try { moveToBack("moveTaskToBackInner", task); if (inPinnedWindowingMode()) { Loading @@ -5697,7 +5710,11 @@ class Task extends TaskFragment { mRootWindowContainer.ensureVisibilityAndConfig(null /* starting */, mDisplayContent.mDisplayId, false /* markFrozenIfConfigChanged */, false /* deferResume */); } finally { if (mTransitionController.isShellTransitionsEnabled()) { mAtmService.continueWindowLayout(); } } ActivityRecord topActivity = getDisplayArea().topRunningActivity(); Task topRootTask = topActivity.getRootTask(); if (topRootTask != null && topRootTask != this && topActivity.isState(RESUMED)) { Loading
services/core/java/com/android/server/wm/Transition.java +23 −3 Original line number Diff line number Diff line Loading @@ -2244,11 +2244,17 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { WindowContainer<?> ancestor = findCommonAncestor(sortedTargets, wc); // Make leash based on highest (z-order) direct child of ancestor with a participant. // Check whether the ancestor is belonged to last parent, shouldn't happen. final boolean hasReparent = !wc.isDescendantOf(ancestor); WindowContainer leashReference = wc; if (hasReparent) { Slog.e(TAG, "Did not find common ancestor! Ancestor= " + ancestor + " target= " + wc); } else { while (leashReference.getParent() != ancestor) { leashReference = leashReference.getParent(); } } final SurfaceControl rootLeash = leashReference.makeAnimationLeash().setName( "Transition Root: " + leashReference.getName()).build(); rootLeash.setUnreleasedWarningCallSite("Transition.calculateTransitionRoots"); Loading Loading @@ -2453,6 +2459,20 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { // Skip the non-app window or windows on a different display continue; } // Re-initiate the last parent as the initial ancestor instead of the top target. // When move a leaf task from organized task to display area, try to keep the transition // root be the original organized task for close transition animation. // Otherwise, shell will use wrong root layer to play animation. // Note: Since the target is sorted, so only need to do this at the lowest target. if (change.mStartParent != null && wc.getParent() != null && change.mStartParent.isAttached() && wc.getParent() != change.mStartParent && i == targets.size() - 1) { final int transitionMode = change.getTransitMode(wc); if (transitionMode == TRANSIT_CLOSE || transitionMode == TRANSIT_TO_BACK) { ancestor = change.mStartParent; continue; } } while (!wc.isDescendantOf(ancestor)) { ancestor = ancestor.getParent(); } Loading