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.graphics.Rect;
21c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wrenimport android.graphics.drawable.Drawable;
2269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.os.CountDownTimer;
2369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.os.SystemClock;
2469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.text.Editable;
2569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.text.TextWatcher;
261254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurkaimport android.util.AttributeSet;
271254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurkaimport android.view.HapticFeedbackConstants;
2869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.view.KeyEvent;
291254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurkaimport android.view.View;
3069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.view.inputmethod.EditorInfo;
3169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.widget.LinearLayout;
3269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.widget.TextView;
3369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.widget.TextView.OnEditorActionListener;
3469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
3569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport com.android.internal.R;
361254f2f42f7173ef51d0034975ab5cb7d44f8209Michael Jurkaimport com.android.internal.widget.LockPatternUtils;
3769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
3869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler/**
3969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * Base class for PIN and password unlock screens.
4069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler */
4169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerpublic abstract class KeyguardAbsKeyInputView extends LinearLayout
4269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        implements KeyguardSecurityView, OnEditorActionListener, TextWatcher {
4369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected KeyguardSecurityCallback mCallback;
44d5692742c1ff056e9fe55a495632229c86ed5384Daniel Sandler    protected TextView mPasswordEntry;
4569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected LockPatternUtils mLockPatternUtils;
4669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected SecurityMessageDisplay mSecurityMessageDisplay;
47c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    protected View mEcaView;
48c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    private Drawable mBouncerFrame;
49acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler    protected boolean mEnableHaptics;
5069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
5169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    // To avoid accidental lockout due to events while the device in in the pocket, ignore
5269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    // any passwords with length less than or equal to this length.
5369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected static final int MINIMUM_PASSWORD_LENGTH_BEFORE_REPORT = 3;
5469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
5569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public KeyguardAbsKeyInputView(Context context) {
5669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        this(context, null);
5769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
5869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
5969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public KeyguardAbsKeyInputView(Context context, AttributeSet attrs) {
6069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        super(context, attrs);
6169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
6269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
6369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void setKeyguardCallback(KeyguardSecurityCallback callback) {
6469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mCallback = callback;
6569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
6669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
6769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void setLockPatternUtils(LockPatternUtils utils) {
6869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mLockPatternUtils = utils;
69acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler        mEnableHaptics = mLockPatternUtils.isTactileFeedbackEnabled();
7069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
7169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
7269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
7369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void onWindowFocusChanged(boolean hasWindowFocus) {
7469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        if (hasWindowFocus) {
7569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            reset();
7669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        }
7769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
7869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
7969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void reset() {
8069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        // start fresh
8169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mPasswordEntry.setText("");
8269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mPasswordEntry.requestFocus();
8369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
8469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        // if the user is currently locked out, enforce it.
8569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        long deadline = mLockPatternUtils.getLockoutAttemptDeadline();
8669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        if (deadline != 0) {
8769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            handleAttemptLockout(deadline);
8869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        } else {
8969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            resetState();
9069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        }
9169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
9269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
938a26bf5aea45650a14215d398c7d0909fcf80c43Daniel Sandler    protected abstract int getPasswordTextViewId();
9469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected abstract void resetState();
9569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
9669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
9769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected void onFinishInflate() {
98acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler        mLockPatternUtils = new LockPatternUtils(mContext);
9969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
1008a26bf5aea45650a14215d398c7d0909fcf80c43Daniel Sandler        mPasswordEntry = (TextView) findViewById(getPasswordTextViewId());
10169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mPasswordEntry.setOnEditorActionListener(this);
10269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mPasswordEntry.addTextChangedListener(this);
10369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
104c7375afef77b29b7fdb25f48dbe649b7b7fd487calanv        // Set selected property on so the view can send accessibility events.
105c7375afef77b29b7fdb25f48dbe649b7b7fd487calanv        mPasswordEntry.setSelected(true);
106c7375afef77b29b7fdb25f48dbe649b7b7fd487calanv
10769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        // Poke the wakelock any time the text is selected or modified
10869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mPasswordEntry.setOnClickListener(new OnClickListener() {
10969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            public void onClick(View v) {
11069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                mCallback.userActivity(0); // TODO: customize timeout for text?
11169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            }
11269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        });
11369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
11469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mPasswordEntry.addTextChangedListener(new TextWatcher() {
11569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            public void onTextChanged(CharSequence s, int start, int before, int count) {
11669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            }
11769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
11869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
11969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            }
12069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
12169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            public void afterTextChanged(Editable s) {
12269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                if (mCallback != null) {
12369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                    mCallback.userActivity(0);
12469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                }
12569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            }
12669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        });
1270b728244dc87b4a453f2191c2cb37a86e91aee0aJim Miller        mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this);
128c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren        mEcaView = findViewById(R.id.keyguard_selector_fade_container);
129c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren        View bouncerFrameView = findViewById(R.id.keyguard_bouncer_frame);
130c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren        if (bouncerFrameView != null) {
131c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren            mBouncerFrame = bouncerFrameView.getBackground();
132c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren        }
13369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
13469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
13569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
13669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
13769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        // send focus to the password field
13869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        return mPasswordEntry.requestFocus(direction, previouslyFocusedRect);
13969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
14069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
141261b18aaecad87cb0bf64bda86e64257d09c291dDaniel Sandler    /*
142261b18aaecad87cb0bf64bda86e64257d09c291dDaniel Sandler     * Override this if you have a different string for "wrong password"
143261b18aaecad87cb0bf64bda86e64257d09c291dDaniel Sandler     *
144261b18aaecad87cb0bf64bda86e64257d09c291dDaniel Sandler     * Note that PIN/PUK have their own implementation of verifyPasswordAndUnlock and so don't need this
145261b18aaecad87cb0bf64bda86e64257d09c291dDaniel Sandler     */
146261b18aaecad87cb0bf64bda86e64257d09c291dDaniel Sandler    protected int getWrongPasswordStringId() {
147261b18aaecad87cb0bf64bda86e64257d09c291dDaniel Sandler        return R.string.kg_wrong_password;
148261b18aaecad87cb0bf64bda86e64257d09c291dDaniel Sandler    }
149261b18aaecad87cb0bf64bda86e64257d09c291dDaniel 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            }
16416d90923149435cc7f565f684d42ecd074712ce5Daniel Sandler            mSecurityMessageDisplay.setMessage(getWrongPasswordStringId(), 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() {
1846a64ac56b7a8b81e6f24b5ad9856185488f4178dDaniel Sandler                mSecurityMessageDisplay.setMessage("", false);
18569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                resetState();
18669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            }
18769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        }.start();
18869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
18969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
19069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
19169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public boolean onKeyDown(int keyCode, KeyEvent event) {
19269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        mCallback.userActivity(0);
19369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        return false;
19469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
19569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
19669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
19769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
19869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        // Check if this was the result of hitting the enter key
19969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        if (actionId == EditorInfo.IME_NULL || actionId == EditorInfo.IME_ACTION_DONE
20069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler                || actionId == EditorInfo.IME_ACTION_NEXT) {
20169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            verifyPasswordAndUnlock();
20269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            return true;
20369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        }
20469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        return false;
20569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
20669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
20769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
20869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public boolean needsInput() {
20969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        return false;
21069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
21169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
21269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
21369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void onPause() {
21469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
21569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
21669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
21769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
218a042ac90640c0c3fd3c5349083b86bbfd6319b64Chris Wren    public void onResume(int reason) {
21969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        reset();
22069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
22169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
22269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
22369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public KeyguardSecurityCallback getCallback() {
22469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        return mCallback;
22569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
22669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
22769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
22869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
22969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        if (mCallback != null) {
23069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler            mCallback.userActivity(KeyguardViewManager.DIGIT_PRESS_WAKE_MILLIS);
23169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler        }
23269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
23369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
23469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
23569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void onTextChanged(CharSequence s, int start, int before, int count) {
23669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
23769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
23869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    @Override
23969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    public void afterTextChanged(Editable s) {
24069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler    }
24169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
242acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler    // Cause a VIRTUAL_KEY vibration
243acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler    public void doHapticKeyClick() {
244acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler        if (mEnableHaptics) {
245acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler            performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY,
246acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler                    HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING
247acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler                    | HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
248acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler        }
249acb60fb57783b517e52fa60b1fa5f977141180c1Daniel Sandler    }
250c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren
251c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    @Override
252c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    public void showBouncer(int duration) {
253c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren        KeyguardSecurityViewHelper.
254c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren                showBouncer(mSecurityMessageDisplay, mEcaView, mBouncerFrame, duration);
255c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    }
256c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren
257c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    @Override
258c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    public void hideBouncer(int duration) {
259c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren        KeyguardSecurityViewHelper.
260c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren                hideBouncer(mSecurityMessageDisplay, mEcaView, mBouncerFrame, duration);
261c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    }
26269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler}
26369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler
264