Loading services/core/java/com/android/server/wm/WindowManagerService.java +278 −268 Original line number Diff line number Diff line Loading @@ -8557,33 +8557,10 @@ public class WindowManagerService extends IWindowManager.Stub * @return bitmap indicating if another pass through layout must be made. */ public int handleAppTransitionReadyLocked(WindowList windows) { int changes = 0; int i; int appsCount = mOpeningApps.size(); boolean goodToGo = true; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Checking " + appsCount + " opening apps (frozen=" + mDisplayFrozen + " timeout=" + mAppTransition.isTimeout() + ")..."); if (!mAppTransition.isTimeout()) { for (i = 0; i < appsCount && goodToGo; i++) { AppWindowToken wtoken = mOpeningApps.valueAt(i); if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Check opening app=" + wtoken + ": allDrawn=" + wtoken.allDrawn + " startingDisplayed=" + wtoken.startingDisplayed + " startingMoved=" + wtoken.startingMoved); if (!wtoken.allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) { goodToGo = false; } } if (goodToGo && mWallpaperControllerLocked.isWallpaperVisible()) { goodToGo &= mWallpaperControllerLocked.wallpaperTransitionReady(); } if (!checkIfTransitionGoodToGo(appsCount)) { return 0; } if (goodToGo) { if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO"); int transit = mAppTransition.getAppTransition(); if (mSkipAppTransitionAnimation) { Loading @@ -8596,11 +8573,6 @@ public class WindowManagerService extends IWindowManager.Stub rebuildAppWindowListLocked(); // if wallpaper is animating in or out set oldWallpaper to null else to wallpaper final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget(); final WindowState oldWallpaper = mWallpaperControllerLocked.isWallpaperTargetAnimating() ? null : wallpaperTarget; mInnerFields.mWallpaperMayChange = false; // The top-most window will supply the layout params, Loading @@ -8615,12 +8587,6 @@ public class WindowManagerService extends IWindowManager.Stub final WindowState upperWallpaperTarget = mWallpaperControllerLocked.getUpperWallpaperTarget(); if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New wallpaper target=" + wallpaperTarget + ", oldWallpaper=" + oldWallpaper + ", lower target=" + lowerWallpaperTarget + ", upper target=" + upperWallpaperTarget); boolean openingAppHasWallpaper = false; boolean closingAppHasWallpaper = false; final AppWindowToken lowerWallpaperAppToken; Loading @@ -8632,6 +8598,7 @@ public class WindowManagerService extends IWindowManager.Stub upperWallpaperAppToken = upperWallpaperTarget.mAppToken; } int i; // Do a first pass through the tokens for two // things: // (1) Determine if both the closing and opening Loading Loading @@ -8678,41 +8645,8 @@ public class WindowManagerService extends IWindowManager.Stub } } mAnimateWallpaperWithTarget = false; if (closingAppHasWallpaper && openingAppHasWallpaper) { if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Wallpaper animation!"); switch (transit) { case AppTransition.TRANSIT_ACTIVITY_OPEN: case AppTransition.TRANSIT_TASK_OPEN: case AppTransition.TRANSIT_TASK_TO_FRONT: transit = AppTransition.TRANSIT_WALLPAPER_INTRA_OPEN; break; case AppTransition.TRANSIT_ACTIVITY_CLOSE: case AppTransition.TRANSIT_TASK_CLOSE: case AppTransition.TRANSIT_TASK_TO_BACK: transit = AppTransition.TRANSIT_WALLPAPER_INTRA_CLOSE; break; } if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit: " + AppTransition.appTransitionToString(transit)); } else if ((oldWallpaper != null) && !mOpeningApps.isEmpty() && !mOpeningApps.contains(oldWallpaper.mAppToken)) { // We are transitioning from an activity with // a wallpaper to one without. transit = AppTransition.TRANSIT_WALLPAPER_CLOSE; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit away from wallpaper: " + AppTransition.appTransitionToString(transit)); } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw()) { // We are transitioning from an activity without // a wallpaper to now showing the wallpaper transit = AppTransition.TRANSIT_WALLPAPER_OPEN; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit into wallpaper: " + AppTransition.appTransitionToString(transit)); } else { mAnimateWallpaperWithTarget = true; } transit = maybeUpdateTransitToWallpaper(transit, openingAppHasWallpaper, closingAppHasWallpaper, lowerWallpaperTarget, upperWallpaperTarget); // If all closing windows are obscured, then there is // no need to do an animation. This is the case, for Loading @@ -8724,29 +8658,7 @@ public class WindowManagerService extends IWindowManager.Stub animLp = null; } // Process all applications animating in place if (transit == AppTransition.TRANSIT_TASK_IN_PLACE) { // Find the focused window final WindowState win = findFocusedWindowLocked(getDefaultDisplayContentLocked()); if (win != null) { final AppWindowToken wtoken = win.mAppToken; final AppWindowAnimator appAnimator = wtoken.mAppAnimator; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now animating app in place " + wtoken); appAnimator.clearThumbnail(); appAnimator.animation = null; updateTokenInPlaceLocked(wtoken, transit); wtoken.updateReportedVisibilityLocked(); appAnimator.mAllAppWinAnimators.clear(); final int N = wtoken.allAppWindows.size(); for (int j = 0; j < N; j++) { appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator); } mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); mAnimator.mAnimating |= appAnimator.showAllWindowsLocked(); } } processApplicationsAnimatingInPlace(transit); AppWindowToken topClosingApp = null; int topClosingLayer = 0; Loading Loading @@ -8848,8 +8760,6 @@ public class WindowManagerService extends IWindowManager.Stub // This has changed the visibility of windows, so perform // a new layout to get them all up-to-date. changes |= WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG; getDefaultDisplayContentLocked().layoutNeeded = true; // TODO(multidisplay): IMEs are only supported on the default display. Loading @@ -8860,9 +8770,109 @@ public class WindowManagerService extends IWindowManager.Stub updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, true /*updateInputWindows*/); mFocusMayChange = false; notifyActivityDrawnForKeyguard(); return WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG; } return changes; private int maybeUpdateTransitToWallpaper(int transit, boolean openingAppHasWallpaper, boolean closingAppHasWallpaper, WindowState lowerWallpaperTarget, WindowState upperWallpaperTarget) { // if wallpaper is animating in or out set oldWallpaper to null else to wallpaper final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget(); final WindowState oldWallpaper = mWallpaperControllerLocked.isWallpaperTargetAnimating() ? null : wallpaperTarget; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New wallpaper target=" + wallpaperTarget + ", oldWallpaper=" + oldWallpaper + ", lower target=" + lowerWallpaperTarget + ", upper target=" + upperWallpaperTarget); mAnimateWallpaperWithTarget = false; if (closingAppHasWallpaper && openingAppHasWallpaper) { if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Wallpaper animation!"); switch (transit) { case AppTransition.TRANSIT_ACTIVITY_OPEN: case AppTransition.TRANSIT_TASK_OPEN: case AppTransition.TRANSIT_TASK_TO_FRONT: transit = AppTransition.TRANSIT_WALLPAPER_INTRA_OPEN; break; case AppTransition.TRANSIT_ACTIVITY_CLOSE: case AppTransition.TRANSIT_TASK_CLOSE: case AppTransition.TRANSIT_TASK_TO_BACK: transit = AppTransition.TRANSIT_WALLPAPER_INTRA_CLOSE; break; } if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit: " + AppTransition.appTransitionToString(transit)); } else if ((oldWallpaper != null) && !mOpeningApps.isEmpty() && !mOpeningApps.contains(oldWallpaper.mAppToken)) { // We are transitioning from an activity with // a wallpaper to one without. transit = AppTransition.TRANSIT_WALLPAPER_CLOSE; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit away from wallpaper: " + AppTransition.appTransitionToString(transit)); } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw()) { // We are transitioning from an activity without // a wallpaper to now showing the wallpaper transit = AppTransition.TRANSIT_WALLPAPER_OPEN; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit into wallpaper: " + AppTransition.appTransitionToString(transit)); } else { mAnimateWallpaperWithTarget = true; } return transit; } private void processApplicationsAnimatingInPlace(int transit) { if (transit == AppTransition.TRANSIT_TASK_IN_PLACE) { // Find the focused window final WindowState win = findFocusedWindowLocked(getDefaultDisplayContentLocked()); if (win != null) { final AppWindowToken wtoken = win.mAppToken; final AppWindowAnimator appAnimator = wtoken.mAppAnimator; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now animating app in place " + wtoken); appAnimator.clearThumbnail(); appAnimator.animation = null; updateTokenInPlaceLocked(wtoken, transit); wtoken.updateReportedVisibilityLocked(); appAnimator.mAllAppWinAnimators.clear(); final int N = wtoken.allAppWindows.size(); for (int j = 0; j < N; j++) { appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator); } mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); mAnimator.mAnimating |= appAnimator.showAllWindowsLocked(); } } } private boolean checkIfTransitionGoodToGo(int appsCount) { if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Checking " + appsCount + " opening apps (frozen=" + mDisplayFrozen + " timeout=" + mAppTransition.isTimeout() + ")..."); if (!mAppTransition.isTimeout()) { for (int i = 0; i < appsCount; i++) { AppWindowToken wtoken = mOpeningApps.valueAt(i); if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Check opening app=" + wtoken + ": allDrawn=" + wtoken.allDrawn + " startingDisplayed=" + wtoken.startingDisplayed + " startingMoved=" + wtoken.startingMoved); if (!wtoken.allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) { return false; } } // If the wallpaper is visible, we need to check it's ready too. return !mWallpaperControllerLocked.isWallpaperVisible() || mWallpaperControllerLocked.wallpaperTransitionReady(); } return true; } private void createThumbnailAppAnimator(int transit, AppWindowToken appToken, Loading Loading
services/core/java/com/android/server/wm/WindowManagerService.java +278 −268 Original line number Diff line number Diff line Loading @@ -8557,33 +8557,10 @@ public class WindowManagerService extends IWindowManager.Stub * @return bitmap indicating if another pass through layout must be made. */ public int handleAppTransitionReadyLocked(WindowList windows) { int changes = 0; int i; int appsCount = mOpeningApps.size(); boolean goodToGo = true; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Checking " + appsCount + " opening apps (frozen=" + mDisplayFrozen + " timeout=" + mAppTransition.isTimeout() + ")..."); if (!mAppTransition.isTimeout()) { for (i = 0; i < appsCount && goodToGo; i++) { AppWindowToken wtoken = mOpeningApps.valueAt(i); if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Check opening app=" + wtoken + ": allDrawn=" + wtoken.allDrawn + " startingDisplayed=" + wtoken.startingDisplayed + " startingMoved=" + wtoken.startingMoved); if (!wtoken.allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) { goodToGo = false; } } if (goodToGo && mWallpaperControllerLocked.isWallpaperVisible()) { goodToGo &= mWallpaperControllerLocked.wallpaperTransitionReady(); } if (!checkIfTransitionGoodToGo(appsCount)) { return 0; } if (goodToGo) { if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO"); int transit = mAppTransition.getAppTransition(); if (mSkipAppTransitionAnimation) { Loading @@ -8596,11 +8573,6 @@ public class WindowManagerService extends IWindowManager.Stub rebuildAppWindowListLocked(); // if wallpaper is animating in or out set oldWallpaper to null else to wallpaper final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget(); final WindowState oldWallpaper = mWallpaperControllerLocked.isWallpaperTargetAnimating() ? null : wallpaperTarget; mInnerFields.mWallpaperMayChange = false; // The top-most window will supply the layout params, Loading @@ -8615,12 +8587,6 @@ public class WindowManagerService extends IWindowManager.Stub final WindowState upperWallpaperTarget = mWallpaperControllerLocked.getUpperWallpaperTarget(); if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New wallpaper target=" + wallpaperTarget + ", oldWallpaper=" + oldWallpaper + ", lower target=" + lowerWallpaperTarget + ", upper target=" + upperWallpaperTarget); boolean openingAppHasWallpaper = false; boolean closingAppHasWallpaper = false; final AppWindowToken lowerWallpaperAppToken; Loading @@ -8632,6 +8598,7 @@ public class WindowManagerService extends IWindowManager.Stub upperWallpaperAppToken = upperWallpaperTarget.mAppToken; } int i; // Do a first pass through the tokens for two // things: // (1) Determine if both the closing and opening Loading Loading @@ -8678,41 +8645,8 @@ public class WindowManagerService extends IWindowManager.Stub } } mAnimateWallpaperWithTarget = false; if (closingAppHasWallpaper && openingAppHasWallpaper) { if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Wallpaper animation!"); switch (transit) { case AppTransition.TRANSIT_ACTIVITY_OPEN: case AppTransition.TRANSIT_TASK_OPEN: case AppTransition.TRANSIT_TASK_TO_FRONT: transit = AppTransition.TRANSIT_WALLPAPER_INTRA_OPEN; break; case AppTransition.TRANSIT_ACTIVITY_CLOSE: case AppTransition.TRANSIT_TASK_CLOSE: case AppTransition.TRANSIT_TASK_TO_BACK: transit = AppTransition.TRANSIT_WALLPAPER_INTRA_CLOSE; break; } if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit: " + AppTransition.appTransitionToString(transit)); } else if ((oldWallpaper != null) && !mOpeningApps.isEmpty() && !mOpeningApps.contains(oldWallpaper.mAppToken)) { // We are transitioning from an activity with // a wallpaper to one without. transit = AppTransition.TRANSIT_WALLPAPER_CLOSE; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit away from wallpaper: " + AppTransition.appTransitionToString(transit)); } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw()) { // We are transitioning from an activity without // a wallpaper to now showing the wallpaper transit = AppTransition.TRANSIT_WALLPAPER_OPEN; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit into wallpaper: " + AppTransition.appTransitionToString(transit)); } else { mAnimateWallpaperWithTarget = true; } transit = maybeUpdateTransitToWallpaper(transit, openingAppHasWallpaper, closingAppHasWallpaper, lowerWallpaperTarget, upperWallpaperTarget); // If all closing windows are obscured, then there is // no need to do an animation. This is the case, for Loading @@ -8724,29 +8658,7 @@ public class WindowManagerService extends IWindowManager.Stub animLp = null; } // Process all applications animating in place if (transit == AppTransition.TRANSIT_TASK_IN_PLACE) { // Find the focused window final WindowState win = findFocusedWindowLocked(getDefaultDisplayContentLocked()); if (win != null) { final AppWindowToken wtoken = win.mAppToken; final AppWindowAnimator appAnimator = wtoken.mAppAnimator; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now animating app in place " + wtoken); appAnimator.clearThumbnail(); appAnimator.animation = null; updateTokenInPlaceLocked(wtoken, transit); wtoken.updateReportedVisibilityLocked(); appAnimator.mAllAppWinAnimators.clear(); final int N = wtoken.allAppWindows.size(); for (int j = 0; j < N; j++) { appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator); } mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); mAnimator.mAnimating |= appAnimator.showAllWindowsLocked(); } } processApplicationsAnimatingInPlace(transit); AppWindowToken topClosingApp = null; int topClosingLayer = 0; Loading Loading @@ -8848,8 +8760,6 @@ public class WindowManagerService extends IWindowManager.Stub // This has changed the visibility of windows, so perform // a new layout to get them all up-to-date. changes |= WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG; getDefaultDisplayContentLocked().layoutNeeded = true; // TODO(multidisplay): IMEs are only supported on the default display. Loading @@ -8860,9 +8770,109 @@ public class WindowManagerService extends IWindowManager.Stub updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, true /*updateInputWindows*/); mFocusMayChange = false; notifyActivityDrawnForKeyguard(); return WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT | WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG; } return changes; private int maybeUpdateTransitToWallpaper(int transit, boolean openingAppHasWallpaper, boolean closingAppHasWallpaper, WindowState lowerWallpaperTarget, WindowState upperWallpaperTarget) { // if wallpaper is animating in or out set oldWallpaper to null else to wallpaper final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget(); final WindowState oldWallpaper = mWallpaperControllerLocked.isWallpaperTargetAnimating() ? null : wallpaperTarget; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New wallpaper target=" + wallpaperTarget + ", oldWallpaper=" + oldWallpaper + ", lower target=" + lowerWallpaperTarget + ", upper target=" + upperWallpaperTarget); mAnimateWallpaperWithTarget = false; if (closingAppHasWallpaper && openingAppHasWallpaper) { if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Wallpaper animation!"); switch (transit) { case AppTransition.TRANSIT_ACTIVITY_OPEN: case AppTransition.TRANSIT_TASK_OPEN: case AppTransition.TRANSIT_TASK_TO_FRONT: transit = AppTransition.TRANSIT_WALLPAPER_INTRA_OPEN; break; case AppTransition.TRANSIT_ACTIVITY_CLOSE: case AppTransition.TRANSIT_TASK_CLOSE: case AppTransition.TRANSIT_TASK_TO_BACK: transit = AppTransition.TRANSIT_WALLPAPER_INTRA_CLOSE; break; } if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit: " + AppTransition.appTransitionToString(transit)); } else if ((oldWallpaper != null) && !mOpeningApps.isEmpty() && !mOpeningApps.contains(oldWallpaper.mAppToken)) { // We are transitioning from an activity with // a wallpaper to one without. transit = AppTransition.TRANSIT_WALLPAPER_CLOSE; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit away from wallpaper: " + AppTransition.appTransitionToString(transit)); } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw()) { // We are transitioning from an activity without // a wallpaper to now showing the wallpaper transit = AppTransition.TRANSIT_WALLPAPER_OPEN; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit into wallpaper: " + AppTransition.appTransitionToString(transit)); } else { mAnimateWallpaperWithTarget = true; } return transit; } private void processApplicationsAnimatingInPlace(int transit) { if (transit == AppTransition.TRANSIT_TASK_IN_PLACE) { // Find the focused window final WindowState win = findFocusedWindowLocked(getDefaultDisplayContentLocked()); if (win != null) { final AppWindowToken wtoken = win.mAppToken; final AppWindowAnimator appAnimator = wtoken.mAppAnimator; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now animating app in place " + wtoken); appAnimator.clearThumbnail(); appAnimator.animation = null; updateTokenInPlaceLocked(wtoken, transit); wtoken.updateReportedVisibilityLocked(); appAnimator.mAllAppWinAnimators.clear(); final int N = wtoken.allAppWindows.size(); for (int j = 0; j < N; j++) { appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator); } mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); mAnimator.mAnimating |= appAnimator.showAllWindowsLocked(); } } } private boolean checkIfTransitionGoodToGo(int appsCount) { if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Checking " + appsCount + " opening apps (frozen=" + mDisplayFrozen + " timeout=" + mAppTransition.isTimeout() + ")..."); if (!mAppTransition.isTimeout()) { for (int i = 0; i < appsCount; i++) { AppWindowToken wtoken = mOpeningApps.valueAt(i); if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Check opening app=" + wtoken + ": allDrawn=" + wtoken.allDrawn + " startingDisplayed=" + wtoken.startingDisplayed + " startingMoved=" + wtoken.startingMoved); if (!wtoken.allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) { return false; } } // If the wallpaper is visible, we need to check it's ready too. return !mWallpaperControllerLocked.isWallpaperVisible() || mWallpaperControllerLocked.wallpaperTransitionReady(); } return true; } private void createThumbnailAppAnimator(int transit, AppWindowToken appToken, Loading