Merge "Suppress app transition while recents is running" into tm-qpr-dev am: f66cb50a99
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20335896 Change-Id: I4d1e7c31d45374087032c0c3a11b5dd22c9c4bf8 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -1921,6 +1921,12 @@
|
|||||||
"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",
|
||||||
@@ -2023,12 +2029,6 @@
|
|||||||
"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",
|
||||||
@@ -2569,6 +2569,12 @@
|
|||||||
"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",
|
||||||
|
|||||||
@@ -80,7 +80,6 @@ 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.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.Trace;
|
import android.os.Trace;
|
||||||
@@ -172,16 +171,6 @@ 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.
|
||||||
*/
|
*/
|
||||||
@@ -231,45 +220,32 @@ public class AppTransitionController {
|
|||||||
mWallpaperControllerLocked.adjustWallpaperWindowsForAppTransitionIfNeeded(
|
mWallpaperControllerLocked.adjustWallpaperWindowsForAppTransitionIfNeeded(
|
||||||
mDisplayContent.mOpeningApps);
|
mDisplayContent.mOpeningApps);
|
||||||
|
|
||||||
// Remove launcher from app transition animation while recents is running. Recents animation
|
|
||||||
// is managed outside of app transition framework, so we just need to commit visibility.
|
|
||||||
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(
|
@TransitionOldType final int transit = getTransitCompatType(
|
||||||
mDisplayContent.mAppTransition, openingAppsForAnimation, closingAppsForAnimation,
|
mDisplayContent.mAppTransition, mDisplayContent.mOpeningApps,
|
||||||
mDisplayContent.mChangingContainers,
|
mDisplayContent.mClosingApps, 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}"
|
||||||
+ " excludeLauncherFromAnimation=%b openingApps=[%s] closingApps=[%s] transit=%s",
|
+ " openingApps=[%s] closingApps=[%s] transit=%s",
|
||||||
mDisplayContent.mDisplayId, appTransition.toString(), excludeLauncherFromAnimation,
|
mDisplayContent.mDisplayId, appTransition.toString(), mDisplayContent.mOpeningApps,
|
||||||
mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
|
mDisplayContent.mClosingApps, AppTransition.appTransitionOldToString(transit));
|
||||||
AppTransition.appTransitionOldToString(transit));
|
|
||||||
|
|
||||||
// Find the layout params of the top-most application window in the tokens, which is
|
// Find the layout params of the top-most application window in the tokens, which is
|
||||||
// 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(openingAppsForAnimation,
|
final ArraySet<Integer> activityTypes = collectActivityTypes(mDisplayContent.mOpeningApps,
|
||||||
closingAppsForAnimation, mDisplayContent.mChangingContainers);
|
mDisplayContent.mClosingApps, mDisplayContent.mChangingContainers);
|
||||||
final ActivityRecord animLpActivity = findAnimLayoutParamsToken(transit, activityTypes,
|
final ActivityRecord animLpActivity = findAnimLayoutParamsToken(transit, activityTypes,
|
||||||
openingAppsForAnimation, closingAppsForAnimation,
|
mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps,
|
||||||
mDisplayContent.mChangingContainers);
|
mDisplayContent.mChangingContainers);
|
||||||
final ActivityRecord topOpeningApp =
|
final ActivityRecord topOpeningApp =
|
||||||
getTopApp(openingAppsForAnimation, false /* ignoreHidden */);
|
getTopApp(mDisplayContent.mOpeningApps, false /* ignoreHidden */);
|
||||||
final ActivityRecord topClosingApp =
|
final ActivityRecord topClosingApp =
|
||||||
getTopApp(closingAppsForAnimation, false /* ignoreHidden */);
|
getTopApp(mDisplayContent.mClosingApps, 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);
|
||||||
@@ -281,14 +257,14 @@ public class AppTransitionController {
|
|||||||
overrideWithRemoteAnimationIfSet(animLpActivity, transit, activityTypes);
|
overrideWithRemoteAnimationIfSet(animLpActivity, transit, activityTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean voiceInteraction = containsVoiceInteraction(closingAppsForAnimation)
|
final boolean voiceInteraction = containsVoiceInteraction(mDisplayContent.mClosingApps)
|
||||||
|| containsVoiceInteraction(openingAppsForAnimation);
|
|| containsVoiceInteraction(mDisplayContent.mOpeningApps);
|
||||||
|
|
||||||
final int layoutRedo;
|
final int layoutRedo;
|
||||||
mService.mSurfaceAnimationRunner.deferStartingAnimations();
|
mService.mSurfaceAnimationRunner.deferStartingAnimations();
|
||||||
try {
|
try {
|
||||||
applyAnimations(openingAppsForAnimation, closingAppsForAnimation, transit, animLp,
|
applyAnimations(mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps, transit,
|
||||||
voiceInteraction);
|
animLp, voiceInteraction);
|
||||||
handleClosingApps();
|
handleClosingApps();
|
||||||
handleOpeningApps();
|
handleOpeningApps();
|
||||||
handleChangingApps(transit);
|
handleChangingApps(transit);
|
||||||
@@ -1226,6 +1202,11 @@ 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",
|
||||||
|
|||||||
@@ -16,8 +16,6 @@
|
|||||||
|
|
||||||
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;
|
||||||
@@ -27,7 +25,6 @@ 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;
|
||||||
@@ -411,50 +408,38 @@ public class AppTransitionTests extends WindowTestsBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExcludeLauncher() {
|
public void testDelayWhileRecents() {
|
||||||
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).commitVisibility(eq(false), anyBoolean(), anyBoolean());
|
verify(activity1, never()).commitVisibility(anyBoolean(), anyBoolean(), anyBoolean());
|
||||||
verify(activity1).applyAnimation(any(), eq(TRANSIT_OLD_ACTIVITY_OPEN), eq(false),
|
verify(activity2, never()).commitVisibility(anyBoolean(), anyBoolean(), anyBoolean());
|
||||||
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
|
||||||
|
|||||||
Reference in New Issue
Block a user