diff options
author | Craig Mautner <cmautner@google.com> | 2012-10-01 14:21:06 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-10-01 14:23:39 -0700 |
commit | 1f7a09b5df9f859781d9cfa0053fad44c72c2168 (patch) | |
tree | 5d1d2ae2a97de71b15e957ae6d1664aaff3cc079 /services | |
parent | ba30ac6aa7bc4df030292c62c9f38fac0a65b79e (diff) | |
parent | 65d11b3eeff395011a2c6b56eb117fd3c4881c1a (diff) | |
download | frameworks_base-1f7a09b5df9f859781d9cfa0053fad44c72c2168.zip frameworks_base-1f7a09b5df9f859781d9cfa0053fad44c72c2168.tar.gz frameworks_base-1f7a09b5df9f859781d9cfa0053fad44c72c2168.tar.bz2 |
Merge "Only inform DisplayManager of visible content." into jb-mr1-dev
Diffstat (limited to 'services')
-rw-r--r-- | services/java/com/android/server/display/DisplayManagerService.java | 26 | ||||
-rwxr-xr-x | services/java/com/android/server/wm/WindowManagerService.java | 117 |
2 files changed, 88 insertions, 55 deletions
diff --git a/services/java/com/android/server/display/DisplayManagerService.java b/services/java/com/android/server/display/DisplayManagerService.java index f348cb6..b8c6cd5 100644 --- a/services/java/com/android/server/display/DisplayManagerService.java +++ b/services/java/com/android/server/display/DisplayManagerService.java @@ -209,7 +209,7 @@ public final class DisplayManagerService extends IDisplayManager.Stub { public void setWindowManager(WindowManagerFuncs windowManagerFuncs) { synchronized (mSyncRoot) { mWindowManagerFuncs = windowManagerFuncs; - scheduleTraversalLocked(); + scheduleTraversalLocked(false); } } @@ -220,7 +220,7 @@ public final class DisplayManagerService extends IDisplayManager.Stub { public void setInputManager(InputManagerFuncs inputManagerFuncs) { synchronized (mSyncRoot) { mInputManagerFuncs = inputManagerFuncs; - scheduleTraversalLocked(); + scheduleTraversalLocked(false); } } @@ -264,7 +264,7 @@ public final class DisplayManagerService extends IDisplayManager.Stub { display.setDisplayInfoOverrideFromWindowManagerLocked(info); if (!mTempDisplayInfo.equals(display.getDisplayInfoLocked())) { sendDisplayEventLocked(displayId, DisplayManagerGlobal.EVENT_DISPLAY_CHANGED); - scheduleTraversalLocked(); + scheduleTraversalLocked(false); } } } @@ -527,7 +527,7 @@ public final class DisplayManagerService extends IDisplayManager.Stub { mDisplayDevices.add(device); addLogicalDisplayLocked(device); - scheduleTraversalLocked(); + scheduleTraversalLocked(false); } } @@ -543,7 +543,7 @@ public final class DisplayManagerService extends IDisplayManager.Stub { device.applyPendingDisplayDeviceInfoChangesLocked(); if (updateLogicalDisplaysLocked()) { - scheduleTraversalLocked(); + scheduleTraversalLocked(false); } } } @@ -560,7 +560,7 @@ public final class DisplayManagerService extends IDisplayManager.Stub { mRemovedDisplayDevices.add(device); updateLogicalDisplaysLocked(); - scheduleTraversalLocked(); + scheduleTraversalLocked(false); } } @@ -668,13 +668,15 @@ public final class DisplayManagerService extends IDisplayManager.Stub { * * @param displayId The logical display id to update. * @param hasContent True if the logical display has content. + * @param inTraversal True if called from WindowManagerService during a window traversal prior + * to call to performTraversalInTransactionFromWindowManager. */ - public void setDisplayHasContent(int displayId, boolean hasContent) { + public void setDisplayHasContent(int displayId, boolean hasContent, boolean inTraversal) { synchronized (mSyncRoot) { LogicalDisplay display = mLogicalDisplays.get(displayId); if (display != null && display.hasContentLocked() != hasContent) { display.setHasContentLocked(hasContent); - scheduleTraversalLocked(); + scheduleTraversalLocked(inTraversal); } } } @@ -741,10 +743,12 @@ public final class DisplayManagerService extends IDisplayManager.Stub { // Requests that performTraversalsInTransactionFromWindowManager be called at a // later time to apply changes to surfaces and displays. - private void scheduleTraversalLocked() { + private void scheduleTraversalLocked(boolean inTraversal) { if (!mPendingTraversal && mWindowManagerFuncs != null) { mPendingTraversal = true; - mHandler.sendEmptyMessage(MSG_REQUEST_TRAVERSAL); + if (!inTraversal) { + mHandler.sendEmptyMessage(MSG_REQUEST_TRAVERSAL); + } } } @@ -911,7 +915,7 @@ public final class DisplayManagerService extends IDisplayManager.Stub { @Override public void onTraversalRequested() { synchronized (mSyncRoot) { - scheduleTraversalLocked(); + scheduleTraversalLocked(false); } } } diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index b206d9b5..d530f47 100755 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -18,19 +18,24 @@ package com.android.server.wm; import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW; +import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; import static android.view.WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW; import static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND; import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; -import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW; +import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; +import static android.view.WindowManager.LayoutParams.TYPE_BOOT_PROGRESS; import static android.view.WindowManager.LayoutParams.TYPE_DREAM; 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_KEYGUARD; +import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; +import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; import static android.view.WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; @@ -594,6 +599,11 @@ public class WindowManagerService extends IWindowManager.Stub private float mScreenBrightness = -1; private float mButtonBrightness = -1; private boolean mUpdateRotation = false; + + private static final int DISPLAY_CONTENT_UNKNOWN = 0; + private static final int DISPLAY_CONTENT_MIRROR = 1; + private static final int DISPLAY_CONTENT_UNIQUE = 2; + private int mDisplayHasContent = DISPLAY_CONTENT_UNKNOWN; } final LayoutFields mInnerFields = new LayoutFields(); @@ -1118,10 +1128,6 @@ public class WindowManagerService extends IWindowManager.Stub if (win.mAppToken != null && addToToken) { win.mAppToken.allAppWindows.add(win); } - - if (windows.size() == 1) { - mDisplayManagerService.setDisplayHasContent(win.getDisplayId(), true); - } } /** TODO(cmautner): Is this the same as {@link WindowState#canReceiveKeys()} */ @@ -1129,7 +1135,7 @@ public class WindowManagerService extends IWindowManager.Stub final int fl = w.mAttrs.flags & (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM); if (fl == 0 || fl == (FLAG_NOT_FOCUSABLE|FLAG_ALT_FOCUSABLE_IM) - || w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { + || w.mAttrs.type == TYPE_APPLICATION_STARTING) { if (DEBUG_INPUT_METHOD) { Slog.i(TAG, "isVisibleOrAdding " + w + ": " + w.isVisibleOrAdding()); if (!w.isVisibleOrAdding()) { @@ -1177,7 +1183,7 @@ public class WindowManagerService extends IWindowManager.Stub // is not actually looking to move the IME, look down below // for a real window to target... if (!willMove - && w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING + && w.mAttrs.type == TYPE_APPLICATION_STARTING && i > 0) { WindowState wb = windows.get(i-1); if (wb.mAppToken == w.mAppToken && canBeImeTarget(wb)) { @@ -1576,7 +1582,7 @@ public class WindowManagerService extends IWindowManager.Stub while (i > 0) { i--; w = windows.get(i); - if ((w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER)) { + if ((w.mAttrs.type == TYPE_WALLPAPER)) { if (topCurW == null) { topCurW = w; topCurI = i; @@ -2411,9 +2417,6 @@ public class WindowManagerService extends IWindowManager.Stub final WindowList windows = win.getWindowList(); windows.remove(win); - if (windows.isEmpty()) { - mDisplayManagerService.setDisplayHasContent(win.getDisplayId(), false); - } mPendingRemove.remove(win); mWindowsChanged = true; if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Final remove of window: " + win); @@ -2774,13 +2777,11 @@ public class WindowManagerService extends IWindowManager.Stub win.mHScale = win.mVScale = 1; } - boolean imMayMove = (flagChanges&( - WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM | - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)) != 0; + boolean imMayMove = (flagChanges & (FLAG_ALT_FOCUSABLE_IM | FLAG_NOT_FOCUSABLE)) != 0; final boolean isDefaultDisplay = win.isDefaultDisplay(); boolean focusMayChange = isDefaultDisplay && (win.mViewVisibility != viewVisibility - || ((flagChanges&WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) != 0) + || ((flagChanges & FLAG_NOT_FOCUSABLE) != 0) || (!win.mRelayoutCalled)); boolean wallpaperMayMove = win.mViewVisibility != viewVisibility @@ -3094,8 +3095,7 @@ public class WindowManagerService extends IWindowManager.Stub final int windowCount = windows.size(); for (int i = 0; i < windowCount; i++) { WindowState window = windows.get(i); - if (window.isVisibleLw() || - window.mAttrs.type == WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND) { + if (window.isVisibleLw() || window.mAttrs.type == TYPE_UNIVERSE_BACKGROUND) { WindowInfo info = getWindowInfoForWindowStateLocked(window); outInfos.add(info); } @@ -3149,8 +3149,7 @@ public class WindowManagerService extends IWindowManager.Stub info.type = window.mAttrs.type; info.displayId = window.getDisplayId(); info.compatibilityScale = window.mGlobalScale; - info.visible = window.isVisibleLw() - || info.type == WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND; + info.visible = window.isVisibleLw() || info.type == TYPE_UNIVERSE_BACKGROUND; info.layer = window.mLayer; window.getTouchableRegion(mTempRegion); mTempRegion.getBounds(info.touchableRegion); @@ -4375,7 +4374,7 @@ public class WindowManagerService extends IWindowManager.Stub // an opaque window and our starting window transition animation // can still work. We just need to make sure the starting window // is also showing the wallpaper. - windowFlags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; + windowFlags |= FLAG_SHOW_WALLPAPER; } else { return; } @@ -5497,7 +5496,7 @@ public class WindowManagerService extends IWindowManager.Stub final int N = windows.size(); for (int i=0; i<N; i++) { WindowState w = windows.get(i); - if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD) { + if (w.mAttrs.type == TYPE_KEYGUARD) { // Only if there is a keyguard attached to the window manager // will we consider ourselves as having a keyguard. If it // isn't attached, we don't know if it wants to be shown or @@ -5513,13 +5512,13 @@ public class WindowManagerService extends IWindowManager.Stub return; } if (w.isDrawnLw()) { - if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_BOOT_PROGRESS) { + if (w.mAttrs.type == TYPE_BOOT_PROGRESS) { haveBootMsg = true; - } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION) { + } else if (w.mAttrs.type == TYPE_APPLICATION) { haveApp = true; - } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER) { + } else if (w.mAttrs.type == TYPE_WALLPAPER) { haveWallpaper = true; - } else if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD) { + } else if (w.mAttrs.type == TYPE_KEYGUARD) { haveKeyguard = true; } } @@ -5715,9 +5714,8 @@ public class WindowManagerService extends IWindowManager.Stub dw = displayInfo.logicalWidth; dh = displayInfo.logicalHeight; - int aboveAppLayer = mPolicy.windowTypeToLayerLw( - WindowManager.LayoutParams.TYPE_APPLICATION) * TYPE_LAYER_MULTIPLIER - + TYPE_LAYER_OFFSET; + int aboveAppLayer = mPolicy.windowTypeToLayerLw(TYPE_APPLICATION) + * TYPE_LAYER_MULTIPLIER + TYPE_LAYER_OFFSET; aboveAppLayer += TYPE_LAYER_MULTIPLIER; boolean isImeTarget = mInputMethodTarget != null @@ -7994,8 +7992,7 @@ public class WindowManagerService extends IWindowManager.Stub numRemoved++; continue; } else if (lastBelow == i-1) { - if (w.mAttrs.type == WindowManager.LayoutParams.TYPE_WALLPAPER - || w.mAttrs.type == WindowManager.LayoutParams.TYPE_UNIVERSE_BACKGROUND) { + if (w.mAttrs.type == TYPE_WALLPAPER || w.mAttrs.type == TYPE_UNIVERSE_BACKGROUND) { lastBelow = i; } } @@ -8778,12 +8775,22 @@ public class WindowManagerService extends IWindowManager.Stub && mInnerFields.mButtonBrightness < 0) { mInnerFields.mButtonBrightness = w.mAttrs.buttonBrightness; } + final int type = attrs.type; if (canBeSeen - && (attrs.type == WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG - || attrs.type == WindowManager.LayoutParams.TYPE_KEYGUARD - || attrs.type == WindowManager.LayoutParams.TYPE_SYSTEM_ERROR)) { + && (type == TYPE_SYSTEM_DIALOG + || type == TYPE_KEYGUARD + || type == TYPE_SYSTEM_ERROR)) { mInnerFields.mSyswin = true; } + + if (canBeSeen) { + if (type == TYPE_DREAM || type == TYPE_KEYGUARD) { + mInnerFields.mDisplayHasContent = LayoutFields.DISPLAY_CONTENT_MIRROR; + } else if (mInnerFields.mDisplayHasContent + == LayoutFields.DISPLAY_CONTENT_UNKNOWN) { + mInnerFields.mDisplayHasContent = LayoutFields.DISPLAY_CONTENT_UNIQUE; + } + } } boolean opaqueDrawn = canBeSeen && w.isOpaqueDrawn(); @@ -8802,7 +8809,7 @@ public class WindowManagerService extends IWindowManager.Stub final WindowStateAnimator winAnimator = w.mWinAnimator; if (!mAnimator.isDimmingLocked(winAnimator)) { final int width, height; - if (attrs.type == WindowManager.LayoutParams.TYPE_BOOT_PROGRESS) { + if (attrs.type == TYPE_BOOT_PROGRESS) { final DisplayInfo displayInfo = w.mDisplayContent.getDisplayInfo(); width = displayInfo.logicalWidth; height = displayInfo.logicalHeight; @@ -8867,6 +8874,7 @@ public class WindowManagerService extends IWindowManager.Stub mInnerFields.mHoldScreen = null; mInnerFields.mScreenBrightness = -1; mInnerFields.mButtonBrightness = -1; + mInnerFields.mDisplayHasContent = LayoutFields.DISPLAY_CONTENT_UNKNOWN; mTransactionSequence++; final DisplayContent defaultDisplay = getDefaultDisplayContentLocked(); @@ -8886,10 +8894,6 @@ public class WindowManagerService extends IWindowManager.Stub mStrictModeFlash.positionSurface(defaultDw, defaultDh); } - // Give the display manager a chance to adjust properties - // like display rotation if it needs to. - mDisplayManagerService.performTraversalInTransactionFromWindowManager(); - boolean focusDisplayed = false; boolean updateAllDrawn = false; @@ -8905,6 +8909,11 @@ public class WindowManagerService extends IWindowManager.Stub final int innerDh = displayInfo.appHeight; final boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY); + // Reset for each display unless we are forcing mirroring. + if (mInnerFields.mDisplayHasContent != LayoutFields.DISPLAY_CONTENT_MIRROR) { + mInnerFields.mDisplayHasContent = LayoutFields.DISPLAY_CONTENT_UNKNOWN; + } + int repeats = 0; do { repeats++; @@ -9024,9 +9033,8 @@ public class WindowManagerService extends IWindowManager.Stub final boolean committed = winAnimator.commitFinishDrawingLocked(currentTime); if (isDefaultDisplay && committed) { - if ((w.mAttrs.flags - & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) { - if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG, + if ((w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) { + if (DEBUG_WALLPAPER) Slog.v(TAG, "First draw done in potential wallpaper target " + w); mInnerFields.mWallpaperMayChange = true; displayContent.pendingLayoutChanges |= @@ -9042,7 +9050,8 @@ public class WindowManagerService extends IWindowManager.Stub winAnimator.setSurfaceBoundariesLocked(recoveringMemory); final AppWindowToken atoken = w.mAppToken; - if (DEBUG_STARTING_WINDOW && atoken != null && w == atoken.startingWindow) { + if (DEBUG_STARTING_WINDOW && atoken != null + && w == atoken.startingWindow) { Slog.d(TAG, "updateWindows: starting " + w + " isOnScreen=" + w.isOnScreen() + " allDrawn=" + atoken.allDrawn + " freezingScreen=" + atoken.mAppAnimator.freezingScreen); @@ -9054,8 +9063,7 @@ public class WindowManagerService extends IWindowManager.Stub atoken.numInterestingWindows = atoken.numDrawnWindows = 0; atoken.startingDisplayed = false; } - if ((w.isOnScreen() || winAnimator.mAttrType - == WindowManager.LayoutParams.TYPE_BASE_APPLICATION) + if ((w.isOnScreen() || winAnimator.mAttrType == TYPE_BASE_APPLICATION) && !w.mExiting && !w.mDestroying) { if (WindowManagerService.DEBUG_VISIBILITY || WindowManagerService.DEBUG_ORIENTATION) { @@ -9098,6 +9106,22 @@ public class WindowManagerService extends IWindowManager.Stub updateResizingWindows(w); } + final boolean hasUniqueContent; + switch (mInnerFields.mDisplayHasContent) { + case LayoutFields.DISPLAY_CONTENT_MIRROR: + hasUniqueContent = isDefaultDisplay; + break; + case LayoutFields.DISPLAY_CONTENT_UNIQUE: + hasUniqueContent = true; + break; + case LayoutFields.DISPLAY_CONTENT_UNKNOWN: + default: + hasUniqueContent = false; + break; + } + mDisplayManagerService.setDisplayHasContent(displayId, hasUniqueContent, + true /* inTraversal, must call performTraversalInTrans... below */); + if (!mInnerFields.mDimming && mAnimator.isDimmingLocked(displayId)) { stopDimmingLocked(displayId); } @@ -9110,6 +9134,11 @@ public class WindowManagerService extends IWindowManager.Stub if (focusDisplayed) { mH.sendEmptyMessage(H.REPORT_LOSING_FOCUS); } + + // Give the display manager a chance to adjust properties + // like display rotation if it needs to. + mDisplayManagerService.performTraversalInTransactionFromWindowManager(); + } catch (RuntimeException e) { Log.wtf(TAG, "Unhandled exception in Window Manager", e); } finally { |