diff options
3 files changed, 42 insertions, 70 deletions
diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json index 31e2abe0bb85..f047905f18b6 100644 --- a/data/etc/services.core.protolog.json +++ b/data/etc/services.core.protolog.json @@ -1921,6 +1921,12 @@ "group": "WM_DEBUG_STATES", "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": { "message": "Pause the recording session on display %s", "level": "VERBOSE", @@ -2023,12 +2029,6 @@ "group": "WM_DEBUG_CONTENT_RECORDING", "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": { "message": "Screenshotting Activity %s", "level": "VERBOSE", @@ -2569,6 +2569,12 @@ "group": "WM_ERROR", "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": { "message": "Complete pause: %s", "level": "VERBOSE", diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java index 9c95e31cc5f5..29b64171692a 100644 --- a/services/core/java/com/android/server/wm/AppTransitionController.java +++ b/services/core/java/com/android/server/wm/AppTransitionController.java @@ -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 android.annotation.IntDef; -import android.annotation.NonNull; import android.annotation.Nullable; import android.graphics.Rect; import android.os.Trace; @@ -172,16 +171,6 @@ public class AppTransitionController { ? 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. */ @@ -231,45 +220,32 @@ public class AppTransitionController { mWallpaperControllerLocked.adjustWallpaperWindowsForAppTransitionIfNeeded( 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( - mDisplayContent.mAppTransition, openingAppsForAnimation, closingAppsForAnimation, - mDisplayContent.mChangingContainers, + mDisplayContent.mAppTransition, mDisplayContent.mOpeningApps, + mDisplayContent.mClosingApps, mDisplayContent.mChangingContainers, mWallpaperControllerLocked.getWallpaperTarget(), getOldWallpaper(), mDisplayContent.mSkipAppTransitionAnimation); mDisplayContent.mSkipAppTransitionAnimation = false; ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "handleAppTransitionReady: displayId=%d appTransition={%s}" - + " excludeLauncherFromAnimation=%b openingApps=[%s] closingApps=[%s] transit=%s", - mDisplayContent.mDisplayId, appTransition.toString(), excludeLauncherFromAnimation, - mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps, - AppTransition.appTransitionOldToString(transit)); + + " openingApps=[%s] closingApps=[%s] transit=%s", + mDisplayContent.mDisplayId, appTransition.toString(), mDisplayContent.mOpeningApps, + mDisplayContent.mClosingApps, AppTransition.appTransitionOldToString(transit)); // 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 // no need to do an animation. This is the case, for example, when this transition is being // done behind a dream window. - final ArraySet<Integer> activityTypes = collectActivityTypes(openingAppsForAnimation, - closingAppsForAnimation, mDisplayContent.mChangingContainers); + final ArraySet<Integer> activityTypes = collectActivityTypes(mDisplayContent.mOpeningApps, + mDisplayContent.mClosingApps, mDisplayContent.mChangingContainers); final ActivityRecord animLpActivity = findAnimLayoutParamsToken(transit, activityTypes, - openingAppsForAnimation, closingAppsForAnimation, + mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps, mDisplayContent.mChangingContainers); final ActivityRecord topOpeningApp = - getTopApp(openingAppsForAnimation, false /* ignoreHidden */); + getTopApp(mDisplayContent.mOpeningApps, false /* ignoreHidden */); final ActivityRecord topClosingApp = - getTopApp(closingAppsForAnimation, false /* ignoreHidden */); + getTopApp(mDisplayContent.mClosingApps, false /* ignoreHidden */); final ActivityRecord topChangingApp = getTopApp(mDisplayContent.mChangingContainers, false /* ignoreHidden */); final WindowManager.LayoutParams animLp = getAnimLp(animLpActivity); @@ -281,14 +257,14 @@ public class AppTransitionController { overrideWithRemoteAnimationIfSet(animLpActivity, transit, activityTypes); } - final boolean voiceInteraction = containsVoiceInteraction(closingAppsForAnimation) - || containsVoiceInteraction(openingAppsForAnimation); + final boolean voiceInteraction = containsVoiceInteraction(mDisplayContent.mClosingApps) + || containsVoiceInteraction(mDisplayContent.mOpeningApps); final int layoutRedo; mService.mSurfaceAnimationRunner.deferStartingAnimations(); try { - applyAnimations(openingAppsForAnimation, closingAppsForAnimation, transit, animLp, - voiceInteraction); + applyAnimations(mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps, transit, + animLp, voiceInteraction); handleClosingApps(); handleOpeningApps(); handleChangingApps(transit); @@ -1226,6 +1202,11 @@ public class AppTransitionController { if (activity == null) { 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, "Check opening app=%s: allDrawn=%b startingDisplayed=%b " + "startingMoved=%b isRelaunching()=%b startingWindow=%s", diff --git a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java index f61effa284ef..b80d9495afeb 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java @@ -16,8 +16,6 @@ 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_BASE_APPLICATION; 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_UNOCCLUDE; 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_KEYGUARD_GOING_AWAY; import static android.view.WindowManager.TRANSIT_OLD_TASK_CHANGE_WINDOWING_MODE; @@ -412,50 +409,38 @@ public class AppTransitionTests extends WindowTestsBase { } @Test - public void testExcludeLauncher() { + public void testDelayWhileRecents() { final DisplayContent dc = createNewDisplay(Display.STATE_ON); doReturn(false).when(dc).onDescendantOrientationChanged(any()); final Task task = createTask(dc); - // Simulate activity1 launches activity2 + // Simulate activity1 launches activity2. final ActivityRecord activity1 = createActivityRecord(task); activity1.setVisible(true); activity1.mVisibleRequested = false; activity1.allDrawn = true; - dc.mClosingApps.add(activity1); final ActivityRecord activity2 = createActivityRecord(task); activity2.setVisible(false); activity2.mVisibleRequested = true; activity2.allDrawn = true; + + dc.mClosingApps.add(activity1); dc.mOpeningApps.add(activity2); dc.prepareAppTransition(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)); + assertTrue(dc.mAppTransition.containsTransitRequest(TRANSIT_OPEN)); // Wait until everything in animation handler get executed to prevent the exiting window // from being removed during WindowSurfacePlacer Traversal. waitUntilHandlersIdle(); + // Start recents + doReturn(true).when(task) + .isSelfAnimating(anyInt(), eq(ANIMATION_TYPE_RECENTS)); + dc.mAppTransitionController.handleAppTransitionReady(); - verify(activity1).commitVisibility(eq(false), 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()); + verify(activity1, never()).commitVisibility(anyBoolean(), anyBoolean(), anyBoolean()); + verify(activity2, never()).commitVisibility(anyBoolean(), anyBoolean(), anyBoolean()); } @Test |