From 1c01c8bc79941471857338bae011fd0a6790f89f Mon Sep 17 00:00:00 2001 From: Fred Quintana Date: Sat, 15 Aug 2009 21:46:24 -0700 Subject: [PATCH] do not merge: cherrypicked 53f5bc273b81a3761242d3356ed8490b5e6797f2 from master branch --- .../policy/impl/AccountUnlockScreen.java | 81 +++++++++++-------- .../policy/impl/LockPatternKeyguardView.java | 8 +- 2 files changed, 52 insertions(+), 37 deletions(-) diff --git a/policy/com/android/internal/policy/impl/AccountUnlockScreen.java b/policy/com/android/internal/policy/impl/AccountUnlockScreen.java index 098a65118445f..e1181453d6195 100644 --- a/policy/com/android/internal/policy/impl/AccountUnlockScreen.java +++ b/policy/com/android/internal/policy/impl/AccountUnlockScreen.java @@ -21,6 +21,10 @@ import com.android.internal.widget.LockPatternUtils; import android.accounts.Account; import android.accounts.AccountManager; +import android.accounts.OperationCanceledException; +import android.accounts.AccountManagerFuture; +import android.accounts.AuthenticatorException; +import android.accounts.AccountManagerCallback; import android.content.Context; import android.content.Intent; import android.graphics.Rect; @@ -36,6 +40,8 @@ import android.widget.EditText; import android.widget.RelativeLayout; import android.widget.TextView; +import java.io.IOException; + /** * When the user forgets their password a bunch of times, we fall back on their * account's login/password to unlock the phone (and reset their lock pattern). @@ -135,23 +141,7 @@ public class AccountUnlockScreen extends RelativeLayout implements KeyguardScree public void onClick(View v) { mCallback.pokeWakelock(); if (v == mOk) { - if (checkPassword()) { - // clear out forgotten password - mLockPatternUtils.setPermanentlyLocked(false); - - // launch the 'choose lock pattern' activity so - // the user can pick a new one if they want to - Intent intent = new Intent(); - intent.setClassName(LOCK_PATTERN_PACKAGE, LOCK_PATTERN_CLASS); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mContext.startActivity(intent); - - // close the keyguard - mCallback.keyguardDone(true); - } else { - mInstructions.setText(R.string.lockscreen_glogin_invalid_input); - mPassword.setText(""); - } + asyncCheckPassword(); } if (v == mEmergencyCall) { @@ -159,6 +149,26 @@ public class AccountUnlockScreen extends RelativeLayout implements KeyguardScree } } + private void onCheckPasswordResult(boolean flag) { + if (flag) { + // clear out forgotten password + mLockPatternUtils.setPermanentlyLocked(false); + + // launch the 'choose lock pattern' activity so + // the user can pick a new one if they want to + Intent intent = new Intent(); + intent.setClassName(LOCK_PATTERN_PACKAGE, LOCK_PATTERN_CLASS); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mContext.startActivity(intent); + + // close the keyguard + mCallback.keyguardDone(true); + } else { + mInstructions.setText(R.string.lockscreen_glogin_invalid_input); + mPassword.setText(""); + } + } + @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN @@ -186,7 +196,7 @@ public class AccountUnlockScreen extends RelativeLayout implements KeyguardScree * find a single best match. */ private Account findIntendedAccount(String username) { - Account[] accounts = AccountManager.get(mContext).blockingGetAccounts(); + Account[] accounts = AccountManager.get(mContext).getAccounts(); // Try to figure out which account they meant if they // typed only the username (and not the domain), or got @@ -196,14 +206,14 @@ public class AccountUnlockScreen extends RelativeLayout implements KeyguardScree int bestScore = 0; for (Account a: accounts) { int score = 0; - if (username.equals(a.mName)) { + if (username.equals(a.name)) { score = 4; - } else if (username.equalsIgnoreCase(a.mName)) { + } else if (username.equalsIgnoreCase(a.name)) { score = 3; } else if (username.indexOf('@') < 0) { - int i = a.mName.indexOf('@'); + int i = a.name.indexOf('@'); if (i >= 0) { - String aUsername = a.mName.substring(0, i); + String aUsername = a.name.substring(0, i); if (username.equals(aUsername)) { score = 2; } else if (username.equalsIgnoreCase(aUsername)) { @@ -221,21 +231,26 @@ public class AccountUnlockScreen extends RelativeLayout implements KeyguardScree return bestAccount; } - private boolean checkPassword() { + private void asyncCheckPassword() { final String login = mLogin.getText().toString(); final String password = mPassword.getText().toString(); Account account = findIntendedAccount(login); if (account == null) { - return false; - } - // TODO(fredq) change this to asynchronously issue the request and wait for the response (by - // supplying a callback rather than calling get() immediately) - try { - return AccountManager.get(mContext).confirmPassword( - account, password, null /* callback */, null /* handler */).getResult(); - } catch (android.accounts.OperationCanceledException e) { - // the request was canceled - return false; + onCheckPasswordResult(false); + return; } + AccountManager.get(mContext).confirmPassword( + account, password, new AccountManagerCallback() { + public void run(AccountManagerFuture future) { + boolean result = false; + try { + result = future.getResult(); + } catch (OperationCanceledException e) { + } catch (IOException e) { + } catch (AuthenticatorException e) { + } + onCheckPasswordResult(result); + } + }, null /* handler */); } } diff --git a/policy/com/android/internal/policy/impl/LockPatternKeyguardView.java b/policy/com/android/internal/policy/impl/LockPatternKeyguardView.java index 4294de401304e..0c45cd56e4fad 100644 --- a/policy/com/android/internal/policy/impl/LockPatternKeyguardView.java +++ b/policy/com/android/internal/policy/impl/LockPatternKeyguardView.java @@ -152,7 +152,7 @@ public class LockPatternKeyguardView extends KeyguardViewBase { KeyguardWindowController controller) { super(context); - final boolean hasAccount = AccountManager.get(context).blockingGetAccounts().length > 0; + final boolean hasAccount = AccountManager.get(context).getAccounts().length > 0; boolean hasSAMLAccount = false; if (hasAccount) { /* If we have a SAML account which requires web login we can not use the @@ -160,11 +160,11 @@ public class LockPatternKeyguardView extends KeyguardViewBase { For now we will disable fallback screen in this case. Ultimately we could consider bringing up a web login from GLS but need to make sure that it will work in the "locked screen" mode. */ - try { + String[] features = new String[] {"saml"}; hasSAMLAccount = - AccountManager.get(context).blockingGetAccountsWithTypeAndFeatures( - "com.GOOGLE.GAIA", new String[] {"saml"}).length > 0; + AccountManager.get(context).getAccountsByTypeAndFeatures( + "com.google.GAIA", features, null, null).getResult().length > 0; } catch (Exception e) { // We err on the side of caution. // In case of error we assume we have a SAML account.