Merge "Exclude launcher from app transition animation while recents is running." into tm-dev am: 0dfb582d5a

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18492309

Change-Id: Id75dd00b26c9e92e8548ba52dfe6191caf1ccac5
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Issei Suzuki
2022-05-31 15:55:45 +00:00
committed by Automerger Merge Worker
3 changed files with 78 additions and 51 deletions

View File

@@ -1879,12 +1879,6 @@
"group": "WM_DEBUG_STATES", "group": "WM_DEBUG_STATES",
"at": "com\/android\/server\/wm\/TaskFragment.java" "at": "com\/android\/server\/wm\/TaskFragment.java"
}, },
"-240296576": {
"message": "handleAppTransitionReady: displayId=%d appTransition={%s} openingApps=[%s] closingApps=[%s] transit=%s",
"level": "VERBOSE",
"group": "WM_DEBUG_APP_TRANSITIONS",
"at": "com\/android\/server\/wm\/AppTransitionController.java"
},
"-237664290": { "-237664290": {
"message": "Pause the recording session on display %s", "message": "Pause the recording session on display %s",
"level": "VERBOSE", "level": "VERBOSE",
@@ -1987,6 +1981,12 @@
"group": "WM_DEBUG_CONTENT_RECORDING", "group": "WM_DEBUG_CONTENT_RECORDING",
"at": "com\/android\/server\/wm\/ContentRecorder.java" "at": "com\/android\/server\/wm\/ContentRecorder.java"
}, },
"-134793542": {
"message": "handleAppTransitionReady: displayId=%d appTransition={%s} excludeLauncherFromAnimation=%b openingApps=[%s] closingApps=[%s] transit=%s",
"level": "VERBOSE",
"group": "WM_DEBUG_APP_TRANSITIONS",
"at": "com\/android\/server\/wm\/AppTransitionController.java"
},
"-134091882": { "-134091882": {
"message": "Screenshotting Activity %s", "message": "Screenshotting Activity %s",
"level": "VERBOSE", "level": "VERBOSE",
@@ -2491,12 +2491,6 @@
"group": "WM_ERROR", "group": "WM_ERROR",
"at": "com\/android\/server\/wm\/WindowManagerService.java" "at": "com\/android\/server\/wm\/WindowManagerService.java"
}, },
"323235828": {
"message": "Delaying app transition for recents animation to finish",
"level": "VERBOSE",
"group": "WM_DEBUG_APP_TRANSITIONS",
"at": "com\/android\/server\/wm\/AppTransitionController.java"
},
"327461496": { "327461496": {
"message": "Complete pause: %s", "message": "Complete pause: %s",
"level": "VERBOSE", "level": "VERBOSE",

View File

@@ -76,6 +76,7 @@ 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.WindowManagerDebugConfig.TAG_WM;
import android.annotation.IntDef; import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.os.Trace; import android.os.Trace;
import android.util.ArrayMap; import android.util.ArrayMap;
@@ -145,7 +146,8 @@ public class AppTransitionController {
* Returns the currently visible window that is associated with the wallpaper in case we are * Returns the currently visible window that is associated with the wallpaper in case we are
* transitioning from an activity with a wallpaper to one without. * transitioning from an activity with a wallpaper to one without.
*/ */
private @Nullable WindowState getOldWallpaper() { @Nullable
private WindowState getOldWallpaper() {
final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget(); final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget();
final @TransitionType int firstTransit = final @TransitionType int firstTransit =
mDisplayContent.mAppTransition.getFirstAppTransition(); mDisplayContent.mAppTransition.getFirstAppTransition();
@@ -165,6 +167,16 @@ public class AppTransitionController {
? null : wallpaperTarget; ? null : wallpaperTarget;
} }
@NonNull
private static ArraySet<ActivityRecord> getAppsForAnimation(
@NonNull ArraySet<ActivityRecord> apps, boolean excludeLauncherFromAnimation) {
final ArraySet<ActivityRecord> appsForAnimation = new ArraySet<>(apps);
if (excludeLauncherFromAnimation) {
appsForAnimation.removeIf(ConfigurationContainer::isActivityTypeHome);
}
return appsForAnimation;
}
/** /**
* Handle application transition for given display. * Handle application transition for given display.
*/ */
@@ -214,18 +226,29 @@ public class AppTransitionController {
mWallpaperControllerLocked.adjustWallpaperWindowsForAppTransitionIfNeeded( mWallpaperControllerLocked.adjustWallpaperWindowsForAppTransitionIfNeeded(
mDisplayContent.mOpeningApps); mDisplayContent.mOpeningApps);
final @TransitionOldType int transit = getTransitCompatType( // Remove launcher from app transition animation while recents is running. Recents animation
mDisplayContent.mAppTransition, mDisplayContent.mOpeningApps, // is managed outside of app transition framework, so we just need to commit visibility.
mDisplayContent.mClosingApps, mDisplayContent.mChangingContainers, final boolean excludeLauncherFromAnimation =
mDisplayContent.mOpeningApps.stream().anyMatch(
(app) -> app.isAnimating(PARENTS, ANIMATION_TYPE_RECENTS))
|| mDisplayContent.mClosingApps.stream().anyMatch(
(app) -> app.isAnimating(PARENTS, ANIMATION_TYPE_RECENTS));
final ArraySet<ActivityRecord> openingAppsForAnimation = getAppsForAnimation(
mDisplayContent.mOpeningApps, excludeLauncherFromAnimation);
final ArraySet<ActivityRecord> closingAppsForAnimation = getAppsForAnimation(
mDisplayContent.mClosingApps, excludeLauncherFromAnimation);
@TransitionOldType final int transit = getTransitCompatType(
mDisplayContent.mAppTransition, openingAppsForAnimation, closingAppsForAnimation,
mDisplayContent.mChangingContainers,
mWallpaperControllerLocked.getWallpaperTarget(), getOldWallpaper(), mWallpaperControllerLocked.getWallpaperTarget(), getOldWallpaper(),
mDisplayContent.mSkipAppTransitionAnimation); mDisplayContent.mSkipAppTransitionAnimation);
mDisplayContent.mSkipAppTransitionAnimation = false; mDisplayContent.mSkipAppTransitionAnimation = false;
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
"handleAppTransitionReady: displayId=%d appTransition={%s}" "handleAppTransitionReady: displayId=%d appTransition={%s}"
+ " openingApps=[%s] closingApps=[%s] transit=%s", + " excludeLauncherFromAnimation=%b openingApps=[%s] closingApps=[%s] transit=%s",
mDisplayContent.mDisplayId, mDisplayContent.mDisplayId, appTransition.toString(), excludeLauncherFromAnimation,
appTransition.toString(),
mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps, mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
AppTransition.appTransitionOldToString(transit)); AppTransition.appTransitionOldToString(transit));
@@ -233,13 +256,15 @@ public class AppTransitionController {
// what will control the animation theme. If all closing windows are obscured, then there is // what will control the animation theme. If all closing windows are obscured, then there is
// no need to do an animation. This is the case, for example, when this transition is being // no need to do an animation. This is the case, for example, when this transition is being
// done behind a dream window. // done behind a dream window.
final ArraySet<Integer> activityTypes = collectActivityTypes(mDisplayContent.mOpeningApps, final ArraySet<Integer> activityTypes = collectActivityTypes(openingAppsForAnimation,
mDisplayContent.mClosingApps, mDisplayContent.mChangingContainers); closingAppsForAnimation, mDisplayContent.mChangingContainers);
final ActivityRecord animLpActivity = findAnimLayoutParamsToken(transit, activityTypes); final ActivityRecord animLpActivity = findAnimLayoutParamsToken(transit, activityTypes,
openingAppsForAnimation, closingAppsForAnimation,
mDisplayContent.mChangingContainers);
final ActivityRecord topOpeningApp = final ActivityRecord topOpeningApp =
getTopApp(mDisplayContent.mOpeningApps, false /* ignoreHidden */); getTopApp(openingAppsForAnimation, false /* ignoreHidden */);
final ActivityRecord topClosingApp = final ActivityRecord topClosingApp =
getTopApp(mDisplayContent.mClosingApps, false /* ignoreHidden */); getTopApp(closingAppsForAnimation, false /* ignoreHidden */);
final ActivityRecord topChangingApp = final ActivityRecord topChangingApp =
getTopApp(mDisplayContent.mChangingContainers, false /* ignoreHidden */); getTopApp(mDisplayContent.mChangingContainers, false /* ignoreHidden */);
final WindowManager.LayoutParams animLp = getAnimLp(animLpActivity); final WindowManager.LayoutParams animLp = getAnimLp(animLpActivity);
@@ -251,14 +276,14 @@ public class AppTransitionController {
overrideWithRemoteAnimationIfSet(animLpActivity, transit, activityTypes); overrideWithRemoteAnimationIfSet(animLpActivity, transit, activityTypes);
} }
final boolean voiceInteraction = containsVoiceInteraction(mDisplayContent.mClosingApps) final boolean voiceInteraction = containsVoiceInteraction(closingAppsForAnimation)
|| containsVoiceInteraction(mDisplayContent.mOpeningApps); || containsVoiceInteraction(openingAppsForAnimation);
final int layoutRedo; final int layoutRedo;
mService.mSurfaceAnimationRunner.deferStartingAnimations(); mService.mSurfaceAnimationRunner.deferStartingAnimations();
try { try {
applyAnimations(mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps, transit, applyAnimations(openingAppsForAnimation, closingAppsForAnimation, transit, animLp,
animLp, voiceInteraction); voiceInteraction);
handleClosingApps(); handleClosingApps();
handleOpeningApps(); handleOpeningApps();
handleChangingApps(transit); handleChangingApps(transit);
@@ -310,7 +335,7 @@ public class AppTransitionController {
* case we are transitioning from an activity with a wallpaper to one * case we are transitioning from an activity with a wallpaper to one
* without. Otherwise null. * without. Otherwise null.
*/ */
static @TransitionOldType int getTransitCompatType(AppTransition appTransition, @TransitionOldType static int getTransitCompatType(AppTransition appTransition,
ArraySet<ActivityRecord> openingApps, ArraySet<ActivityRecord> closingApps, ArraySet<ActivityRecord> openingApps, ArraySet<ActivityRecord> closingApps,
ArraySet<WindowContainer> changingContainers, @Nullable WindowState wallpaperTarget, ArraySet<WindowContainer> changingContainers, @Nullable WindowState wallpaperTarget,
@Nullable WindowState oldWallpaper, boolean skipAppTransitionAnimation) { @Nullable WindowState oldWallpaper, boolean skipAppTransitionAnimation) {
@@ -341,8 +366,8 @@ public class AppTransitionController {
if (skipAppTransitionAnimation) { if (skipAppTransitionAnimation) {
return WindowManager.TRANSIT_OLD_UNSET; return WindowManager.TRANSIT_OLD_UNSET;
} }
final @TransitionFlags int flags = appTransition.getTransitFlags(); @TransitionFlags final int flags = appTransition.getTransitFlags();
final @TransitionType int firstTransit = appTransition.getFirstAppTransition(); @TransitionType final int firstTransit = appTransition.getFirstAppTransition();
// Special transitions // Special transitions
// TODO(new-app-transitions): Revisit if those can be rewritten by using flags. // TODO(new-app-transitions): Revisit if those can be rewritten by using flags.
@@ -720,11 +745,9 @@ public class AppTransitionController {
*/ */
@Nullable @Nullable
private ActivityRecord findAnimLayoutParamsToken(@TransitionOldType int transit, private ActivityRecord findAnimLayoutParamsToken(@TransitionOldType int transit,
ArraySet<Integer> activityTypes) { ArraySet<Integer> activityTypes, ArraySet<ActivityRecord> openingApps,
ArraySet<ActivityRecord> closingApps, ArraySet<WindowContainer> changingApps) {
ActivityRecord result; ActivityRecord result;
final ArraySet<ActivityRecord> closingApps = mDisplayContent.mClosingApps;
final ArraySet<ActivityRecord> openingApps = mDisplayContent.mOpeningApps;
final ArraySet<WindowContainer> changingApps = mDisplayContent.mChangingContainers;
// Remote animations always win, but fullscreen tokens override non-fullscreen tokens. // Remote animations always win, but fullscreen tokens override non-fullscreen tokens.
result = lookForHighestTokenWithFilter(closingApps, openingApps, changingApps, result = lookForHighestTokenWithFilter(closingApps, openingApps, changingApps,
@@ -1152,11 +1175,6 @@ public class AppTransitionController {
if (activity == null) { if (activity == null) {
continue; continue;
} }
if (activity.isAnimating(PARENTS, ANIMATION_TYPE_RECENTS)) {
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
"Delaying app transition for recents animation to finish");
return false;
}
ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, ProtoLog.v(WM_DEBUG_APP_TRANSITIONS,
"Check opening app=%s: allDrawn=%b startingDisplayed=%b " "Check opening app=%s: allDrawn=%b startingDisplayed=%b "
+ "startingMoved=%b isRelaunching()=%b startingWindow=%s", + "startingMoved=%b isRelaunching()=%b startingWindow=%s",

View File

@@ -16,6 +16,8 @@
package com.android.server.wm; package com.android.server.wm;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static android.view.WindowManager.TRANSIT_CHANGE; import static android.view.WindowManager.TRANSIT_CHANGE;
@@ -25,6 +27,7 @@ import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE; import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE;
import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE; import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
import static android.view.WindowManager.TRANSIT_NONE; import static android.view.WindowManager.TRANSIT_NONE;
import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_OPEN;
import static android.view.WindowManager.TRANSIT_OLD_CRASHING_ACTIVITY_CLOSE; import static android.view.WindowManager.TRANSIT_OLD_CRASHING_ACTIVITY_CLOSE;
import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY; import static android.view.WindowManager.TRANSIT_OLD_KEYGUARD_GOING_AWAY;
import static android.view.WindowManager.TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE; import static android.view.WindowManager.TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE;
@@ -409,38 +412,50 @@ public class AppTransitionTests extends WindowTestsBase {
} }
@Test @Test
public void testDelayWhileRecents() { public void testExcludeLauncher() {
final DisplayContent dc = createNewDisplay(Display.STATE_ON); final DisplayContent dc = createNewDisplay(Display.STATE_ON);
doReturn(false).when(dc).onDescendantOrientationChanged(any()); doReturn(false).when(dc).onDescendantOrientationChanged(any());
final Task task = createTask(dc); final Task task = createTask(dc);
// Simulate activity1 launches activity2. // Simulate activity1 launches activity2
final ActivityRecord activity1 = createActivityRecord(task); final ActivityRecord activity1 = createActivityRecord(task);
activity1.setVisible(true); activity1.setVisible(true);
activity1.mVisibleRequested = false; activity1.mVisibleRequested = false;
activity1.allDrawn = true; activity1.allDrawn = true;
dc.mClosingApps.add(activity1);
final ActivityRecord activity2 = createActivityRecord(task); final ActivityRecord activity2 = createActivityRecord(task);
activity2.setVisible(false); activity2.setVisible(false);
activity2.mVisibleRequested = true; activity2.mVisibleRequested = true;
activity2.allDrawn = true; activity2.allDrawn = true;
dc.mClosingApps.add(activity1);
dc.mOpeningApps.add(activity2); dc.mOpeningApps.add(activity2);
dc.prepareAppTransition(TRANSIT_OPEN); dc.prepareAppTransition(TRANSIT_OPEN);
assertTrue(dc.mAppTransition.containsTransitRequest(TRANSIT_OPEN));
// Simulate start recents
final ActivityRecord homeActivity = createActivityRecord(dc, WINDOWING_MODE_FULLSCREEN,
ACTIVITY_TYPE_HOME);
homeActivity.setVisible(false);
homeActivity.mVisibleRequested = true;
homeActivity.allDrawn = true;
dc.mOpeningApps.add(homeActivity);
dc.prepareAppTransition(TRANSIT_NONE);
doReturn(true).when(task)
.isSelfAnimating(anyInt(), eq(ANIMATION_TYPE_RECENTS));
// Wait until everything in animation handler get executed to prevent the exiting window // Wait until everything in animation handler get executed to prevent the exiting window
// from being removed during WindowSurfacePlacer Traversal. // from being removed during WindowSurfacePlacer Traversal.
waitUntilHandlersIdle(); waitUntilHandlersIdle();
// Start recents
doReturn(true).when(task)
.isSelfAnimating(anyInt(), eq(ANIMATION_TYPE_RECENTS));
dc.mAppTransitionController.handleAppTransitionReady(); dc.mAppTransitionController.handleAppTransitionReady();
verify(activity1, never()).commitVisibility(anyBoolean(), anyBoolean(), anyBoolean()); verify(activity1).commitVisibility(eq(false), anyBoolean(), anyBoolean());
verify(activity2, never()).commitVisibility(anyBoolean(), anyBoolean(), anyBoolean()); verify(activity1).applyAnimation(any(), eq(TRANSIT_OLD_ACTIVITY_OPEN), eq(false),
anyBoolean(), any());
verify(activity2).commitVisibility(eq(true), anyBoolean(), anyBoolean());
verify(activity2).applyAnimation(any(), eq(TRANSIT_OLD_ACTIVITY_OPEN), eq(true),
anyBoolean(), any());
verify(homeActivity).commitVisibility(eq(true), anyBoolean(), anyBoolean());
verify(homeActivity, never()).applyAnimation(any(), anyInt(), anyBoolean(), anyBoolean(),
any());
} }
@Test @Test