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