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