ChooseLockPattern.java revision cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0c
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/* 2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License. 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License. 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings; 18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 198a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger; 20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.google.android.collect.Lists; 21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient; 22bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xiaimport com.android.internal.widget.LockPatternChecker; 23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.widget.LockPatternUtils; 24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.widget.LockPatternView; 2556544d0e9198ab21dabec621cdf419b52b412dacJim Millerimport com.android.internal.widget.LockPatternView.Cell; 266f60f7ed22f94891156115643452a32d0324f65aAdrian Roosimport com.android.settings.notification.RedactionInterstitial; 2717e9e1933055b207473b488595b2887bfcaea32eJim Miller 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport static com.android.internal.widget.LockPatternView.DisplayMode; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity; 3117e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.app.Fragment; 320698a216311acd9ab52224602d1a75c08bf89f04Jim Millerimport android.content.Context; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 34bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xiaimport android.os.AsyncTask; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 365437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roosimport android.os.UserHandle; 3791e6c499ca8f33cc093fed4277d2b48ab780b309Andres Moralesimport android.util.Log; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.KeyEvent; 3917e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.view.LayoutInflater; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 4117e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.view.ViewGroup; 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList; 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Collections; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List; 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * If the user has a lock pattern set already, makes them confirm the existing one. 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Then, prompts the user to choose a lock pattern: 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * - prompts for initial pattern 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * - asks for confirmation / restart 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * - saves chosen password when confirmed 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 56263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ChooseLockPattern extends SettingsActivity { 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Used by the choose lock pattern wizard to indicate the wizard is 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * finished, and each activity in the wizard should finish. 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * <p> 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Previously, each activity in the wizard would finish itself after 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * starting the next activity. However, this leads to broken 'Back' 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * behavior. So, now an activity does not finish itself until it gets this 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * result. 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project static final int RESULT_FINISHED = RESULT_FIRST_USER; 6700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 6891e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales private static final String TAG = "ChooseLockPattern"; 6991e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales 7017e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 7117e9e1933055b207473b488595b2887bfcaea32eJim Miller public Intent getIntent() { 7217e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent modIntent = new Intent(super.getIntent()); 736b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName()); 7417e9e1933055b207473b488595b2887bfcaea32eJim Miller return modIntent; 7517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 7600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 77f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos public static Intent createIntent(Context context, 780698a216311acd9ab52224602d1a75c08bf89f04Jim Miller boolean requirePassword, boolean confirmCredentials) { 790698a216311acd9ab52224602d1a75c08bf89f04Jim Miller Intent intent = new Intent(context, ChooseLockPattern.class); 800698a216311acd9ab52224602d1a75c08bf89f04Jim Miller intent.putExtra("key_lock_method", "pattern"); 810698a216311acd9ab52224602d1a75c08bf89f04Jim Miller intent.putExtra(ChooseLockGeneric.CONFIRM_CREDENTIALS, confirmCredentials); 820698a216311acd9ab52224602d1a75c08bf89f04Jim Miller intent.putExtra(EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, requirePassword); 830698a216311acd9ab52224602d1a75c08bf89f04Jim Miller return intent; 840698a216311acd9ab52224602d1a75c08bf89f04Jim Miller } 850698a216311acd9ab52224602d1a75c08bf89f04Jim Miller 86a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales public static Intent createIntent(Context context, 87a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales boolean requirePassword, String pattern) { 88a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales Intent intent = createIntent(context, requirePassword, false); 89a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, pattern); 90a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales return intent; 91a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales } 92a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 936609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales 946609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales public static Intent createIntent(Context context, 956609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales boolean requirePassword, long challenge) { 966609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales Intent intent = createIntent(context, requirePassword, false); 976609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true); 986609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge); 996609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales return intent; 1006609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales } 1016609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales 10217e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 103a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani protected boolean isValidFragment(String fragmentName) { 104a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani if (ChooseLockPatternFragment.class.getName().equals(fragmentName)) return true; 105a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani return false; 106a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani } 107a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani 1086b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam /* package */ Class<? extends Fragment> getFragmentClass() { 1096b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam return ChooseLockPatternFragment.class; 1106b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam } 1116b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam 112a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani @Override 11317e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 11417e9e1933055b207473b488595b2887bfcaea32eJim Miller // requestWindowFeature(Window.FEATURE_NO_TITLE); 11517e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 1168c74072e9cad7ae7cf7266f87b8f202aa42939ceJim Miller CharSequence msg = getText(R.string.lockpassword_choose_your_pattern_header); 117263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio setTitle(msg); 11817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 12017e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 12117e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onKeyDown(int keyCode, KeyEvent event) { 12217e9e1933055b207473b488595b2887bfcaea32eJim Miller // *** TODO *** 12317e9e1933055b207473b488595b2887bfcaea32eJim Miller // chooseLockPatternFragment.onKeyDown(keyCode, event); 12417e9e1933055b207473b488595b2887bfcaea32eJim Miller return super.onKeyDown(keyCode, event); 12517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1278a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren public static class ChooseLockPatternFragment extends InstrumentedFragment 12817e9e1933055b207473b488595b2887bfcaea32eJim Miller implements View.OnClickListener { 129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 13017e9e1933055b207473b488595b2887bfcaea32eJim Miller public static final int CONFIRM_EXISTING_REQUEST = 55; 131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 13217e9e1933055b207473b488595b2887bfcaea32eJim Miller // how long after a confirmation message is shown before moving on 13317e9e1933055b207473b488595b2887bfcaea32eJim Miller static final int INFORMATION_MSG_TIMEOUT_MS = 3000; 134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 13517e9e1933055b207473b488595b2887bfcaea32eJim Miller // how long we wait to clear a wrong pattern 13617e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 2000; 137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 13817e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int ID_EMPTY_MESSAGE = -1; 139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 140a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales private String mCurrentPattern; 1416609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales private boolean mHasChallenge; 1426609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales private long mChallenge; 14317e9e1933055b207473b488595b2887bfcaea32eJim Miller protected TextView mHeaderText; 14417e9e1933055b207473b488595b2887bfcaea32eJim Miller protected LockPatternView mLockPatternView; 14517e9e1933055b207473b488595b2887bfcaea32eJim Miller protected TextView mFooterText; 14617e9e1933055b207473b488595b2887bfcaea32eJim Miller private TextView mFooterLeftButton; 14717e9e1933055b207473b488595b2887bfcaea32eJim Miller private TextView mFooterRightButton; 14817e9e1933055b207473b488595b2887bfcaea32eJim Miller protected List<LockPatternView.Cell> mChosenPattern = null; 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 15017e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 15117e9e1933055b207473b488595b2887bfcaea32eJim Miller * The patten used during the help screen to show how to draw a pattern. 15217e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 15317e9e1933055b207473b488595b2887bfcaea32eJim Miller private final List<LockPatternView.Cell> mAnimatePattern = 15417e9e1933055b207473b488595b2887bfcaea32eJim Miller Collections.unmodifiableList(Lists.newArrayList( 15517e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternView.Cell.of(0, 0), 15617e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternView.Cell.of(0, 1), 15717e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternView.Cell.of(1, 1), 15817e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternView.Cell.of(2, 1) 15917e9e1933055b207473b488595b2887bfcaea32eJim Miller )); 16017e9e1933055b207473b488595b2887bfcaea32eJim Miller 16117e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 16217e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onActivityResult(int requestCode, int resultCode, 16317e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent data) { 16417e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onActivityResult(requestCode, resultCode, data); 16517e9e1933055b207473b488595b2887bfcaea32eJim Miller switch (requestCode) { 16617e9e1933055b207473b488595b2887bfcaea32eJim Miller case CONFIRM_EXISTING_REQUEST: 16717e9e1933055b207473b488595b2887bfcaea32eJim Miller if (resultCode != Activity.RESULT_OK) { 16817e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(RESULT_FINISHED); 16917e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 170a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales } else { 171a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales mCurrentPattern = data.getStringExtra( 172a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); 17317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 174a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 17517e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 17617e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 17817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 180af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam protected void setRightButtonEnabled(boolean enabled) { 181af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam mFooterRightButton.setEnabled(enabled); 182af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 183af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam 184af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam protected void setRightButtonText(int text) { 185af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam mFooterRightButton.setText(text); 186af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 187af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam 18817e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 18917e9e1933055b207473b488595b2887bfcaea32eJim Miller * The pattern listener that responds according to a user choosing a new 19017e9e1933055b207473b488595b2887bfcaea32eJim Miller * lock pattern. 19117e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 19217e9e1933055b207473b488595b2887bfcaea32eJim Miller protected LockPatternView.OnPatternListener mChooseNewLockPatternListener = 19317e9e1933055b207473b488595b2887bfcaea32eJim Miller new LockPatternView.OnPatternListener() { 19417e9e1933055b207473b488595b2887bfcaea32eJim Miller 19517e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPatternStart() { 19617e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.removeCallbacks(mClearPatternRunnable); 19717e9e1933055b207473b488595b2887bfcaea32eJim Miller patternInProgress(); 198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 20017e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPatternCleared() { 20117e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.removeCallbacks(mClearPatternRunnable); 20217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 20356544d0e9198ab21dabec621cdf419b52b412dacJim Miller 20417e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPatternDetected(List<LockPatternView.Cell> pattern) { 20517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage == Stage.NeedToConfirm || mUiStage == Stage.ConfirmWrong) { 20617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mChosenPattern == null) throw new IllegalStateException( 20717e9e1933055b207473b488595b2887bfcaea32eJim Miller "null chosen pattern in stage 'need to confirm"); 20817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mChosenPattern.equals(pattern)) { 20917e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.ChoiceConfirmed); 21017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 21117e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.ConfirmWrong); 21217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 21317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (mUiStage == Stage.Introduction || mUiStage == Stage.ChoiceTooShort){ 21417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (pattern.size() < LockPatternUtils.MIN_LOCK_PATTERN_SIZE) { 21517e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.ChoiceTooShort); 21617e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 21717e9e1933055b207473b488595b2887bfcaea32eJim Miller mChosenPattern = new ArrayList<LockPatternView.Cell>(pattern); 21817e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.FirstChoiceValid); 21917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 22017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 22117e9e1933055b207473b488595b2887bfcaea32eJim Miller throw new IllegalStateException("Unexpected stage " + mUiStage + " when " 22217e9e1933055b207473b488595b2887bfcaea32eJim Miller + "entering the pattern."); 22317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 22417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 22556544d0e9198ab21dabec621cdf419b52b412dacJim Miller 22617e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPatternCellAdded(List<Cell> pattern) { 227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 22817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 23017e9e1933055b207473b488595b2887bfcaea32eJim Miller private void patternInProgress() { 23117e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(R.string.lockpattern_recording_inprogress); 23217e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterText.setText(""); 23317e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setEnabled(false); 23417e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterRightButton.setEnabled(false); 23517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 23617e9e1933055b207473b488595b2887bfcaea32eJim Miller }; 237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 2388a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 2398a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 2408a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren return MetricsLogger.CHOOSE_LOCK_PATTERN; 2418a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 2428a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 24517e9e1933055b207473b488595b2887bfcaea32eJim Miller * The states of the left footer button. 246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 24717e9e1933055b207473b488595b2887bfcaea32eJim Miller enum LeftButtonMode { 24817e9e1933055b207473b488595b2887bfcaea32eJim Miller Cancel(R.string.cancel, true), 24917e9e1933055b207473b488595b2887bfcaea32eJim Miller CancelDisabled(R.string.cancel, false), 25017e9e1933055b207473b488595b2887bfcaea32eJim Miller Retry(R.string.lockpattern_retry_button_text, true), 25117e9e1933055b207473b488595b2887bfcaea32eJim Miller RetryDisabled(R.string.lockpattern_retry_button_text, false), 25217e9e1933055b207473b488595b2887bfcaea32eJim Miller Gone(ID_EMPTY_MESSAGE, false); 25317e9e1933055b207473b488595b2887bfcaea32eJim Miller 25417e9e1933055b207473b488595b2887bfcaea32eJim Miller 25517e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 25617e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param text The displayed text for this mode. 25717e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param enabled Whether the button should be enabled. 25817e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 25917e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode(int text, boolean enabled) { 26017e9e1933055b207473b488595b2887bfcaea32eJim Miller this.text = text; 26117e9e1933055b207473b488595b2887bfcaea32eJim Miller this.enabled = enabled; 26217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 26417e9e1933055b207473b488595b2887bfcaea32eJim Miller final int text; 26517e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean enabled; 26617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 26917e9e1933055b207473b488595b2887bfcaea32eJim Miller * The states of the right button. 270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 27117e9e1933055b207473b488595b2887bfcaea32eJim Miller enum RightButtonMode { 27217e9e1933055b207473b488595b2887bfcaea32eJim Miller Continue(R.string.lockpattern_continue_button_text, true), 27317e9e1933055b207473b488595b2887bfcaea32eJim Miller ContinueDisabled(R.string.lockpattern_continue_button_text, false), 27417e9e1933055b207473b488595b2887bfcaea32eJim Miller Confirm(R.string.lockpattern_confirm_button_text, true), 27517e9e1933055b207473b488595b2887bfcaea32eJim Miller ConfirmDisabled(R.string.lockpattern_confirm_button_text, false), 27617e9e1933055b207473b488595b2887bfcaea32eJim Miller Ok(android.R.string.ok, true); 27717e9e1933055b207473b488595b2887bfcaea32eJim Miller 27817e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 27917e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param text The displayed text for this mode. 28017e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param enabled Whether the button should be enabled. 28117e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 28217e9e1933055b207473b488595b2887bfcaea32eJim Miller RightButtonMode(int text, boolean enabled) { 28317e9e1933055b207473b488595b2887bfcaea32eJim Miller this.text = text; 28417e9e1933055b207473b488595b2887bfcaea32eJim Miller this.enabled = enabled; 28517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 28717e9e1933055b207473b488595b2887bfcaea32eJim Miller final int text; 28817e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean enabled; 28917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 29217e9e1933055b207473b488595b2887bfcaea32eJim Miller * Keep track internally of where the user is in choosing a pattern. 293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 29417e9e1933055b207473b488595b2887bfcaea32eJim Miller protected enum Stage { 29517e9e1933055b207473b488595b2887bfcaea32eJim Miller 29617e9e1933055b207473b488595b2887bfcaea32eJim Miller Introduction( 29717e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_recording_intro_header, 29817e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Cancel, RightButtonMode.ContinueDisabled, 29963cf89a49a751c49bf60b9898e7d59f02b91c046Jim Miller ID_EMPTY_MESSAGE, true), 30017e9e1933055b207473b488595b2887bfcaea32eJim Miller HelpScreen( 30117e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_settings_help_how_to_record, 30217e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Gone, RightButtonMode.Ok, ID_EMPTY_MESSAGE, false), 30317e9e1933055b207473b488595b2887bfcaea32eJim Miller ChoiceTooShort( 30417e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_recording_incorrect_too_short, 30517e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Retry, RightButtonMode.ContinueDisabled, 30617e9e1933055b207473b488595b2887bfcaea32eJim Miller ID_EMPTY_MESSAGE, true), 30717e9e1933055b207473b488595b2887bfcaea32eJim Miller FirstChoiceValid( 30817e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_pattern_entered_header, 30917e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Retry, RightButtonMode.Continue, ID_EMPTY_MESSAGE, false), 31017e9e1933055b207473b488595b2887bfcaea32eJim Miller NeedToConfirm( 31117e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_need_to_confirm, 31277cb854d689cd5c49e14f80abb7803d77ced2e79Jim Miller LeftButtonMode.Cancel, RightButtonMode.ConfirmDisabled, 31317e9e1933055b207473b488595b2887bfcaea32eJim Miller ID_EMPTY_MESSAGE, true), 31417e9e1933055b207473b488595b2887bfcaea32eJim Miller ConfirmWrong( 31517e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_need_to_unlock_wrong, 31617e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Cancel, RightButtonMode.ConfirmDisabled, 31717e9e1933055b207473b488595b2887bfcaea32eJim Miller ID_EMPTY_MESSAGE, true), 31817e9e1933055b207473b488595b2887bfcaea32eJim Miller ChoiceConfirmed( 31917e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_pattern_confirmed_header, 32017e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Cancel, RightButtonMode.Confirm, ID_EMPTY_MESSAGE, false); 32117e9e1933055b207473b488595b2887bfcaea32eJim Miller 32217e9e1933055b207473b488595b2887bfcaea32eJim Miller 32317e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 32417e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param headerMessage The message displayed at the top. 32517e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param leftMode The mode of the left button. 32617e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param rightMode The mode of the right button. 32717e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param footerMessage The footer message. 32817e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param patternEnabled Whether the pattern widget is enabled. 32917e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 33017e9e1933055b207473b488595b2887bfcaea32eJim Miller Stage(int headerMessage, 33117e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode leftMode, 33217e9e1933055b207473b488595b2887bfcaea32eJim Miller RightButtonMode rightMode, 33317e9e1933055b207473b488595b2887bfcaea32eJim Miller int footerMessage, boolean patternEnabled) { 33417e9e1933055b207473b488595b2887bfcaea32eJim Miller this.headerMessage = headerMessage; 33517e9e1933055b207473b488595b2887bfcaea32eJim Miller this.leftMode = leftMode; 33617e9e1933055b207473b488595b2887bfcaea32eJim Miller this.rightMode = rightMode; 33717e9e1933055b207473b488595b2887bfcaea32eJim Miller this.footerMessage = footerMessage; 33817e9e1933055b207473b488595b2887bfcaea32eJim Miller this.patternEnabled = patternEnabled; 33917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 34017e9e1933055b207473b488595b2887bfcaea32eJim Miller 34117e9e1933055b207473b488595b2887bfcaea32eJim Miller final int headerMessage; 34217e9e1933055b207473b488595b2887bfcaea32eJim Miller final LeftButtonMode leftMode; 34317e9e1933055b207473b488595b2887bfcaea32eJim Miller final RightButtonMode rightMode; 34417e9e1933055b207473b488595b2887bfcaea32eJim Miller final int footerMessage; 34517e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean patternEnabled; 346afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 34817e9e1933055b207473b488595b2887bfcaea32eJim Miller private Stage mUiStage = Stage.Introduction; 349afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 35017e9e1933055b207473b488595b2887bfcaea32eJim Miller private Runnable mClearPatternRunnable = new Runnable() { 35117e9e1933055b207473b488595b2887bfcaea32eJim Miller public void run() { 35217e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.clearPattern(); 35317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 35417e9e1933055b207473b488595b2887bfcaea32eJim Miller }; 355afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 35617e9e1933055b207473b488595b2887bfcaea32eJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 357bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia private AsyncTask<?, ?, ?> mPendingLockCheck; 358afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 35917e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UI_STAGE = "uiStage"; 36017e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_PATTERN_CHOICE = "chosenPattern"; 361a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales private static final String KEY_CURRENT_PATTERN = "currentPattern"; 36200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 36317e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 36417e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 36517e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 36617e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity()); 36766026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani if (!(getActivity() instanceof ChooseLockPattern)) { 36866026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani throw new SecurityException("Fragment contained in wrong activity"); 36966026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani } 37017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 37217e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 37317e9e1933055b207473b488595b2887bfcaea32eJim Miller public View onCreateView(LayoutInflater inflater, ViewGroup container, 37417e9e1933055b207473b488595b2887bfcaea32eJim Miller Bundle savedInstanceState) { 3756b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam return inflater.inflate(R.layout.choose_lock_pattern, container, false); 3766b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam } 37717e9e1933055b207473b488595b2887bfcaea32eJim Miller 3786b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam @Override 3796b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam public void onViewCreated(View view, Bundle savedInstanceState) { 3806b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam super.onViewCreated(view, savedInstanceState); 38117e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText = (TextView) view.findViewById(R.id.headerText); 38217e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView = (LockPatternView) view.findViewById(R.id.lockPattern); 38317e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setOnPatternListener(mChooseNewLockPatternListener); 38417e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setTactileFeedbackEnabled( 38517e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.utils().isTactileFeedbackEnabled()); 38617e9e1933055b207473b488595b2887bfcaea32eJim Miller 38717e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterText = (TextView) view.findViewById(R.id.footerText); 38817e9e1933055b207473b488595b2887bfcaea32eJim Miller 38917e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton = (TextView) view.findViewById(R.id.footerLeftButton); 39017e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterRightButton = (TextView) view.findViewById(R.id.footerRightButton); 39117e9e1933055b207473b488595b2887bfcaea32eJim Miller 39217e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setOnClickListener(this); 39317e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterRightButton.setOnClickListener(this); 39417e9e1933055b207473b488595b2887bfcaea32eJim Miller 39517e9e1933055b207473b488595b2887bfcaea32eJim Miller // make it so unhandled touch events within the unlock screen go to the 39617e9e1933055b207473b488595b2887bfcaea32eJim Miller // lock pattern view. 39717e9e1933055b207473b488595b2887bfcaea32eJim Miller final LinearLayoutWithDefaultTouchRecepient topLayout 39817e9e1933055b207473b488595b2887bfcaea32eJim Miller = (LinearLayoutWithDefaultTouchRecepient) view.findViewById( 39917e9e1933055b207473b488595b2887bfcaea32eJim Miller R.id.topLayout); 40017e9e1933055b207473b488595b2887bfcaea32eJim Miller topLayout.setDefaultTouchRecepient(mLockPatternView); 40117e9e1933055b207473b488595b2887bfcaea32eJim Miller 40217e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean confirmCredentials = getActivity().getIntent() 40366026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani .getBooleanExtra("confirm_credentials", true); 4046609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales Intent intent = getActivity().getIntent(); 4056609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales mCurrentPattern = intent.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); 4066609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales mHasChallenge = intent.getBooleanExtra( 4076609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false); 4086609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales mChallenge = intent.getLongExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0); 40917e9e1933055b207473b488595b2887bfcaea32eJim Miller 41017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (savedInstanceState == null) { 41117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (confirmCredentials) { 41217e9e1933055b207473b488595b2887bfcaea32eJim Miller // first launch. As a security measure, we're in NeedToConfirm mode until we 41317e9e1933055b207473b488595b2887bfcaea32eJim Miller // know there isn't an existing password or the user confirms their password. 41417e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.NeedToConfirm); 41517e9e1933055b207473b488595b2887bfcaea32eJim Miller boolean launchedConfirmationActivity = 41617e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.launchConfirmationActivity( 4178a09b619aeb233e2aab1919301f162d8acf1f0f0Jorim Jaggi CONFIRM_EXISTING_REQUEST, 418a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales getString(R.string.unlock_set_unlock_launch_picker_title), true); 41917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!launchedConfirmationActivity) { 42017e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 42117e9e1933055b207473b488595b2887bfcaea32eJim Miller } 42217e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 423bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller updateStage(Stage.Introduction); 424bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 425bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } else { 42617e9e1933055b207473b488595b2887bfcaea32eJim Miller // restore from previous state 42717e9e1933055b207473b488595b2887bfcaea32eJim Miller final String patternString = savedInstanceState.getString(KEY_PATTERN_CHOICE); 42817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (patternString != null) { 42917e9e1933055b207473b488595b2887bfcaea32eJim Miller mChosenPattern = LockPatternUtils.stringToPattern(patternString); 43017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 431a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 432a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales if (mCurrentPattern == null) { 433a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales mCurrentPattern = savedInstanceState.getString(KEY_CURRENT_PATTERN); 434a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales } 43517e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.values()[savedInstanceState.getInt(KEY_UI_STAGE)]); 436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 439bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia @Override 440bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia public void onResume() { 441bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia super.onResume(); 442bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia mLockPatternView.enableInput(); 443bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia } 444bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia 445bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia @Override 446bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia public void onPause() { 447bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia super.onPause(); 448bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia if (mPendingLockCheck != null) { 449bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia mPendingLockCheck.cancel(false); 450bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia mPendingLockCheck = null; 451bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia } 452bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia } 453bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia 454ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam protected Intent getRedactionInterstitialIntent(Context context) { 455ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam return RedactionInterstitial.createStartIntent(context); 456ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam } 457ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam 458af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam public void handleLeftButton() { 459af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam if (mUiStage.leftMode == LeftButtonMode.Retry) { 460af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam mChosenPattern = null; 461af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam mLockPatternView.clearPattern(); 462af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam updateStage(Stage.Introduction); 463af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } else if (mUiStage.leftMode == LeftButtonMode.Cancel) { 464af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam getActivity().finish(); 465af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } else { 466af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam throw new IllegalStateException("left footer button pressed, but stage of " + 46717e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage + " doesn't make sense"); 468af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 469af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 47017e9e1933055b207473b488595b2887bfcaea32eJim Miller 471af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam public void handleRightButton() { 472af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam if (mUiStage.rightMode == RightButtonMode.Continue) { 473af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam if (mUiStage != Stage.FirstChoiceValid) { 474af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam throw new IllegalStateException("expected ui stage " 475af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam + Stage.FirstChoiceValid + " when button is " 476af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam + RightButtonMode.Continue); 477af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 478af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam updateStage(Stage.NeedToConfirm); 479af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } else if (mUiStage.rightMode == RightButtonMode.Confirm) { 480af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam if (mUiStage != Stage.ChoiceConfirmed) { 481af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam throw new IllegalStateException("expected ui stage " + Stage.ChoiceConfirmed 482af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam + " when button is " + RightButtonMode.Confirm); 483af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 484cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence new SaveChosenPatternAndFinish().execute(); 485af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } else if (mUiStage.rightMode == RightButtonMode.Ok) { 486af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam if (mUiStage != Stage.HelpScreen) { 487af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam throw new IllegalStateException("Help screen is only mode with ok button, " 488af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam + "but stage is " + mUiStage); 489afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 490af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam mLockPatternView.clearPattern(); 491af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam mLockPatternView.setDisplayMode(DisplayMode.Correct); 492af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam updateStage(Stage.Introduction); 493af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 494af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 495af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam 496af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam public void onClick(View v) { 497af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam if (v == mFooterLeftButton) { 498af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam handleLeftButton(); 499af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } else if (v == mFooterRightButton) { 500af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam handleRightButton(); 501afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 502afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 503afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 50417e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onKeyDown(int keyCode, KeyEvent event) { 50517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 50617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage == Stage.HelpScreen) { 50717e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 50817e9e1933055b207473b488595b2887bfcaea32eJim Miller return true; 50917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 51017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 51117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (keyCode == KeyEvent.KEYCODE_MENU && mUiStage == Stage.Introduction) { 51217e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.HelpScreen); 513afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 514afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 51517e9e1933055b207473b488595b2887bfcaea32eJim Miller return false; 516afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 517afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 51817e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onSaveInstanceState(Bundle outState) { 51917e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onSaveInstanceState(outState); 520afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 52117e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putInt(KEY_UI_STAGE, mUiStage.ordinal()); 52217e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mChosenPattern != null) { 52317e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putString(KEY_PATTERN_CHOICE, 52417e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternUtils.patternToString(mChosenPattern)); 52517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 526a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 527a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales if (mCurrentPattern != null) { 528a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales outState.putString(KEY_CURRENT_PATTERN, 529a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales mCurrentPattern); 530a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales } 531afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 532afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 53317e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 53417e9e1933055b207473b488595b2887bfcaea32eJim Miller * Updates the messages and buttons appropriate to what stage the user 53517e9e1933055b207473b488595b2887bfcaea32eJim Miller * is at in choosing a view. This doesn't handle clearing out the pattern; 53617e9e1933055b207473b488595b2887bfcaea32eJim Miller * the pattern is expected to be in the right state. 53717e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param stage 53817e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 53917e9e1933055b207473b488595b2887bfcaea32eJim Miller protected void updateStage(Stage stage) { 540eef72c39ae83697b1beaa148ec56aced67382fecalanv final Stage previousStage = mUiStage; 541afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 54217e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage = stage; 543afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 54417e9e1933055b207473b488595b2887bfcaea32eJim Miller // header text, footer text, visibility and 54517e9e1933055b207473b488595b2887bfcaea32eJim Miller // enabled state all known from the stage 54617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (stage == Stage.ChoiceTooShort) { 54717e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText( 54817e9e1933055b207473b488595b2887bfcaea32eJim Miller getResources().getString( 54917e9e1933055b207473b488595b2887bfcaea32eJim Miller stage.headerMessage, 55017e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternUtils.MIN_LOCK_PATTERN_SIZE)); 55117e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 55217e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(stage.headerMessage); 55317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 55417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (stage.footerMessage == ID_EMPTY_MESSAGE) { 55517e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterText.setText(""); 55617e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 55717e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterText.setText(stage.footerMessage); 55817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 559afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 56017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (stage.leftMode == LeftButtonMode.Gone) { 56117e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setVisibility(View.GONE); 56217e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 56317e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setVisibility(View.VISIBLE); 56417e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setText(stage.leftMode.text); 56517e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setEnabled(stage.leftMode.enabled); 56617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 567afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 568af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam setRightButtonText(stage.rightMode.text); 569af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam setRightButtonEnabled(stage.rightMode.enabled); 570afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 57117e9e1933055b207473b488595b2887bfcaea32eJim Miller // same for whether the patten is enabled 57217e9e1933055b207473b488595b2887bfcaea32eJim Miller if (stage.patternEnabled) { 57317e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.enableInput(); 57417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 57517e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.disableInput(); 57617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 577afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 57817e9e1933055b207473b488595b2887bfcaea32eJim Miller // the rest of the stuff varies enough that it is easier just to handle 57917e9e1933055b207473b488595b2887bfcaea32eJim Miller // on a case by case basis. 58017e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setDisplayMode(DisplayMode.Correct); 58100da4f6d3b7cd2aa347b88e3f15b3b6ddd3e5803Selim Cinek boolean announceAlways = false; 58217e9e1933055b207473b488595b2887bfcaea32eJim Miller 58317e9e1933055b207473b488595b2887bfcaea32eJim Miller switch (mUiStage) { 58417e9e1933055b207473b488595b2887bfcaea32eJim Miller case Introduction: 58517e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.clearPattern(); 58617e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 58717e9e1933055b207473b488595b2887bfcaea32eJim Miller case HelpScreen: 58817e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setPattern(DisplayMode.Animate, mAnimatePattern); 58917e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 59017e9e1933055b207473b488595b2887bfcaea32eJim Miller case ChoiceTooShort: 59117e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setDisplayMode(DisplayMode.Wrong); 59217e9e1933055b207473b488595b2887bfcaea32eJim Miller postClearPatternRunnable(); 59300da4f6d3b7cd2aa347b88e3f15b3b6ddd3e5803Selim Cinek announceAlways = true; 59417e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 59517e9e1933055b207473b488595b2887bfcaea32eJim Miller case FirstChoiceValid: 59617e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 59717e9e1933055b207473b488595b2887bfcaea32eJim Miller case NeedToConfirm: 59817e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.clearPattern(); 59917e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 60017e9e1933055b207473b488595b2887bfcaea32eJim Miller case ConfirmWrong: 60117e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setDisplayMode(DisplayMode.Wrong); 60217e9e1933055b207473b488595b2887bfcaea32eJim Miller postClearPatternRunnable(); 60300da4f6d3b7cd2aa347b88e3f15b3b6ddd3e5803Selim Cinek announceAlways = true; 60417e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 60517e9e1933055b207473b488595b2887bfcaea32eJim Miller case ChoiceConfirmed: 60617e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 60717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 608eef72c39ae83697b1beaa148ec56aced67382fecalanv 609eef72c39ae83697b1beaa148ec56aced67382fecalanv // If the stage changed, announce the header for accessibility. This 610eef72c39ae83697b1beaa148ec56aced67382fecalanv // is a no-op when accessibility is disabled. 61100da4f6d3b7cd2aa347b88e3f15b3b6ddd3e5803Selim Cinek if (previousStage != stage || announceAlways) { 612eef72c39ae83697b1beaa148ec56aced67382fecalanv mHeaderText.announceForAccessibility(mHeaderText.getText()); 613eef72c39ae83697b1beaa148ec56aced67382fecalanv } 614afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 615afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 616afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 61717e9e1933055b207473b488595b2887bfcaea32eJim Miller // clear the wrong pattern unless they have started a new one 61817e9e1933055b207473b488595b2887bfcaea32eJim Miller // already 61917e9e1933055b207473b488595b2887bfcaea32eJim Miller private void postClearPatternRunnable() { 62017e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.removeCallbacks(mClearPatternRunnable); 62117e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.postDelayed(mClearPatternRunnable, WRONG_PATTERN_CLEAR_TIMEOUT_MS); 62217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 623afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 624cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence private class SaveChosenPatternAndFinish extends AsyncTask<Void,Void,Void> { 625cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence boolean mLockVirgin; 626cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence LockPatternUtils mUtils; 627cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence boolean mWasSecureBefore; 628e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project 629cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence @Override 630cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence protected void onPreExecute(){ 631cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence setRightButtonEnabled(false); 632cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence mUtils = mChooseLockSettingsHelper.utils(); 633cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence mLockVirgin = !mUtils.isPatternEverChosen(UserHandle.myUserId()); 63490d6c568cf24178669254964af343f729639b31dAdrian Roos 635cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence mWasSecureBefore = mUtils.isSecure(UserHandle.myUserId()); 636cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence 637cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence final boolean required = getActivity().getIntent().getBooleanExtra( 6380698a216311acd9ab52224602d1a75c08bf89f04Jim Miller EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); 639a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 640cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence mUtils.setCredentialRequiredToDecrypt(required); 641cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence } 642e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project 643cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence @Override 644cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence protected Void doInBackground(Void... params){ 645cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence mUtils.saveLockPattern(mChosenPattern, mCurrentPattern, UserHandle.myUserId()); 646cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence return null; 64717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 64800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 649cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence @Override 650cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence protected void onPostExecute(Void param) { 651cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence if (mLockVirgin) { 652cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence mUtils.setVisiblePatternEnabled(true, UserHandle.myUserId()); 653cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence } 654cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence 655cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence if (mHasChallenge) { 656cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence startVerifyPattern(mUtils, mWasSecureBefore); 657cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence } else { 658cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence if (!mWasSecureBefore) { 659cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence Intent intent = getRedactionInterstitialIntent(getActivity()); 660cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence if (intent != null) { 661cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence startActivity(intent); 662cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence } 663ccade402782d9b39331ada3859aa00893132e5c9Alex Chau } 664cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence getActivity().setResult(RESULT_FINISHED); 665cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence doFinish(); 66658c5fb38c75cf04309f74927b3c91c54a645b690Jorim Jaggi } 6676609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales } 668bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia } 669bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia 67058c5fb38c75cf04309f74927b3c91c54a645b690Jorim Jaggi private void startVerifyPattern(LockPatternUtils utils, final boolean wasSecureBefore) { 671bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia mLockPatternView.disableInput(); 672bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia if (mPendingLockCheck != null) { 673bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia mPendingLockCheck.cancel(false); 674bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia } 675bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia 676bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia mPendingLockCheck = LockPatternChecker.verifyPattern( 677bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia utils, 678bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia mChosenPattern, 679bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia mChallenge, 680bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia UserHandle.myUserId(), 681bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia new LockPatternChecker.OnVerifyCallback() { 682bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia @Override 68391e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales public void onVerified(byte[] token, int timeoutMs) { 68491e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales if (token == null) { 68591e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales Log.e(TAG, "critical: no token returned for known good pattern"); 68691e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales } 68791e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales 688bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia mLockPatternView.enableInput(); 689bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia mPendingLockCheck = null; 690bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia 69158c5fb38c75cf04309f74927b3c91c54a645b690Jorim Jaggi if (!wasSecureBefore) { 692ccade402782d9b39331ada3859aa00893132e5c9Alex Chau Intent intent = getRedactionInterstitialIntent(getActivity()); 693ccade402782d9b39331ada3859aa00893132e5c9Alex Chau if (intent != null) { 694ccade402782d9b39331ada3859aa00893132e5c9Alex Chau startActivity(intent); 695ccade402782d9b39331ada3859aa00893132e5c9Alex Chau } 69658c5fb38c75cf04309f74927b3c91c54a645b690Jorim Jaggi } 69758c5fb38c75cf04309f74927b3c91c54a645b690Jorim Jaggi 698bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia Intent intent = new Intent(); 699bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia intent.putExtra( 700bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token); 701bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia getActivity().setResult(RESULT_FINISHED, intent); 702bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia doFinish(); 703bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia } 704bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia }); 705bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia } 706bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia 707bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia private void doFinish() { 70847811fe057052df5ea20db06696d589965092b4bLucky Zhang getActivity().finish(); 70917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 710afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 711afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 712