diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index ab3d09864e99c..8cabf42dadf82 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -562,6 +562,11 @@ public final class ViewRootImpl implements ViewParent, } attrs = mWindowAttributes; setTag(); + + if ((mClientWindowLayoutFlags&WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) != 0 + && (attrs.flags&WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) == 0) { + Slog.d(mTag, "setView: FLAG_KEEP_SCREEN_ON changed from true to false!!!"); + } // Keep track of the actual window flags supplied by the client. mClientWindowLayoutFlags = attrs.flags; @@ -889,6 +894,10 @@ public final class ViewRootImpl implements ViewParent, final int oldInsetBottom = mWindowAttributes.surfaceInsets.bottom; final int oldSoftInputMode = mWindowAttributes.softInputMode; final boolean oldHasManualSurfaceInsets = mWindowAttributes.hasManualSurfaceInsets; + if ((mClientWindowLayoutFlags&WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) != 0 + && (attrs.flags&WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) == 0) { + Slog.d(mTag, "setLayoutParams: FLAG_KEEP_SCREEN_ON from true to false!!!"); + } // Keep track of the actual window flags supplied by the client. mClientWindowLayoutFlags = attrs.flags; diff --git a/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java b/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java index 0979cd32a1e28..5d3cc1694e29c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java +++ b/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java @@ -73,4 +73,7 @@ public class WindowManagerDebugConfig { static final boolean SHOW_LIGHT_TRANSACTIONS = false || SHOW_TRANSACTIONS; static final boolean SHOW_STACK_CRAWLS = false; static final boolean DEBUG_WINDOW_CROP = false; + + static final String TAG_KEEP_SCREEN_ON = "DebugKeepScreenOn"; + static final boolean DEBUG_KEEP_SCREEN_ON = true; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index cf5cdc38bf2f6..5a5f10c0303b8 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -221,6 +221,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS_LIGHT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_INPUT_METHOD; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEYGUARD; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEEP_SCREEN_ON; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_RESIZE; @@ -240,6 +241,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.SHOW_STACK_CRAWLS; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_VERBOSE_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_KEEP_SCREEN_ON; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowStateAnimator.DRAW_PENDING; @@ -509,6 +511,10 @@ public class WindowManagerService extends IWindowManager.Stub boolean mShowingBootMessages = false; boolean mBootAnimationStopped = false; + // Following variables are for debugging screen wakelock only. + WindowState mLastWakeLockHoldingWindow = null; + WindowState mLastWakeLockObscuringWindow = null; + /** Dump of the windows and app tokens at the time of the last ANR. Cleared after * LAST_ANR_LIFETIME_DURATION_MSECS */ String mLastANRState; @@ -9279,9 +9285,21 @@ public class WindowManagerService extends IWindowManager.Stub final boolean state = mHoldingScreenWakeLock.isHeld(); if (hold != state) { if (hold) { + if (DEBUG_KEEP_SCREEN_ON) { + Slog.d(TAG_KEEP_SCREEN_ON, "Acquiring screen wakelock due to " + + mWindowPlacerLocked.mHoldScreenWindow); + } + mLastWakeLockHoldingWindow = mWindowPlacerLocked.mHoldScreenWindow; + mLastWakeLockObscuringWindow = null; mHoldingScreenWakeLock.acquire(); mPolicy.keepScreenOnStartedLw(); } else { + if (DEBUG_KEEP_SCREEN_ON) { + Slog.d(TAG_KEEP_SCREEN_ON, "Releasing screen wakelock, obscured by " + + mWindowPlacerLocked.mObsuringWindow); + } + mLastWakeLockHoldingWindow = null; + mLastWakeLockObscuringWindow = mWindowPlacerLocked.mObsuringWindow; mPolicy.keepScreenOnStoppedLw(); mHoldingScreenWakeLock.release(); } @@ -10212,6 +10230,9 @@ public class WindowManagerService extends IWindowManager.Stub pw.print(mLastFinishedFreezeSource); } pw.println(); + pw.print(" mLastWakeLockHoldingWindow=");pw.print(mLastWakeLockHoldingWindow); + pw.print(" mLastWakeLockObscuringWindow="); pw.print(mLastWakeLockObscuringWindow); + pw.println(); mInputMonitor.dump(pw, " "); diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index 240323d7e4a15..fb4be303ced30 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -31,8 +31,10 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TOKEN_MOVEMEN import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_TRACE; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEEP_SCREEN_ON; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS; import static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerDebugConfig.TAG_KEEP_SCREEN_ON; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.H.DO_TRAVERSAL; @@ -132,6 +134,12 @@ class WindowSurfacePlacer { private boolean mSustainedPerformanceModeEnabled = false; private boolean mSustainedPerformanceModeCurrent = false; + // Following variables are for debugging screen wakelock only. + // Last window that requires screen wakelock + WindowState mHoldScreenWindow = null; + // Last window that obscures all windows below + WindowState mObsuringWindow = null; + private static final class LayerAndToken { public int layer; public AppWindowToken token; @@ -288,6 +296,8 @@ class WindowSurfacePlacer { } mHoldScreen = null; + mHoldScreenWindow = null; + mObsuringWindow = null; mScreenBrightness = -1; mButtonBrightness = -1; mUserActivityTimeout = -1; @@ -1425,12 +1435,21 @@ class WindowSurfacePlacer { // This window completely covers everything behind it, // so we want to leave all of them as undimmed (for // performance reasons). + if (!mObscured) { + mObsuringWindow = w; + } + mObscured = true; } if (w.mHasSurface) { if ((attrFlags&FLAG_KEEP_SCREEN_ON) != 0) { mHoldScreen = w.mSession; + mHoldScreenWindow = w; + } else if (DEBUG_KEEP_SCREEN_ON && w == mService.mLastWakeLockHoldingWindow) { + Slog.d(TAG_KEEP_SCREEN_ON, "handleNotObscuredLocked: " + w + " was holding " + + "screen wakelock but no longer has FLAG_KEEP_SCREEN_ON!!! called by" + + Debug.getCallers(10)); } if (!mSyswin && w.mAttrs.screenBrightness >= 0 && mScreenBrightness < 0) { @@ -1686,5 +1705,7 @@ class WindowSurfacePlacer { public void dump(PrintWriter pw, String prefix) { pw.print(prefix); pw.print("mTraversalScheduled="); pw.println(mTraversalScheduled); + pw.print(prefix); pw.print("mHoldScreenWindow="); pw.println(mHoldScreenWindow); + pw.print(prefix); pw.print("mObsuringWindow="); pw.println(mObsuringWindow); } }