Dismiss keyguard when opening settings

Previously, the app would throw the user back to the
lockscreen, which would require user to swipe up to dismiss
it and unlock (e.g. enter PIN), then open the settings
activity.
Fix this confusion by directly trying to dismiss keyguard.

Pass through requestDismissKeyguard() from KeyguardManager
so that other activities may also use it.

Test: Set lock via PIN, launch camera via secure intent
      (e.g. via right KeyguardAffordance), tap settings
      button, observe PIN request, enter PIN, land in
      settings activity.
Test: When unlocking, dismiss PIN entry, observe
      "Keyguard dismiss canceled" in logcat.

Signed-off-by: Felix <google@ix5.org>
Change-Id: I9e1e2a8551f7b2230c59d04efd3ef9820f74e1c8
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java
index 8efc25f..6fcbccd 100644
--- a/src/com/android/camera/CameraActivity.java
+++ b/src/com/android/camera/CameraActivity.java
@@ -22,6 +22,7 @@
 import android.app.ActionBar;
 import android.app.Activity;
 import android.app.Dialog;
+import android.app.KeyguardManager.KeyguardDismissCallback;
 import android.content.ActivityNotFoundException;
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
@@ -2509,7 +2510,32 @@
         UsageStatistics.instance().controlUsed(
                 eventprotos.ControlEvent.ControlType.OVERALL_SETTINGS);
         Intent intent = new Intent(this, CameraSettingsActivity.class);
-        startActivity(intent);
+        if (!isKeyguardLocked()) {
+            startActivity(intent);
+        } else {
+            /* Need to explicitly request keyguard dismissal for PIN/pattern
+             * entry to show up directly. */
+            requestDismissKeyguard(
+                /* requesting Activity: */ CameraActivity.this,
+                new KeyguardDismissCallback() {
+                    @Override
+                    public void onDismissSucceeded() {
+                        /* Need to use launchActivityByIntent() so that going
+                         * back from settings after unlock leads to main
+                         * activity instead of dismissing camera entirely. */
+                        launchActivityByIntent(intent);
+                    }
+                    @Override
+                    public void onDismissError() {
+                        Log.e(TAG, "Keyguard dismissal failed.");
+                    }
+                    @Override
+                    public void onDismissCancelled() {
+                        Log.d(TAG, "Keyguard dismissal canceled.");
+                    }
+                }
+            );
+        }
     }
 
     @Override
diff --git a/src/com/android/camera/util/QuickActivity.java b/src/com/android/camera/util/QuickActivity.java
index 18ea253..5122255 100644
--- a/src/com/android/camera/util/QuickActivity.java
+++ b/src/com/android/camera/util/QuickActivity.java
@@ -224,6 +224,16 @@
         return false;
     }
 
+    protected void requestDismissKeyguard(Activity activity,
+            @Nullable KeyguardManager.KeyguardDismissCallback callback) {
+        if (mKeyguardManager == null) {
+            mKeyguardManager = AndroidServices.instance().provideKeyguardManager();
+        }
+        if (mKeyguardManager != null) {
+            mKeyguardManager.requestDismissKeyguard(activity, callback);
+        }
+    }
+
     /**
      * Subclasses should override this in place of {@link Activity#onNewIntent}.
      */