ChooseLockPattern.java revision a677ee210c67d13d15ba0663887675bda16354d8
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; 25a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasaniimport com.android.settings.ChooseLockGeneric.ChooseLockGenericFragment; 2617e9e1933055b207473b488595b2887bfcaea32eJim Miller 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport static com.android.internal.widget.LockPatternView.DisplayMode; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity; 3017e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.app.Fragment; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 3317e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.preference.PreferenceActivity; 34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.KeyEvent; 3517e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.view.LayoutInflater; 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 3717e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.view.ViewGroup; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Collections; 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * If the user has a lock pattern set already, makes them confirm the existing one. 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Then, prompts the user to choose a lock pattern: 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * - prompts for initial pattern 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * - asks for confirmation / restart 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * - saves chosen password when confirmed 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 5217e9e1933055b207473b488595b2887bfcaea32eJim Millerpublic class ChooseLockPattern extends PreferenceActivity { 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Used by the choose lock pattern wizard to indicate the wizard is 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * finished, and each activity in the wizard should finish. 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * <p> 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Previously, each activity in the wizard would finish itself after 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * starting the next activity. However, this leads to broken 'Back' 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * behavior. So, now an activity does not finish itself until it gets this 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * result. 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project static final int RESULT_FINISHED = RESULT_FIRST_USER; 6300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 6417e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 6517e9e1933055b207473b488595b2887bfcaea32eJim Miller public Intent getIntent() { 6617e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent modIntent = new Intent(super.getIntent()); 6717e9e1933055b207473b488595b2887bfcaea32eJim Miller modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ChooseLockPatternFragment.class.getName()); 6817e9e1933055b207473b488595b2887bfcaea32eJim Miller modIntent.putExtra(EXTRA_NO_HEADERS, true); 6917e9e1933055b207473b488595b2887bfcaea32eJim Miller return modIntent; 7017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 7100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 7217e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 73a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani protected boolean isValidFragment(String fragmentName) { 74a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani if (ChooseLockPatternFragment.class.getName().equals(fragmentName)) return true; 75a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani return false; 76a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani } 77a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani 78a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani @Override 7917e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 8017e9e1933055b207473b488595b2887bfcaea32eJim Miller // requestWindowFeature(Window.FEATURE_NO_TITLE); 8117e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 828c74072e9cad7ae7cf7266f87b8f202aa42939ceJim Miller CharSequence msg = getText(R.string.lockpassword_choose_your_pattern_header); 838c74072e9cad7ae7cf7266f87b8f202aa42939ceJim Miller showBreadCrumbs(msg, msg); 8417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 8617e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 8717e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onKeyDown(int keyCode, KeyEvent event) { 8817e9e1933055b207473b488595b2887bfcaea32eJim Miller // *** TODO *** 8917e9e1933055b207473b488595b2887bfcaea32eJim Miller // chooseLockPatternFragment.onKeyDown(keyCode, event); 9017e9e1933055b207473b488595b2887bfcaea32eJim Miller return super.onKeyDown(keyCode, event); 9117e9e1933055b207473b488595b2887bfcaea32eJim Miller } 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 9317e9e1933055b207473b488595b2887bfcaea32eJim Miller public static class ChooseLockPatternFragment extends Fragment 9417e9e1933055b207473b488595b2887bfcaea32eJim Miller implements View.OnClickListener { 95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 9617e9e1933055b207473b488595b2887bfcaea32eJim Miller public static final int CONFIRM_EXISTING_REQUEST = 55; 97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 9817e9e1933055b207473b488595b2887bfcaea32eJim Miller // how long after a confirmation message is shown before moving on 9917e9e1933055b207473b488595b2887bfcaea32eJim Miller static final int INFORMATION_MSG_TIMEOUT_MS = 3000; 100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 10117e9e1933055b207473b488595b2887bfcaea32eJim Miller // how long we wait to clear a wrong pattern 10217e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 2000; 103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 10417e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int ID_EMPTY_MESSAGE = -1; 105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 10617e9e1933055b207473b488595b2887bfcaea32eJim Miller protected TextView mHeaderText; 10717e9e1933055b207473b488595b2887bfcaea32eJim Miller protected LockPatternView mLockPatternView; 10817e9e1933055b207473b488595b2887bfcaea32eJim Miller protected TextView mFooterText; 10917e9e1933055b207473b488595b2887bfcaea32eJim Miller private TextView mFooterLeftButton; 11017e9e1933055b207473b488595b2887bfcaea32eJim Miller private TextView mFooterRightButton; 11117e9e1933055b207473b488595b2887bfcaea32eJim Miller protected List<LockPatternView.Cell> mChosenPattern = null; 112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 11317e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 11417e9e1933055b207473b488595b2887bfcaea32eJim Miller * The patten used during the help screen to show how to draw a pattern. 11517e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 11617e9e1933055b207473b488595b2887bfcaea32eJim Miller private final List<LockPatternView.Cell> mAnimatePattern = 11717e9e1933055b207473b488595b2887bfcaea32eJim Miller Collections.unmodifiableList(Lists.newArrayList( 11817e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternView.Cell.of(0, 0), 11917e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternView.Cell.of(0, 1), 12017e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternView.Cell.of(1, 1), 12117e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternView.Cell.of(2, 1) 12217e9e1933055b207473b488595b2887bfcaea32eJim Miller )); 12317e9e1933055b207473b488595b2887bfcaea32eJim Miller 12417e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 12517e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onActivityResult(int requestCode, int resultCode, 12617e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent data) { 12717e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onActivityResult(requestCode, resultCode, data); 12817e9e1933055b207473b488595b2887bfcaea32eJim Miller switch (requestCode) { 12917e9e1933055b207473b488595b2887bfcaea32eJim Miller case CONFIRM_EXISTING_REQUEST: 13017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (resultCode != Activity.RESULT_OK) { 13117e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(RESULT_FINISHED); 13217e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 13317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 13417e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 13517e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 13717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 13917e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 14017e9e1933055b207473b488595b2887bfcaea32eJim Miller * The pattern listener that responds according to a user choosing a new 14117e9e1933055b207473b488595b2887bfcaea32eJim Miller * lock pattern. 14217e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 14317e9e1933055b207473b488595b2887bfcaea32eJim Miller protected LockPatternView.OnPatternListener mChooseNewLockPatternListener = 14417e9e1933055b207473b488595b2887bfcaea32eJim Miller new LockPatternView.OnPatternListener() { 14517e9e1933055b207473b488595b2887bfcaea32eJim Miller 14617e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPatternStart() { 14717e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.removeCallbacks(mClearPatternRunnable); 14817e9e1933055b207473b488595b2887bfcaea32eJim Miller patternInProgress(); 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 15117e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPatternCleared() { 15217e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.removeCallbacks(mClearPatternRunnable); 15317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 15456544d0e9198ab21dabec621cdf419b52b412dacJim Miller 15517e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPatternDetected(List<LockPatternView.Cell> pattern) { 15617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage == Stage.NeedToConfirm || mUiStage == Stage.ConfirmWrong) { 15717e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mChosenPattern == null) throw new IllegalStateException( 15817e9e1933055b207473b488595b2887bfcaea32eJim Miller "null chosen pattern in stage 'need to confirm"); 15917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mChosenPattern.equals(pattern)) { 16017e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.ChoiceConfirmed); 16117e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 16217e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.ConfirmWrong); 16317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 16417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (mUiStage == Stage.Introduction || mUiStage == Stage.ChoiceTooShort){ 16517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (pattern.size() < LockPatternUtils.MIN_LOCK_PATTERN_SIZE) { 16617e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.ChoiceTooShort); 16717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 16817e9e1933055b207473b488595b2887bfcaea32eJim Miller mChosenPattern = new ArrayList<LockPatternView.Cell>(pattern); 16917e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.FirstChoiceValid); 17017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 17117e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 17217e9e1933055b207473b488595b2887bfcaea32eJim Miller throw new IllegalStateException("Unexpected stage " + mUiStage + " when " 17317e9e1933055b207473b488595b2887bfcaea32eJim Miller + "entering the pattern."); 17417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 17517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 17656544d0e9198ab21dabec621cdf419b52b412dacJim Miller 17717e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPatternCellAdded(List<Cell> pattern) { 178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 18117e9e1933055b207473b488595b2887bfcaea32eJim Miller private void patternInProgress() { 18217e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(R.string.lockpattern_recording_inprogress); 18317e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterText.setText(""); 18417e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setEnabled(false); 18517e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterRightButton.setEnabled(false); 18617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 18717e9e1933055b207473b488595b2887bfcaea32eJim Miller }; 188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 19117e9e1933055b207473b488595b2887bfcaea32eJim Miller * The states of the left footer button. 192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 19317e9e1933055b207473b488595b2887bfcaea32eJim Miller enum LeftButtonMode { 19417e9e1933055b207473b488595b2887bfcaea32eJim Miller Cancel(R.string.cancel, true), 19517e9e1933055b207473b488595b2887bfcaea32eJim Miller CancelDisabled(R.string.cancel, false), 19617e9e1933055b207473b488595b2887bfcaea32eJim Miller Retry(R.string.lockpattern_retry_button_text, true), 19717e9e1933055b207473b488595b2887bfcaea32eJim Miller RetryDisabled(R.string.lockpattern_retry_button_text, false), 19817e9e1933055b207473b488595b2887bfcaea32eJim Miller Gone(ID_EMPTY_MESSAGE, false); 19917e9e1933055b207473b488595b2887bfcaea32eJim Miller 20017e9e1933055b207473b488595b2887bfcaea32eJim Miller 20117e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 20217e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param text The displayed text for this mode. 20317e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param enabled Whether the button should be enabled. 20417e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 20517e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode(int text, boolean enabled) { 20617e9e1933055b207473b488595b2887bfcaea32eJim Miller this.text = text; 20717e9e1933055b207473b488595b2887bfcaea32eJim Miller this.enabled = enabled; 20817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 21017e9e1933055b207473b488595b2887bfcaea32eJim Miller final int text; 21117e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean enabled; 21217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 21517e9e1933055b207473b488595b2887bfcaea32eJim Miller * The states of the right button. 216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 21717e9e1933055b207473b488595b2887bfcaea32eJim Miller enum RightButtonMode { 21817e9e1933055b207473b488595b2887bfcaea32eJim Miller Continue(R.string.lockpattern_continue_button_text, true), 21917e9e1933055b207473b488595b2887bfcaea32eJim Miller ContinueDisabled(R.string.lockpattern_continue_button_text, false), 22017e9e1933055b207473b488595b2887bfcaea32eJim Miller Confirm(R.string.lockpattern_confirm_button_text, true), 22117e9e1933055b207473b488595b2887bfcaea32eJim Miller ConfirmDisabled(R.string.lockpattern_confirm_button_text, false), 22217e9e1933055b207473b488595b2887bfcaea32eJim Miller Ok(android.R.string.ok, true); 22317e9e1933055b207473b488595b2887bfcaea32eJim Miller 22417e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 22517e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param text The displayed text for this mode. 22617e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param enabled Whether the button should be enabled. 22717e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 22817e9e1933055b207473b488595b2887bfcaea32eJim Miller RightButtonMode(int text, boolean enabled) { 22917e9e1933055b207473b488595b2887bfcaea32eJim Miller this.text = text; 23017e9e1933055b207473b488595b2887bfcaea32eJim Miller this.enabled = enabled; 23117e9e1933055b207473b488595b2887bfcaea32eJim Miller } 232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 23317e9e1933055b207473b488595b2887bfcaea32eJim Miller final int text; 23417e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean enabled; 23517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 23817e9e1933055b207473b488595b2887bfcaea32eJim Miller * Keep track internally of where the user is in choosing a pattern. 239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 24017e9e1933055b207473b488595b2887bfcaea32eJim Miller protected enum Stage { 24117e9e1933055b207473b488595b2887bfcaea32eJim Miller 24217e9e1933055b207473b488595b2887bfcaea32eJim Miller Introduction( 24317e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_recording_intro_header, 24417e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Cancel, RightButtonMode.ContinueDisabled, 24563cf89a49a751c49bf60b9898e7d59f02b91c046Jim Miller ID_EMPTY_MESSAGE, true), 24617e9e1933055b207473b488595b2887bfcaea32eJim Miller HelpScreen( 24717e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_settings_help_how_to_record, 24817e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Gone, RightButtonMode.Ok, ID_EMPTY_MESSAGE, false), 24917e9e1933055b207473b488595b2887bfcaea32eJim Miller ChoiceTooShort( 25017e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_recording_incorrect_too_short, 25117e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Retry, RightButtonMode.ContinueDisabled, 25217e9e1933055b207473b488595b2887bfcaea32eJim Miller ID_EMPTY_MESSAGE, true), 25317e9e1933055b207473b488595b2887bfcaea32eJim Miller FirstChoiceValid( 25417e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_pattern_entered_header, 25517e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Retry, RightButtonMode.Continue, ID_EMPTY_MESSAGE, false), 25617e9e1933055b207473b488595b2887bfcaea32eJim Miller NeedToConfirm( 25717e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_need_to_confirm, 25877cb854d689cd5c49e14f80abb7803d77ced2e79Jim Miller LeftButtonMode.Cancel, RightButtonMode.ConfirmDisabled, 25917e9e1933055b207473b488595b2887bfcaea32eJim Miller ID_EMPTY_MESSAGE, true), 26017e9e1933055b207473b488595b2887bfcaea32eJim Miller ConfirmWrong( 26117e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_need_to_unlock_wrong, 26217e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Cancel, RightButtonMode.ConfirmDisabled, 26317e9e1933055b207473b488595b2887bfcaea32eJim Miller ID_EMPTY_MESSAGE, true), 26417e9e1933055b207473b488595b2887bfcaea32eJim Miller ChoiceConfirmed( 26517e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpattern_pattern_confirmed_header, 26617e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode.Cancel, RightButtonMode.Confirm, ID_EMPTY_MESSAGE, false); 26717e9e1933055b207473b488595b2887bfcaea32eJim Miller 26817e9e1933055b207473b488595b2887bfcaea32eJim Miller 26917e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 27017e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param headerMessage The message displayed at the top. 27117e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param leftMode The mode of the left button. 27217e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param rightMode The mode of the right button. 27317e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param footerMessage The footer message. 27417e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param patternEnabled Whether the pattern widget is enabled. 27517e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 27617e9e1933055b207473b488595b2887bfcaea32eJim Miller Stage(int headerMessage, 27717e9e1933055b207473b488595b2887bfcaea32eJim Miller LeftButtonMode leftMode, 27817e9e1933055b207473b488595b2887bfcaea32eJim Miller RightButtonMode rightMode, 27917e9e1933055b207473b488595b2887bfcaea32eJim Miller int footerMessage, boolean patternEnabled) { 28017e9e1933055b207473b488595b2887bfcaea32eJim Miller this.headerMessage = headerMessage; 28117e9e1933055b207473b488595b2887bfcaea32eJim Miller this.leftMode = leftMode; 28217e9e1933055b207473b488595b2887bfcaea32eJim Miller this.rightMode = rightMode; 28317e9e1933055b207473b488595b2887bfcaea32eJim Miller this.footerMessage = footerMessage; 28417e9e1933055b207473b488595b2887bfcaea32eJim Miller this.patternEnabled = patternEnabled; 28517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 28617e9e1933055b207473b488595b2887bfcaea32eJim Miller 28717e9e1933055b207473b488595b2887bfcaea32eJim Miller final int headerMessage; 28817e9e1933055b207473b488595b2887bfcaea32eJim Miller final LeftButtonMode leftMode; 28917e9e1933055b207473b488595b2887bfcaea32eJim Miller final RightButtonMode rightMode; 29017e9e1933055b207473b488595b2887bfcaea32eJim Miller final int footerMessage; 29117e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean patternEnabled; 292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 29417e9e1933055b207473b488595b2887bfcaea32eJim Miller private Stage mUiStage = Stage.Introduction; 295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 29617e9e1933055b207473b488595b2887bfcaea32eJim Miller private Runnable mClearPatternRunnable = new Runnable() { 29717e9e1933055b207473b488595b2887bfcaea32eJim Miller public void run() { 29817e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.clearPattern(); 29917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 30017e9e1933055b207473b488595b2887bfcaea32eJim Miller }; 301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 30217e9e1933055b207473b488595b2887bfcaea32eJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 30417e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UI_STAGE = "uiStage"; 30517e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_PATTERN_CHOICE = "chosenPattern"; 30600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 30717e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 30817e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 30917e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 31017e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity()); 31117e9e1933055b207473b488595b2887bfcaea32eJim Miller } 312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 31317e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 31417e9e1933055b207473b488595b2887bfcaea32eJim Miller public View onCreateView(LayoutInflater inflater, ViewGroup container, 31517e9e1933055b207473b488595b2887bfcaea32eJim Miller Bundle savedInstanceState) { 31617e9e1933055b207473b488595b2887bfcaea32eJim Miller 31717e9e1933055b207473b488595b2887bfcaea32eJim Miller // setupViews() 31817e9e1933055b207473b488595b2887bfcaea32eJim Miller View view = inflater.inflate(R.layout.choose_lock_pattern, null); 31917e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText = (TextView) view.findViewById(R.id.headerText); 32017e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView = (LockPatternView) view.findViewById(R.id.lockPattern); 32117e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setOnPatternListener(mChooseNewLockPatternListener); 32217e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setTactileFeedbackEnabled( 32317e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.utils().isTactileFeedbackEnabled()); 32417e9e1933055b207473b488595b2887bfcaea32eJim Miller 32517e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterText = (TextView) view.findViewById(R.id.footerText); 32617e9e1933055b207473b488595b2887bfcaea32eJim Miller 32717e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton = (TextView) view.findViewById(R.id.footerLeftButton); 32817e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterRightButton = (TextView) view.findViewById(R.id.footerRightButton); 32917e9e1933055b207473b488595b2887bfcaea32eJim Miller 33017e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setOnClickListener(this); 33117e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterRightButton.setOnClickListener(this); 33217e9e1933055b207473b488595b2887bfcaea32eJim Miller 33317e9e1933055b207473b488595b2887bfcaea32eJim Miller // make it so unhandled touch events within the unlock screen go to the 33417e9e1933055b207473b488595b2887bfcaea32eJim Miller // lock pattern view. 33517e9e1933055b207473b488595b2887bfcaea32eJim Miller final LinearLayoutWithDefaultTouchRecepient topLayout 33617e9e1933055b207473b488595b2887bfcaea32eJim Miller = (LinearLayoutWithDefaultTouchRecepient) view.findViewById( 33717e9e1933055b207473b488595b2887bfcaea32eJim Miller R.id.topLayout); 33817e9e1933055b207473b488595b2887bfcaea32eJim Miller topLayout.setDefaultTouchRecepient(mLockPatternView); 33917e9e1933055b207473b488595b2887bfcaea32eJim Miller 34017e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean confirmCredentials = getActivity().getIntent() 3411bafb6e0194aa4c0495301a1f4510e40b11eab99Jim Miller .getBooleanExtra("confirm_credentials", false); 34217e9e1933055b207473b488595b2887bfcaea32eJim Miller 34317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (savedInstanceState == null) { 34417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (confirmCredentials) { 34517e9e1933055b207473b488595b2887bfcaea32eJim Miller // first launch. As a security measure, we're in NeedToConfirm mode until we 34617e9e1933055b207473b488595b2887bfcaea32eJim Miller // know there isn't an existing password or the user confirms their password. 34717e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.NeedToConfirm); 34817e9e1933055b207473b488595b2887bfcaea32eJim Miller boolean launchedConfirmationActivity = 34917e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.launchConfirmationActivity( 35017e9e1933055b207473b488595b2887bfcaea32eJim Miller CONFIRM_EXISTING_REQUEST, null, null); 35117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (!launchedConfirmationActivity) { 35217e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 35317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 35417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 355bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller updateStage(Stage.Introduction); 356bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } 357bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller } else { 35817e9e1933055b207473b488595b2887bfcaea32eJim Miller // restore from previous state 35917e9e1933055b207473b488595b2887bfcaea32eJim Miller final String patternString = savedInstanceState.getString(KEY_PATTERN_CHOICE); 36017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (patternString != null) { 36117e9e1933055b207473b488595b2887bfcaea32eJim Miller mChosenPattern = LockPatternUtils.stringToPattern(patternString); 36217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 36317e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.values()[savedInstanceState.getInt(KEY_UI_STAGE)]); 364afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 36517e9e1933055b207473b488595b2887bfcaea32eJim Miller return view; 366afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 367afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 36817e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onClick(View v) { 36917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (v == mFooterLeftButton) { 37017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage.leftMode == LeftButtonMode.Retry) { 37117e9e1933055b207473b488595b2887bfcaea32eJim Miller mChosenPattern = null; 37217e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.clearPattern(); 37317e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 37417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (mUiStage.leftMode == LeftButtonMode.Cancel) { 37517e9e1933055b207473b488595b2887bfcaea32eJim Miller // They are canceling the entire wizard 37617e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(RESULT_FINISHED); 37717e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 37817e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 37917e9e1933055b207473b488595b2887bfcaea32eJim Miller throw new IllegalStateException("left footer button pressed, but stage of " + 38017e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage + " doesn't make sense"); 381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 38217e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (v == mFooterRightButton) { 38317e9e1933055b207473b488595b2887bfcaea32eJim Miller 38417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage.rightMode == RightButtonMode.Continue) { 38517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage != Stage.FirstChoiceValid) { 38617e9e1933055b207473b488595b2887bfcaea32eJim Miller throw new IllegalStateException("expected ui stage " + Stage.FirstChoiceValid 38717e9e1933055b207473b488595b2887bfcaea32eJim Miller + " when button is " + RightButtonMode.Continue); 38817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 38917e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.NeedToConfirm); 39017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (mUiStage.rightMode == RightButtonMode.Confirm) { 39117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage != Stage.ChoiceConfirmed) { 39217e9e1933055b207473b488595b2887bfcaea32eJim Miller throw new IllegalStateException("expected ui stage " + Stage.ChoiceConfirmed 39317e9e1933055b207473b488595b2887bfcaea32eJim Miller + " when button is " + RightButtonMode.Confirm); 39417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 39517e9e1933055b207473b488595b2887bfcaea32eJim Miller saveChosenPatternAndFinish(); 39617e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (mUiStage.rightMode == RightButtonMode.Ok) { 39717e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage != Stage.HelpScreen) { 39817e9e1933055b207473b488595b2887bfcaea32eJim Miller throw new IllegalStateException("Help screen is only mode with ok button, but " + 39917e9e1933055b207473b488595b2887bfcaea32eJim Miller "stage is " + mUiStage); 40017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 40117e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.clearPattern(); 40217e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setDisplayMode(DisplayMode.Correct); 40317e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 404afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 406afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 40817e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onKeyDown(int keyCode, KeyEvent event) { 40917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 41017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage == Stage.HelpScreen) { 41117e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 41217e9e1933055b207473b488595b2887bfcaea32eJim Miller return true; 41317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 41417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 41517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (keyCode == KeyEvent.KEYCODE_MENU && mUiStage == Stage.Introduction) { 41617e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.HelpScreen); 417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 41917e9e1933055b207473b488595b2887bfcaea32eJim Miller return false; 420afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 421afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 42217e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onSaveInstanceState(Bundle outState) { 42317e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onSaveInstanceState(outState); 424afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 42517e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putInt(KEY_UI_STAGE, mUiStage.ordinal()); 42617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mChosenPattern != null) { 42717e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putString(KEY_PATTERN_CHOICE, 42817e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternUtils.patternToString(mChosenPattern)); 42917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 431afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 43217e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 43317e9e1933055b207473b488595b2887bfcaea32eJim Miller * Updates the messages and buttons appropriate to what stage the user 43417e9e1933055b207473b488595b2887bfcaea32eJim Miller * is at in choosing a view. This doesn't handle clearing out the pattern; 43517e9e1933055b207473b488595b2887bfcaea32eJim Miller * the pattern is expected to be in the right state. 43617e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param stage 43717e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 43817e9e1933055b207473b488595b2887bfcaea32eJim Miller protected void updateStage(Stage stage) { 439eef72c39ae83697b1beaa148ec56aced67382fecalanv final Stage previousStage = mUiStage; 440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 44117e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage = stage; 442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 44317e9e1933055b207473b488595b2887bfcaea32eJim Miller // header text, footer text, visibility and 44417e9e1933055b207473b488595b2887bfcaea32eJim Miller // enabled state all known from the stage 44517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (stage == Stage.ChoiceTooShort) { 44617e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText( 44717e9e1933055b207473b488595b2887bfcaea32eJim Miller getResources().getString( 44817e9e1933055b207473b488595b2887bfcaea32eJim Miller stage.headerMessage, 44917e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternUtils.MIN_LOCK_PATTERN_SIZE)); 45017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 45117e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(stage.headerMessage); 45217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 45317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (stage.footerMessage == ID_EMPTY_MESSAGE) { 45417e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterText.setText(""); 45517e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 45617e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterText.setText(stage.footerMessage); 45717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 458afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 45917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (stage.leftMode == LeftButtonMode.Gone) { 46017e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setVisibility(View.GONE); 46117e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 46217e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setVisibility(View.VISIBLE); 46317e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setText(stage.leftMode.text); 46417e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterLeftButton.setEnabled(stage.leftMode.enabled); 46517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 466afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 46717e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterRightButton.setText(stage.rightMode.text); 46817e9e1933055b207473b488595b2887bfcaea32eJim Miller mFooterRightButton.setEnabled(stage.rightMode.enabled); 469afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 47017e9e1933055b207473b488595b2887bfcaea32eJim Miller // same for whether the patten is enabled 47117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (stage.patternEnabled) { 47217e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.enableInput(); 47317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 47417e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.disableInput(); 47517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 476afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 47717e9e1933055b207473b488595b2887bfcaea32eJim Miller // the rest of the stuff varies enough that it is easier just to handle 47817e9e1933055b207473b488595b2887bfcaea32eJim Miller // on a case by case basis. 47917e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setDisplayMode(DisplayMode.Correct); 48017e9e1933055b207473b488595b2887bfcaea32eJim Miller 48117e9e1933055b207473b488595b2887bfcaea32eJim Miller switch (mUiStage) { 48217e9e1933055b207473b488595b2887bfcaea32eJim Miller case Introduction: 48317e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.clearPattern(); 48417e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 48517e9e1933055b207473b488595b2887bfcaea32eJim Miller case HelpScreen: 48617e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setPattern(DisplayMode.Animate, mAnimatePattern); 48717e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 48817e9e1933055b207473b488595b2887bfcaea32eJim Miller case ChoiceTooShort: 48917e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setDisplayMode(DisplayMode.Wrong); 49017e9e1933055b207473b488595b2887bfcaea32eJim Miller postClearPatternRunnable(); 49117e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 49217e9e1933055b207473b488595b2887bfcaea32eJim Miller case FirstChoiceValid: 49317e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 49417e9e1933055b207473b488595b2887bfcaea32eJim Miller case NeedToConfirm: 49517e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.clearPattern(); 49617e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 49717e9e1933055b207473b488595b2887bfcaea32eJim Miller case ConfirmWrong: 49817e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.setDisplayMode(DisplayMode.Wrong); 49917e9e1933055b207473b488595b2887bfcaea32eJim Miller postClearPatternRunnable(); 50017e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 50117e9e1933055b207473b488595b2887bfcaea32eJim Miller case ChoiceConfirmed: 50217e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 50317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 504eef72c39ae83697b1beaa148ec56aced67382fecalanv 505eef72c39ae83697b1beaa148ec56aced67382fecalanv // If the stage changed, announce the header for accessibility. This 506eef72c39ae83697b1beaa148ec56aced67382fecalanv // is a no-op when accessibility is disabled. 507eef72c39ae83697b1beaa148ec56aced67382fecalanv if (previousStage != stage) { 508eef72c39ae83697b1beaa148ec56aced67382fecalanv mHeaderText.announceForAccessibility(mHeaderText.getText()); 509eef72c39ae83697b1beaa148ec56aced67382fecalanv } 510afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 511afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 512afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 51317e9e1933055b207473b488595b2887bfcaea32eJim Miller // clear the wrong pattern unless they have started a new one 51417e9e1933055b207473b488595b2887bfcaea32eJim Miller // already 51517e9e1933055b207473b488595b2887bfcaea32eJim Miller private void postClearPatternRunnable() { 51617e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.removeCallbacks(mClearPatternRunnable); 51717e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternView.postDelayed(mClearPatternRunnable, WRONG_PATTERN_CLEAR_TIMEOUT_MS); 51817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 519afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 52017e9e1933055b207473b488595b2887bfcaea32eJim Miller private void saveChosenPatternAndFinish() { 52117e9e1933055b207473b488595b2887bfcaea32eJim Miller LockPatternUtils utils = mChooseLockSettingsHelper.utils(); 52217e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean lockVirgin = !utils.isPatternEverChosen(); 523e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project 5245541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller final boolean isFallback = getActivity().getIntent() 5255541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false); 5265541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller utils.saveLockPattern(mChosenPattern, isFallback); 52717e9e1933055b207473b488595b2887bfcaea32eJim Miller utils.setLockPatternEnabled(true); 528e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project 52917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (lockVirgin) { 53017e9e1933055b207473b488595b2887bfcaea32eJim Miller utils.setVisiblePatternEnabled(true); 53117e9e1933055b207473b488595b2887bfcaea32eJim Miller } 53200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 53317e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(RESULT_FINISHED); 53417e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 53517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 536afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 537afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 538