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