ChooseLockPattern.java revision cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0c
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
198a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger;
20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.google.android.collect.Lists;
21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient;
22bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xiaimport com.android.internal.widget.LockPatternChecker;
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.widget.LockPatternUtils;
24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.widget.LockPatternView;
2556544d0e9198ab21dabec621cdf419b52b412dacJim Millerimport com.android.internal.widget.LockPatternView.Cell;
266f60f7ed22f94891156115643452a32d0324f65aAdrian Roosimport com.android.settings.notification.RedactionInterstitial;
2717e9e1933055b207473b488595b2887bfcaea32eJim Miller
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport static com.android.internal.widget.LockPatternView.DisplayMode;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity;
3117e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.app.Fragment;
320698a216311acd9ab52224602d1a75c08bf89f04Jim Millerimport android.content.Context;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
34bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xiaimport android.os.AsyncTask;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
365437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roosimport android.os.UserHandle;
3791e6c499ca8f33cc093fed4277d2b48ab780b309Andres Moralesimport android.util.Log;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.KeyEvent;
3917e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.view.LayoutInflater;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
4117e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.view.ViewGroup;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Collections;
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * If the user has a lock pattern set already, makes them confirm the existing one.
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Then, prompts the user to choose a lock pattern:
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * - prompts for initial pattern
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * - asks for confirmation / restart
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * - saves chosen password when confirmed
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
56263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ChooseLockPattern extends SettingsActivity {
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /**
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Used by the choose lock pattern wizard to indicate the wizard is
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * finished, and each activity in the wizard should finish.
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * <p>
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Previously, each activity in the wizard would finish itself after
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * starting the next activity. However, this leads to broken 'Back'
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * behavior. So, now an activity does not finish itself until it gets this
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * result.
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    static final int RESULT_FINISHED = RESULT_FIRST_USER;
6700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller
6891e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales    private static final String TAG = "ChooseLockPattern";
6991e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales
7017e9e1933055b207473b488595b2887bfcaea32eJim Miller    @Override
7117e9e1933055b207473b488595b2887bfcaea32eJim Miller    public Intent getIntent() {
7217e9e1933055b207473b488595b2887bfcaea32eJim Miller        Intent modIntent = new Intent(super.getIntent());
736b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName());
7417e9e1933055b207473b488595b2887bfcaea32eJim Miller        return modIntent;
7517e9e1933055b207473b488595b2887bfcaea32eJim Miller    }
7600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller
77f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos    public static Intent createIntent(Context context,
780698a216311acd9ab52224602d1a75c08bf89f04Jim Miller            boolean requirePassword, boolean confirmCredentials) {
790698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        Intent intent = new Intent(context, ChooseLockPattern.class);
800698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        intent.putExtra("key_lock_method", "pattern");
810698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        intent.putExtra(ChooseLockGeneric.CONFIRM_CREDENTIALS, confirmCredentials);
820698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        intent.putExtra(EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, requirePassword);
830698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        return intent;
840698a216311acd9ab52224602d1a75c08bf89f04Jim Miller    }
850698a216311acd9ab52224602d1a75c08bf89f04Jim Miller
86a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales    public static Intent createIntent(Context context,
87a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales            boolean requirePassword, String pattern) {
88a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        Intent intent = createIntent(context, requirePassword, false);
89a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, pattern);
90a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        return intent;
91a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales    }
92a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales
936609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales
946609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales    public static Intent createIntent(Context context,
956609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            boolean requirePassword, long challenge) {
966609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        Intent intent = createIntent(context, requirePassword, false);
976609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true);
986609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge);
996609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        return intent;
1006609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales    }
1016609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales
10217e9e1933055b207473b488595b2887bfcaea32eJim Miller    @Override
103a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    protected boolean isValidFragment(String fragmentName) {
104a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani        if (ChooseLockPatternFragment.class.getName().equals(fragmentName)) return true;
105a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani        return false;
106a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    }
107a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani
1086b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam    /* package */ Class<? extends Fragment> getFragmentClass() {
1096b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        return ChooseLockPatternFragment.class;
1106b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam    }
1116b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam
112a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    @Override
11317e9e1933055b207473b488595b2887bfcaea32eJim Miller    public void onCreate(Bundle savedInstanceState) {
11417e9e1933055b207473b488595b2887bfcaea32eJim Miller        // requestWindowFeature(Window.FEATURE_NO_TITLE);
11517e9e1933055b207473b488595b2887bfcaea32eJim Miller        super.onCreate(savedInstanceState);
1168c74072e9cad7ae7cf7266f87b8f202aa42939ceJim Miller        CharSequence msg = getText(R.string.lockpassword_choose_your_pattern_header);
117263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio        setTitle(msg);
11817e9e1933055b207473b488595b2887bfcaea32eJim Miller    }
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
12017e9e1933055b207473b488595b2887bfcaea32eJim Miller    @Override
12117e9e1933055b207473b488595b2887bfcaea32eJim Miller    public boolean onKeyDown(int keyCode, KeyEvent event) {
12217e9e1933055b207473b488595b2887bfcaea32eJim Miller        // *** TODO ***
12317e9e1933055b207473b488595b2887bfcaea32eJim Miller        // chooseLockPatternFragment.onKeyDown(keyCode, event);
12417e9e1933055b207473b488595b2887bfcaea32eJim Miller        return super.onKeyDown(keyCode, event);
12517e9e1933055b207473b488595b2887bfcaea32eJim Miller    }
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1278a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    public static class ChooseLockPatternFragment extends InstrumentedFragment
12817e9e1933055b207473b488595b2887bfcaea32eJim Miller            implements View.OnClickListener {
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
13017e9e1933055b207473b488595b2887bfcaea32eJim Miller        public static final int CONFIRM_EXISTING_REQUEST = 55;
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
13217e9e1933055b207473b488595b2887bfcaea32eJim Miller        // how long after a confirmation message is shown before moving on
13317e9e1933055b207473b488595b2887bfcaea32eJim Miller        static final int INFORMATION_MSG_TIMEOUT_MS = 3000;
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
13517e9e1933055b207473b488595b2887bfcaea32eJim Miller        // how long we wait to clear a wrong pattern
13617e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 2000;
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
13817e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final int ID_EMPTY_MESSAGE = -1;
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
140a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        private String mCurrentPattern;
1416609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        private boolean mHasChallenge;
1426609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        private long mChallenge;
14317e9e1933055b207473b488595b2887bfcaea32eJim Miller        protected TextView mHeaderText;
14417e9e1933055b207473b488595b2887bfcaea32eJim Miller        protected LockPatternView mLockPatternView;
14517e9e1933055b207473b488595b2887bfcaea32eJim Miller        protected TextView mFooterText;
14617e9e1933055b207473b488595b2887bfcaea32eJim Miller        private TextView mFooterLeftButton;
14717e9e1933055b207473b488595b2887bfcaea32eJim Miller        private TextView mFooterRightButton;
14817e9e1933055b207473b488595b2887bfcaea32eJim Miller        protected List<LockPatternView.Cell> mChosenPattern = null;
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
15017e9e1933055b207473b488595b2887bfcaea32eJim Miller        /**
15117e9e1933055b207473b488595b2887bfcaea32eJim Miller         * The patten used during the help screen to show how to draw a pattern.
15217e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
15317e9e1933055b207473b488595b2887bfcaea32eJim Miller        private final List<LockPatternView.Cell> mAnimatePattern =
15417e9e1933055b207473b488595b2887bfcaea32eJim Miller                Collections.unmodifiableList(Lists.newArrayList(
15517e9e1933055b207473b488595b2887bfcaea32eJim Miller                        LockPatternView.Cell.of(0, 0),
15617e9e1933055b207473b488595b2887bfcaea32eJim Miller                        LockPatternView.Cell.of(0, 1),
15717e9e1933055b207473b488595b2887bfcaea32eJim Miller                        LockPatternView.Cell.of(1, 1),
15817e9e1933055b207473b488595b2887bfcaea32eJim Miller                        LockPatternView.Cell.of(2, 1)
15917e9e1933055b207473b488595b2887bfcaea32eJim Miller                ));
16017e9e1933055b207473b488595b2887bfcaea32eJim Miller
16117e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
16217e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onActivityResult(int requestCode, int resultCode,
16317e9e1933055b207473b488595b2887bfcaea32eJim Miller                Intent data) {
16417e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onActivityResult(requestCode, resultCode, data);
16517e9e1933055b207473b488595b2887bfcaea32eJim Miller            switch (requestCode) {
16617e9e1933055b207473b488595b2887bfcaea32eJim Miller                case CONFIRM_EXISTING_REQUEST:
16717e9e1933055b207473b488595b2887bfcaea32eJim Miller                    if (resultCode != Activity.RESULT_OK) {
16817e9e1933055b207473b488595b2887bfcaea32eJim Miller                        getActivity().setResult(RESULT_FINISHED);
16917e9e1933055b207473b488595b2887bfcaea32eJim Miller                        getActivity().finish();
170a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                    } else {
171a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                        mCurrentPattern = data.getStringExtra(
172a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                                ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
17317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
174a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales
17517e9e1933055b207473b488595b2887bfcaea32eJim Miller                    updateStage(Stage.Introduction);
17617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    break;
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
17817e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
180af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam        protected void setRightButtonEnabled(boolean enabled) {
181af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam            mFooterRightButton.setEnabled(enabled);
182af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam        }
183af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam
184af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam        protected void setRightButtonText(int text) {
185af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam            mFooterRightButton.setText(text);
186af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam        }
187af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam
18817e9e1933055b207473b488595b2887bfcaea32eJim Miller        /**
18917e9e1933055b207473b488595b2887bfcaea32eJim Miller         * The pattern listener that responds according to a user choosing a new
19017e9e1933055b207473b488595b2887bfcaea32eJim Miller         * lock pattern.
19117e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
19217e9e1933055b207473b488595b2887bfcaea32eJim Miller        protected LockPatternView.OnPatternListener mChooseNewLockPatternListener =
19317e9e1933055b207473b488595b2887bfcaea32eJim Miller                new LockPatternView.OnPatternListener() {
19417e9e1933055b207473b488595b2887bfcaea32eJim Miller
19517e9e1933055b207473b488595b2887bfcaea32eJim Miller                public void onPatternStart() {
19617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mLockPatternView.removeCallbacks(mClearPatternRunnable);
19717e9e1933055b207473b488595b2887bfcaea32eJim Miller                    patternInProgress();
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
20017e9e1933055b207473b488595b2887bfcaea32eJim Miller                public void onPatternCleared() {
20117e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mLockPatternView.removeCallbacks(mClearPatternRunnable);
20217e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
20356544d0e9198ab21dabec621cdf419b52b412dacJim Miller
20417e9e1933055b207473b488595b2887bfcaea32eJim Miller                public void onPatternDetected(List<LockPatternView.Cell> pattern) {
20517e9e1933055b207473b488595b2887bfcaea32eJim Miller                    if (mUiStage == Stage.NeedToConfirm || mUiStage == Stage.ConfirmWrong) {
20617e9e1933055b207473b488595b2887bfcaea32eJim Miller                        if (mChosenPattern == null) throw new IllegalStateException(
20717e9e1933055b207473b488595b2887bfcaea32eJim Miller                                "null chosen pattern in stage 'need to confirm");
20817e9e1933055b207473b488595b2887bfcaea32eJim Miller                        if (mChosenPattern.equals(pattern)) {
20917e9e1933055b207473b488595b2887bfcaea32eJim Miller                            updateStage(Stage.ChoiceConfirmed);
21017e9e1933055b207473b488595b2887bfcaea32eJim Miller                        } else {
21117e9e1933055b207473b488595b2887bfcaea32eJim Miller                            updateStage(Stage.ConfirmWrong);
21217e9e1933055b207473b488595b2887bfcaea32eJim Miller                        }
21317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (mUiStage == Stage.Introduction || mUiStage == Stage.ChoiceTooShort){
21417e9e1933055b207473b488595b2887bfcaea32eJim Miller                        if (pattern.size() < LockPatternUtils.MIN_LOCK_PATTERN_SIZE) {
21517e9e1933055b207473b488595b2887bfcaea32eJim Miller                            updateStage(Stage.ChoiceTooShort);
21617e9e1933055b207473b488595b2887bfcaea32eJim Miller                        } else {
21717e9e1933055b207473b488595b2887bfcaea32eJim Miller                            mChosenPattern = new ArrayList<LockPatternView.Cell>(pattern);
21817e9e1933055b207473b488595b2887bfcaea32eJim Miller                            updateStage(Stage.FirstChoiceValid);
21917e9e1933055b207473b488595b2887bfcaea32eJim Miller                        }
22017e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else {
22117e9e1933055b207473b488595b2887bfcaea32eJim Miller                        throw new IllegalStateException("Unexpected stage " + mUiStage + " when "
22217e9e1933055b207473b488595b2887bfcaea32eJim Miller                                + "entering the pattern.");
22317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
22417e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
22556544d0e9198ab21dabec621cdf419b52b412dacJim Miller
22617e9e1933055b207473b488595b2887bfcaea32eJim Miller                public void onPatternCellAdded(List<Cell> pattern) {
227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
22817e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
23017e9e1933055b207473b488595b2887bfcaea32eJim Miller                private void patternInProgress() {
23117e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mHeaderText.setText(R.string.lockpattern_recording_inprogress);
23217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mFooterText.setText("");
23317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mFooterLeftButton.setEnabled(false);
23417e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mFooterRightButton.setEnabled(false);
23517e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
23617e9e1933055b207473b488595b2887bfcaea32eJim Miller         };
237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2388a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        @Override
2398a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        protected int getMetricsCategory() {
2408a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren            return MetricsLogger.CHOOSE_LOCK_PATTERN;
2418a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        }
2428a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        /**
24517e9e1933055b207473b488595b2887bfcaea32eJim Miller         * The states of the left footer button.
246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         */
24717e9e1933055b207473b488595b2887bfcaea32eJim Miller        enum LeftButtonMode {
24817e9e1933055b207473b488595b2887bfcaea32eJim Miller            Cancel(R.string.cancel, true),
24917e9e1933055b207473b488595b2887bfcaea32eJim Miller            CancelDisabled(R.string.cancel, false),
25017e9e1933055b207473b488595b2887bfcaea32eJim Miller            Retry(R.string.lockpattern_retry_button_text, true),
25117e9e1933055b207473b488595b2887bfcaea32eJim Miller            RetryDisabled(R.string.lockpattern_retry_button_text, false),
25217e9e1933055b207473b488595b2887bfcaea32eJim Miller            Gone(ID_EMPTY_MESSAGE, false);
25317e9e1933055b207473b488595b2887bfcaea32eJim Miller
25417e9e1933055b207473b488595b2887bfcaea32eJim Miller
25517e9e1933055b207473b488595b2887bfcaea32eJim Miller            /**
25617e9e1933055b207473b488595b2887bfcaea32eJim Miller             * @param text The displayed text for this mode.
25717e9e1933055b207473b488595b2887bfcaea32eJim Miller             * @param enabled Whether the button should be enabled.
25817e9e1933055b207473b488595b2887bfcaea32eJim Miller             */
25917e9e1933055b207473b488595b2887bfcaea32eJim Miller            LeftButtonMode(int text, boolean enabled) {
26017e9e1933055b207473b488595b2887bfcaea32eJim Miller                this.text = text;
26117e9e1933055b207473b488595b2887bfcaea32eJim Miller                this.enabled = enabled;
26217e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
26417e9e1933055b207473b488595b2887bfcaea32eJim Miller            final int text;
26517e9e1933055b207473b488595b2887bfcaea32eJim Miller            final boolean enabled;
26617e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        /**
26917e9e1933055b207473b488595b2887bfcaea32eJim Miller         * The states of the right button.
270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         */
27117e9e1933055b207473b488595b2887bfcaea32eJim Miller        enum RightButtonMode {
27217e9e1933055b207473b488595b2887bfcaea32eJim Miller            Continue(R.string.lockpattern_continue_button_text, true),
27317e9e1933055b207473b488595b2887bfcaea32eJim Miller            ContinueDisabled(R.string.lockpattern_continue_button_text, false),
27417e9e1933055b207473b488595b2887bfcaea32eJim Miller            Confirm(R.string.lockpattern_confirm_button_text, true),
27517e9e1933055b207473b488595b2887bfcaea32eJim Miller            ConfirmDisabled(R.string.lockpattern_confirm_button_text, false),
27617e9e1933055b207473b488595b2887bfcaea32eJim Miller            Ok(android.R.string.ok, true);
27717e9e1933055b207473b488595b2887bfcaea32eJim Miller
27817e9e1933055b207473b488595b2887bfcaea32eJim Miller            /**
27917e9e1933055b207473b488595b2887bfcaea32eJim Miller             * @param text The displayed text for this mode.
28017e9e1933055b207473b488595b2887bfcaea32eJim Miller             * @param enabled Whether the button should be enabled.
28117e9e1933055b207473b488595b2887bfcaea32eJim Miller             */
28217e9e1933055b207473b488595b2887bfcaea32eJim Miller            RightButtonMode(int text, boolean enabled) {
28317e9e1933055b207473b488595b2887bfcaea32eJim Miller                this.text = text;
28417e9e1933055b207473b488595b2887bfcaea32eJim Miller                this.enabled = enabled;
28517e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
28717e9e1933055b207473b488595b2887bfcaea32eJim Miller            final int text;
28817e9e1933055b207473b488595b2887bfcaea32eJim Miller            final boolean enabled;
28917e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        /**
29217e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Keep track internally of where the user is in choosing a pattern.
293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         */
29417e9e1933055b207473b488595b2887bfcaea32eJim Miller        protected enum Stage {
29517e9e1933055b207473b488595b2887bfcaea32eJim Miller
29617e9e1933055b207473b488595b2887bfcaea32eJim Miller            Introduction(
29717e9e1933055b207473b488595b2887bfcaea32eJim Miller                    R.string.lockpattern_recording_intro_header,
29817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    LeftButtonMode.Cancel, RightButtonMode.ContinueDisabled,
29963cf89a49a751c49bf60b9898e7d59f02b91c046Jim Miller                    ID_EMPTY_MESSAGE, true),
30017e9e1933055b207473b488595b2887bfcaea32eJim Miller            HelpScreen(
30117e9e1933055b207473b488595b2887bfcaea32eJim Miller                    R.string.lockpattern_settings_help_how_to_record,
30217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    LeftButtonMode.Gone, RightButtonMode.Ok, ID_EMPTY_MESSAGE, false),
30317e9e1933055b207473b488595b2887bfcaea32eJim Miller            ChoiceTooShort(
30417e9e1933055b207473b488595b2887bfcaea32eJim Miller                    R.string.lockpattern_recording_incorrect_too_short,
30517e9e1933055b207473b488595b2887bfcaea32eJim Miller                    LeftButtonMode.Retry, RightButtonMode.ContinueDisabled,
30617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    ID_EMPTY_MESSAGE, true),
30717e9e1933055b207473b488595b2887bfcaea32eJim Miller            FirstChoiceValid(
30817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    R.string.lockpattern_pattern_entered_header,
30917e9e1933055b207473b488595b2887bfcaea32eJim Miller                    LeftButtonMode.Retry, RightButtonMode.Continue, ID_EMPTY_MESSAGE, false),
31017e9e1933055b207473b488595b2887bfcaea32eJim Miller            NeedToConfirm(
31117e9e1933055b207473b488595b2887bfcaea32eJim Miller                    R.string.lockpattern_need_to_confirm,
31277cb854d689cd5c49e14f80abb7803d77ced2e79Jim Miller                    LeftButtonMode.Cancel, RightButtonMode.ConfirmDisabled,
31317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    ID_EMPTY_MESSAGE, true),
31417e9e1933055b207473b488595b2887bfcaea32eJim Miller            ConfirmWrong(
31517e9e1933055b207473b488595b2887bfcaea32eJim Miller                    R.string.lockpattern_need_to_unlock_wrong,
31617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    LeftButtonMode.Cancel, RightButtonMode.ConfirmDisabled,
31717e9e1933055b207473b488595b2887bfcaea32eJim Miller                    ID_EMPTY_MESSAGE, true),
31817e9e1933055b207473b488595b2887bfcaea32eJim Miller            ChoiceConfirmed(
31917e9e1933055b207473b488595b2887bfcaea32eJim Miller                    R.string.lockpattern_pattern_confirmed_header,
32017e9e1933055b207473b488595b2887bfcaea32eJim Miller                    LeftButtonMode.Cancel, RightButtonMode.Confirm, ID_EMPTY_MESSAGE, false);
32117e9e1933055b207473b488595b2887bfcaea32eJim Miller
32217e9e1933055b207473b488595b2887bfcaea32eJim Miller
32317e9e1933055b207473b488595b2887bfcaea32eJim Miller            /**
32417e9e1933055b207473b488595b2887bfcaea32eJim Miller             * @param headerMessage The message displayed at the top.
32517e9e1933055b207473b488595b2887bfcaea32eJim Miller             * @param leftMode The mode of the left button.
32617e9e1933055b207473b488595b2887bfcaea32eJim Miller             * @param rightMode The mode of the right button.
32717e9e1933055b207473b488595b2887bfcaea32eJim Miller             * @param footerMessage The footer message.
32817e9e1933055b207473b488595b2887bfcaea32eJim Miller             * @param patternEnabled Whether the pattern widget is enabled.
32917e9e1933055b207473b488595b2887bfcaea32eJim Miller             */
33017e9e1933055b207473b488595b2887bfcaea32eJim Miller            Stage(int headerMessage,
33117e9e1933055b207473b488595b2887bfcaea32eJim Miller                    LeftButtonMode leftMode,
33217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    RightButtonMode rightMode,
33317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    int footerMessage, boolean patternEnabled) {
33417e9e1933055b207473b488595b2887bfcaea32eJim Miller                this.headerMessage = headerMessage;
33517e9e1933055b207473b488595b2887bfcaea32eJim Miller                this.leftMode = leftMode;
33617e9e1933055b207473b488595b2887bfcaea32eJim Miller                this.rightMode = rightMode;
33717e9e1933055b207473b488595b2887bfcaea32eJim Miller                this.footerMessage = footerMessage;
33817e9e1933055b207473b488595b2887bfcaea32eJim Miller                this.patternEnabled = patternEnabled;
33917e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
34017e9e1933055b207473b488595b2887bfcaea32eJim Miller
34117e9e1933055b207473b488595b2887bfcaea32eJim Miller            final int headerMessage;
34217e9e1933055b207473b488595b2887bfcaea32eJim Miller            final LeftButtonMode leftMode;
34317e9e1933055b207473b488595b2887bfcaea32eJim Miller            final RightButtonMode rightMode;
34417e9e1933055b207473b488595b2887bfcaea32eJim Miller            final int footerMessage;
34517e9e1933055b207473b488595b2887bfcaea32eJim Miller            final boolean patternEnabled;
346afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
34817e9e1933055b207473b488595b2887bfcaea32eJim Miller        private Stage mUiStage = Stage.Introduction;
349afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
35017e9e1933055b207473b488595b2887bfcaea32eJim Miller        private Runnable mClearPatternRunnable = new Runnable() {
35117e9e1933055b207473b488595b2887bfcaea32eJim Miller            public void run() {
35217e9e1933055b207473b488595b2887bfcaea32eJim Miller                mLockPatternView.clearPattern();
35317e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
35417e9e1933055b207473b488595b2887bfcaea32eJim Miller        };
355afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
35617e9e1933055b207473b488595b2887bfcaea32eJim Miller        private ChooseLockSettingsHelper mChooseLockSettingsHelper;
357bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia        private AsyncTask<?, ?, ?> mPendingLockCheck;
358afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
35917e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UI_STAGE = "uiStage";
36017e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_PATTERN_CHOICE = "chosenPattern";
361a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        private static final String KEY_CURRENT_PATTERN = "currentPattern";
36200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller
36317e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
36417e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onCreate(Bundle savedInstanceState) {
36517e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onCreate(savedInstanceState);
36617e9e1933055b207473b488595b2887bfcaea32eJim Miller            mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity());
36766026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            if (!(getActivity() instanceof ChooseLockPattern)) {
36866026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani                throw new SecurityException("Fragment contained in wrong activity");
36966026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            }
37017e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
37217e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
37317e9e1933055b207473b488595b2887bfcaea32eJim Miller        public View onCreateView(LayoutInflater inflater, ViewGroup container,
37417e9e1933055b207473b488595b2887bfcaea32eJim Miller                Bundle savedInstanceState) {
3756b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam            return inflater.inflate(R.layout.choose_lock_pattern, container, false);
3766b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        }
37717e9e1933055b207473b488595b2887bfcaea32eJim Miller
3786b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        @Override
3796b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        public void onViewCreated(View view, Bundle savedInstanceState) {
3806b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam            super.onViewCreated(view, savedInstanceState);
38117e9e1933055b207473b488595b2887bfcaea32eJim Miller            mHeaderText = (TextView) view.findViewById(R.id.headerText);
38217e9e1933055b207473b488595b2887bfcaea32eJim Miller            mLockPatternView = (LockPatternView) view.findViewById(R.id.lockPattern);
38317e9e1933055b207473b488595b2887bfcaea32eJim Miller            mLockPatternView.setOnPatternListener(mChooseNewLockPatternListener);
38417e9e1933055b207473b488595b2887bfcaea32eJim Miller            mLockPatternView.setTactileFeedbackEnabled(
38517e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mChooseLockSettingsHelper.utils().isTactileFeedbackEnabled());
38617e9e1933055b207473b488595b2887bfcaea32eJim Miller
38717e9e1933055b207473b488595b2887bfcaea32eJim Miller            mFooterText = (TextView) view.findViewById(R.id.footerText);
38817e9e1933055b207473b488595b2887bfcaea32eJim Miller
38917e9e1933055b207473b488595b2887bfcaea32eJim Miller            mFooterLeftButton = (TextView) view.findViewById(R.id.footerLeftButton);
39017e9e1933055b207473b488595b2887bfcaea32eJim Miller            mFooterRightButton = (TextView) view.findViewById(R.id.footerRightButton);
39117e9e1933055b207473b488595b2887bfcaea32eJim Miller
39217e9e1933055b207473b488595b2887bfcaea32eJim Miller            mFooterLeftButton.setOnClickListener(this);
39317e9e1933055b207473b488595b2887bfcaea32eJim Miller            mFooterRightButton.setOnClickListener(this);
39417e9e1933055b207473b488595b2887bfcaea32eJim Miller
39517e9e1933055b207473b488595b2887bfcaea32eJim Miller            // make it so unhandled touch events within the unlock screen go to the
39617e9e1933055b207473b488595b2887bfcaea32eJim Miller            // lock pattern view.
39717e9e1933055b207473b488595b2887bfcaea32eJim Miller            final LinearLayoutWithDefaultTouchRecepient topLayout
39817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    = (LinearLayoutWithDefaultTouchRecepient) view.findViewById(
39917e9e1933055b207473b488595b2887bfcaea32eJim Miller                    R.id.topLayout);
40017e9e1933055b207473b488595b2887bfcaea32eJim Miller            topLayout.setDefaultTouchRecepient(mLockPatternView);
40117e9e1933055b207473b488595b2887bfcaea32eJim Miller
40217e9e1933055b207473b488595b2887bfcaea32eJim Miller            final boolean confirmCredentials = getActivity().getIntent()
40366026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani                    .getBooleanExtra("confirm_credentials", true);
4046609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            Intent intent = getActivity().getIntent();
4056609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            mCurrentPattern = intent.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
4066609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            mHasChallenge = intent.getBooleanExtra(
4076609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false);
4086609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            mChallenge = intent.getLongExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0);
40917e9e1933055b207473b488595b2887bfcaea32eJim Miller
41017e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (savedInstanceState == null) {
41117e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (confirmCredentials) {
41217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    // first launch. As a security measure, we're in NeedToConfirm mode until we
41317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    // know there isn't an existing password or the user confirms their password.
41417e9e1933055b207473b488595b2887bfcaea32eJim Miller                    updateStage(Stage.NeedToConfirm);
41517e9e1933055b207473b488595b2887bfcaea32eJim Miller                    boolean launchedConfirmationActivity =
41617e9e1933055b207473b488595b2887bfcaea32eJim Miller                        mChooseLockSettingsHelper.launchConfirmationActivity(
4178a09b619aeb233e2aab1919301f162d8acf1f0f0Jorim Jaggi                                CONFIRM_EXISTING_REQUEST,
418a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                                getString(R.string.unlock_set_unlock_launch_picker_title), true);
41917e9e1933055b207473b488595b2887bfcaea32eJim Miller                    if (!launchedConfirmationActivity) {
42017e9e1933055b207473b488595b2887bfcaea32eJim Miller                        updateStage(Stage.Introduction);
42117e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
42217e9e1933055b207473b488595b2887bfcaea32eJim Miller                } else {
423bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller                    updateStage(Stage.Introduction);
424bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller                }
425bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            } else {
42617e9e1933055b207473b488595b2887bfcaea32eJim Miller                // restore from previous state
42717e9e1933055b207473b488595b2887bfcaea32eJim Miller                final String patternString = savedInstanceState.getString(KEY_PATTERN_CHOICE);
42817e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (patternString != null) {
42917e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mChosenPattern = LockPatternUtils.stringToPattern(patternString);
43017e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
431a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales
432a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                if (mCurrentPattern == null) {
433a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                    mCurrentPattern = savedInstanceState.getString(KEY_CURRENT_PATTERN);
434a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                }
43517e9e1933055b207473b488595b2887bfcaea32eJim Miller                updateStage(Stage.values()[savedInstanceState.getInt(KEY_UI_STAGE)]);
436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
439bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia        @Override
440bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia        public void onResume() {
441bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia            super.onResume();
442bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia            mLockPatternView.enableInput();
443bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia        }
444bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia
445bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia        @Override
446bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia        public void onPause() {
447bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia            super.onPause();
448bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia            if (mPendingLockCheck != null) {
449bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                mPendingLockCheck.cancel(false);
450bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                mPendingLockCheck = null;
451bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia            }
452bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia        }
453bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia
454ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam        protected Intent getRedactionInterstitialIntent(Context context) {
455ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam            return RedactionInterstitial.createStartIntent(context);
456ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam        }
457ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam
458af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam        public void handleLeftButton() {
459af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam            if (mUiStage.leftMode == LeftButtonMode.Retry) {
460af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                mChosenPattern = null;
461af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                mLockPatternView.clearPattern();
462af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                updateStage(Stage.Introduction);
463af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam            } else if (mUiStage.leftMode == LeftButtonMode.Cancel) {
464af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                getActivity().finish();
465af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam            } else {
466af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                throw new IllegalStateException("left footer button pressed, but stage of " +
46717e9e1933055b207473b488595b2887bfcaea32eJim Miller                        mUiStage + " doesn't make sense");
468af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam            }
469af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam        }
47017e9e1933055b207473b488595b2887bfcaea32eJim Miller
471af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam        public void handleRightButton() {
472af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam            if (mUiStage.rightMode == RightButtonMode.Continue) {
473af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                if (mUiStage != Stage.FirstChoiceValid) {
474af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                    throw new IllegalStateException("expected ui stage "
475af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                            + Stage.FirstChoiceValid + " when button is "
476af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                            + RightButtonMode.Continue);
477af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                }
478af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                updateStage(Stage.NeedToConfirm);
479af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam            } else if (mUiStage.rightMode == RightButtonMode.Confirm) {
480af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                if (mUiStage != Stage.ChoiceConfirmed) {
481af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                    throw new IllegalStateException("expected ui stage " + Stage.ChoiceConfirmed
482af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                            + " when button is " + RightButtonMode.Confirm);
483af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                }
484cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                new SaveChosenPatternAndFinish().execute();
485af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam            } else if (mUiStage.rightMode == RightButtonMode.Ok) {
486af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                if (mUiStage != Stage.HelpScreen) {
487af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                    throw new IllegalStateException("Help screen is only mode with ok button, "
488af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                            + "but stage is " + mUiStage);
489afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
490af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                mLockPatternView.clearPattern();
491af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                mLockPatternView.setDisplayMode(DisplayMode.Correct);
492af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                updateStage(Stage.Introduction);
493af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam            }
494af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam        }
495af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam
496af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam        public void onClick(View v) {
497af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam            if (v == mFooterLeftButton) {
498af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                handleLeftButton();
499af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam            } else if (v == mFooterRightButton) {
500af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam                handleRightButton();
501afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
502afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
503afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
50417e9e1933055b207473b488595b2887bfcaea32eJim Miller        public boolean onKeyDown(int keyCode, KeyEvent event) {
50517e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
50617e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (mUiStage == Stage.HelpScreen) {
50717e9e1933055b207473b488595b2887bfcaea32eJim Miller                    updateStage(Stage.Introduction);
50817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    return true;
50917e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
51017e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
51117e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (keyCode == KeyEvent.KEYCODE_MENU && mUiStage == Stage.Introduction) {
51217e9e1933055b207473b488595b2887bfcaea32eJim Miller                updateStage(Stage.HelpScreen);
513afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                return true;
514afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
51517e9e1933055b207473b488595b2887bfcaea32eJim Miller            return false;
516afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
517afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
51817e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onSaveInstanceState(Bundle outState) {
51917e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onSaveInstanceState(outState);
520afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
52117e9e1933055b207473b488595b2887bfcaea32eJim Miller            outState.putInt(KEY_UI_STAGE, mUiStage.ordinal());
52217e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (mChosenPattern != null) {
52317e9e1933055b207473b488595b2887bfcaea32eJim Miller                outState.putString(KEY_PATTERN_CHOICE,
52417e9e1933055b207473b488595b2887bfcaea32eJim Miller                        LockPatternUtils.patternToString(mChosenPattern));
52517e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
526a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales
527a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales            if (mCurrentPattern != null) {
528a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                outState.putString(KEY_CURRENT_PATTERN,
529a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                        mCurrentPattern);
530a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales            }
531afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
532afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
53317e9e1933055b207473b488595b2887bfcaea32eJim Miller        /**
53417e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Updates the messages and buttons appropriate to what stage the user
53517e9e1933055b207473b488595b2887bfcaea32eJim Miller         * is at in choosing a view.  This doesn't handle clearing out the pattern;
53617e9e1933055b207473b488595b2887bfcaea32eJim Miller         * the pattern is expected to be in the right state.
53717e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param stage
53817e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
53917e9e1933055b207473b488595b2887bfcaea32eJim Miller        protected void updateStage(Stage stage) {
540eef72c39ae83697b1beaa148ec56aced67382fecalanv            final Stage previousStage = mUiStage;
541afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
54217e9e1933055b207473b488595b2887bfcaea32eJim Miller            mUiStage = stage;
543afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
54417e9e1933055b207473b488595b2887bfcaea32eJim Miller            // header text, footer text, visibility and
54517e9e1933055b207473b488595b2887bfcaea32eJim Miller            // enabled state all known from the stage
54617e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (stage == Stage.ChoiceTooShort) {
54717e9e1933055b207473b488595b2887bfcaea32eJim Miller                mHeaderText.setText(
54817e9e1933055b207473b488595b2887bfcaea32eJim Miller                        getResources().getString(
54917e9e1933055b207473b488595b2887bfcaea32eJim Miller                                stage.headerMessage,
55017e9e1933055b207473b488595b2887bfcaea32eJim Miller                                LockPatternUtils.MIN_LOCK_PATTERN_SIZE));
55117e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
55217e9e1933055b207473b488595b2887bfcaea32eJim Miller                mHeaderText.setText(stage.headerMessage);
55317e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
55417e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (stage.footerMessage == ID_EMPTY_MESSAGE) {
55517e9e1933055b207473b488595b2887bfcaea32eJim Miller                mFooterText.setText("");
55617e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
55717e9e1933055b207473b488595b2887bfcaea32eJim Miller                mFooterText.setText(stage.footerMessage);
55817e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
559afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
56017e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (stage.leftMode == LeftButtonMode.Gone) {
56117e9e1933055b207473b488595b2887bfcaea32eJim Miller                mFooterLeftButton.setVisibility(View.GONE);
56217e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
56317e9e1933055b207473b488595b2887bfcaea32eJim Miller                mFooterLeftButton.setVisibility(View.VISIBLE);
56417e9e1933055b207473b488595b2887bfcaea32eJim Miller                mFooterLeftButton.setText(stage.leftMode.text);
56517e9e1933055b207473b488595b2887bfcaea32eJim Miller                mFooterLeftButton.setEnabled(stage.leftMode.enabled);
56617e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
567afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
568af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam            setRightButtonText(stage.rightMode.text);
569af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam            setRightButtonEnabled(stage.rightMode.enabled);
570afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
57117e9e1933055b207473b488595b2887bfcaea32eJim Miller            // same for whether the patten is enabled
57217e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (stage.patternEnabled) {
57317e9e1933055b207473b488595b2887bfcaea32eJim Miller                mLockPatternView.enableInput();
57417e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
57517e9e1933055b207473b488595b2887bfcaea32eJim Miller                mLockPatternView.disableInput();
57617e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
577afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
57817e9e1933055b207473b488595b2887bfcaea32eJim Miller            // the rest of the stuff varies enough that it is easier just to handle
57917e9e1933055b207473b488595b2887bfcaea32eJim Miller            // on a case by case basis.
58017e9e1933055b207473b488595b2887bfcaea32eJim Miller            mLockPatternView.setDisplayMode(DisplayMode.Correct);
58100da4f6d3b7cd2aa347b88e3f15b3b6ddd3e5803Selim Cinek            boolean announceAlways = false;
58217e9e1933055b207473b488595b2887bfcaea32eJim Miller
58317e9e1933055b207473b488595b2887bfcaea32eJim Miller            switch (mUiStage) {
58417e9e1933055b207473b488595b2887bfcaea32eJim Miller                case Introduction:
58517e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mLockPatternView.clearPattern();
58617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    break;
58717e9e1933055b207473b488595b2887bfcaea32eJim Miller                case HelpScreen:
58817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mLockPatternView.setPattern(DisplayMode.Animate, mAnimatePattern);
58917e9e1933055b207473b488595b2887bfcaea32eJim Miller                    break;
59017e9e1933055b207473b488595b2887bfcaea32eJim Miller                case ChoiceTooShort:
59117e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mLockPatternView.setDisplayMode(DisplayMode.Wrong);
59217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    postClearPatternRunnable();
59300da4f6d3b7cd2aa347b88e3f15b3b6ddd3e5803Selim Cinek                    announceAlways = true;
59417e9e1933055b207473b488595b2887bfcaea32eJim Miller                    break;
59517e9e1933055b207473b488595b2887bfcaea32eJim Miller                case FirstChoiceValid:
59617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    break;
59717e9e1933055b207473b488595b2887bfcaea32eJim Miller                case NeedToConfirm:
59817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mLockPatternView.clearPattern();
59917e9e1933055b207473b488595b2887bfcaea32eJim Miller                    break;
60017e9e1933055b207473b488595b2887bfcaea32eJim Miller                case ConfirmWrong:
60117e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mLockPatternView.setDisplayMode(DisplayMode.Wrong);
60217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    postClearPatternRunnable();
60300da4f6d3b7cd2aa347b88e3f15b3b6ddd3e5803Selim Cinek                    announceAlways = true;
60417e9e1933055b207473b488595b2887bfcaea32eJim Miller                    break;
60517e9e1933055b207473b488595b2887bfcaea32eJim Miller                case ChoiceConfirmed:
60617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    break;
60717e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
608eef72c39ae83697b1beaa148ec56aced67382fecalanv
609eef72c39ae83697b1beaa148ec56aced67382fecalanv            // If the stage changed, announce the header for accessibility. This
610eef72c39ae83697b1beaa148ec56aced67382fecalanv            // is a no-op when accessibility is disabled.
61100da4f6d3b7cd2aa347b88e3f15b3b6ddd3e5803Selim Cinek            if (previousStage != stage || announceAlways) {
612eef72c39ae83697b1beaa148ec56aced67382fecalanv                mHeaderText.announceForAccessibility(mHeaderText.getText());
613eef72c39ae83697b1beaa148ec56aced67382fecalanv            }
614afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
615afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
616afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
61717e9e1933055b207473b488595b2887bfcaea32eJim Miller        // clear the wrong pattern unless they have started a new one
61817e9e1933055b207473b488595b2887bfcaea32eJim Miller        // already
61917e9e1933055b207473b488595b2887bfcaea32eJim Miller        private void postClearPatternRunnable() {
62017e9e1933055b207473b488595b2887bfcaea32eJim Miller            mLockPatternView.removeCallbacks(mClearPatternRunnable);
62117e9e1933055b207473b488595b2887bfcaea32eJim Miller            mLockPatternView.postDelayed(mClearPatternRunnable, WRONG_PATTERN_CLEAR_TIMEOUT_MS);
62217e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
623afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
624cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence        private class SaveChosenPatternAndFinish extends AsyncTask<Void,Void,Void> {
625cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence            boolean mLockVirgin;
626cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence            LockPatternUtils mUtils;
627cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence            boolean mWasSecureBefore;
628e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project
629cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence            @Override
630cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence            protected void onPreExecute(){
631cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                setRightButtonEnabled(false);
632cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                mUtils = mChooseLockSettingsHelper.utils();
633cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                mLockVirgin = !mUtils.isPatternEverChosen(UserHandle.myUserId());
63490d6c568cf24178669254964af343f729639b31dAdrian Roos
635cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                mWasSecureBefore = mUtils.isSecure(UserHandle.myUserId());
636cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence
637cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                final boolean required = getActivity().getIntent().getBooleanExtra(
6380698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                    EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true);
639a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales
640cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                mUtils.setCredentialRequiredToDecrypt(required);
641cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence            }
642e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project
643cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence            @Override
644cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence            protected Void doInBackground(Void... params){
645cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                mUtils.saveLockPattern(mChosenPattern, mCurrentPattern, UserHandle.myUserId());
646cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                return null;
64717e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
64800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller
649cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence            @Override
650cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence            protected void onPostExecute(Void param) {
651cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                if (mLockVirgin) {
652cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                    mUtils.setVisiblePatternEnabled(true, UserHandle.myUserId());
653cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                }
654cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence
655cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                if (mHasChallenge) {
656cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                    startVerifyPattern(mUtils, mWasSecureBefore);
657cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                } else {
658cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                    if (!mWasSecureBefore) {
659cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                        Intent intent = getRedactionInterstitialIntent(getActivity());
660cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                        if (intent != null) {
661cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                            startActivity(intent);
662cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                        }
663ccade402782d9b39331ada3859aa00893132e5c9Alex Chau                    }
664cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                    getActivity().setResult(RESULT_FINISHED);
665cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence                    doFinish();
66658c5fb38c75cf04309f74927b3c91c54a645b690Jorim Jaggi                }
6676609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            }
668bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia        }
669bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia
67058c5fb38c75cf04309f74927b3c91c54a645b690Jorim Jaggi        private void startVerifyPattern(LockPatternUtils utils, final boolean wasSecureBefore) {
671bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia            mLockPatternView.disableInput();
672bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia            if (mPendingLockCheck != null) {
673bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                mPendingLockCheck.cancel(false);
674bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia            }
675bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia
676bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia            mPendingLockCheck = LockPatternChecker.verifyPattern(
677bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                    utils,
678bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                    mChosenPattern,
679bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                    mChallenge,
680bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                    UserHandle.myUserId(),
681bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                    new LockPatternChecker.OnVerifyCallback() {
682bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                        @Override
68391e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales                        public void onVerified(byte[] token, int timeoutMs) {
68491e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales                            if (token == null) {
68591e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales                                Log.e(TAG, "critical: no token returned for known good pattern");
68691e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales                            }
68791e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales
688bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                            mLockPatternView.enableInput();
689bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                            mPendingLockCheck = null;
690bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia
69158c5fb38c75cf04309f74927b3c91c54a645b690Jorim Jaggi                            if (!wasSecureBefore) {
692ccade402782d9b39331ada3859aa00893132e5c9Alex Chau                                Intent intent = getRedactionInterstitialIntent(getActivity());
693ccade402782d9b39331ada3859aa00893132e5c9Alex Chau                                if (intent != null) {
694ccade402782d9b39331ada3859aa00893132e5c9Alex Chau                                    startActivity(intent);
695ccade402782d9b39331ada3859aa00893132e5c9Alex Chau                                }
69658c5fb38c75cf04309f74927b3c91c54a645b690Jorim Jaggi                            }
69758c5fb38c75cf04309f74927b3c91c54a645b690Jorim Jaggi
698bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                            Intent intent = new Intent();
699bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                            intent.putExtra(
700bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                                    ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token);
701bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                            getActivity().setResult(RESULT_FINISHED, intent);
702bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                            doFinish();
703bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                        }
704bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia                    });
705bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia        }
706bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia
707bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia        private void doFinish() {
70847811fe057052df5ea20db06696d589965092b4bLucky Zhang            getActivity().finish();
70917e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
710afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
711afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
712