Fields Summary |
---|
private static final String | LOCK_PATTERN_PACKAGE |
private static final String | LOCK_PATTERN_CLASS |
private KeyguardSecurityCallback | mCallback |
private com.android.internal.widget.LockPatternUtils | mLockPatternUtils |
private android.widget.EditText | mLogin |
private android.widget.EditText | mPassword |
private android.widget.Button | mOk |
public boolean | mEnableFallback |
private SecurityMessageDisplay | mSecurityMessageDisplay |
private android.app.ProgressDialog | mCheckingDialogShown while making asynchronous check of password. |
Methods Summary |
---|
public void | afterTextChanged(android.text.Editable s)
|
private void | asyncCheckPassword()
mCallback.userActivity();
final String login = mLogin.getText().toString();
final String password = mPassword.getText().toString();
Account account = findIntendedAccount(login);
if (account == null) {
postOnCheckPasswordResult(false);
return;
}
getProgressDialog().show();
Bundle options = new Bundle();
options.putString(AccountManager.KEY_PASSWORD, password);
AccountManager.get(mContext).confirmCredentialsAsUser(account, options, null /* activity */,
new AccountManagerCallback<Bundle>() {
public void run(AccountManagerFuture<Bundle> future) {
try {
mCallback.userActivity();
final Bundle result = future.getResult();
final boolean verified = result.getBoolean(AccountManager.KEY_BOOLEAN_RESULT);
postOnCheckPasswordResult(verified);
} catch (OperationCanceledException e) {
postOnCheckPasswordResult(false);
} catch (IOException e) {
postOnCheckPasswordResult(false);
} catch (AuthenticatorException e) {
postOnCheckPasswordResult(false);
} finally {
mLogin.post(new Runnable() {
public void run() {
getProgressDialog().hide();
}
});
}
}
}, null /* handler */, new UserHandle(mLockPatternUtils.getCurrentUser()));
|
public void | beforeTextChanged(java.lang.CharSequence s, int start, int count, int after)
|
public void | cleanUp(){@inheritDoc}
if (mCheckingDialog != null) {
mCheckingDialog.hide();
}
mCallback = null;
mLockPatternUtils = null;
|
public boolean | dispatchKeyEvent(android.view.KeyEvent event)
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
if (mLockPatternUtils.isPermanentlyLocked()) {
mCallback.dismiss(false);
} else {
// TODO: mCallback.forgotPattern(false);
}
return true;
}
return super.dispatchKeyEvent(event);
|
private android.accounts.Account | findIntendedAccount(java.lang.String username)Given the string the user entered in the 'username' field, find
the stored account that they probably intended. Prefer, in order:
- an exact match for what was typed, or
- a case-insensitive match for what was typed, or
- if they didn't include a domain, an exact match of the username, or
- if they didn't include a domain, a case-insensitive
match of the username.
If there is a tie for the best match, choose neither --
the user needs to be more specific.
Account[] accounts = AccountManager.get(mContext).getAccountsByTypeAsUser("com.google",
new UserHandle(mLockPatternUtils.getCurrentUser()));
// Try to figure out which account they meant if they
// typed only the username (and not the domain), or got
// the case wrong.
Account bestAccount = null;
int bestScore = 0;
for (Account a: accounts) {
int score = 0;
if (username.equals(a.name)) {
score = 4;
} else if (username.equalsIgnoreCase(a.name)) {
score = 3;
} else if (username.indexOf('@") < 0) {
int i = a.name.indexOf('@");
if (i >= 0) {
String aUsername = a.name.substring(0, i);
if (username.equals(aUsername)) {
score = 2;
} else if (username.equalsIgnoreCase(aUsername)) {
score = 1;
}
}
}
if (score > bestScore) {
bestAccount = a;
bestScore = score;
} else if (score == bestScore) {
bestAccount = null;
}
}
return bestAccount;
|
public KeyguardSecurityCallback | getCallback()
return mCallback;
|
private android.app.Dialog | getProgressDialog()
if (mCheckingDialog == null) {
mCheckingDialog = new ProgressDialog(mContext);
mCheckingDialog.setMessage(
mContext.getString(R.string.kg_login_checking_password));
mCheckingDialog.setIndeterminate(true);
mCheckingDialog.setCancelable(false);
mCheckingDialog.getWindow().setType(
WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
}
return mCheckingDialog;
|
public void | hideBouncer(int duration)
|
public boolean | needsInput()
return true;
|
public void | onClick(android.view.View v)
mCallback.userActivity();
if (v == mOk) {
asyncCheckPassword();
}
|
protected void | onFinishInflate()
super.onFinishInflate();
mLogin = (EditText) findViewById(R.id.login);
mLogin.setFilters(new InputFilter[] { new LoginFilter.UsernameFilterGeneric() } );
mLogin.addTextChangedListener(this);
mPassword = (EditText) findViewById(R.id.password);
mPassword.addTextChangedListener(this);
mOk = (Button) findViewById(R.id.ok);
mOk.setOnClickListener(this);
mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this);
reset();
|
public void | onPause()
|
protected boolean | onRequestFocusInDescendants(int direction, android.graphics.Rect previouslyFocusedRect)
// send focus to the login field
return mLogin.requestFocus(direction, previouslyFocusedRect);
|
public void | onResume(int reason)
reset();
|
public void | onTextChanged(java.lang.CharSequence s, int start, int before, int count)
if (mCallback != null) {
mCallback.userActivity();
}
|
private void | postOnCheckPasswordResult(boolean success)
// ensure this runs on UI thread
mLogin.post(new Runnable() {
public void run() {
if (success) {
// clear out forgotten password
mLockPatternUtils.setPermanentlyLocked(false);
mLockPatternUtils.setLockPatternEnabled(false);
mLockPatternUtils.saveLockPattern(null);
// 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.startActivityAsUser(intent,
new UserHandle(mLockPatternUtils.getCurrentUser()));
mCallback.reportUnlockAttempt(true);
// dismiss keyguard
mCallback.dismiss(true);
} else {
mSecurityMessageDisplay.setMessage(R.string.kg_login_invalid_input, true);
mPassword.setText("");
mCallback.reportUnlockAttempt(false);
}
}
});
|
public void | reset()
// start fresh
mLogin.setText("");
mPassword.setText("");
mLogin.requestFocus();
boolean permLocked = mLockPatternUtils.isPermanentlyLocked();
mSecurityMessageDisplay.setMessage(permLocked ? R.string.kg_login_too_many_attempts :
R.string.kg_login_instructions, permLocked ? true : false);
|
public void | setKeyguardCallback(KeyguardSecurityCallback callback)
mCallback = callback;
|
public void | setLockPatternUtils(com.android.internal.widget.LockPatternUtils utils)
mLockPatternUtils = utils;
|
public void | showBouncer(int duration)
|
public void | showUsabilityHint()
|
public void | startAppearAnimation()
// TODO.
|
public boolean | startDisappearAnimation(java.lang.Runnable finishRunnable)
return false;
|