diff options
| author | 2015-03-12 16:22:07 +0000 | |
|---|---|---|
| committer | 2015-03-12 16:22:07 +0000 | |
| commit | 1b4933d10eea59b091f263ebb3723f4d59a85d2b (patch) | |
| tree | 4122307eea71754f90aa464fc3dc8fa9baf52103 | |
| parent | 1c24b3f110e0521a3840c3dfce9a86343fa02672 (diff) | |
| parent | 4a7f8b99f82559e3a2fa02c5499a4d77cd79c707 (diff) | |
Merge "Wait for visible wallpaper drawn before starting app transitions"
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowManagerService.java | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 4dd4e1e0d825..a25a84c091ea 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -613,6 +613,13 @@ public class WindowManagerService extends IWindowManager.Stub static final long WALLPAPER_TIMEOUT_RECOVERY = 10000; boolean mAnimateWallpaperWithTarget; + // We give a wallpaper up to 1000ms to finish drawing before playing app transitions. + static final long WALLPAPER_DRAW_PENDING_TIMEOUT_DURATION = 1000; + static final int WALLPAPER_DRAW_NORMAL = 0; + static final int WALLPAPER_DRAW_PENDING = 1; + static final int WALLPAPER_DRAW_TIMEOUT = 2; + int mWallpaperDrawState = WALLPAPER_DRAW_NORMAL; + AppWindowToken mFocusedApp = null; PowerManager mPowerManager; @@ -7644,6 +7651,7 @@ public class WindowManagerService extends IWindowManager.Stub public static final int CHECK_IF_BOOT_ANIMATION_FINISHED = 37; public static final int RESET_ANR_MESSAGE = 38; + public static final int WALLPAPER_DRAW_PENDING_TIMEOUT = 39; @Override public void handleMessage(Message msg) { @@ -8160,6 +8168,17 @@ public class WindowManagerService extends IWindowManager.Stub } } break; + case WALLPAPER_DRAW_PENDING_TIMEOUT: { + synchronized (mWindowMap) { + if (mWallpaperDrawState == WALLPAPER_DRAW_PENDING) { + mWallpaperDrawState = WALLPAPER_DRAW_TIMEOUT; + if (DEBUG_APP_TRANSITIONS || DEBUG_WALLPAPER) Slog.v(TAG, + "*** WALLPAPER DRAW TIMEOUT"); + performLayoutAndPlaceSurfacesLocked(); + } + } + } + break; } if (DEBUG_WINDOW_TRACE) { Slog.v(TAG, "handleMessage: exit"); @@ -9066,6 +9085,39 @@ public class WindowManagerService extends IWindowManager.Stub goodToGo = false; } } + if (goodToGo && isWallpaperVisible(mWallpaperTarget)) { + boolean wallpaperGoodToGo = true; + for (int curTokenIndex = mWallpaperTokens.size() - 1; + curTokenIndex >= 0 && wallpaperGoodToGo; curTokenIndex--) { + WindowToken token = mWallpaperTokens.get(curTokenIndex); + for (int curWallpaperIndex = token.windows.size() - 1; curWallpaperIndex >= 0; + curWallpaperIndex--) { + WindowState wallpaper = token.windows.get(curWallpaperIndex); + if (wallpaper.mWallpaperVisible && !wallpaper.isDrawnLw()) { + // We've told this wallpaper to be visible, but it is not drawn yet + wallpaperGoodToGo = false; + if (mWallpaperDrawState != WALLPAPER_DRAW_TIMEOUT) { + // wait for this wallpaper until it is drawn or timeout + goodToGo = false; + } + if (mWallpaperDrawState == WALLPAPER_DRAW_NORMAL) { + mWallpaperDrawState = WALLPAPER_DRAW_PENDING; + mH.removeMessages(H.WALLPAPER_DRAW_PENDING_TIMEOUT); + mH.sendEmptyMessageDelayed(H.WALLPAPER_DRAW_PENDING_TIMEOUT, + WALLPAPER_DRAW_PENDING_TIMEOUT_DURATION); + } + if (DEBUG_APP_TRANSITIONS || DEBUG_WALLPAPER) Slog.v(TAG, + "Wallpaper should be visible but has not been drawn yet. " + + "mWallpaperDrawState=" + mWallpaperDrawState); + break; + } + } + } + if (wallpaperGoodToGo) { + mWallpaperDrawState = WALLPAPER_DRAW_NORMAL; + mH.removeMessages(H.WALLPAPER_DRAW_PENDING_TIMEOUT); + } + } } if (goodToGo) { if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO"); |