am 1b4933d1: Merge "Wait for visible wallpaper drawn before starting app transitions"

* commit '1b4933d10eea59b091f263ebb3723f4d59a85d2b':
  Wait for visible wallpaper drawn before starting app transitions
This commit is contained in:
Olawale Ogunwale
2015-03-12 21:38:30 +00:00
committed by Android Git Automerger

View File

@ -615,6 +615,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;
@ -7664,6 +7671,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) {
@ -8180,6 +8188,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");
@ -9086,6 +9105,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");