ChooseLockPattern.java revision d189ac52a4e49291b729d817fc903116abc086d0
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 19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity; 2017e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.app.Fragment; 210698a216311acd9ab52224602d1a75c08bf89f04Jim Millerimport android.content.Context; 22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 2491e6c499ca8f33cc093fed4277d2b48ab780b309Andres Moralesimport android.util.Log; 25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.KeyEvent; 2617e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.view.LayoutInflater; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 2817e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.view.ViewGroup; 29d189ac52a4e49291b729d817fc903116abc086d0Maurice Lamimport android.widget.LinearLayout; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 329d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent; 3339b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient; 3439b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.internal.widget.LockPatternUtils; 3539b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.internal.widget.LockPatternUtils.RequestThrottledException; 3639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.internal.widget.LockPatternView; 3739b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.internal.widget.LockPatternView.Cell; 3839b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.internal.widget.LockPatternView.DisplayMode; 3939b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.settings.notification.RedactionInterstitial; 40d189ac52a4e49291b729d817fc903116abc086d0Maurice Lamimport com.android.setupwizardlib.GlifLayout; 4139b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.google.android.collect.Lists; 4239b467482d1bf256a111c757e9b7621c6f523271Jason Monk 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Collections; 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * If the user has a lock pattern set already, makes them confirm the existing one. 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Then, prompts the user to choose a lock pattern: 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * - prompts for initial pattern 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * - asks for confirmation / restart 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * - saves chosen password when confirmed 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 55263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ChooseLockPattern extends SettingsActivity { 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Used by the choose lock pattern wizard to indicate the wizard is 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * finished, and each activity in the wizard should finish. 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * <p> 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Previously, each activity in the wizard would finish itself after 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * starting the next activity. However, this leads to broken 'Back' 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * behavior. So, now an activity does not finish itself until it gets this 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * result. 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project static final int RESULT_FINISHED = RESULT_FIRST_USER; 6600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 6791e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales private static final String TAG = "ChooseLockPattern"; 6891e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales 6917e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 7017e9e1933055b207473b488595b2887bfcaea32eJim Miller public Intent getIntent() { 7117e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent modIntent = new Intent(super.getIntent()); 726b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName()); 7317e9e1933055b207473b488595b2887bfcaea32eJim Miller return modIntent; 7417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 7500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 76f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos public static Intent createIntent(Context context, 77fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri boolean requirePassword, boolean confirmCredentials, int userId) { 780698a216311acd9ab52224602d1a75c08bf89f04Jim Miller Intent intent = new Intent(context, ChooseLockPattern.class); 790698a216311acd9ab52224602d1a75c08bf89f04Jim Miller intent.putExtra("key_lock_method", "pattern"); 800698a216311acd9ab52224602d1a75c08bf89f04Jim Miller intent.putExtra(ChooseLockGeneric.CONFIRM_CREDENTIALS, confirmCredentials); 810698a216311acd9ab52224602d1a75c08bf89f04Jim Miller intent.putExtra(EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, requirePassword); 826934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri intent.putExtra(Intent.EXTRA_USER_ID, userId); 830698a216311acd9ab52224602d1a75c08bf89f04Jim Miller return intent; 840698a216311acd9ab52224602d1a75c08bf89f04Jim Miller } 850698a216311acd9ab52224602d1a75c08bf89f04Jim Miller 86a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales public static Intent createIntent(Context context, 87fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri boolean requirePassword, String pattern, int userId) { 88fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri Intent intent = createIntent(context, requirePassword, false, userId); 89a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, pattern); 90a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales return intent; 91a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales } 92a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 936609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales public static Intent createIntent(Context context, 94fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri boolean requirePassword, long challenge, int userId) { 95fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri Intent intent = createIntent(context, requirePassword, false, userId); 966609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true); 976609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge); 986609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales return intent; 996609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales } 1006609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales 10117e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 102a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani protected boolean isValidFragment(String fragmentName) { 103a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani if (ChooseLockPatternFragment.class.getName().equals(fragmentName)) return true; 104a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani return false; 105a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani } 106a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani 1076b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam /* package */ Class<? extends Fragment> getFragmentClass() { 1086b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam return ChooseLockPatternFragment.class; 1096b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam } 1106b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam 111a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani @Override 11271fde52ae36f134e93835bee53bc4bfe5481bba0Udam Saini protected void onCreate(Bundle savedInstanceState) { 11317e9e1933055b207473b488595b2887bfcaea32eJim Miller // requestWindowFeature(Window.FEATURE_NO_TITLE); 11417e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 1158c74072e9cad7ae7cf7266f87b8f202aa42939ceJim Miller CharSequence msg = getText(R.string.lockpassword_choose_your_pattern_header); 116263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio setTitle(msg); 117d189ac52a4e49291b729d817fc903116abc086d0Maurice Lam LinearLayout layout = (LinearLayout) findViewById(R.id.content_parent); 118d189ac52a4e49291b729d817fc903116abc086d0Maurice Lam layout.setFitsSystemWindows(false); 11917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 12117e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 12217e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onKeyDown(int keyCode, KeyEvent event) { 12317e9e1933055b207473b488595b2887bfcaea32eJim Miller // *** TODO *** 12417e9e1933055b207473b488595b2887bfcaea32eJim Miller // chooseLockPatternFragment.onKeyDown(keyCode, event); 12517e9e1933055b207473b488595b2887bfcaea32eJim Miller return super.onKeyDown(keyCode, event); 12617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1288a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren public static class ChooseLockPatternFragment extends InstrumentedFragment 1293e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia implements View.OnClickListener, SaveAndFinishWorker.Listener { 130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 13117e9e1933055b207473b488595b2887bfcaea32eJim Miller public static final int CONFIRM_EXISTING_REQUEST = 55; 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 13317e9e1933055b207473b488595b2887bfcaea32eJim Miller // how long after a confirmation message is shown before moving on 13417e9e1933055b207473b488595b2887bfcaea32eJim Miller static final int INFORMATION_MSG_TIMEOUT_MS = 3000; 135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 13617e9e1933055b207473b488595b2887bfcaea32eJim Miller // how long we wait to clear a wrong pattern 13717e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 2000; 138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 13917e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int ID_EMPTY_MESSAGE = -1; 140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1413e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private static final String FRAGMENT_TAG_SAVE_AND_FINISH = "save_and_finish_worker"; 1423e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 143a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales private String mCurrentPattern; 1446609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales private boolean mHasChallenge; 1456609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales private long mChallenge; 14617e9e1933055b207473b488595b2887bfcaea32eJim Miller protected TextView mHeaderText; 14717e9e1933055b207473b488595b2887bfcaea32eJim Miller protected LockPatternView mLockPatternView; 14817e9e1933055b207473b488595b2887bfcaea32eJim Miller protected TextView mFooterText; 14917e9e1933055b207473b488595b2887bfcaea32eJim Miller private TextView mFooterLeftButton; 15017e9e1933055b207473b488595b2887bfcaea32eJim Miller private TextView mFooterRightButton; 15117e9e1933055b207473b488595b2887bfcaea32eJim Miller protected List<LockPatternView.Cell> mChosenPattern = null; 15292779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini private boolean mHideDrawer = false; 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 15417e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 15517e9e1933055b207473b488595b2887bfcaea32eJim Miller * The patten used during the help screen to show how to draw a pattern. 15617e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 15717e9e1933055b207473b488595b2887bfcaea32eJim Miller private final List<LockPatternView.Cell> mAnimatePattern = 15817e9e1933055b207473b488595b2887bfcaea32eJim Miller Collections.unmodifiableList(Lists.newArrayList( 15917e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternView.Cell.of(0, 0), 16017e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternView.Cell.of(0, 1), 16117e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternView.Cell.of(1, 1), 16217e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternView.Cell.of(2, 1) 16317e9e1933055b207473b488595b2887bfcaea32eJim Miller )); 16417e9e1933055b207473b488595b2887bfcaea32eJim Miller 16517e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 16617e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onActivityResult(int requestCode, int resultCode, 16717e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent data) { 16817e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onActivityResult(requestCode, resultCode, data); 16917e9e1933055b207473b488595b2887bfcaea32eJim Miller switch (requestCode) { 17017e9e1933055b207473b488595b2887bfcaea32eJim Miller case CONFIRM_EXISTING_REQUEST: 17117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (resultCode != Activity.RESULT_OK) { 17217e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(RESULT_FINISHED); 17317e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 174a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales } else { 175a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales mCurrentPattern = data.getStringExtra( 176a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); 17717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 178a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 17917e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 18017e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 18217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 184af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam protected void setRightButtonEnabled(boolean enabled) { 185af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam mFooterRightButton.setEnabled(enabled); 186af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 187af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam 188af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam protected void setRightButtonText(int text) { 189af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam mFooterRightButton.setText(text); 190af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 191af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam 19217e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 19317e9e1933055b207473b488595b2887bfcaea32eJim Miller * The pattern listener that responds according to a user choosing a new 19417e9e1933055b207473b488595b2887bfcaea32eJim Miller * lock pattern. 19517e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 19617e9e1933055b207473b488595b2887bfcaea32eJim Miller protected LockPatternView.OnPatternListener mChooseNewLockPatternListener = 19717e9e1933055b207473b488595b2887bfcaea32eJim Miller new LockPatternView.OnPatternListener() { 19817e9e1933055b207473b488595b2887bfcaea32eJim Miller 19917e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPatternStart() { 20017e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.removeCallbacks(mClearPatternRunnable); 20117e9e1933055b207473b488595b2887bfcaea32eJim Miller patternInProgress(); 202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 20417e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPatternCleared() { 20517e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.removeCallbacks(mClearPatternRunnable); 20617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 20756544d0e9198ab21dabec621cdf419b52b412dacJim Miller 20817e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPatternDetected(List<LockPatternView.Cell> pattern) { 20917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage == Stage.NeedToConfirm || mUiStage == Stage.ConfirmWrong) { 21017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mChosenPattern == null) throw new IllegalStateException( 21117e9e1933055b207473b488595b2887bfcaea32eJim Miller "null chosen pattern in stage 'need to confirm"); 21217e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mChosenPattern.equals(pattern)) { 21317e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.ChoiceConfirmed); 21417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 21517e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.ConfirmWrong); 21617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 21717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (mUiStage == Stage.Introduction || mUiStage == Stage.ChoiceTooShort){ 21817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (pattern.size() < LockPatternUtils.MIN_LOCK_PATTERN_SIZE) { 21917e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.ChoiceTooShort); 22017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 22117e9e1933055b207473b488595b2887bfcaea32eJim Miller mChosenPattern = new ArrayList<LockPatternView.Cell>(pattern); 22217e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.FirstChoiceValid); 22317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 22417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 22517e9e1933055b207473b488595b2887bfcaea32eJim Miller throw new IllegalStateException("Unexpected stage " + mUiStage + " when " 22617e9e1933055b207473b488595b2887bfcaea32eJim Miller + "entering the pattern."); 22717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 22817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 22956544d0e9198ab21dabec621cdf419b52b412dacJim Miller 23017e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPatternCellAdded(List<Cell> pattern) { 231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 23217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 23417e9e1933055b207473b488595b2887bfcaea32eJim Miller private void patternInProgress() { 23517e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(R.string.lockpattern_recording_inprogress); 23617e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterText.setText(""); 23717e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setEnabled(false); 23817e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterRightButton.setEnabled(false); 23917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 24017e9e1933055b207473b488595b2887bfcaea32eJim Miller }; 241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 2428a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 2438a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 2449d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren return MetricsEvent.CHOOSE_LOCK_PATTERN; 2458a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 2468a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 24917e9e1933055b207473b488595b2887bfcaea32eJim Miller * The states of the left footer button. 250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 25117e9e1933055b207473b488595b2887bfcaea32eJim Miller enum LeftButtonMode { 25217e9e1933055b207473b488595b2887bfcaea32eJim Miller Cancel(R.string.cancel, true), 25317e9e1933055b207473b488595b2887bfcaea32eJim Miller CancelDisabled(R.string.cancel, false), 25417e9e1933055b207473b488595b2887bfcaea32eJim Miller Retry(R.string.lockpattern_retry_button_text, true), 25517e9e1933055b207473b488595b2887bfcaea32eJim Miller RetryDisabled(R.string.lockpattern_retry_button_text, false), 25617e9e1933055b207473b488595b2887bfcaea32eJim Miller Gone(ID_EMPTY_MESSAGE, false); 25717e9e1933055b207473b488595b2887bfcaea32eJim Miller 25817e9e1933055b207473b488595b2887bfcaea32eJim Miller 25917e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 26017e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param text The displayed text for this mode. 26117e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param enabled Whether the button should be enabled. 26217e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 26317e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode(int text, boolean enabled) { 26417e9e1933055b207473b488595b2887bfcaea32eJim Miller this.text = text; 26517e9e1933055b207473b488595b2887bfcaea32eJim Miller this.enabled = enabled; 26617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 26817e9e1933055b207473b488595b2887bfcaea32eJim Miller final int text; 26917e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean enabled; 27017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 27317e9e1933055b207473b488595b2887bfcaea32eJim Miller * The states of the right button. 274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 27517e9e1933055b207473b488595b2887bfcaea32eJim Miller enum RightButtonMode { 27617e9e1933055b207473b488595b2887bfcaea32eJim Miller Continue(R.string.lockpattern_continue_button_text, true), 27717e9e1933055b207473b488595b2887bfcaea32eJim Miller ContinueDisabled(R.string.lockpattern_continue_button_text, false), 27817e9e1933055b207473b488595b2887bfcaea32eJim Miller Confirm(R.string.lockpattern_confirm_button_text, true), 27917e9e1933055b207473b488595b2887bfcaea32eJim Miller ConfirmDisabled(R.string.lockpattern_confirm_button_text, false), 28017e9e1933055b207473b488595b2887bfcaea32eJim Miller Ok(android.R.string.ok, true); 28117e9e1933055b207473b488595b2887bfcaea32eJim Miller 28217e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 28317e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param text The displayed text for this mode. 28417e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param enabled Whether the button should be enabled. 28517e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 28617e9e1933055b207473b488595b2887bfcaea32eJim Miller RightButtonMode(int text, boolean enabled) { 28717e9e1933055b207473b488595b2887bfcaea32eJim Miller this.text = text; 28817e9e1933055b207473b488595b2887bfcaea32eJim Miller this.enabled = enabled; 28917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 29117e9e1933055b207473b488595b2887bfcaea32eJim Miller final int text; 29217e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean enabled; 29317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 29617e9e1933055b207473b488595b2887bfcaea32eJim Miller * Keep track internally of where the user is in choosing a pattern. 297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 29817e9e1933055b207473b488595b2887bfcaea32eJim Miller protected enum Stage { 29917e9e1933055b207473b488595b2887bfcaea32eJim Miller 30017e9e1933055b207473b488595b2887bfcaea32eJim Miller Introduction( 30117e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_recording_intro_header, 30217e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Cancel, RightButtonMode.ContinueDisabled, 30363cf89a49a751c49bf60b9898e7d59f02b91c046Jim Miller ID_EMPTY_MESSAGE, true), 30417e9e1933055b207473b488595b2887bfcaea32eJim Miller HelpScreen( 30517e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_settings_help_how_to_record, 30617e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Gone, RightButtonMode.Ok, ID_EMPTY_MESSAGE, false), 30717e9e1933055b207473b488595b2887bfcaea32eJim Miller ChoiceTooShort( 30817e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_recording_incorrect_too_short, 30917e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Retry, RightButtonMode.ContinueDisabled, 31017e9e1933055b207473b488595b2887bfcaea32eJim Miller ID_EMPTY_MESSAGE, true), 31117e9e1933055b207473b488595b2887bfcaea32eJim Miller FirstChoiceValid( 31217e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_pattern_entered_header, 31317e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Retry, RightButtonMode.Continue, ID_EMPTY_MESSAGE, false), 31417e9e1933055b207473b488595b2887bfcaea32eJim Miller NeedToConfirm( 31517e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_need_to_confirm, 31677cb854d689cd5c49e14f80abb7803d77ced2e79Jim Miller LeftButtonMode.Cancel, RightButtonMode.ConfirmDisabled, 31717e9e1933055b207473b488595b2887bfcaea32eJim Miller ID_EMPTY_MESSAGE, true), 31817e9e1933055b207473b488595b2887bfcaea32eJim Miller ConfirmWrong( 31917e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_need_to_unlock_wrong, 32017e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Cancel, RightButtonMode.ConfirmDisabled, 32117e9e1933055b207473b488595b2887bfcaea32eJim Miller ID_EMPTY_MESSAGE, true), 32217e9e1933055b207473b488595b2887bfcaea32eJim Miller ChoiceConfirmed( 32317e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_pattern_confirmed_header, 32417e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Cancel, RightButtonMode.Confirm, ID_EMPTY_MESSAGE, false); 32517e9e1933055b207473b488595b2887bfcaea32eJim Miller 32617e9e1933055b207473b488595b2887bfcaea32eJim Miller 32717e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 32817e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param headerMessage The message displayed at the top. 32917e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param leftMode The mode of the left button. 33017e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param rightMode The mode of the right button. 33117e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param footerMessage The footer message. 33217e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param patternEnabled Whether the pattern widget is enabled. 33317e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 33417e9e1933055b207473b488595b2887bfcaea32eJim Miller Stage(int headerMessage, 33517e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode leftMode, 33617e9e1933055b207473b488595b2887bfcaea32eJim Miller RightButtonMode rightMode, 33717e9e1933055b207473b488595b2887bfcaea32eJim Miller int footerMessage, boolean patternEnabled) { 33817e9e1933055b207473b488595b2887bfcaea32eJim Miller this.headerMessage = headerMessage; 33917e9e1933055b207473b488595b2887bfcaea32eJim Miller this.leftMode = leftMode; 34017e9e1933055b207473b488595b2887bfcaea32eJim Miller this.rightMode = rightMode; 34117e9e1933055b207473b488595b2887bfcaea32eJim Miller this.footerMessage = footerMessage; 34217e9e1933055b207473b488595b2887bfcaea32eJim Miller this.patternEnabled = patternEnabled; 34317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 34417e9e1933055b207473b488595b2887bfcaea32eJim Miller 34517e9e1933055b207473b488595b2887bfcaea32eJim Miller final int headerMessage; 34617e9e1933055b207473b488595b2887bfcaea32eJim Miller final LeftButtonMode leftMode; 34717e9e1933055b207473b488595b2887bfcaea32eJim Miller final RightButtonMode rightMode; 34817e9e1933055b207473b488595b2887bfcaea32eJim Miller final int footerMessage; 34917e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean patternEnabled; 350afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 35217e9e1933055b207473b488595b2887bfcaea32eJim Miller private Stage mUiStage = Stage.Introduction; 353afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 35417e9e1933055b207473b488595b2887bfcaea32eJim Miller private Runnable mClearPatternRunnable = new Runnable() { 35517e9e1933055b207473b488595b2887bfcaea32eJim Miller public void run() { 35617e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.clearPattern(); 35717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 35817e9e1933055b207473b488595b2887bfcaea32eJim Miller }; 359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 36017e9e1933055b207473b488595b2887bfcaea32eJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 3613e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private SaveAndFinishWorker mSaveAndFinishWorker; 362fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri private int mUserId; 363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 36417e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UI_STAGE = "uiStage"; 36517e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_PATTERN_CHOICE = "chosenPattern"; 366a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales private static final String KEY_CURRENT_PATTERN = "currentPattern"; 36700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 36817e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 36917e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 37017e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 37117e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity()); 37266026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani if (!(getActivity() instanceof ChooseLockPattern)) { 37366026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani throw new SecurityException("Fragment contained in wrong activity"); 37466026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani } 375fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri Intent intent = getActivity().getIntent(); 376fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri // Only take this argument into account if it belongs to the current profile. 377194300dff340d67255d12762ffb376b7ba201c87Benjamin Franz mUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras()); 37862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos 37962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos if (intent.getBooleanExtra( 38062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos ChooseLockSettingsHelper.EXTRA_KEY_FOR_CHANGE_CRED_REQUIRED_FOR_BOOT, false)) { 38162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos SaveAndFinishWorker w = new SaveAndFinishWorker(); 38262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos final boolean required = getActivity().getIntent().getBooleanExtra( 38362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); 38462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos String current = intent.getStringExtra( 38562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); 38662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos w.setBlocking(true); 38762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos w.setListener(this); 38862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos w.start(mChooseLockSettingsHelper.utils(), required, 38962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos false, 0, LockPatternUtils.stringToPattern(current), current, mUserId); 39062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos } 39192779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini mHideDrawer = getActivity().getIntent().getBooleanExtra(EXTRA_HIDE_DRAWER, false); 39217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 393afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 39417e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 39517e9e1933055b207473b488595b2887bfcaea32eJim Miller public View onCreateView(LayoutInflater inflater, ViewGroup container, 39617e9e1933055b207473b488595b2887bfcaea32eJim Miller Bundle savedInstanceState) { 397d189ac52a4e49291b729d817fc903116abc086d0Maurice Lam final GlifLayout layout = (GlifLayout) inflater.inflate( 398d189ac52a4e49291b729d817fc903116abc086d0Maurice Lam R.layout.choose_lock_pattern, container, false); 399d189ac52a4e49291b729d817fc903116abc086d0Maurice Lam layout.setHeaderText(getActivity().getTitle()); 400d189ac52a4e49291b729d817fc903116abc086d0Maurice Lam return layout; 4016b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam } 40217e9e1933055b207473b488595b2887bfcaea32eJim Miller 4036b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam @Override 4046b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam public void onViewCreated(View view, Bundle savedInstanceState) { 4056b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam super.onViewCreated(view, savedInstanceState); 40617e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText = (TextView) view.findViewById(R.id.headerText); 40717e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView = (LockPatternView) view.findViewById(R.id.lockPattern); 40817e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setOnPatternListener(mChooseNewLockPatternListener); 40917e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setTactileFeedbackEnabled( 41017e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.utils().isTactileFeedbackEnabled()); 41117e9e1933055b207473b488595b2887bfcaea32eJim Miller 41217e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterText = (TextView) view.findViewById(R.id.footerText); 41317e9e1933055b207473b488595b2887bfcaea32eJim Miller 41417e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton = (TextView) view.findViewById(R.id.footerLeftButton); 41517e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterRightButton = (TextView) view.findViewById(R.id.footerRightButton); 41617e9e1933055b207473b488595b2887bfcaea32eJim Miller 41717e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setOnClickListener(this); 41817e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterRightButton.setOnClickListener(this); 41917e9e1933055b207473b488595b2887bfcaea32eJim Miller 42017e9e1933055b207473b488595b2887bfcaea32eJim Miller // make it so unhandled touch events within the unlock screen go to the 42117e9e1933055b207473b488595b2887bfcaea32eJim Miller // lock pattern view. 42217e9e1933055b207473b488595b2887bfcaea32eJim Miller final LinearLayoutWithDefaultTouchRecepient topLayout 42317e9e1933055b207473b488595b2887bfcaea32eJim Miller = (LinearLayoutWithDefaultTouchRecepient) view.findViewById( 42417e9e1933055b207473b488595b2887bfcaea32eJim Miller R.id.topLayout); 42517e9e1933055b207473b488595b2887bfcaea32eJim Miller topLayout.setDefaultTouchRecepient(mLockPatternView); 42617e9e1933055b207473b488595b2887bfcaea32eJim Miller 42717e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean confirmCredentials = getActivity().getIntent() 42866026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani .getBooleanExtra("confirm_credentials", true); 4296609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales Intent intent = getActivity().getIntent(); 4306609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales mCurrentPattern = intent.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); 4316609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales mHasChallenge = intent.getBooleanExtra( 4326609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false); 4336609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales mChallenge = intent.getLongExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0); 43417e9e1933055b207473b488595b2887bfcaea32eJim Miller 43517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (savedInstanceState == null) { 43617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (confirmCredentials) { 43717e9e1933055b207473b488595b2887bfcaea32eJim Miller // first launch. As a security measure, we're in NeedToConfirm mode until we 43817e9e1933055b207473b488595b2887bfcaea32eJim Miller // know there isn't an existing password or the user confirms their password. 43917e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.NeedToConfirm); 44017e9e1933055b207473b488595b2887bfcaea32eJim Miller boolean launchedConfirmationActivity = 44117e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.launchConfirmationActivity( 4428a09b619aeb233e2aab1919301f162d8acf1f0f0Jorim Jaggi CONFIRM_EXISTING_REQUEST, 443fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri getString(R.string.unlock_set_unlock_launch_picker_title), true, 444fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mUserId); 44517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!launchedConfirmationActivity) { 44617e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 44717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 44817e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 449bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller updateStage(Stage.Introduction); 450bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 451bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } else { 45217e9e1933055b207473b488595b2887bfcaea32eJim Miller // restore from previous state 45317e9e1933055b207473b488595b2887bfcaea32eJim Miller final String patternString = savedInstanceState.getString(KEY_PATTERN_CHOICE); 45417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (patternString != null) { 45517e9e1933055b207473b488595b2887bfcaea32eJim Miller mChosenPattern = LockPatternUtils.stringToPattern(patternString); 45617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 457a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 458a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales if (mCurrentPattern == null) { 459a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales mCurrentPattern = savedInstanceState.getString(KEY_CURRENT_PATTERN); 460a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales } 46117e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.values()[savedInstanceState.getInt(KEY_UI_STAGE)]); 4623e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 4633e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia // Re-attach to the exiting worker if there is one. 4643e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mSaveAndFinishWorker = (SaveAndFinishWorker) getFragmentManager().findFragmentByTag( 4653e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia FRAGMENT_TAG_SAVE_AND_FINISH); 466afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 467afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 468afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 469bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia @Override 470bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia public void onResume() { 471bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia super.onResume(); 472e47a2ab83eac80ed6e46606668db21b178168da7Xiyuan Xia updateStage(mUiStage); 473e47a2ab83eac80ed6e46606668db21b178168da7Xiyuan Xia 4743e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mSaveAndFinishWorker != null) { 4753e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia setRightButtonEnabled(false); 4763e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mSaveAndFinishWorker.setListener(this); 4773e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 478bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia } 479bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia 480bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia @Override 481bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia public void onPause() { 482bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia super.onPause(); 4833e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mSaveAndFinishWorker != null) { 4843e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mSaveAndFinishWorker.setListener(null); 485bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia } 486bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia } 487bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia 488ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam protected Intent getRedactionInterstitialIntent(Context context) { 489f6077f4757183ae8b31af0928c895c806241b593Clara Bayarri return RedactionInterstitial.createStartIntent(context, mUserId); 490ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam } 491ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam 492af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam public void handleLeftButton() { 493af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam if (mUiStage.leftMode == LeftButtonMode.Retry) { 494af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam mChosenPattern = null; 495af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam mLockPatternView.clearPattern(); 496af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam updateStage(Stage.Introduction); 497af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } else if (mUiStage.leftMode == LeftButtonMode.Cancel) { 498af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam getActivity().finish(); 499af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } else { 500af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam throw new IllegalStateException("left footer button pressed, but stage of " + 50117e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage + " doesn't make sense"); 502af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 503af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 50417e9e1933055b207473b488595b2887bfcaea32eJim Miller 505af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam public void handleRightButton() { 506af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam if (mUiStage.rightMode == RightButtonMode.Continue) { 507af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam if (mUiStage != Stage.FirstChoiceValid) { 508af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam throw new IllegalStateException("expected ui stage " 509af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam + Stage.FirstChoiceValid + " when button is " 510af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam + RightButtonMode.Continue); 511af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 512af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam updateStage(Stage.NeedToConfirm); 513af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } else if (mUiStage.rightMode == RightButtonMode.Confirm) { 514af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam if (mUiStage != Stage.ChoiceConfirmed) { 515af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam throw new IllegalStateException("expected ui stage " + Stage.ChoiceConfirmed 516af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam + " when button is " + RightButtonMode.Confirm); 517af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 5183e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia startSaveAndFinish(); 519af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } else if (mUiStage.rightMode == RightButtonMode.Ok) { 520af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam if (mUiStage != Stage.HelpScreen) { 521af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam throw new IllegalStateException("Help screen is only mode with ok button, " 522af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam + "but stage is " + mUiStage); 523afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 524af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam mLockPatternView.clearPattern(); 525af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam mLockPatternView.setDisplayMode(DisplayMode.Correct); 526af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam updateStage(Stage.Introduction); 527af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 528af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 529af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam 530af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam public void onClick(View v) { 531af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam if (v == mFooterLeftButton) { 532af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam handleLeftButton(); 533af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } else if (v == mFooterRightButton) { 534af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam handleRightButton(); 535afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 536afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 537afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 53817e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onKeyDown(int keyCode, KeyEvent event) { 53917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 54017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage == Stage.HelpScreen) { 54117e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 54217e9e1933055b207473b488595b2887bfcaea32eJim Miller return true; 54317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 54417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 54517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (keyCode == KeyEvent.KEYCODE_MENU && mUiStage == Stage.Introduction) { 54617e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.HelpScreen); 547afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 548afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 54917e9e1933055b207473b488595b2887bfcaea32eJim Miller return false; 550afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 551afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 55217e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onSaveInstanceState(Bundle outState) { 55317e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onSaveInstanceState(outState); 554afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 55517e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putInt(KEY_UI_STAGE, mUiStage.ordinal()); 55617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mChosenPattern != null) { 55717e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putString(KEY_PATTERN_CHOICE, 55817e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternUtils.patternToString(mChosenPattern)); 55917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 560a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 561a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales if (mCurrentPattern != null) { 562a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales outState.putString(KEY_CURRENT_PATTERN, 563a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales mCurrentPattern); 564a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales } 565afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 566afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 56717e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 56817e9e1933055b207473b488595b2887bfcaea32eJim Miller * Updates the messages and buttons appropriate to what stage the user 56917e9e1933055b207473b488595b2887bfcaea32eJim Miller * is at in choosing a view. This doesn't handle clearing out the pattern; 57017e9e1933055b207473b488595b2887bfcaea32eJim Miller * the pattern is expected to be in the right state. 57117e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param stage 57217e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 57317e9e1933055b207473b488595b2887bfcaea32eJim Miller protected void updateStage(Stage stage) { 574eef72c39ae83697b1beaa148ec56aced67382fecalanv final Stage previousStage = mUiStage; 575afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 57617e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage = stage; 577afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 57817e9e1933055b207473b488595b2887bfcaea32eJim Miller // header text, footer text, visibility and 57917e9e1933055b207473b488595b2887bfcaea32eJim Miller // enabled state all known from the stage 58017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (stage == Stage.ChoiceTooShort) { 58117e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText( 58217e9e1933055b207473b488595b2887bfcaea32eJim Miller getResources().getString( 58317e9e1933055b207473b488595b2887bfcaea32eJim Miller stage.headerMessage, 58417e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternUtils.MIN_LOCK_PATTERN_SIZE)); 58517e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 58617e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(stage.headerMessage); 58717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 58817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (stage.footerMessage == ID_EMPTY_MESSAGE) { 58917e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterText.setText(""); 59017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 59117e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterText.setText(stage.footerMessage); 59217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 593afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 59417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (stage.leftMode == LeftButtonMode.Gone) { 59517e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setVisibility(View.GONE); 59617e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 59717e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setVisibility(View.VISIBLE); 59817e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setText(stage.leftMode.text); 59917e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setEnabled(stage.leftMode.enabled); 60017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 601afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 602af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam setRightButtonText(stage.rightMode.text); 603af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam setRightButtonEnabled(stage.rightMode.enabled); 604afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 6053e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia // same for whether the pattern is enabled 60617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (stage.patternEnabled) { 60717e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.enableInput(); 60817e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 60917e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.disableInput(); 61017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 611afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 61217e9e1933055b207473b488595b2887bfcaea32eJim Miller // the rest of the stuff varies enough that it is easier just to handle 61317e9e1933055b207473b488595b2887bfcaea32eJim Miller // on a case by case basis. 61417e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setDisplayMode(DisplayMode.Correct); 61500da4f6d3b7cd2aa347b88e3f15b3b6ddd3e5803Selim Cinek boolean announceAlways = false; 61617e9e1933055b207473b488595b2887bfcaea32eJim Miller 61717e9e1933055b207473b488595b2887bfcaea32eJim Miller switch (mUiStage) { 61817e9e1933055b207473b488595b2887bfcaea32eJim Miller case Introduction: 61917e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.clearPattern(); 62017e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 62117e9e1933055b207473b488595b2887bfcaea32eJim Miller case HelpScreen: 62217e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setPattern(DisplayMode.Animate, mAnimatePattern); 62317e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 62417e9e1933055b207473b488595b2887bfcaea32eJim Miller case ChoiceTooShort: 62517e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setDisplayMode(DisplayMode.Wrong); 62617e9e1933055b207473b488595b2887bfcaea32eJim Miller postClearPatternRunnable(); 62700da4f6d3b7cd2aa347b88e3f15b3b6ddd3e5803Selim Cinek announceAlways = true; 62817e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 62917e9e1933055b207473b488595b2887bfcaea32eJim Miller case FirstChoiceValid: 63017e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 63117e9e1933055b207473b488595b2887bfcaea32eJim Miller case NeedToConfirm: 63217e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.clearPattern(); 63317e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 63417e9e1933055b207473b488595b2887bfcaea32eJim Miller case ConfirmWrong: 63517e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setDisplayMode(DisplayMode.Wrong); 63617e9e1933055b207473b488595b2887bfcaea32eJim Miller postClearPatternRunnable(); 63700da4f6d3b7cd2aa347b88e3f15b3b6ddd3e5803Selim Cinek announceAlways = true; 63817e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 63917e9e1933055b207473b488595b2887bfcaea32eJim Miller case ChoiceConfirmed: 64017e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 64117e9e1933055b207473b488595b2887bfcaea32eJim Miller } 642eef72c39ae83697b1beaa148ec56aced67382fecalanv 643eef72c39ae83697b1beaa148ec56aced67382fecalanv // If the stage changed, announce the header for accessibility. This 644eef72c39ae83697b1beaa148ec56aced67382fecalanv // is a no-op when accessibility is disabled. 64500da4f6d3b7cd2aa347b88e3f15b3b6ddd3e5803Selim Cinek if (previousStage != stage || announceAlways) { 646eef72c39ae83697b1beaa148ec56aced67382fecalanv mHeaderText.announceForAccessibility(mHeaderText.getText()); 647eef72c39ae83697b1beaa148ec56aced67382fecalanv } 648afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 649afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 65017e9e1933055b207473b488595b2887bfcaea32eJim Miller // clear the wrong pattern unless they have started a new one 65117e9e1933055b207473b488595b2887bfcaea32eJim Miller // already 65217e9e1933055b207473b488595b2887bfcaea32eJim Miller private void postClearPatternRunnable() { 65317e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.removeCallbacks(mClearPatternRunnable); 65417e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.postDelayed(mClearPatternRunnable, WRONG_PATTERN_CLEAR_TIMEOUT_MS); 65517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 656afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 6573e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private void startSaveAndFinish() { 6583e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mSaveAndFinishWorker != null) { 6593e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia Log.w(TAG, "startSaveAndFinish with an existing SaveAndFinishWorker."); 6603e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia return; 6613e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 662e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project 6633e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia setRightButtonEnabled(false); 66490d6c568cf24178669254964af343f729639b31dAdrian Roos 6653e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mSaveAndFinishWorker = new SaveAndFinishWorker(); 6665bb1e4fb909a5f0e0574d3572ea1edcf32a2190fRobin Lee mSaveAndFinishWorker.setListener(this); 6675bb1e4fb909a5f0e0574d3572ea1edcf32a2190fRobin Lee 6683e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia getFragmentManager().beginTransaction().add(mSaveAndFinishWorker, 6693e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia FRAGMENT_TAG_SAVE_AND_FINISH).commit(); 6705bb1e4fb909a5f0e0574d3572ea1edcf32a2190fRobin Lee getFragmentManager().executePendingTransactions(); 671cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence 6723e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia final boolean required = getActivity().getIntent().getBooleanExtra( 6730698a216311acd9ab52224602d1a75c08bf89f04Jim Miller EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); 6743e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mSaveAndFinishWorker.start(mChooseLockSettingsHelper.utils(), required, 675fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mHasChallenge, mChallenge, mChosenPattern, mCurrentPattern, mUserId); 6763e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 677a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 6783e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia @Override 6793e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia public void onChosenLockSaveFinished(boolean wasSecureBefore, Intent resultData) { 6803e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia getActivity().setResult(RESULT_FINISHED, resultData); 681e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project 6823e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (!wasSecureBefore) { 6833e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia Intent intent = getRedactionInterstitialIntent(getActivity()); 6843e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (intent != null) { 68592779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini intent.putExtra(EXTRA_HIDE_DRAWER, mHideDrawer); 6863e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia startActivity(intent); 6873e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 68817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 689686ae494f485a5025dfa456b4f32427b3715c337Udam Saini getActivity().finish(); 6903e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 6913e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 69200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 6933e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private static class SaveAndFinishWorker extends SaveChosenLockWorkerBase { 6943e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 6953e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private List<LockPatternView.Cell> mChosenPattern; 6963e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private String mCurrentPattern; 6973e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private boolean mLockVirgin; 6983e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 6993e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia public void start(LockPatternUtils utils, boolean credentialRequired, 7003e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia boolean hasChallenge, long challenge, 701fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri List<LockPatternView.Cell> chosenPattern, String currentPattern, int userId) { 702b8a22e42d42e6de8fce1a2026c112c12fd0f0f7aClara Bayarri prepare(utils, credentialRequired, hasChallenge, challenge, userId); 7033e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 7043e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mCurrentPattern = currentPattern; 7053e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mChosenPattern = chosenPattern; 706fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mUserId = userId; 7073e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 708fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mLockVirgin = !mUtils.isPatternEverChosen(mUserId); 7093e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 7103e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia start(); 7113e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 7123e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 7133e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia @Override 7143e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected Intent saveAndVerifyInBackground() { 7153e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia Intent result = null; 716fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri final int userId = mUserId; 7173e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mUtils.saveLockPattern(mChosenPattern, mCurrentPattern, userId); 7183e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 7193e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mHasChallenge) { 7203e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia byte[] token; 7213e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia try { 7223e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia token = mUtils.verifyPattern(mChosenPattern, mChallenge, userId); 7233e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } catch (RequestThrottledException e) { 7243e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia token = null; 725cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence } 726cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence 7273e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (token == null) { 7283e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia Log.e(TAG, "critical: no token returned for known good pattern"); 72958c5fb38c75cf04309f74927b3c91c54a645b690Jorim Jaggi } 730bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia 7313e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia result = new Intent(); 7323e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia result.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token); 733bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia } 734bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia 7353e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia return result; 736bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia } 737bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia 7383e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia @Override 7393e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected void finish(Intent resultData) { 7403e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mLockVirgin) { 741fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mUtils.setVisiblePatternEnabled(true, mUserId); 7423e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 7433e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 7443e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia super.finish(resultData); 74517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 746afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 747afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 748