Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5f75aa15 authored by Jim Miller's avatar Jim Miller
Browse files

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
parent ffc45b7d
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -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++) {
+9 −0
Original line number Diff line number Diff line
@@ -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);

}
+37 −12
Original line number Diff line number Diff line
@@ -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,13 +227,17 @@ 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 {
        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");
@@ -233,6 +247,17 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri
            } 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);
        }
    }

    @Override