AccountUnlockScreen.java revision 1d587e3d5d91fab1cf3048bbeeafa86445cbd08c
11f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/*
21f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
31f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project *
41f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
51f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * you may not use this file except in compliance with the License.
61f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * You may obtain a copy of the License at
71f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project *
81f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
91f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project *
101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * See the License for the specific language governing permissions and
141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * limitations under the License.
151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */
161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectpackage com.android.internal.policy.impl;
181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport com.android.internal.R;
201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport com.android.internal.widget.LockPatternUtils;
211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
224e8f62fbcb4c1edf0e6ef379ad231fa74b12a248Fred Quintanaimport android.accounts.Account;
234e8f62fbcb4c1edf0e6ef379ad231fa74b12a248Fred Quintanaimport android.accounts.AccountManager;
241c01c8bc79941471857338bae011fd0a6790f89fFred Quintanaimport android.accounts.OperationCanceledException;
251c01c8bc79941471857338bae011fd0a6790f89fFred Quintanaimport android.accounts.AccountManagerFuture;
261c01c8bc79941471857338bae011fd0a6790f89fFred Quintanaimport android.accounts.AuthenticatorException;
271c01c8bc79941471857338bae011fd0a6790f89fFred Quintanaimport android.accounts.AccountManagerCallback;
281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Context;
291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Intent;
305475906f53e2d79807548932dfabbf9945143740Jim Millerimport android.content.res.Configuration;
311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.graphics.Rect;
321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.text.Editable;
331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.text.InputFilter;
341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.text.LoginFilter;
351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.text.TextWatcher;
361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.KeyEvent;
371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.LayoutInflater;
381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.View;
3984999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaenimport android.view.WindowManager;
401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.Button;
411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.EditText;
421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.RelativeLayout;
431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.TextView;
4484999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaenimport android.app.Dialog;
4584999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaenimport android.app.ProgressDialog;
46261259b673fbc86e4b04c458e12342f292e7a4f3Fred Quintanaimport android.os.Bundle;
471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
481c01c8bc79941471857338bae011fd0a6790f89fFred Quintanaimport java.io.IOException;
491c01c8bc79941471857338bae011fd0a6790f89fFred Quintana
501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/**
511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * When the user forgets their password a bunch of times, we fall back on their
521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * account's login/password to unlock the phone (and reset their lock pattern).
531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */
541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectpublic class AccountUnlockScreen extends RelativeLayout implements KeyguardScreen,
55c23024d32779b170dde32a50fbdd945ce521b874Jim Miller        KeyguardUpdateMonitor.InfoCallback,View.OnClickListener, TextWatcher {
561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private static final String LOCK_PATTERN_PACKAGE = "com.android.settings";
571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private static final String LOCK_PATTERN_CLASS =
581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            "com.android.settings.ChooseLockPattern";
591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * The amount of millis to stay awake once this screen detects activity
621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private static final int AWAKE_POKE_MILLIS = 30000;
641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private final KeyguardScreenCallback mCallback;
661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private final LockPatternUtils mLockPatternUtils;
67ecaced9a788910b3517bdab08b382c9d45e34dfeJim Miller    private KeyguardUpdateMonitor mUpdateMonitor;
681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private TextView mTopHeader;
701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private TextView mInstructions;
711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private EditText mLogin;
721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private EditText mPassword;
731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private Button mOk;
741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    private Button mEmergencyCall;
751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
7784999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen     * Shown while making asynchronous check of password.
7884999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen     */
7984999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen    private ProgressDialog mCheckingDialog;
8084999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen
8184999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen    /**
821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * AccountUnlockScreen constructor.
835475906f53e2d79807548932dfabbf9945143740Jim Miller     * @param configuration
84ecaced9a788910b3517bdab08b382c9d45e34dfeJim Miller     * @param updateMonitor
851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
865475906f53e2d79807548932dfabbf9945143740Jim Miller    public AccountUnlockScreen(Context context,Configuration configuration,
87ecaced9a788910b3517bdab08b382c9d45e34dfeJim Miller            KeyguardUpdateMonitor updateMonitor, KeyguardScreenCallback callback,
88ecaced9a788910b3517bdab08b382c9d45e34dfeJim Miller            LockPatternUtils lockPatternUtils) {
891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        super(context);
901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mCallback = callback;
911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mLockPatternUtils = lockPatternUtils;
921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        LayoutInflater.from(context).inflate(
941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                R.layout.keyguard_screen_glogin_unlock, this, true);
951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mTopHeader = (TextView) findViewById(R.id.topHeader);
9784999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen        mTopHeader.setText(mLockPatternUtils.isPermanentlyLocked() ?
9884999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen                R.string.lockscreen_glogin_too_many_attempts :
9984999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen                R.string.lockscreen_glogin_forgot_pattern);
1001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mInstructions = (TextView) findViewById(R.id.instructions);
1021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mLogin = (EditText) findViewById(R.id.login);
1041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mLogin.setFilters(new InputFilter[] { new LoginFilter.UsernameFilterGeneric() } );
1051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mLogin.addTextChangedListener(this);
1061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mPassword = (EditText) findViewById(R.id.password);
1081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mPassword.addTextChangedListener(this);
1091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mOk = (Button) findViewById(R.id.ok);
1111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mOk.setOnClickListener(this);
1121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mEmergencyCall = (Button) findViewById(R.id.emergencyCall);
1141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mEmergencyCall.setOnClickListener(this);
115c23024d32779b170dde32a50fbdd945ce521b874Jim Miller        mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCall);
116ecaced9a788910b3517bdab08b382c9d45e34dfeJim Miller
117ecaced9a788910b3517bdab08b382c9d45e34dfeJim Miller        mUpdateMonitor = updateMonitor;
118ecaced9a788910b3517bdab08b382c9d45e34dfeJim Miller        mUpdateMonitor.registerInfoCallback(this);
1194e8f62fbcb4c1edf0e6ef379ad231fa74b12a248Fred Quintana    }
1201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void afterTextChanged(Editable s) {
1221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
1251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void onTextChanged(CharSequence s, int start, int before, int count) {
1281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mCallback.pokeWakelock(AWAKE_POKE_MILLIS);
1291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    @Override
1321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    protected boolean onRequestFocusInDescendants(int direction,
1331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            Rect previouslyFocusedRect) {
1341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        // send focus to the login field
1351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        return mLogin.requestFocus(direction, previouslyFocusedRect);
1361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
1391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public boolean needsInput() {
1401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        return true;
1411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
1441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void onPause() {
1451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
1491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void onResume() {
1501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        // start fresh
1511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mLogin.setText("");
1521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mPassword.setText("");
1531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mLogin.requestFocus();
154c23024d32779b170dde32a50fbdd945ce521b874Jim Miller        mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCall);
1551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
1581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void cleanUp() {
15984999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen        if (mCheckingDialog != null) {
16084999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen            mCheckingDialog.hide();
16184999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen        }
162ecaced9a788910b3517bdab08b382c9d45e34dfeJim Miller        mUpdateMonitor.removeCallback(this);
1631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /** {@inheritDoc} */
1661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public void onClick(View v) {
1671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        mCallback.pokeWakelock();
1681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (v == mOk) {
1691c01c8bc79941471857338bae011fd0a6790f89fFred Quintana            asyncCheckPassword();
1701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
1711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (v == mEmergencyCall) {
1731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            mCallback.takeEmergencyCallAction();
1741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
1751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
1761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
1771d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller    private void postOnCheckPasswordResult(final boolean success) {
1781d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller        // ensure this runs on UI thread
1791d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller        mLogin.post(new Runnable() {
1801d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller            public void run() {
1811d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                if (success) {
1821d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    // clear out forgotten password
1831d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    mLockPatternUtils.setPermanentlyLocked(false);
1841d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    mLockPatternUtils.setLockPatternEnabled(false);
1851d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    mLockPatternUtils.saveLockPattern(null);
1861d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller
1871d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    // launch the 'choose lock pattern' activity so
1881d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    // the user can pick a new one if they want to
1891d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    Intent intent = new Intent();
1901d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    intent.setClassName(LOCK_PATTERN_PACKAGE, LOCK_PATTERN_CLASS);
1911d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1921d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    mContext.startActivity(intent);
1931d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    mCallback.reportSuccessfulUnlockAttempt();
1941d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller
1951d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    // close the keyguard
1961d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    mCallback.keyguardDone(true);
1971d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                } else {
1981d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    mInstructions.setText(R.string.lockscreen_glogin_invalid_input);
1991d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    mPassword.setText("");
2001d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    mCallback.reportFailedUnlockAttempt();
2011d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                }
2021d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller            }
2031d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller        });
2041c01c8bc79941471857338bae011fd0a6790f89fFred Quintana    }
2051c01c8bc79941471857338bae011fd0a6790f89fFred Quintana
2061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    @Override
2071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    public boolean dispatchKeyEvent(KeyEvent event) {
2081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        if (event.getAction() == KeyEvent.ACTION_DOWN
2091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
21084999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen            if (mLockPatternUtils.isPermanentlyLocked()) {
21184999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen                mCallback.goToLockScreen();
21284999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen            } else {
21384999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen                mCallback.forgotPattern(false);
21484999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen            }
2151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            return true;
2161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        return super.dispatchKeyEvent(event);
2181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
2191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    /**
2211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * Given the string the user entered in the 'username' field, find
2221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * the stored account that they probably intended.  Prefer, in order:
2231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     *
2241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     *   - an exact match for what was typed, or
2251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     *   - a case-insensitive match for what was typed, or
2261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     *   - if they didn't include a domain, an exact match of the username, or
2271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     *   - if they didn't include a domain, a case-insensitive
2281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     *     match of the username.
2291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     *
2301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * If there is a tie for the best match, choose neither --
2311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * the user needs to be more specific.
2321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     *
2331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * @return an account name from the database, or null if we can't
2341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     * find a single best match.
2351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project     */
2364e8f62fbcb4c1edf0e6ef379ad231fa74b12a248Fred Quintana    private Account findIntendedAccount(String username) {
237cd8aed8c503ee37fa36b7d14744c9d0271faf12dFred Quintana        Account[] accounts = AccountManager.get(mContext).getAccountsByType("com.google");
2381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        // Try to figure out which account they meant if they
2401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        // typed only the username (and not the domain), or got
2411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        // the case wrong.
2421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2434e8f62fbcb4c1edf0e6ef379ad231fa74b12a248Fred Quintana        Account bestAccount = null;
2441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        int bestScore = 0;
2454e8f62fbcb4c1edf0e6ef379ad231fa74b12a248Fred Quintana        for (Account a: accounts) {
2461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            int score = 0;
2471c01c8bc79941471857338bae011fd0a6790f89fFred Quintana            if (username.equals(a.name)) {
2481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                score = 4;
2491c01c8bc79941471857338bae011fd0a6790f89fFred Quintana            } else if (username.equalsIgnoreCase(a.name)) {
2501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                score = 3;
2511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (username.indexOf('@') < 0) {
2521c01c8bc79941471857338bae011fd0a6790f89fFred Quintana                int i = a.name.indexOf('@');
2531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                if (i >= 0) {
2541c01c8bc79941471857338bae011fd0a6790f89fFred Quintana                    String aUsername = a.name.substring(0, i);
2551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    if (username.equals(aUsername)) {
2561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                        score = 2;
2571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    } else if (username.equalsIgnoreCase(aUsername)) {
2581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                        score = 1;
2591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                    }
2601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                }
2611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
2621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            if (score > bestScore) {
2631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                bestAccount = a;
2641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                bestScore = score;
2651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            } else if (score == bestScore) {
2661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project                bestAccount = null;
2671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project            }
2681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        }
2691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        return bestAccount;
2701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
2711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project
2721c01c8bc79941471857338bae011fd0a6790f89fFred Quintana    private void asyncCheckPassword() {
27384999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen        mCallback.pokeWakelock(AWAKE_POKE_MILLIS);
2741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        final String login = mLogin.getText().toString();
2751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project        final String password = mPassword.getText().toString();
2764e8f62fbcb4c1edf0e6ef379ad231fa74b12a248Fred Quintana        Account account = findIntendedAccount(login);
2774e8f62fbcb4c1edf0e6ef379ad231fa74b12a248Fred Quintana        if (account == null) {
2781d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller            postOnCheckPasswordResult(false);
2791c01c8bc79941471857338bae011fd0a6790f89fFred Quintana            return;
280f29d580185e68bc23750d528511d2717d0de99aaFred Quintana        }
28184999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen        getProgressDialog().show();
282261259b673fbc86e4b04c458e12342f292e7a4f3Fred Quintana        Bundle options = new Bundle();
283261259b673fbc86e4b04c458e12342f292e7a4f3Fred Quintana        options.putString(AccountManager.KEY_PASSWORD, password);
284261259b673fbc86e4b04c458e12342f292e7a4f3Fred Quintana        AccountManager.get(mContext).confirmCredentials(account, options, null /* activity */,
285261259b673fbc86e4b04c458e12342f292e7a4f3Fred Quintana                new AccountManagerCallback<Bundle>() {
286261259b673fbc86e4b04c458e12342f292e7a4f3Fred Quintana            public void run(AccountManagerFuture<Bundle> future) {
2871c01c8bc79941471857338bae011fd0a6790f89fFred Quintana                try {
28884999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen                    mCallback.pokeWakelock(AWAKE_POKE_MILLIS);
289261259b673fbc86e4b04c458e12342f292e7a4f3Fred Quintana                    final Bundle result = future.getResult();
290261259b673fbc86e4b04c458e12342f292e7a4f3Fred Quintana                    final boolean verified = result.getBoolean(AccountManager.KEY_BOOLEAN_RESULT);
2911d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    postOnCheckPasswordResult(verified);
2921c01c8bc79941471857338bae011fd0a6790f89fFred Quintana                } catch (OperationCanceledException e) {
2931d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    postOnCheckPasswordResult(false);
2941c01c8bc79941471857338bae011fd0a6790f89fFred Quintana                } catch (IOException e) {
2951d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    postOnCheckPasswordResult(false);
2961c01c8bc79941471857338bae011fd0a6790f89fFred Quintana                } catch (AuthenticatorException e) {
2971d587e3d5d91fab1cf3048bbeeafa86445cbd08cJim Miller                    postOnCheckPasswordResult(false);
29884999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen                } finally {
29984999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen                    mLogin.post(new Runnable() {
30084999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen                        public void run() {
30184999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen                            getProgressDialog().hide();
30284999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen                        }
30384999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen                    });
3041c01c8bc79941471857338bae011fd0a6790f89fFred Quintana                }
3051c01c8bc79941471857338bae011fd0a6790f89fFred Quintana            }
3061c01c8bc79941471857338bae011fd0a6790f89fFred Quintana        }, null /* handler */);
3071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project    }
30884999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen
30984999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen    private Dialog getProgressDialog() {
31084999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen        if (mCheckingDialog == null) {
31184999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen            mCheckingDialog = new ProgressDialog(mContext);
31284999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen            mCheckingDialog.setMessage(
31384999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen                    mContext.getString(R.string.lockscreen_glogin_checking_password));
31484999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen            mCheckingDialog.setIndeterminate(true);
31584999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen            mCheckingDialog.setCancelable(false);
31684999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen            mCheckingDialog.getWindow().setType(
31784999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen                    WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
3188d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn            if (!mContext.getResources().getBoolean(
3198d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn                    com.android.internal.R.bool.config_sf_slowBlur)) {
3208d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn                mCheckingDialog.getWindow().setFlags(
3218d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn                        WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
3228d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn                        WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
3238d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn            }
32484999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen        }
32584999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen        return mCheckingDialog;
32684999d69e0a70f5e510577b09ea1e788142252a8Karl Rosaen    }
327c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
328c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    public void onPhoneStateChanged(String newState) {
329c23024d32779b170dde32a50fbdd945ce521b874Jim Miller        mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCall);
330c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    }
331c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
332c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    public void onRefreshBatteryInfo(boolean showBatteryInfo, boolean pluggedIn, int batteryLevel) {
333c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
334c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    }
335c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
336c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    public void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn) {
337c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
338c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    }
339c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
340c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    public void onRingerModeChanged(int state) {
341c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
342c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    }
343c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
344c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    public void onTimeChanged() {
345c23024d32779b170dde32a50fbdd945ce521b874Jim Miller
346c23024d32779b170dde32a50fbdd945ce521b874Jim Miller    }
3471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project}
348