summaryrefslogtreecommitdiffstats
path: root/services/java/com/android/server/WindowManagerService.java
diff options
context:
space:
mode:
Diffstat (limited to 'services/java/com/android/server/WindowManagerService.java')
-rw-r--r--services/java/com/android/server/WindowManagerService.java89
1 files changed, 72 insertions, 17 deletions
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index f05cdc4..e312df6 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -133,6 +133,7 @@ public class WindowManagerService extends IWindowManager.Stub
static final boolean DEBUG = false;
static final boolean DEBUG_FOCUS = false;
static final boolean DEBUG_ANIM = false;
+ static final boolean DEBUG_LAYOUT = false;
static final boolean DEBUG_LAYERS = false;
static final boolean DEBUG_INPUT = false;
static final boolean DEBUG_INPUT_METHOD = false;
@@ -2288,10 +2289,7 @@ public class WindowManagerService extends IWindowManager.Stub
attrChanges = win.mAttrs.copyFrom(attrs);
}
- if (localLOGV) Log.v(
- TAG, "Relayout given client " + client.asBinder()
- + " (" + win.mAttrs.getTitle() + ")");
-
+ if (DEBUG_LAYOUT) Log.v(TAG, "Relayout " + win + ": " + win.mAttrs);
if ((attrChanges & WindowManager.LayoutParams.ALPHA_CHANGED) != 0) {
win.mAlpha = attrs.alpha;
@@ -2307,6 +2305,8 @@ public class WindowManagerService extends IWindowManager.Stub
(attrs.width / (float)requestedWidth) : 1.0f;
win.mVScale = (attrs.height != requestedHeight) ?
(attrs.height / (float)requestedHeight) : 1.0f;
+ } else {
+ win.mHScale = win.mVScale = 1;
}
boolean imMayMove = (flagChanges&(
@@ -2378,6 +2378,18 @@ public class WindowManagerService extends IWindowManager.Stub
mInputMethodWindow = win;
imMayMove = true;
}
+ if (win.mAttrs.type == TYPE_BASE_APPLICATION
+ && win.mAppToken != null
+ && win.mAppToken.startingWindow != null) {
+ // Special handling of starting window over the base
+ // window of the app: propagate lock screen flags to it,
+ // to provide the correct semantics while starting.
+ final int mask =
+ WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+ | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
+ WindowManager.LayoutParams sa = win.mAppToken.startingWindow.mAttrs;
+ sa.flags = (sa.flags&~mask) | (win.mAttrs.flags&mask);
+ }
} else {
win.mEnterAnimationPending = false;
if (win.mSurface != null) {
@@ -3485,10 +3497,12 @@ public class WindowManagerService extends IWindowManager.Stub
+ ": hidden=" + wtoken.hidden + " hiddenRequested="
+ wtoken.hiddenRequested);
- if (changed && performLayout) {
+ if (changed) {
mLayoutNeeded = true;
- updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES);
- performLayoutAndPlaceSurfacesLocked();
+ if (performLayout) {
+ updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES);
+ performLayoutAndPlaceSurfacesLocked();
+ }
}
}
@@ -5082,7 +5096,9 @@ public class WindowManagerService extends IWindowManager.Stub
// If we are on top of the wallpaper, then the wallpaper also
// gets to see this movement.
- if (mWallpaperTarget == target || mSendingPointersToWallpaper) {
+ if ((mWallpaperTarget == target &&
+ target.mAttrs.type != WindowManager.LayoutParams.TYPE_KEYGUARD)
+ || mSendingPointersToWallpaper) {
sendPointerToWallpaperLocked(null, ev, eventTime);
}
@@ -6011,18 +6027,18 @@ public class WindowManagerService extends IWindowManager.Stub
res.offsetLocation(-win.mFrame.left, -win.mFrame.top);
}
}
-
- if (res != null && returnWhat == RETURN_PENDING_POINTER) {
- synchronized (mWindowMap) {
- if ((mWallpaperTarget == win &&
- win.mAttrs.type != WindowManager.LayoutParams.TYPE_KEYGUARD)
- || mSendingPointersToWallpaper) {
- sendPointerToWallpaperLocked(win, res, res.getEventTime());
- }
+ }
+
+ if (res != null && returnWhat == RETURN_PENDING_POINTER) {
+ synchronized (mWindowMap) {
+ if ((mWallpaperTarget == win &&
+ win.mAttrs.type != WindowManager.LayoutParams.TYPE_KEYGUARD)
+ || mSendingPointersToWallpaper) {
+ sendPointerToWallpaperLocked(win, res, res.getEventTime());
}
}
}
-
+
return res;
}
@@ -7447,6 +7463,12 @@ public class WindowManagerService extends IWindowManager.Stub
if (c.mSurface != null && c.mAttachedHidden) {
c.mAttachedHidden = false;
c.performShowLocked();
+ // It hadn't been shown, which means layout not
+ // performed on it, so now we want to make sure to
+ // do a layout. If called from within the transaction
+ // loop, this will cause it to restart with a new
+ // layout.
+ mLayoutNeeded = true;
}
}
@@ -8083,6 +8105,9 @@ public class WindowManagerService extends IWindowManager.Stub
pw.print(mPolicyVisibilityAfterAnim);
pw.print(" mAttachedHidden="); pw.println(mAttachedHidden);
}
+ if (!mRelayoutCalled) {
+ pw.print(prefix); pw.print("mRelayoutCalled="); pw.println(mRelayoutCalled);
+ }
pw.print(prefix); pw.print("Requested w="); pw.print(mRequestedWidth);
pw.print(" h="); pw.println(mRequestedHeight);
if (mXOffset != 0 || mYOffset != 0) {
@@ -9219,6 +9244,9 @@ public class WindowManagerService extends IWindowManager.Stub
int repeats = 0;
int i;
+ if (DEBUG_LAYOUT) Log.v(TAG, "performLayout: needed="
+ + mLayoutNeeded + " dw=" + dw + " dh=" + dh);
+
// FIRST LOOP: Perform a layout, if needed.
while (mLayoutNeeded) {
@@ -9241,6 +9269,18 @@ public class WindowManagerService extends IWindowManager.Stub
|| win.mAttachedHidden
|| win.mExiting || win.mDestroying;
+ if (win.mLayoutAttached) {
+ if (DEBUG_LAYOUT) Log.v(TAG, "First pass " + win
+ + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame
+ + " mLayoutAttached=" + win.mLayoutAttached);
+ if (DEBUG_LAYOUT && gone) Log.v(TAG, " (mViewVisibility="
+ + win.mViewVisibility + " mRelayoutCalled="
+ + win.mRelayoutCalled + " hidden="
+ + win.mRootToken.hidden + " hiddenRequested="
+ + (atoken != null && atoken.hiddenRequested)
+ + " mAttachedHidden=" + win.mAttachedHidden);
+ }
+
// If this view is GONE, then skip it -- keep the current
// frame, and let the caller know so they can ignore it
// if they want. (We do the normal layout for INVISIBLE
@@ -9249,6 +9289,10 @@ public class WindowManagerService extends IWindowManager.Stub
if (!gone || !win.mHaveFrame) {
if (!win.mLayoutAttached) {
mPolicy.layoutWindowLw(win, win.mAttrs, null);
+ if (DEBUG_LAYOUT) Log.v(TAG, "-> mFrame="
+ + win.mFrame + " mContainingFrame="
+ + win.mContainingFrame + " mDisplayFrame="
+ + win.mDisplayFrame);
} else {
if (topAttached < 0) topAttached = i;
}
@@ -9268,9 +9312,17 @@ public class WindowManagerService extends IWindowManager.Stub
// windows, since that means "perform layout as normal,
// just don't display").
if (win.mLayoutAttached) {
+ if (DEBUG_LAYOUT) Log.v(TAG, "Second pass " + win
+ + " mHaveFrame=" + win.mHaveFrame
+ + " mViewVisibility=" + win.mViewVisibility
+ + " mRelayoutCalled=" + win.mRelayoutCalled);
if ((win.mViewVisibility != View.GONE && win.mRelayoutCalled)
|| !win.mHaveFrame) {
mPolicy.layoutWindowLw(win, win.mAttrs, win.mAttachedWindow);
+ if (DEBUG_LAYOUT) Log.v(TAG, "-> mFrame="
+ + win.mFrame + " mContainingFrame="
+ + win.mContainingFrame + " mDisplayFrame="
+ + win.mDisplayFrame);
}
}
}
@@ -9295,8 +9347,11 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
} else {
+ if (DEBUG_LAYOUT) Log.v(TAG, "Repeating layout because changes=0x"
+ + Integer.toHexString(changes));
repeats++;
if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG) != 0) {
+ if (DEBUG_LAYOUT) Log.v(TAG, "Computing new config from layout");
Configuration newConfig = updateOrientationFromAppTokensLocked(
null, null);
if (newConfig != null) {