Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bdaf705b authored by Issei Suzuki's avatar Issei Suzuki Committed by Automerger Merge Worker
Browse files

Merge "Exclude launcher from app transition animation while recents is...

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

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



Change-Id: I983781f2f8a3495df6b9d0855372211e4093d74d
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents b3370fb0 0dfb582d
Loading
Loading
Loading
Loading
+6 −12
Original line number Original line Diff line number Diff line
@@ -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",
+46 −28
Original line number Original line Diff line number Diff line
@@ -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",
+26 −11
Original line number Original line Diff line number Diff line
@@ -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