ChooseLockPattern.java revision 77cb854d689cd5c49e14f80abb7803d77ced2e79
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 com.google.android.collect.Lists; 20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient; 22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.widget.LockPatternUtils; 23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.widget.LockPatternView; 2456544d0e9198ab21dabec621cdf419b52b412dacJim Millerimport com.android.internal.widget.LockPatternView.Cell; 2517e9e1933055b207473b488595b2887bfcaea32eJim Miller 26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport static com.android.internal.widget.LockPatternView.DisplayMode; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity; 2917e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.app.Fragment; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 3217e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.preference.PreferenceActivity; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.KeyEvent; 3417e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.view.LayoutInflater; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 3617e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.view.ViewGroup; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Collections; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List; 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * If the user has a lock pattern set already, makes them confirm the existing one. 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Then, prompts the user to choose a lock pattern: 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * - prompts for initial pattern 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * - asks for confirmation / restart 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * - saves chosen password when confirmed 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 5117e9e1933055b207473b488595b2887bfcaea32eJim Millerpublic class ChooseLockPattern extends PreferenceActivity { 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Used by the choose lock pattern wizard to indicate the wizard is 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * finished, and each activity in the wizard should finish. 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * <p> 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Previously, each activity in the wizard would finish itself after 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * starting the next activity. However, this leads to broken 'Back' 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * behavior. So, now an activity does not finish itself until it gets this 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * result. 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project static final int RESULT_FINISHED = RESULT_FIRST_USER; 6200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 6317e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 6417e9e1933055b207473b488595b2887bfcaea32eJim Miller public Intent getIntent() { 6517e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent modIntent = new Intent(super.getIntent()); 6617e9e1933055b207473b488595b2887bfcaea32eJim Miller modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ChooseLockPatternFragment.class.getName()); 6717e9e1933055b207473b488595b2887bfcaea32eJim Miller modIntent.putExtra(EXTRA_NO_HEADERS, true); 6817e9e1933055b207473b488595b2887bfcaea32eJim Miller return modIntent; 6917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 7000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 7117e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 7217e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 7317e9e1933055b207473b488595b2887bfcaea32eJim Miller // requestWindowFeature(Window.FEATURE_NO_TITLE); 7417e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 758c74072e9cad7ae7cf7266f87b8f202aa42939ceJim Miller CharSequence msg = getText(R.string.lockpassword_choose_your_pattern_header); 768c74072e9cad7ae7cf7266f87b8f202aa42939ceJim Miller showBreadCrumbs(msg, msg); 7717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 7917e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 8017e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onKeyDown(int keyCode, KeyEvent event) { 8117e9e1933055b207473b488595b2887bfcaea32eJim Miller // *** TODO *** 8217e9e1933055b207473b488595b2887bfcaea32eJim Miller // chooseLockPatternFragment.onKeyDown(keyCode, event); 8317e9e1933055b207473b488595b2887bfcaea32eJim Miller return super.onKeyDown(keyCode, event); 8417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 8617e9e1933055b207473b488595b2887bfcaea32eJim Miller public static class ChooseLockPatternFragment extends Fragment 8717e9e1933055b207473b488595b2887bfcaea32eJim Miller implements View.OnClickListener { 88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 8917e9e1933055b207473b488595b2887bfcaea32eJim Miller public static final int CONFIRM_EXISTING_REQUEST = 55; 90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 9117e9e1933055b207473b488595b2887bfcaea32eJim Miller // how long after a confirmation message is shown before moving on 9217e9e1933055b207473b488595b2887bfcaea32eJim Miller static final int INFORMATION_MSG_TIMEOUT_MS = 3000; 93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 9417e9e1933055b207473b488595b2887bfcaea32eJim Miller // how long we wait to clear a wrong pattern 9517e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 2000; 96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 9717e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int ID_EMPTY_MESSAGE = -1; 98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 9917e9e1933055b207473b488595b2887bfcaea32eJim Miller protected TextView mHeaderText; 10017e9e1933055b207473b488595b2887bfcaea32eJim Miller protected LockPatternView mLockPatternView; 10117e9e1933055b207473b488595b2887bfcaea32eJim Miller protected TextView mFooterText; 10217e9e1933055b207473b488595b2887bfcaea32eJim Miller private TextView mFooterLeftButton; 10317e9e1933055b207473b488595b2887bfcaea32eJim Miller private TextView mFooterRightButton; 10417e9e1933055b207473b488595b2887bfcaea32eJim Miller protected List<LockPatternView.Cell> mChosenPattern = null; 105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 10617e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 10717e9e1933055b207473b488595b2887bfcaea32eJim Miller * The patten used during the help screen to show how to draw a pattern. 10817e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 10917e9e1933055b207473b488595b2887bfcaea32eJim Miller private final List<LockPatternView.Cell> mAnimatePattern = 11017e9e1933055b207473b488595b2887bfcaea32eJim Miller Collections.unmodifiableList(Lists.newArrayList( 11117e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternView.Cell.of(0, 0), 11217e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternView.Cell.of(0, 1), 11317e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternView.Cell.of(1, 1), 11417e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternView.Cell.of(2, 1) 11517e9e1933055b207473b488595b2887bfcaea32eJim Miller )); 11617e9e1933055b207473b488595b2887bfcaea32eJim Miller 11717e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 11817e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onActivityResult(int requestCode, int resultCode, 11917e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent data) { 12017e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onActivityResult(requestCode, resultCode, data); 12117e9e1933055b207473b488595b2887bfcaea32eJim Miller switch (requestCode) { 12217e9e1933055b207473b488595b2887bfcaea32eJim Miller case CONFIRM_EXISTING_REQUEST: 12317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (resultCode != Activity.RESULT_OK) { 12417e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(RESULT_FINISHED); 12517e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 12617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 12717e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 12817e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 13017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 13217e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 13317e9e1933055b207473b488595b2887bfcaea32eJim Miller * The pattern listener that responds according to a user choosing a new 13417e9e1933055b207473b488595b2887bfcaea32eJim Miller * lock pattern. 13517e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 13617e9e1933055b207473b488595b2887bfcaea32eJim Miller protected LockPatternView.OnPatternListener mChooseNewLockPatternListener = 13717e9e1933055b207473b488595b2887bfcaea32eJim Miller new LockPatternView.OnPatternListener() { 13817e9e1933055b207473b488595b2887bfcaea32eJim Miller 13917e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPatternStart() { 14017e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.removeCallbacks(mClearPatternRunnable); 14117e9e1933055b207473b488595b2887bfcaea32eJim Miller patternInProgress(); 142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 14417e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPatternCleared() { 14517e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.removeCallbacks(mClearPatternRunnable); 14617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 14756544d0e9198ab21dabec621cdf419b52b412dacJim Miller 14817e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPatternDetected(List<LockPatternView.Cell> pattern) { 14917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage == Stage.NeedToConfirm || mUiStage == Stage.ConfirmWrong) { 15017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mChosenPattern == null) throw new IllegalStateException( 15117e9e1933055b207473b488595b2887bfcaea32eJim Miller "null chosen pattern in stage 'need to confirm"); 15217e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mChosenPattern.equals(pattern)) { 15317e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.ChoiceConfirmed); 15417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 15517e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.ConfirmWrong); 15617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 15717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (mUiStage == Stage.Introduction || mUiStage == Stage.ChoiceTooShort){ 15817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (pattern.size() < LockPatternUtils.MIN_LOCK_PATTERN_SIZE) { 15917e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.ChoiceTooShort); 16017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 16117e9e1933055b207473b488595b2887bfcaea32eJim Miller mChosenPattern = new ArrayList<LockPatternView.Cell>(pattern); 16217e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.FirstChoiceValid); 16317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 16417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 16517e9e1933055b207473b488595b2887bfcaea32eJim Miller throw new IllegalStateException("Unexpected stage " + mUiStage + " when " 16617e9e1933055b207473b488595b2887bfcaea32eJim Miller + "entering the pattern."); 16717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 16817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 16956544d0e9198ab21dabec621cdf419b52b412dacJim Miller 17017e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPatternCellAdded(List<Cell> pattern) { 171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17417e9e1933055b207473b488595b2887bfcaea32eJim Miller private void patternInProgress() { 17517e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(R.string.lockpattern_recording_inprogress); 17617e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterText.setText(""); 17717e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setEnabled(false); 17817e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterRightButton.setEnabled(false); 17917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 18017e9e1933055b207473b488595b2887bfcaea32eJim Miller }; 181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 18417e9e1933055b207473b488595b2887bfcaea32eJim Miller * The states of the left footer button. 185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 18617e9e1933055b207473b488595b2887bfcaea32eJim Miller enum LeftButtonMode { 18717e9e1933055b207473b488595b2887bfcaea32eJim Miller Cancel(R.string.cancel, true), 18817e9e1933055b207473b488595b2887bfcaea32eJim Miller CancelDisabled(R.string.cancel, false), 18917e9e1933055b207473b488595b2887bfcaea32eJim Miller Retry(R.string.lockpattern_retry_button_text, true), 19017e9e1933055b207473b488595b2887bfcaea32eJim Miller RetryDisabled(R.string.lockpattern_retry_button_text, false), 19117e9e1933055b207473b488595b2887bfcaea32eJim Miller Gone(ID_EMPTY_MESSAGE, false); 19217e9e1933055b207473b488595b2887bfcaea32eJim Miller 19317e9e1933055b207473b488595b2887bfcaea32eJim Miller 19417e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 19517e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param text The displayed text for this mode. 19617e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param enabled Whether the button should be enabled. 19717e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 19817e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode(int text, boolean enabled) { 19917e9e1933055b207473b488595b2887bfcaea32eJim Miller this.text = text; 20017e9e1933055b207473b488595b2887bfcaea32eJim Miller this.enabled = enabled; 20117e9e1933055b207473b488595b2887bfcaea32eJim Miller } 202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 20317e9e1933055b207473b488595b2887bfcaea32eJim Miller final int text; 20417e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean enabled; 20517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 20817e9e1933055b207473b488595b2887bfcaea32eJim Miller * The states of the right button. 209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 21017e9e1933055b207473b488595b2887bfcaea32eJim Miller enum RightButtonMode { 21117e9e1933055b207473b488595b2887bfcaea32eJim Miller Continue(R.string.lockpattern_continue_button_text, true), 21217e9e1933055b207473b488595b2887bfcaea32eJim Miller ContinueDisabled(R.string.lockpattern_continue_button_text, false), 21317e9e1933055b207473b488595b2887bfcaea32eJim Miller Confirm(R.string.lockpattern_confirm_button_text, true), 21417e9e1933055b207473b488595b2887bfcaea32eJim Miller ConfirmDisabled(R.string.lockpattern_confirm_button_text, false), 21517e9e1933055b207473b488595b2887bfcaea32eJim Miller Ok(android.R.string.ok, true); 21617e9e1933055b207473b488595b2887bfcaea32eJim Miller 21717e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 21817e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param text The displayed text for this mode. 21917e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param enabled Whether the button should be enabled. 22017e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 22117e9e1933055b207473b488595b2887bfcaea32eJim Miller RightButtonMode(int text, boolean enabled) { 22217e9e1933055b207473b488595b2887bfcaea32eJim Miller this.text = text; 22317e9e1933055b207473b488595b2887bfcaea32eJim Miller this.enabled = enabled; 22417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 22617e9e1933055b207473b488595b2887bfcaea32eJim Miller final int text; 22717e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean enabled; 22817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 23117e9e1933055b207473b488595b2887bfcaea32eJim Miller * Keep track internally of where the user is in choosing a pattern. 232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 23317e9e1933055b207473b488595b2887bfcaea32eJim Miller protected enum Stage { 23417e9e1933055b207473b488595b2887bfcaea32eJim Miller 23517e9e1933055b207473b488595b2887bfcaea32eJim Miller Introduction( 23617e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_recording_intro_header, 23717e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Cancel, RightButtonMode.ContinueDisabled, 23817e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_recording_intro_footer, true), 23917e9e1933055b207473b488595b2887bfcaea32eJim Miller HelpScreen( 24017e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_settings_help_how_to_record, 24117e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Gone, RightButtonMode.Ok, ID_EMPTY_MESSAGE, false), 24217e9e1933055b207473b488595b2887bfcaea32eJim Miller ChoiceTooShort( 24317e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_recording_incorrect_too_short, 24417e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Retry, RightButtonMode.ContinueDisabled, 24517e9e1933055b207473b488595b2887bfcaea32eJim Miller ID_EMPTY_MESSAGE, true), 24617e9e1933055b207473b488595b2887bfcaea32eJim Miller FirstChoiceValid( 24717e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_pattern_entered_header, 24817e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Retry, RightButtonMode.Continue, ID_EMPTY_MESSAGE, false), 24917e9e1933055b207473b488595b2887bfcaea32eJim Miller NeedToConfirm( 25017e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_need_to_confirm, 25177cb854d689cd5c49e14f80abb7803d77ced2e79Jim Miller LeftButtonMode.Cancel, RightButtonMode.ConfirmDisabled, 25217e9e1933055b207473b488595b2887bfcaea32eJim Miller ID_EMPTY_MESSAGE, true), 25317e9e1933055b207473b488595b2887bfcaea32eJim Miller ConfirmWrong( 25417e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_need_to_unlock_wrong, 25517e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Cancel, RightButtonMode.ConfirmDisabled, 25617e9e1933055b207473b488595b2887bfcaea32eJim Miller ID_EMPTY_MESSAGE, true), 25717e9e1933055b207473b488595b2887bfcaea32eJim Miller ChoiceConfirmed( 25817e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_pattern_confirmed_header, 25917e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Cancel, RightButtonMode.Confirm, ID_EMPTY_MESSAGE, false); 26017e9e1933055b207473b488595b2887bfcaea32eJim Miller 26117e9e1933055b207473b488595b2887bfcaea32eJim Miller 26217e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 26317e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param headerMessage The message displayed at the top. 26417e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param leftMode The mode of the left button. 26517e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param rightMode The mode of the right button. 26617e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param footerMessage The footer message. 26717e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param patternEnabled Whether the pattern widget is enabled. 26817e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 26917e9e1933055b207473b488595b2887bfcaea32eJim Miller Stage(int headerMessage, 27017e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode leftMode, 27117e9e1933055b207473b488595b2887bfcaea32eJim Miller RightButtonMode rightMode, 27217e9e1933055b207473b488595b2887bfcaea32eJim Miller int footerMessage, boolean patternEnabled) { 27317e9e1933055b207473b488595b2887bfcaea32eJim Miller this.headerMessage = headerMessage; 27417e9e1933055b207473b488595b2887bfcaea32eJim Miller this.leftMode = leftMode; 27517e9e1933055b207473b488595b2887bfcaea32eJim Miller this.rightMode = rightMode; 27617e9e1933055b207473b488595b2887bfcaea32eJim Miller this.footerMessage = footerMessage; 27717e9e1933055b207473b488595b2887bfcaea32eJim Miller this.patternEnabled = patternEnabled; 27817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 27917e9e1933055b207473b488595b2887bfcaea32eJim Miller 28017e9e1933055b207473b488595b2887bfcaea32eJim Miller final int headerMessage; 28117e9e1933055b207473b488595b2887bfcaea32eJim Miller final LeftButtonMode leftMode; 28217e9e1933055b207473b488595b2887bfcaea32eJim Miller final RightButtonMode rightMode; 28317e9e1933055b207473b488595b2887bfcaea32eJim Miller final int footerMessage; 28417e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean patternEnabled; 285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 28717e9e1933055b207473b488595b2887bfcaea32eJim Miller private Stage mUiStage = Stage.Introduction; 288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 28917e9e1933055b207473b488595b2887bfcaea32eJim Miller private Runnable mClearPatternRunnable = new Runnable() { 29017e9e1933055b207473b488595b2887bfcaea32eJim Miller public void run() { 29117e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.clearPattern(); 29217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 29317e9e1933055b207473b488595b2887bfcaea32eJim Miller }; 294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 29517e9e1933055b207473b488595b2887bfcaea32eJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 29717e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UI_STAGE = "uiStage"; 29817e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_PATTERN_CHOICE = "chosenPattern"; 29900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 30017e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 30117e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 30217e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 30317e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity()); 30417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 30617e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 30717e9e1933055b207473b488595b2887bfcaea32eJim Miller public View onCreateView(LayoutInflater inflater, ViewGroup container, 30817e9e1933055b207473b488595b2887bfcaea32eJim Miller Bundle savedInstanceState) { 30917e9e1933055b207473b488595b2887bfcaea32eJim Miller 31017e9e1933055b207473b488595b2887bfcaea32eJim Miller // setupViews() 31117e9e1933055b207473b488595b2887bfcaea32eJim Miller View view = inflater.inflate(R.layout.choose_lock_pattern, null); 31217e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText = (TextView) view.findViewById(R.id.headerText); 31317e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView = (LockPatternView) view.findViewById(R.id.lockPattern); 31417e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setOnPatternListener(mChooseNewLockPatternListener); 31517e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setTactileFeedbackEnabled( 31617e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.utils().isTactileFeedbackEnabled()); 31717e9e1933055b207473b488595b2887bfcaea32eJim Miller 31817e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterText = (TextView) view.findViewById(R.id.footerText); 31917e9e1933055b207473b488595b2887bfcaea32eJim Miller 32017e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton = (TextView) view.findViewById(R.id.footerLeftButton); 32117e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterRightButton = (TextView) view.findViewById(R.id.footerRightButton); 32217e9e1933055b207473b488595b2887bfcaea32eJim Miller 32317e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setOnClickListener(this); 32417e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterRightButton.setOnClickListener(this); 32517e9e1933055b207473b488595b2887bfcaea32eJim Miller 32617e9e1933055b207473b488595b2887bfcaea32eJim Miller // make it so unhandled touch events within the unlock screen go to the 32717e9e1933055b207473b488595b2887bfcaea32eJim Miller // lock pattern view. 32817e9e1933055b207473b488595b2887bfcaea32eJim Miller final LinearLayoutWithDefaultTouchRecepient topLayout 32917e9e1933055b207473b488595b2887bfcaea32eJim Miller = (LinearLayoutWithDefaultTouchRecepient) view.findViewById( 33017e9e1933055b207473b488595b2887bfcaea32eJim Miller R.id.topLayout); 33117e9e1933055b207473b488595b2887bfcaea32eJim Miller topLayout.setDefaultTouchRecepient(mLockPatternView); 33217e9e1933055b207473b488595b2887bfcaea32eJim Miller 33317e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean confirmCredentials = getActivity().getIntent() 3341bafb6e0194aa4c0495301a1f4510e40b11eab99Jim Miller .getBooleanExtra("confirm_credentials", false); 33517e9e1933055b207473b488595b2887bfcaea32eJim Miller 33617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (savedInstanceState == null) { 33717e9e1933055b207473b488595b2887bfcaea32eJim Miller if (confirmCredentials) { 33817e9e1933055b207473b488595b2887bfcaea32eJim Miller // first launch. As a security measure, we're in NeedToConfirm mode until we 33917e9e1933055b207473b488595b2887bfcaea32eJim Miller // know there isn't an existing password or the user confirms their password. 34017e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.NeedToConfirm); 34117e9e1933055b207473b488595b2887bfcaea32eJim Miller boolean launchedConfirmationActivity = 34217e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.launchConfirmationActivity( 34317e9e1933055b207473b488595b2887bfcaea32eJim Miller CONFIRM_EXISTING_REQUEST, null, null); 34417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!launchedConfirmationActivity) { 34517e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 34617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 34717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 348bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller updateStage(Stage.Introduction); 349bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 350bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } else { 35117e9e1933055b207473b488595b2887bfcaea32eJim Miller // restore from previous state 35217e9e1933055b207473b488595b2887bfcaea32eJim Miller final String patternString = savedInstanceState.getString(KEY_PATTERN_CHOICE); 35317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (patternString != null) { 35417e9e1933055b207473b488595b2887bfcaea32eJim Miller mChosenPattern = LockPatternUtils.stringToPattern(patternString); 35517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 35617e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.values()[savedInstanceState.getInt(KEY_UI_STAGE)]); 357afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 35817e9e1933055b207473b488595b2887bfcaea32eJim Miller return view; 359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 36117e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onClick(View v) { 36217e9e1933055b207473b488595b2887bfcaea32eJim Miller if (v == mFooterLeftButton) { 36317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage.leftMode == LeftButtonMode.Retry) { 36417e9e1933055b207473b488595b2887bfcaea32eJim Miller mChosenPattern = null; 36517e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.clearPattern(); 36617e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 36717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (mUiStage.leftMode == LeftButtonMode.Cancel) { 36817e9e1933055b207473b488595b2887bfcaea32eJim Miller // They are canceling the entire wizard 36917e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(RESULT_FINISHED); 37017e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 37117e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 37217e9e1933055b207473b488595b2887bfcaea32eJim Miller throw new IllegalStateException("left footer button pressed, but stage of " + 37317e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage + " doesn't make sense"); 374afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 37517e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (v == mFooterRightButton) { 37617e9e1933055b207473b488595b2887bfcaea32eJim Miller 37717e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage.rightMode == RightButtonMode.Continue) { 37817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage != Stage.FirstChoiceValid) { 37917e9e1933055b207473b488595b2887bfcaea32eJim Miller throw new IllegalStateException("expected ui stage " + Stage.FirstChoiceValid 38017e9e1933055b207473b488595b2887bfcaea32eJim Miller + " when button is " + RightButtonMode.Continue); 38117e9e1933055b207473b488595b2887bfcaea32eJim Miller } 38217e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.NeedToConfirm); 38317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (mUiStage.rightMode == RightButtonMode.Confirm) { 38417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage != Stage.ChoiceConfirmed) { 38517e9e1933055b207473b488595b2887bfcaea32eJim Miller throw new IllegalStateException("expected ui stage " + Stage.ChoiceConfirmed 38617e9e1933055b207473b488595b2887bfcaea32eJim Miller + " when button is " + RightButtonMode.Confirm); 38717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 38817e9e1933055b207473b488595b2887bfcaea32eJim Miller saveChosenPatternAndFinish(); 38917e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (mUiStage.rightMode == RightButtonMode.Ok) { 39017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage != Stage.HelpScreen) { 39117e9e1933055b207473b488595b2887bfcaea32eJim Miller throw new IllegalStateException("Help screen is only mode with ok button, but " + 39217e9e1933055b207473b488595b2887bfcaea32eJim Miller "stage is " + mUiStage); 39317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 39417e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.clearPattern(); 39517e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setDisplayMode(DisplayMode.Correct); 39617e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 400afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 40117e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onKeyDown(int keyCode, KeyEvent event) { 40217e9e1933055b207473b488595b2887bfcaea32eJim Miller if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 40317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage == Stage.HelpScreen) { 40417e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 40517e9e1933055b207473b488595b2887bfcaea32eJim Miller return true; 40617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 40717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 40817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (keyCode == KeyEvent.KEYCODE_MENU && mUiStage == Stage.Introduction) { 40917e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.HelpScreen); 410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 41217e9e1933055b207473b488595b2887bfcaea32eJim Miller return false; 413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 414afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 41517e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onSaveInstanceState(Bundle outState) { 41617e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onSaveInstanceState(outState); 417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 41817e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putInt(KEY_UI_STAGE, mUiStage.ordinal()); 41917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mChosenPattern != null) { 42017e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putString(KEY_PATTERN_CHOICE, 42117e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternUtils.patternToString(mChosenPattern)); 42217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 423afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 424afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 42517e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 42617e9e1933055b207473b488595b2887bfcaea32eJim Miller * Updates the messages and buttons appropriate to what stage the user 42717e9e1933055b207473b488595b2887bfcaea32eJim Miller * is at in choosing a view. This doesn't handle clearing out the pattern; 42817e9e1933055b207473b488595b2887bfcaea32eJim Miller * the pattern is expected to be in the right state. 42917e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param stage 43017e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 43117e9e1933055b207473b488595b2887bfcaea32eJim Miller protected void updateStage(Stage stage) { 432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 43317e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage = stage; 434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 43517e9e1933055b207473b488595b2887bfcaea32eJim Miller // header text, footer text, visibility and 43617e9e1933055b207473b488595b2887bfcaea32eJim Miller // enabled state all known from the stage 43717e9e1933055b207473b488595b2887bfcaea32eJim Miller if (stage == Stage.ChoiceTooShort) { 43817e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText( 43917e9e1933055b207473b488595b2887bfcaea32eJim Miller getResources().getString( 44017e9e1933055b207473b488595b2887bfcaea32eJim Miller stage.headerMessage, 44117e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternUtils.MIN_LOCK_PATTERN_SIZE)); 44217e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 44317e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(stage.headerMessage); 44417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 44517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (stage.footerMessage == ID_EMPTY_MESSAGE) { 44617e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterText.setText(""); 44717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 44817e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterText.setText(stage.footerMessage); 44917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 450afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 45117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (stage.leftMode == LeftButtonMode.Gone) { 45217e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setVisibility(View.GONE); 45317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 45417e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setVisibility(View.VISIBLE); 45517e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setText(stage.leftMode.text); 45617e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setEnabled(stage.leftMode.enabled); 45717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 458afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 45917e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterRightButton.setText(stage.rightMode.text); 46017e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterRightButton.setEnabled(stage.rightMode.enabled); 461afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 46217e9e1933055b207473b488595b2887bfcaea32eJim Miller // same for whether the patten is enabled 46317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (stage.patternEnabled) { 46417e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.enableInput(); 46517e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 46617e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.disableInput(); 46717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 468afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 46917e9e1933055b207473b488595b2887bfcaea32eJim Miller // the rest of the stuff varies enough that it is easier just to handle 47017e9e1933055b207473b488595b2887bfcaea32eJim Miller // on a case by case basis. 47117e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setDisplayMode(DisplayMode.Correct); 47217e9e1933055b207473b488595b2887bfcaea32eJim Miller 47317e9e1933055b207473b488595b2887bfcaea32eJim Miller switch (mUiStage) { 47417e9e1933055b207473b488595b2887bfcaea32eJim Miller case Introduction: 47517e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.clearPattern(); 47617e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 47717e9e1933055b207473b488595b2887bfcaea32eJim Miller case HelpScreen: 47817e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setPattern(DisplayMode.Animate, mAnimatePattern); 47917e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 48017e9e1933055b207473b488595b2887bfcaea32eJim Miller case ChoiceTooShort: 48117e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setDisplayMode(DisplayMode.Wrong); 48217e9e1933055b207473b488595b2887bfcaea32eJim Miller postClearPatternRunnable(); 48317e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 48417e9e1933055b207473b488595b2887bfcaea32eJim Miller case FirstChoiceValid: 48517e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 48617e9e1933055b207473b488595b2887bfcaea32eJim Miller case NeedToConfirm: 48717e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.clearPattern(); 48817e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 48917e9e1933055b207473b488595b2887bfcaea32eJim Miller case ConfirmWrong: 49017e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setDisplayMode(DisplayMode.Wrong); 49117e9e1933055b207473b488595b2887bfcaea32eJim Miller postClearPatternRunnable(); 49217e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 49317e9e1933055b207473b488595b2887bfcaea32eJim Miller case ChoiceConfirmed: 49417e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 49517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 496afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 497afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 498afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 49917e9e1933055b207473b488595b2887bfcaea32eJim Miller // clear the wrong pattern unless they have started a new one 50017e9e1933055b207473b488595b2887bfcaea32eJim Miller // already 50117e9e1933055b207473b488595b2887bfcaea32eJim Miller private void postClearPatternRunnable() { 50217e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.removeCallbacks(mClearPatternRunnable); 50317e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.postDelayed(mClearPatternRunnable, WRONG_PATTERN_CLEAR_TIMEOUT_MS); 50417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 505afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 50617e9e1933055b207473b488595b2887bfcaea32eJim Miller private void saveChosenPatternAndFinish() { 50717e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternUtils utils = mChooseLockSettingsHelper.utils(); 50817e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean lockVirgin = !utils.isPatternEverChosen(); 509e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project 51017e9e1933055b207473b488595b2887bfcaea32eJim Miller utils.saveLockPattern(mChosenPattern); 51117e9e1933055b207473b488595b2887bfcaea32eJim Miller utils.setLockPatternEnabled(true); 512e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project 51317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (lockVirgin) { 51417e9e1933055b207473b488595b2887bfcaea32eJim Miller utils.setVisiblePatternEnabled(true); 51517e9e1933055b207473b488595b2887bfcaea32eJim Miller utils.setTactileFeedbackEnabled(false); 51617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 51700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 51817e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(RESULT_FINISHED); 51917e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 52017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 521afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 522afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 523