Merge "Deprecate FLAG_DISMISS_KEYGUARD"
diff --git a/api/current.txt b/api/current.txt
index 5af2a75..016b5ca 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -44385,7 +44385,7 @@
field public static final int FLAG_ALT_FOCUSABLE_IM = 131072; // 0x20000
field public static final deprecated int FLAG_BLUR_BEHIND = 4; // 0x4
field public static final int FLAG_DIM_BEHIND = 2; // 0x2
- field public static final int FLAG_DISMISS_KEYGUARD = 4194304; // 0x400000
+ field public static final deprecated int FLAG_DISMISS_KEYGUARD = 4194304; // 0x400000
field public static final deprecated int FLAG_DITHER = 4096; // 0x1000
field public static final int FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS = -2147483648; // 0x80000000
field public static final int FLAG_FORCE_NOT_FULLSCREEN = 2048; // 0x800
diff --git a/api/system-current.txt b/api/system-current.txt
index 6a1b703..4531732 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -47541,7 +47541,7 @@
field public static final int FLAG_ALT_FOCUSABLE_IM = 131072; // 0x20000
field public static final deprecated int FLAG_BLUR_BEHIND = 4; // 0x4
field public static final int FLAG_DIM_BEHIND = 2; // 0x2
- field public static final int FLAG_DISMISS_KEYGUARD = 4194304; // 0x400000
+ field public static final deprecated int FLAG_DISMISS_KEYGUARD = 4194304; // 0x400000
field public static final deprecated int FLAG_DITHER = 4096; // 0x1000
field public static final int FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS = -2147483648; // 0x80000000
field public static final int FLAG_FORCE_NOT_FULLSCREEN = 2048; // 0x800
diff --git a/api/test-current.txt b/api/test-current.txt
index 272fd49..07d8728 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -44641,7 +44641,7 @@
field public static final int FLAG_ALT_FOCUSABLE_IM = 131072; // 0x20000
field public static final deprecated int FLAG_BLUR_BEHIND = 4; // 0x4
field public static final int FLAG_DIM_BEHIND = 2; // 0x2
- field public static final int FLAG_DISMISS_KEYGUARD = 4194304; // 0x400000
+ field public static final deprecated int FLAG_DISMISS_KEYGUARD = 4194304; // 0x400000
field public static final deprecated int FLAG_DITHER = 4096; // 0x1000
field public static final int FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS = -2147483648; // 0x80000000
field public static final int FLAG_FORCE_NOT_FULLSCREEN = 2048; // 0x800
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index b8408dd..aa7631d 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -922,8 +922,11 @@
* unlock credential) than the user will still need to confirm it before
* seeing this window, unless {@link #FLAG_SHOW_WHEN_LOCKED} has
* also been set.
- * @see KeyguardManager#dismissKeyguard
+ * @deprecated Use {@link #FLAG_SHOW_WHEN_LOCKED} or {@link KeyguardManager#dismissKeyguard}
+ * instead. The Keyguard should never be dismissed automatically repeatedly as it also
+ * guards against unintentional touches.
*/
+ @Deprecated
public static final int FLAG_DISMISS_KEYGUARD = 0x00400000;
/** Window flag: when set the window will accept for touch events
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index b2adc73..d94d3cd 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -1830,11 +1830,10 @@
// If keyguard is showing, nothing is visible, except if we are able to dismiss Keyguard
// right away.
return shouldBeVisible && mStackSupervisor.mKeyguardController
- .canShowActivityWhileKeyguardShowing(dismissKeyguard);
+ .canShowActivityWhileKeyguardShowing(r, dismissKeyguard);
} else if (keyguardLocked) {
-
- // Show when locked windows above keyguard.
- return shouldBeVisible && showWhenLocked;
+ return shouldBeVisible && mStackSupervisor.mKeyguardController.canShowWhileOccluded(
+ dismissKeyguard, showWhenLocked);
} else {
return shouldBeVisible;
}
diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java
index 5e02597..19bf536 100644
--- a/services/core/java/com/android/server/am/KeyguardController.java
+++ b/services/core/java/com/android/server/am/KeyguardController.java
@@ -57,6 +57,7 @@
private boolean mKeyguardShowing;
private boolean mKeyguardGoingAway;
private boolean mOccluded;
+ private boolean mDismissalRequested;
private ActivityRecord mDismissingKeyguardActivity;
private int mBeforeUnoccludeTransit;
private int mVisibilityTransactionDepth;
@@ -95,9 +96,7 @@
mKeyguardShowing = showing;
if (showing) {
mKeyguardGoingAway = false;
-
- // Allow an activity to redismiss Keyguard.
- mDismissingKeyguardActivity = null;
+ mDismissalRequested = false;
}
mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
mService.updateSleepIfNeededLocked();
@@ -183,8 +182,20 @@
* @return True if we may show an activity while Keyguard is showing because we are in the
* process of dismissing it anyways, false otherwise.
*/
- boolean canShowActivityWhileKeyguardShowing(boolean dismissKeyguard) {
- return dismissKeyguard && canDismissKeyguard();
+ boolean canShowActivityWhileKeyguardShowing(ActivityRecord r, boolean dismissKeyguard) {
+
+ // Allow to show it when we are about to dismiss Keyguard. This isn't allowed if r is
+ // already the dismissing activity, in which case we don't allow it to repeatedly dismiss
+ // Keyguard.
+ return dismissKeyguard && canDismissKeyguard() &&
+ (mDismissalRequested || r != mDismissingKeyguardActivity);
+ }
+
+ /**
+ * @return True if we may show an activity while Keyguard is occluded, false otherwise.
+ */
+ boolean canShowWhileOccluded(boolean dismissKeyguard, boolean showWhenLocked) {
+ return showWhenLocked || dismissKeyguard && !mWindowManager.isKeyguardSecure();
}
private void visibilitiesUpdated() {
@@ -199,7 +210,14 @@
// Only the very top activity may control occluded state
if (stackNdx == topStackNdx) {
- mOccluded = stack.topActivityOccludesKeyguard();
+
+ // A dismissing activity occludes Keyguard in the insecure case for legacy reasons.
+ final ActivityRecord topDismissing = stack.getTopDismissingKeyguardActivity();
+ mOccluded = stack.topActivityOccludesKeyguard()
+ || (topDismissing != null
+ && stack.topRunningActivityLocked() == topDismissing
+ && canShowWhileOccluded(true /* dismissKeyguard */,
+ false /* showWhenLocked */));
}
if (mDismissingKeyguardActivity == null
&& stack.getTopDismissingKeyguardActivity() != null) {
@@ -239,8 +257,13 @@
* Called when somebody might want to dismiss the Keyguard.
*/
private void handleDismissKeyguard() {
- if (mDismissingKeyguardActivity != null) {
+ // We only allow dismissing Keyguard via the flag when Keyguard is secure for legacy
+ // reasons, because that's how apps used to dismiss Keyguard in the secure case. In the
+ // insecure case, we actually show it on top of the lockscreen. See #canShowWhileOccluded.
+ if (!mOccluded && mDismissingKeyguardActivity != null
+ && mWindowManager.isKeyguardSecure()) {
mWindowManager.dismissKeyguard(null /* callback */);
+ mDismissalRequested = true;
// If we are about to unocclude the Keyguard, but we can dismiss it without security,
// we immediately dismiss the Keyguard so the activity gets shown without a flicker.
@@ -296,6 +319,7 @@
pw.println(prefix + " mKeyguardGoingAway=" + mKeyguardGoingAway);
pw.println(prefix + " mOccluded=" + mOccluded);
pw.println(prefix + " mDismissingKeyguardActivity=" + mDismissingKeyguardActivity);
+ pw.println(prefix + " mDismissalRequested=" + mDismissalRequested);
pw.println(prefix + " mVisibilityTransactionDepth=" + mVisibilityTransactionDepth);
}
}