Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2f952916 authored by Olawale Ogunwale's avatar Olawale Ogunwale Committed by Android Git Automerger
Browse files

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

* commit '1b4933d1':
  Wait for visible wallpaper drawn before starting app transitions
parents 8a264dd2 1b4933d1
Loading
Loading
Loading
Loading
+52 −0
Original line number Diff line number Diff line
@@ -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");