From 4d7369adb3cf0e713d25abaefa74d6627ecb086e Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Mon, 25 Apr 2016 16:09:14 -0700 Subject: [PATCH] Request a wallpaper update pass when wallpaper target is set to visible Usually wallpaper target gets updated when some wallpaper target window finishes drawing. However in some cases, Recents app could be set to visible again before its stopped. (Which could happen when we started opening transition into some app with a saved surface, but the app draws so slow so that when user pressed Recents button again, the app still hasn't delivered first frame.) In this case, the surface is already drawn and we won't get a finish drawing again. We need to make sure the wallpaper target is updated. bug: 27742244 Change-Id: I8ff53f15f95bae8a99a5a0fd11e24e0186dc3345 --- .../java/com/android/server/wm/AppWindowToken.java | 7 +++++++ .../com/android/server/wm/WindowManagerService.java | 2 ++ .../core/java/com/android/server/wm/WindowState.java | 10 ++++++++++ 3 files changed, 19 insertions(+) diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 9f54b53739537..3b1f34a30529e 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -515,6 +515,13 @@ class AppWindowToken extends WindowToken { } } + void requestUpdateWallpaperIfNeeded() { + for (int i = allAppWindows.size() - 1; i >= 0; i--) { + final WindowState w = allAppWindows.get(i); + w.requestUpdateWallpaperIfNeeded(); + } + } + boolean isRelaunching() { return mPendingRelaunchCount > 0; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 0b66959ec4bc8..1b9a46a411ef5 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -4422,6 +4422,8 @@ public class WindowManagerService extends IWindowManager.Stub wtoken.sendAppVisibilityToClients(); } } + wtoken.requestUpdateWallpaperIfNeeded(); + if (DEBUG_ADD_REMOVE) Slog.v( TAG_WM, "No longer Stopped: " + wtoken); wtoken.mAppStopped = false; diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 2c5b035741569..f4e6321172a75 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -72,6 +72,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; import static android.view.WindowManager.LayoutParams.FLAG_SCALED; import static android.view.WindowManager.LayoutParams.FLAG_SECURE; +import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; import static android.view.WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON; import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW; @@ -89,6 +90,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; +import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER; import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_FREEFORM; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; @@ -2710,6 +2712,14 @@ final class WindowState implements WindowManagerPolicy.WindowState { mAnimateReplacingWindow = false; } + void requestUpdateWallpaperIfNeeded() { + if (mDisplayContent != null && (mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) { + mDisplayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; + mDisplayContent.layoutNeeded = true; + mService.mWindowPlacerLocked.requestTraversal(); + } + } + float translateToWindowX(float x) { float winX = x - mFrame.left; if (mEnforceSizeCompat) {