Loading services/core/java/com/android/server/wm/WindowManagerService.java +52 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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"); Loading Loading @@ -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"); Loading Loading
services/core/java/com/android/server/wm/WindowManagerService.java +52 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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"); Loading Loading @@ -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"); Loading