From 5f75aa15d7c1c5ea1c1eecd95bf2bb0920173eb2 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Wed, 29 Aug 2012 15:10:34 -0700 Subject: Fix Camera and GoogleNow launching in keyguard 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/impl/keyguard/KeyguardHostView.java | 17 +++++++- .../impl/keyguard/KeyguardSecurityCallback.java | 9 ++++ .../policy/impl/keyguard/KeyguardSelectorView.java | 49 ++++++++++++++++------ 3 files changed, 61 insertions(+), 14 deletions(-) diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java index 0ad3a6a9398f..1e425ea6fcdf 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java @@ -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++) { diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityCallback.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityCallback.java index 1a4a40bff21b..36342a5772e6 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityCallback.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityCallback.java @@ -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); + } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java index b69697fc1c24..a38b2475508f 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSelectorView.java @@ -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); } } -- cgit v1.2.3-59-g8ed1b