OSDN Git Service

Fix Camera and GoogleNow launching in keyguard
authorJim Miller <jaggies@google.com>
Wed, 29 Aug 2012 22:10:34 +0000 (15:10 -0700)
committerJim Miller <jaggies@google.com>
Thu, 30 Aug 2012 03:06:47 +0000 (20:06 -0700)
This change allows keyguard to launch the secure camera when the device
is in a secure mode.  It also allows launching delayed actions after the
user has entered their security, such as that required for GoogleNow.

Change-Id: I54975001728ced3c339f86eafc3a38cea606082b

policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityCallback.java
policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java

index 0ad3a6a..1e425ea 100644 (file)
@@ -221,6 +221,11 @@ public class KeyguardHostView extends KeyguardViewBase {
             mViewMediatorCallback.keyguardDoneDrawing();
         }
 
+        @Override
+        public void setOnDismissRunnable(Runnable runnable) {
+            KeyguardHostView.this.setOnDismissRunnable(runnable);
+        }
+
     };
 
     public void takeEmergencyCallAction() {
@@ -273,7 +278,7 @@ public class KeyguardHostView extends KeyguardViewBase {
                 final android.app.PendingIntent pendingIntent,
                 final Intent fillInIntent) {
             if (pendingIntent.isActivity()) {
-                mLaunchRunnable = new Runnable() {
+                setOnDismissRunnable(new Runnable() {
                     public void run() {
                         try {
                               // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT?
@@ -292,7 +297,7 @@ public class KeyguardHostView extends KeyguardViewBase {
                                       "unknown exception: ", e);
                           }
                     }
-                };
+                });
 
                 mCallback.dismiss(false);
                 return true;
@@ -307,6 +312,14 @@ public class KeyguardHostView extends KeyguardViewBase {
         requestFocus();
     }
 
+    /**
+     *  Sets a runnable to run when keyguard is dismissed
+     * @param runnable
+     */
+    protected void setOnDismissRunnable(Runnable runnable) {
+        mLaunchRunnable = runnable;
+    }
+
     private KeyguardSecurityView getSecurityView(int securitySelectorId) {
         final int children = mViewFlipper.getChildCount();
         for (int child = 0; child < children; child++) {
index 1a4a40b..36342a5 100644 (file)
@@ -57,6 +57,15 @@ public interface KeyguardSecurityCallback {
      */
     void showBackupUnlock();
 
+    /**
+     * Used to inform keyguard when the current view is done drawing.
+     */
     void keyguardDoneDrawing();
 
+    /**
+     * Sets a runnable to launch after the user enters their
+     * @param runnable
+     */
+    void setOnDismissRunnable(Runnable runnable);
+
 }
index b69697f..a38b247 100644 (file)
@@ -61,7 +61,7 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri
                             ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
                             .getAssistIntent(mContext, UserHandle.USER_CURRENT);
                     if (assistIntent != null) {
-                        launchActivity(assistIntent);
+                        launchActivity(assistIntent, false);
                     } else {
                         Log.w(TAG, "Failed to get intent for assist activity");
                     }
@@ -69,7 +69,7 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri
                     break;
 
                 case com.android.internal.R.drawable.ic_lockscreen_camera:
-                    launchActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA));
+                    launchCamera();
                     mCallback.userActivity(0);
                     break;
 
@@ -128,6 +128,16 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri
         this(context, null);
     }
 
+    protected void launchCamera() {
+        if (mLockPatternUtils.isSecure()) {
+            // Launch the secure version of the camera
+            launchActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE), true);
+        } else {
+            // Launch the normal camera
+            launchActivity(new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA), false);
+        }
+    }
+
     public KeyguardSelectorView(Context context, AttributeSet attrs) {
         super(context, attrs);
         mLockPatternUtils = new LockPatternUtils(getContext());
@@ -217,21 +227,36 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri
     /**
      * Launches the said intent for the current foreground user.
      * @param intent
+     * @param showsWhileLocked true if the activity can be run on top of keyguard.
+     * See {@link WindowManager#FLAG_SHOW_WHEN_LOCKED}
      */
-    private void launchActivity(Intent intent) {
+    private void launchActivity(final Intent intent, boolean showsWhileLocked) {
         intent.setFlags(
                 Intent.FLAG_ACTIVITY_NEW_TASK
                 | Intent.FLAG_ACTIVITY_SINGLE_TOP
                 | Intent.FLAG_ACTIVITY_CLEAR_TOP);
-        try {
-            ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
-        } catch (RemoteException e) {
-            Log.w(TAG, "can't dismiss keyguard on launch");
-        }
-        try {
-            mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
-        } catch (ActivityNotFoundException e) {
-            Log.w(TAG, "Activity not found for intent + " + intent.getAction());
+        boolean isSecure = mLockPatternUtils.isSecure();
+        if (!isSecure || showsWhileLocked) {
+            if (!isSecure) try {
+                ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity();
+            } catch (RemoteException e) {
+                Log.w(TAG, "can't dismiss keyguard on launch");
+            }
+            try {
+                mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
+            } catch (ActivityNotFoundException e) {
+                Log.w(TAG, "Activity not found for intent + " + intent.getAction());
+            }
+        } else {
+            // Create a runnable to start the activity and ask the user to enter their
+            // credentials.
+            mCallback.setOnDismissRunnable(new Runnable() {
+                @Override
+                public void run() {
+                    mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
+                }
+            });
+            mCallback.dismiss(false);
         }
     }