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