am 190ca7dd: am 1f7a09b5: Merge "Only inform DisplayManager of visible content." into jb-mr1-dev

* commit '190ca7ddad52ad78a0f313313ab744ed4c7848c8':
  Only inform DisplayManager of visible content.
This commit is contained in:
Craig Mautner
2012-10-01 14:27:53 -07:00
committed by Android Git Automerger
2 changed files with 88 additions and 55 deletions

View File

@@ -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);
}
}
}

View File

@@ -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 {