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

Commit f66cb50a authored by Issei Suzuki's avatar Issei Suzuki Committed by Android (Google) Code Review
Browse files

Merge "Suppress app transition while recents is running" into tm-qpr-dev

parents 9ac39f2d 67db8072
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -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",
+19 −38
Original line number Diff line number Diff line
@@ -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",
+11 −26
Original line number Diff line number Diff line
@@ -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;
@@ -411,50 +408,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