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