From: Jorim Jaggi Date: Thu, 15 Jun 2017 19:10:38 +0000 (-0400) Subject: Don't even think about changing keyguard transit X-Git-Tag: android-x86-9.0-r1~1044^2~136^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=a69243a5475c3cecc410c3328f221bab220cab8a;p=android-x86%2Fframeworks-base.git Don't even think about changing keyguard transit When camera was launched with a lockscreen wallpaper set, the wallpaper target was launcher in that case, which was also in mClosingApps because it was first getting shown by keyguard exit but then immediately hidden by starting the camera, before the transition started. Now since lockscreen wasn't the wallpaper target, launcher was already for some reason, and we changed the transit to WALLPAPER_CLOSE as a window with the wallpaper target was in mClosingApps. Fix this by never ever changing away from keyguard transits. Test: go/wm-smoke Test: ActivityManagerTransitionSelectionTests Test: Set lockscreen wallpaper, set animation duration scale to 0.5, insert a random sleep statement in SystemUI, launch camera from screen off while in trusted state and camera wasn't running before. Fixes: 37677242 Change-Id: I984b66d7f117034f3d55591284dd822b5ec76cbd --- diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index c1c72cad0c6b..b1ed35867dcf 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -2044,7 +2044,10 @@ public class AppTransition implements Dump { if (forceOverride || isKeyguardTransit(transit) || !isTransitionSet() || mNextAppTransition == TRANSIT_NONE) { setAppTransition(transit, flags); - } else if (!alwaysKeepCurrent) { + } + // We never want to change from a Keyguard transit to a non-Keyguard transit, as our logic + // relies on the fact that we always execute a Keyguard transition after preparing one. + else if (!alwaysKeepCurrent && !isKeyguardTransit(transit)) { if (transit == TRANSIT_TASK_OPEN && isTransitionEqual(TRANSIT_TASK_CLOSE)) { // Opening a new task always supersedes a close for the anim. setAppTransition(transit, flags); diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index 4442bb87ec33..82c862f6a6a8 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -25,6 +25,7 @@ import static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_CLOSE; import static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_INTRA_CLOSE; import static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_INTRA_OPEN; import static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_OPEN; +import static com.android.server.wm.AppTransition.isKeyguardGoingAwayTransit; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS; @@ -239,7 +240,7 @@ class WindowSurfacePlacer { if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO"); int transit = mService.mAppTransition.getAppTransition(); - if (mService.mSkipAppTransitionAnimation) { + if (mService.mSkipAppTransitionAnimation && !isKeyguardGoingAwayTransit(transit)) { transit = AppTransition.TRANSIT_UNSET; } mService.mSkipAppTransitionAnimation = false; @@ -598,42 +599,47 @@ class WindowSurfacePlacer { + ", openingApps=" + openingApps + ", closingApps=" + closingApps); mService.mAnimateWallpaperWithTarget = false; - if (closingAppHasWallpaper && openingAppHasWallpaper) { - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Wallpaper animation!"); - switch (transit) { - case TRANSIT_ACTIVITY_OPEN: - case TRANSIT_TASK_OPEN: - case TRANSIT_TASK_TO_FRONT: - transit = TRANSIT_WALLPAPER_INTRA_OPEN; - break; - case TRANSIT_ACTIVITY_CLOSE: - case TRANSIT_TASK_CLOSE: - case TRANSIT_TASK_TO_BACK: - transit = TRANSIT_WALLPAPER_INTRA_CLOSE; - break; - } - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, - "New transit: " + AppTransition.appTransitionToString(transit)); - } else if (openingCanBeWallpaperTarget && transit == TRANSIT_KEYGUARD_GOING_AWAY) { + if (openingCanBeWallpaperTarget && transit == TRANSIT_KEYGUARD_GOING_AWAY) { transit = TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit: " + AppTransition.appTransitionToString(transit)); - } else if (oldWallpaper != null && !mService.mOpeningApps.isEmpty() - && !openingApps.contains(oldWallpaper.mAppToken) - && closingApps.contains(oldWallpaper.mAppToken)) { - // We are transitioning from an activity with a wallpaper to one without. - transit = TRANSIT_WALLPAPER_CLOSE; - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit away from wallpaper: " - + AppTransition.appTransitionToString(transit)); - } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw() && - openingApps.contains(wallpaperTarget.mAppToken)) { - // We are transitioning from an activity without - // a wallpaper to now showing the wallpaper - transit = TRANSIT_WALLPAPER_OPEN; - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit into wallpaper: " - + AppTransition.appTransitionToString(transit)); - } else { - mService.mAnimateWallpaperWithTarget = true; + } + // We never want to change from a Keyguard transit to a non-Keyguard transit, as our logic + // relies on the fact that we always execute a Keyguard transition after preparing one. + else if (!isKeyguardGoingAwayTransit(transit)) { + if (closingAppHasWallpaper && openingAppHasWallpaper) { + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Wallpaper animation!"); + switch (transit) { + case TRANSIT_ACTIVITY_OPEN: + case TRANSIT_TASK_OPEN: + case TRANSIT_TASK_TO_FRONT: + transit = TRANSIT_WALLPAPER_INTRA_OPEN; + break; + case TRANSIT_ACTIVITY_CLOSE: + case TRANSIT_TASK_CLOSE: + case TRANSIT_TASK_TO_BACK: + transit = TRANSIT_WALLPAPER_INTRA_CLOSE; + break; + } + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, + "New transit: " + AppTransition.appTransitionToString(transit)); + } else if (oldWallpaper != null && !mService.mOpeningApps.isEmpty() + && !openingApps.contains(oldWallpaper.mAppToken) + && closingApps.contains(oldWallpaper.mAppToken)) { + // We are transitioning from an activity with a wallpaper to one without. + transit = TRANSIT_WALLPAPER_CLOSE; + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit away from wallpaper: " + + AppTransition.appTransitionToString(transit)); + } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw() && + openingApps.contains(wallpaperTarget.mAppToken)) { + // We are transitioning from an activity without + // a wallpaper to now showing the wallpaper + transit = TRANSIT_WALLPAPER_OPEN; + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit into wallpaper: " + + AppTransition.appTransitionToString(transit)); + } else { + mService.mAnimateWallpaperWithTarget = true; + } } return transit; }