Request keyguard dismissal from suspend dialog

Sometimes a suspended app may be started while the device is locked. The
suspend dialog should request the user to unlock in these cases.

Test: Manual:
1. Suspend camera app.
2. Lock the screen.
3. Try to launch the camera while the screen is locked, e.g., by double
tapping the power button.

Bug: 157867645
Change-Id: Ie3b5e2903804bc8b385de4fc9276dd55a8108c0f
Merged-In: Ie3b5e2903804bc8b385de4fc9276dd55a8108c0f
diff --git a/core/java/com/android/internal/app/SuspendedAppActivity.java b/core/java/com/android/internal/app/SuspendedAppActivity.java
index 0589baa..d8eaeda 100644
--- a/core/java/com/android/internal/app/SuspendedAppActivity.java
+++ b/core/java/com/android/internal/app/SuspendedAppActivity.java
@@ -26,6 +26,7 @@
 import android.annotation.Nullable;
 import android.app.AlertDialog;
 import android.app.AppGlobals;
+import android.app.KeyguardManager;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentSender;
@@ -208,9 +209,32 @@
         ap.mPositiveButtonText = getString(android.R.string.ok);
         ap.mNeutralButtonText = resolveNeutralButtonText();
         ap.mPositiveButtonListener = ap.mNeutralButtonListener = this;
+
+        requestDismissKeyguardIfNeeded(ap.mMessage);
+
         setupAlert();
     }
 
+    private void requestDismissKeyguardIfNeeded(CharSequence dismissMessage) {
+        final KeyguardManager km = getSystemService(KeyguardManager.class);
+        if (km.isKeyguardLocked()) {
+            km.requestDismissKeyguard(this, dismissMessage,
+                    new KeyguardManager.KeyguardDismissCallback() {
+                        @Override
+                        public void onDismissError() {
+                            Slog.e(TAG, "Error while dismissing keyguard."
+                                    + " Keeping the dialog visible.");
+                        }
+
+                        @Override
+                        public void onDismissCancelled() {
+                            Slog.w(TAG, "Keyguard dismiss was cancelled. Finishing.");
+                            SuspendedAppActivity.this.finish();
+                        }
+                    });
+        }
+    }
+
     @Override
     public void onClick(DialogInterface dialog, int which) {
         switch (which) {