Loading core/java/android/view/IRecentsAnimationController.aidl +9 −0 Original line number Diff line number Diff line Loading @@ -154,4 +154,13 @@ interface IRecentsAnimationController { * app. */ void detachNavigationBarFromApp(boolean moveHomeToTop); /** * Used for animating the navigation bar during app launch from recents in live tile mode. * * First fade out the navigation bar at the bottom of the display and then fade in to the app. * * @param duration the duration of the app launch animation */ void animateNavigationBarToApp(long duration); } services/core/java/com/android/server/wm/RecentsAnimationController.java +33 −5 Original line number Diff line number Diff line Loading @@ -156,6 +156,7 @@ public class RecentsAnimationController implements DeathRecipient { @VisibleForTesting boolean mShouldAttachNavBarToAppDuringTransition; private boolean mNavigationBarAttachedToApp; private ActivityRecord mNavBarAttachedApp; /** * Animates the screenshot of task that used to be controlled by RecentsAnimation. Loading Loading @@ -392,6 +393,18 @@ public class RecentsAnimationController implements DeathRecipient { Binder.restoreCallingIdentity(token); } } @Override public void animateNavigationBarToApp(long duration) { final long token = Binder.clearCallingIdentity(); try { synchronized (mService.getWindowManagerLock()) { animateNavigationBarForAppLaunch(duration); } } finally { Binder.restoreCallingIdentity(token); } } }; /** Loading Loading @@ -613,7 +626,6 @@ public class RecentsAnimationController implements DeathRecipient { || mDisplayContent.getFadeRotationAnimationController() != null) { return; } ActivityRecord topActivity = null; boolean shouldTranslateNavBar = false; final boolean isDisplayLandscape = mDisplayContent.getConfiguration().orientation == ORIENTATION_LANDSCAPE; Loading @@ -630,12 +642,12 @@ public class RecentsAnimationController implements DeathRecipient { continue; } shouldTranslateNavBar = isSplitScreenSecondary; topActivity = task.getTopVisibleActivity(); mNavBarAttachedApp = task.getTopVisibleActivity(); break; } final WindowState navWindow = getNavigationBarWindow(); if (topActivity == null || navWindow == null || navWindow.mToken == null) { if (mNavBarAttachedApp == null || navWindow == null || navWindow.mToken == null) { return; } mNavigationBarAttachedToApp = true; Loading @@ -643,9 +655,9 @@ public class RecentsAnimationController implements DeathRecipient { final SurfaceControl.Transaction t = navWindow.mToken.getPendingTransaction(); final SurfaceControl navSurfaceControl = navWindow.mToken.getSurfaceControl(); if (shouldTranslateNavBar) { navWindow.setSurfaceTranslationY(-topActivity.getBounds().top); navWindow.setSurfaceTranslationY(-mNavBarAttachedApp.getBounds().top); } t.reparent(navSurfaceControl, topActivity.getSurfaceControl()); t.reparent(navSurfaceControl, mNavBarAttachedApp.getSurfaceControl()); t.show(navSurfaceControl); final WindowContainer imeContainer = mDisplayContent.getImeContainer(); Loading Loading @@ -695,9 +707,25 @@ public class RecentsAnimationController implements DeathRecipient { } } void animateNavigationBarForAppLaunch(long duration) { if (!mShouldAttachNavBarToAppDuringTransition // Skip the case where the nav bar is controlled by fade rotation. || mDisplayContent.getFadeRotationAnimationController() != null || mNavigationBarAttachedToApp || mNavBarAttachedApp == null) { return; } final NavBarFadeAnimationController controller = new NavBarFadeAnimationController(mDisplayContent); controller.fadeOutAndInSequentially(duration, null /* fadeOutParent */, mNavBarAttachedApp.getSurfaceControl()); } void addTaskToTargets(Task task, OnAnimationFinishedCallback finishedCallback) { if (mRunner != null) { mIsAddingTaskToTargets = task != null; mNavBarAttachedApp = task == null ? null : task.getTopVisibleActivity(); // No need to send task appeared when the task target already exists, or when the // task is being managed as a multi-window mode outside of recents (e.g. bubbles). if (isAnimatingTask(task) || skipAnimation(task)) { Loading Loading
core/java/android/view/IRecentsAnimationController.aidl +9 −0 Original line number Diff line number Diff line Loading @@ -154,4 +154,13 @@ interface IRecentsAnimationController { * app. */ void detachNavigationBarFromApp(boolean moveHomeToTop); /** * Used for animating the navigation bar during app launch from recents in live tile mode. * * First fade out the navigation bar at the bottom of the display and then fade in to the app. * * @param duration the duration of the app launch animation */ void animateNavigationBarToApp(long duration); }
services/core/java/com/android/server/wm/RecentsAnimationController.java +33 −5 Original line number Diff line number Diff line Loading @@ -156,6 +156,7 @@ public class RecentsAnimationController implements DeathRecipient { @VisibleForTesting boolean mShouldAttachNavBarToAppDuringTransition; private boolean mNavigationBarAttachedToApp; private ActivityRecord mNavBarAttachedApp; /** * Animates the screenshot of task that used to be controlled by RecentsAnimation. Loading Loading @@ -392,6 +393,18 @@ public class RecentsAnimationController implements DeathRecipient { Binder.restoreCallingIdentity(token); } } @Override public void animateNavigationBarToApp(long duration) { final long token = Binder.clearCallingIdentity(); try { synchronized (mService.getWindowManagerLock()) { animateNavigationBarForAppLaunch(duration); } } finally { Binder.restoreCallingIdentity(token); } } }; /** Loading Loading @@ -613,7 +626,6 @@ public class RecentsAnimationController implements DeathRecipient { || mDisplayContent.getFadeRotationAnimationController() != null) { return; } ActivityRecord topActivity = null; boolean shouldTranslateNavBar = false; final boolean isDisplayLandscape = mDisplayContent.getConfiguration().orientation == ORIENTATION_LANDSCAPE; Loading @@ -630,12 +642,12 @@ public class RecentsAnimationController implements DeathRecipient { continue; } shouldTranslateNavBar = isSplitScreenSecondary; topActivity = task.getTopVisibleActivity(); mNavBarAttachedApp = task.getTopVisibleActivity(); break; } final WindowState navWindow = getNavigationBarWindow(); if (topActivity == null || navWindow == null || navWindow.mToken == null) { if (mNavBarAttachedApp == null || navWindow == null || navWindow.mToken == null) { return; } mNavigationBarAttachedToApp = true; Loading @@ -643,9 +655,9 @@ public class RecentsAnimationController implements DeathRecipient { final SurfaceControl.Transaction t = navWindow.mToken.getPendingTransaction(); final SurfaceControl navSurfaceControl = navWindow.mToken.getSurfaceControl(); if (shouldTranslateNavBar) { navWindow.setSurfaceTranslationY(-topActivity.getBounds().top); navWindow.setSurfaceTranslationY(-mNavBarAttachedApp.getBounds().top); } t.reparent(navSurfaceControl, topActivity.getSurfaceControl()); t.reparent(navSurfaceControl, mNavBarAttachedApp.getSurfaceControl()); t.show(navSurfaceControl); final WindowContainer imeContainer = mDisplayContent.getImeContainer(); Loading Loading @@ -695,9 +707,25 @@ public class RecentsAnimationController implements DeathRecipient { } } void animateNavigationBarForAppLaunch(long duration) { if (!mShouldAttachNavBarToAppDuringTransition // Skip the case where the nav bar is controlled by fade rotation. || mDisplayContent.getFadeRotationAnimationController() != null || mNavigationBarAttachedToApp || mNavBarAttachedApp == null) { return; } final NavBarFadeAnimationController controller = new NavBarFadeAnimationController(mDisplayContent); controller.fadeOutAndInSequentially(duration, null /* fadeOutParent */, mNavBarAttachedApp.getSurfaceControl()); } void addTaskToTargets(Task task, OnAnimationFinishedCallback finishedCallback) { if (mRunner != null) { mIsAddingTaskToTargets = task != null; mNavBarAttachedApp = task == null ? null : task.getTopVisibleActivity(); // No need to send task appeared when the task target already exists, or when the // task is being managed as a multi-window mode outside of recents (e.g. bubbles). if (isAnimatingTask(task) || skipAnimation(task)) { Loading