summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2012-06-19 17:48:32 -0700
committerDianne Hackborn <hackbod@google.com>2012-06-19 17:54:24 -0700
commit6e2281d44c9b71a03a50ed24d654927111cd2b72 (patch)
treea5e6da073ffdf3e695e1dfa0a33c258f49bf068e /services
parent0abe556d28f5f5d395559cc6567b05939d1b2640 (diff)
downloadframeworks_base-6e2281d44c9b71a03a50ed24d654927111cd2b72.zip
frameworks_base-6e2281d44c9b71a03a50ed24d654927111cd2b72.tar.gz
frameworks_base-6e2281d44c9b71a03a50ed24d654927111cd2b72.tar.bz2
Fix issue #6686339: 2 taps required to launch notification...
...or settings from lock screen When a window is drawn, the code to determine whether it should now be shown was calling WindowState.isReadyForDisplay(). Part of the condition of this function is that it is not ready if a policy is forcing the window to be hidden -- which is the case when the lock screen is shown. As a result, we wouldn't show the window at that point, so wouldn't tell the activity manager that the token's windows are visibible, and wouldn't tell the lock screen to go away. This adds a new variation WindowState.isReadyForDisplayIgnoringKeyguard(), which is the same as the original method but ignores the policy visibility for app windows. This allows windows to be go through the complete path of handling when the window is finally drawn and telling the activity manager about it, even if behind the lock screen. By making it a separate function, we don't impact any other code that is calling the old function and may be relying on its behavior. Also cleaned up a little of the dumpsys output. Most important, the new ANR section is now moved to the top, since we want "adb shell dumpsys window" to still give a nice summary of what we normally care about -- the window stack and important global state. Change-Id: Ica3ea85ce46f3f5f5cd2cc30fbd9de13d3885a57
Diffstat (limited to 'services')
-rwxr-xr-xservices/java/com/android/server/wm/WindowManagerService.java29
-rw-r--r--services/java/com/android/server/wm/WindowState.java22
-rw-r--r--services/java/com/android/server/wm/WindowStateAnimator.java4
3 files changed, 40 insertions, 15 deletions
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 5efbe2c..e101377 100755
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -9537,12 +9537,14 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
}
- pw.println();
- if (mOpeningApps.size() > 0) {
- pw.print(" mOpeningApps="); pw.println(mOpeningApps);
- }
- if (mClosingApps.size() > 0) {
- pw.print(" mClosingApps="); pw.println(mClosingApps);
+ if (mOpeningApps.size() > 0 || mClosingApps.size() > 0) {
+ pw.println();
+ if (mOpeningApps.size() > 0) {
+ pw.print(" mOpeningApps="); pw.println(mOpeningApps);
+ }
+ if (mClosingApps.size() > 0) {
+ pw.print(" mClosingApps="); pw.println(mClosingApps);
+ }
}
}
@@ -9756,7 +9758,7 @@ public class WindowManagerService extends IWindowManager.Stub
pw.print(" mTransitionWindowAnimationScale="); pw.print(mTransitionAnimationScale);
pw.print(" mAnimatorDurationScale="); pw.println(mAnimatorDurationScale);
pw.print(" mTraversalScheduled="); pw.print(mTraversalScheduled);
- pw.print(" mNextAppTransition=0x");
+ pw.print(" mNextAppTransition=0x");
pw.print(Integer.toHexString(mNextAppTransition));
pw.print(" mAppTransitionReady="); pw.println(mAppTransitionReady);
pw.print(" mAppTransitionRunning="); pw.print(mAppTransitionRunning);
@@ -9798,7 +9800,7 @@ public class WindowManagerService extends IWindowManager.Stub
pw.println(mNextAppTransitionCallback);
}
pw.print(" mStartingIconInTransition="); pw.print(mStartingIconInTransition);
- pw.print(", mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation);
+ pw.print(" mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation);
}
}
@@ -9966,30 +9968,31 @@ public class WindowManagerService extends IWindowManager.Stub
}
synchronized(mWindowMap) {
+ pw.println();
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
}
- dumpPolicyLocked(pw, args, dumpAll);
+ dumpLastANRLocked(pw);
pw.println();
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
}
- dumpSessionsLocked(pw, dumpAll);
+ dumpPolicyLocked(pw, args, dumpAll);
pw.println();
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
}
- dumpTokensLocked(pw, dumpAll);
+ dumpSessionsLocked(pw, dumpAll);
pw.println();
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
}
- dumpWindowsLocked(pw, dumpAll, null);
+ dumpTokensLocked(pw, dumpAll);
pw.println();
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
}
- dumpLastANRLocked(pw);
+ dumpWindowsLocked(pw, dumpAll, null);
}
}
diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java
index 8f2ef76..f94bacd 100644
--- a/services/java/com/android/server/wm/WindowState.java
+++ b/services/java/com/android/server/wm/WindowState.java
@@ -719,6 +719,28 @@ final class WindowState implements WindowManagerPolicy.WindowState {
}
/**
+ * Like isReadyForDisplay(), but ignores any force hiding of the window due
+ * to the keyguard.
+ */
+ boolean isReadyForDisplayIgnoringKeyguard() {
+ if (mRootToken.waitingToShow &&
+ mService.mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
+ return false;
+ }
+ final AppWindowToken atoken = mAppToken;
+ if (atoken == null && !mPolicyVisibility) {
+ // If this is not an app window, and the policy has asked to force
+ // hide, then we really do want to hide.
+ return false;
+ }
+ return mHasSurface && !mDestroying
+ && ((!mAttachedHidden && mViewVisibility == View.VISIBLE
+ && !mRootToken.hidden)
+ || mWinAnimator.mAnimation != null
+ || ((atoken != null) && (atoken.mAppAnimator.animation != null)));
+ }
+
+ /**
* Like isOnScreen, but returns false if the surface hasn't yet
* been drawn.
*/
diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java
index 579cbb7..f2dd335 100644
--- a/services/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/java/com/android/server/wm/WindowStateAnimator.java
@@ -1218,10 +1218,10 @@ class WindowStateAnimator {
}
Slog.v(TAG, "performShow on " + this
+ ": mDrawState=" + mDrawState + " readyForDisplay="
- + mWin.isReadyForDisplay()
+ + mWin.isReadyForDisplayIgnoringKeyguard()
+ " starting=" + (mWin.mAttrs.type == TYPE_APPLICATION_STARTING), e);
}
- if (mDrawState == READY_TO_SHOW && mWin.isReadyForDisplay()) {
+ if (mDrawState == READY_TO_SHOW && mWin.isReadyForDisplayIgnoringKeyguard()) {
if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION)
WindowManagerService.logSurface(mWin, "SHOW (performShowLocked)", null);
if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + this