summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xpolicy/src/com/android/internal/policy/impl/PhoneWindowManager.java2
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/CameraWidgetFrame.java10
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardActivityLauncher.java21
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java49
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardSecurityCallback.java12
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java16
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();
+ }
+
}