diff options
6 files changed, 69 insertions, 41 deletions
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 5397a29cda3b..d733369e17f6 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -3899,7 +3899,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } public void dismissKeyguardLw() { - if (!mKeyguardMediator.isSecure()) { + if (mKeyguardMediator.isDismissable()) { if (mKeyguardMediator.isShowing()) { mHandler.post(new Runnable() { public void run() { diff --git a/policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java b/policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java index 0f5817a333bc..dbd999913637 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java @@ -188,16 +188,6 @@ public class CameraWidgetFrame extends KeyguardWidgetFrame implements View.OnCli return iv; } - @Override - public void setPivotX(float pivotX) { - // don't pivot me - } - - @Override - public void setPivotY(float pivotY) { - // don't pivot me - } - public void render() { final Throwable[] thrown = new Throwable[1]; final Bitmap[] offscreen = new Bitmap[1]; diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java index 51407fee1c9b..dbb357710850 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java @@ -35,6 +35,7 @@ import android.provider.MediaStore; import android.util.Log; import android.view.WindowManager; +import com.android.internal.policy.impl.keyguard.KeyguardSecurityCallback.OnDismissAction; import com.android.internal.widget.LockPatternUtils; import java.util.List; @@ -160,10 +161,8 @@ public abstract class KeyguardActivityLauncher { | Intent.FLAG_ACTIVITY_CLEAR_TOP); boolean isSecure = lockPatternUtils.isSecure(); if (!isSecure || showsWhileLocked) { - if (!isSecure) try { - ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity(); - } catch (RemoteException e) { - Log.w(TAG, "can't dismiss keyguard on launch"); + if (!isSecure) { + dismissKeyguardOnNextActivity(); } try { if (DEBUG) Log.d(TAG, String.format("Starting activity for intent %s at %s", @@ -176,16 +175,26 @@ public abstract class KeyguardActivityLauncher { // Create a runnable to start the activity and ask the user to enter their // credentials. KeyguardSecurityCallback callback = getCallback(); - callback.setOnDismissRunnable(new Runnable() { + callback.setOnDismissAction(new OnDismissAction() { @Override - public void run() { + public boolean onDismiss() { + dismissKeyguardOnNextActivity(); startActivityForCurrentUser(intent, animation, worker, onStarted); + return true; } }); callback.dismiss(false); } } + private void dismissKeyguardOnNextActivity() { + try { + ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity(); + } catch (RemoteException e) { + Log.w(TAG, "can't dismiss keyguard on launch"); + } + } + private void startActivityForCurrentUser(final Intent intent, final Bundle options, Handler worker, final Runnable onStarted) { final UserHandle user = new UserHandle(UserHandle.USER_CURRENT); 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 f212f7391fd5..d9f7980cf67b 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java @@ -50,6 +50,7 @@ import android.view.animation.AnimationUtils; import android.widget.RemoteViews.OnClickHandler; import com.android.internal.R; +import com.android.internal.policy.impl.keyguard.KeyguardSecurityCallback.OnDismissAction; import com.android.internal.policy.impl.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.internal.widget.LockPatternUtils; @@ -79,7 +80,7 @@ public class KeyguardHostView extends KeyguardViewBase { private boolean mBootCompleted = false; private boolean mCheckAppWidgetConsistencyOnBootCompleted = false; - protected Runnable mLaunchRunnable; + protected OnDismissAction mDismissAction; protected int mFailedAttempts; private LockPatternUtils mLockPatternUtils; @@ -364,8 +365,8 @@ public class KeyguardHostView extends KeyguardViewBase { } @Override - public void setOnDismissRunnable(Runnable runnable) { - KeyguardHostView.this.setOnDismissRunnable(runnable); + public void setOnDismissAction(OnDismissAction action) { + KeyguardHostView.this.setOnDismissAction(action); } }; @@ -569,12 +570,17 @@ public class KeyguardHostView extends KeyguardViewBase { // If there's a pending runnable because the user interacted with a widget // and we're leaving keyguard, then run it. - if (mLaunchRunnable != null) { - mLaunchRunnable.run(); - mLaunchRunnable = null; + boolean deferKeyguardDone = false; + if (mDismissAction != null) { + deferKeyguardDone = mDismissAction.onDismiss(); + mDismissAction = null; } if (mViewMediatorCallback != null) { - mViewMediatorCallback.keyguardDone(true); + if (deferKeyguardDone) { + mViewMediatorCallback.keyguardDonePending(); + } else { + mViewMediatorCallback.keyguardDone(true); + } } } else { mViewStateManager.showBouncer(true); @@ -587,8 +593,8 @@ public class KeyguardHostView extends KeyguardViewBase { final android.app.PendingIntent pendingIntent, final Intent fillInIntent) { if (pendingIntent.isActivity()) { - setOnDismissRunnable(new Runnable() { - public void run() { + setOnDismissAction(new OnDismissAction() { + public boolean onDismiss() { try { // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT? Context context = view.getContext(); @@ -599,12 +605,13 @@ public class KeyguardHostView extends KeyguardViewBase { pendingIntent.getIntentSender(), fillInIntent, Intent.FLAG_ACTIVITY_NEW_TASK, Intent.FLAG_ACTIVITY_NEW_TASK, 0, opts.toBundle()); - } catch (IntentSender.SendIntentException e) { - android.util.Log.e(TAG, "Cannot send pending intent: ", e); - } catch (Exception e) { - android.util.Log.e(TAG, "Cannot send pending intent due to " + - "unknown exception: ", e); - } + } catch (IntentSender.SendIntentException e) { + android.util.Log.e(TAG, "Cannot send pending intent: ", e); + } catch (Exception e) { + android.util.Log.e(TAG, "Cannot send pending intent due to " + + "unknown exception: ", e); + } + return false; } }); @@ -633,7 +640,7 @@ public class KeyguardHostView extends KeyguardViewBase { } @Override - public void setOnDismissRunnable(Runnable runnable) { + public void setOnDismissAction(OnDismissAction action) { } @Override @@ -668,11 +675,11 @@ public class KeyguardHostView extends KeyguardViewBase { } /** - * Sets a runnable to run when keyguard is dismissed - * @param runnable + * Sets an action to perform when keyguard is dismissed. + * @param action */ - protected void setOnDismissRunnable(Runnable runnable) { - mLaunchRunnable = runnable; + protected void setOnDismissAction(OnDismissAction action) { + mDismissAction = action; } private KeyguardSecurityView getSecurityView(SecurityMode securityMode) { @@ -757,7 +764,7 @@ public class KeyguardHostView extends KeyguardViewBase { if (securityMode == SecurityMode.None) { // Discard current runnable if we're switching back to the selector view - setOnDismissRunnable(null); + setOnDismissAction(null); } mCurrentSecuritySelection = securityMode; } 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 3b8df5db5e2a..e1a0a211f02e 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityCallback.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityCallback.java @@ -17,6 +17,12 @@ package com.android.internal.policy.impl.keyguard; public interface KeyguardSecurityCallback { + /*package*/ interface OnDismissAction { + + /* returns true if the dismiss should be deferred */ + boolean onDismiss(); + } + /** * Dismiss the given security screen. * @param securityVerified true if the user correctly entered credentials for the given screen. @@ -58,9 +64,9 @@ public interface KeyguardSecurityCallback { void showBackupSecurity(); /** - * Sets a runnable to launch after the user successfully enters their credentials. - * @param runnable + * Sets an action to perform after the user successfully enters their credentials. + * @param action */ - void setOnDismissRunnable(Runnable runnable); + void setOnDismissAction(OnDismissAction action); } diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java index 5e192719c42b..128930ad076c 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java @@ -235,6 +235,7 @@ public class KeyguardViewMediator { */ private boolean mWaitingUntilKeyguardVisible = false; private LockPatternUtils mLockPatternUtils; + private boolean mKeyguardDonePending = false; private SoundPool mLockSounds; private int mLockSoundId; @@ -294,6 +295,11 @@ public class KeyguardViewMediator { * has changed and needs to be reapplied to the window. */ void onUserActivityTimeoutChanged(); + + /** + * Report that the keyguard is dismissable, pending the next keyguardDone call. + */ + void keyguardDonePending(); } KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() { @@ -436,6 +442,11 @@ public class KeyguardViewMediator { public void onUserActivityTimeoutChanged() { mKeyguardViewManager.updateUserActivityTimeout(); } + + @Override + public void keyguardDonePending() { + mKeyguardDonePending = true; + } }; public void wakeUp() { @@ -1044,6 +1055,7 @@ public class KeyguardViewMediator { } public void keyguardDone(boolean authenticated, boolean wakeup) { + mKeyguardDonePending = false; synchronized (this) { EventLog.writeEvent(70000, 2); if (DEBUG) Log.d(TAG, "keyguardDone(" + authenticated + ")"); @@ -1377,4 +1389,8 @@ public class KeyguardViewMediator { } } + public boolean isDismissable() { + return mKeyguardDonePending || !isSecure(); + } + } |