KeyguardAbsKeyInputView.java revision acb60fb57783b517e52fa60b1fa5f977141180c1
169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler/*
269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * Copyright (C) 2012 The Android Open Source Project
369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler *
469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * Licensed under the Apache License, Version 2.0 (the "License");
569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * you may not use this file except in compliance with the License.
669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * You may obtain a copy of the License at
769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler *
869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler *      http://www.apache.org/licenses/LICENSE-2.0
969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler *
1069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * Unless required by applicable law or agreed to in writing, software
1169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * distributed under the License is distributed on an "AS IS" BASIS,
1269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * See the License for the specific language governing permissions and
1469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * limitations under the License.
1569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler */
1669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
1769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerpackage com.android.internal.policy.impl.keyguard;
1869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
1969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.content.Context;
2069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.util.AttributeSet;
21acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandlerimport android.view.HapticFeedbackConstants;
2269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.view.View;
2369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.view.ViewParent;
2469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
2569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport com.android.internal.widget.LockPatternUtils;
2669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport java.util.List;
2769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
2869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.app.admin.DevicePolicyManager;
2969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.content.res.Configuration;
3069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.graphics.Rect;
3169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
3269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport com.android.internal.widget.PasswordEntryKeyboardView;
3369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
3469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.os.CountDownTimer;
3569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.os.SystemClock;
3669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.text.Editable;
3769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.text.InputType;
3869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.text.SpannableStringBuilder;
3969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.text.TextWatcher;
4069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.text.method.DigitsKeyListener;
4169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.text.method.TextKeyListener;
4269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.text.style.TextAppearanceSpan;
4369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.view.KeyEvent;
4469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.view.inputmethod.EditorInfo;
4569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.view.inputmethod.InputMethodInfo;
4669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.view.inputmethod.InputMethodManager;
4769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.view.inputmethod.InputMethodSubtype;
4869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.widget.Button;
4969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.widget.EditText;
5069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.widget.LinearLayout;
5169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.widget.TextView;
5269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.widget.TextView.OnEditorActionListener;
5369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
5469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport com.android.internal.R;
5569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
5669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler/**
5769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * Base class for PIN and password unlock screens.
5869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler */
5969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerpublic abstract class KeyguardAbsKeyInputView extends LinearLayout
6069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        implements KeyguardSecurityView, OnEditorActionListener, TextWatcher {
6169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected KeyguardSecurityCallback mCallback;
62d5692742c1ff056e9fe55a495632229c86ed5384Daniel Sandler    protected TextView mPasswordEntry;
6369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected LockPatternUtils mLockPatternUtils;
6469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected SecurityMessageDisplay mSecurityMessageDisplay;
65acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler    protected boolean mEnableHaptics;
6669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
6769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    // To avoid accidental lockout due to events while the device in in the pocket, ignore
6869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    // any passwords with length less than or equal to this length.
6969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected static final int MINIMUM_PASSWORD_LENGTH_BEFORE_REPORT = 3;
7069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
7169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public KeyguardAbsKeyInputView(Context context) {
7269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        this(context, null);
7369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
7469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
7569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public KeyguardAbsKeyInputView(Context context, AttributeSet attrs) {
7669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        super(context, attrs);
7769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
7869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
7969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void setKeyguardCallback(KeyguardSecurityCallback callback) {
8069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mCallback = callback;
8169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
8269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
8369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void setLockPatternUtils(LockPatternUtils utils) {
8469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mLockPatternUtils = utils;
85acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler        mEnableHaptics = mLockPatternUtils.isTactileFeedbackEnabled();
8669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
8769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
8869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
8969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void onWindowFocusChanged(boolean hasWindowFocus) {
9069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        if (hasWindowFocus) {
9169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            reset();
9269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        }
9369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
9469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
9569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void reset() {
9669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        // start fresh
9769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mPasswordEntry.setText("");
9869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mPasswordEntry.requestFocus();
9969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
10069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        // if the user is currently locked out, enforce it.
10169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        long deadline = mLockPatternUtils.getLockoutAttemptDeadline();
10269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        if (deadline != 0) {
10369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            handleAttemptLockout(deadline);
10469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        } else {
10569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            resetState();
10669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        }
10769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
10869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
10969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected abstract void resetState();
11069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
11169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
11269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected void onFinishInflate() {
11369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        // We always set a dummy NavigationManager to avoid null checks
11469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mSecurityMessageDisplay = new KeyguardNavigationManager(null);
11569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
116acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler        mLockPatternUtils = new LockPatternUtils(mContext);
11769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
118d5692742c1ff056e9fe55a495632229c86ed5384Daniel Sandler        mPasswordEntry = (TextView) findViewById(R.id.passwordEntry);
11969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mPasswordEntry.setOnEditorActionListener(this);
12069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mPasswordEntry.addTextChangedListener(this);
12169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
12269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        // Poke the wakelock any time the text is selected or modified
12369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mPasswordEntry.setOnClickListener(new OnClickListener() {
12469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            public void onClick(View v) {
12569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                mCallback.userActivity(0); // TODO: customize timeout for text?
12669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            }
12769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        });
12869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
12969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mPasswordEntry.addTextChangedListener(new TextWatcher() {
13069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            public void onTextChanged(CharSequence s, int start, int before, int count) {
13169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            }
13269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
13369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
13469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            }
13569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
13669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            public void afterTextChanged(Editable s) {
13769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                if (mCallback != null) {
13869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                    mCallback.userActivity(0);
13969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                }
14069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            }
14169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        });
14269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
14369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
14469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
14569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
14669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        // send focus to the password field
14769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        return mPasswordEntry.requestFocus(direction, previouslyFocusedRect);
14869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
14969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
15069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected void verifyPasswordAndUnlock() {
15169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        String entry = mPasswordEntry.getText().toString();
15269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        if (mLockPatternUtils.checkPassword(entry)) {
15369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            mCallback.reportSuccessfulUnlockAttempt();
15469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            mCallback.dismiss(true);
15569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        } else if (entry.length() > MINIMUM_PASSWORD_LENGTH_BEFORE_REPORT ) {
15669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            // to avoid accidental lockout, only count attempts that are long enough to be a
15769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            // real password. This may require some tweaking.
15869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            mCallback.reportFailedUnlockAttempt();
15969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            if (0 == (mCallback.getFailedAttempts()
16069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                    % LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT)) {
16169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                long deadline = mLockPatternUtils.setLockoutAttemptDeadline();
16269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                handleAttemptLockout(deadline);
16369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            }
16469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            mSecurityMessageDisplay.setMessage(R.string.kg_wrong_pin, true);
16569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        }
16669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mPasswordEntry.setText("");
16769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
16869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
16969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    // Prevent user from using the PIN/Password entry until scheduled deadline.
17069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected void handleAttemptLockout(long elapsedRealtimeDeadline) {
17169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mPasswordEntry.setEnabled(false);
17269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        long elapsedRealtime = SystemClock.elapsedRealtime();
17369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        new CountDownTimer(elapsedRealtimeDeadline - elapsedRealtime, 1000) {
17469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
17569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            @Override
17669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            public void onTick(long millisUntilFinished) {
17769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                int secondsRemaining = (int) (millisUntilFinished / 1000);
17869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                mSecurityMessageDisplay.setMessage(
17969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                        R.string.kg_too_many_failed_attempts_countdown, true, secondsRemaining);
18069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            }
18169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
18269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            @Override
18369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            public void onFinish() {
18469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                resetState();
18569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            }
18669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        }.start();
18769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
18869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
18969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
19069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public boolean onKeyDown(int keyCode, KeyEvent event) {
19169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mCallback.userActivity(0);
19269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        return false;
19369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
19469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
19569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
19669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
19769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        // Check if this was the result of hitting the enter key
19869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        if (actionId == EditorInfo.IME_NULL || actionId == EditorInfo.IME_ACTION_DONE
19969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                || actionId == EditorInfo.IME_ACTION_NEXT) {
20069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            verifyPasswordAndUnlock();
20169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            return true;
20269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        }
20369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        return false;
20469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
20569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
20669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
20769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public boolean needsInput() {
20869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        return false;
20969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
21069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
21169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
21269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void onPause() {
21369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
21469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
21569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
21669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
21769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void onResume() {
21869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        reset();
21969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
22069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
22169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
22269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public KeyguardSecurityCallback getCallback() {
22369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        return mCallback;
22469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
22569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
22669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
22769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
22869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        if (mCallback != null) {
22969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            mCallback.userActivity(KeyguardViewManager.DIGIT_PRESS_WAKE_MILLIS);
23069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        }
23169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
23269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
23369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
23469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void onTextChanged(CharSequence s, int start, int before, int count) {
23569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
23669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
23769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
23869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void afterTextChanged(Editable s) {
23969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
24069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
24169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
24269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void setSecurityMessageDisplay(SecurityMessageDisplay display) {
24369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mSecurityMessageDisplay = display;
24469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        reset();
24569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
246acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler
247acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler    // Cause a VIRTUAL_KEY vibration
248acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler    public void doHapticKeyClick() {
249acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler        if (mEnableHaptics) {
250acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler            performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY,
251acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler                    HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING
252acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler                    | HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
253acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler        }
254acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler    }
25569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler}
25669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
257