KeyguardAbsKeyInputView.java revision d5692742c1ff056e9fe55a495632229c86ed5384
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; 2169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.view.View; 2269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.view.ViewParent; 2369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 2469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport com.android.internal.widget.LockPatternUtils; 2569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport java.util.List; 2669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 2769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.app.admin.DevicePolicyManager; 2869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.content.res.Configuration; 2969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.graphics.Rect; 3069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 3169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport com.android.internal.widget.PasswordEntryKeyboardView; 3269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 3369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.os.CountDownTimer; 3469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.os.SystemClock; 3569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.text.Editable; 3669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.text.InputType; 3769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.text.SpannableStringBuilder; 3869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.text.TextWatcher; 3969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.text.method.DigitsKeyListener; 4069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.text.method.TextKeyListener; 4169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.text.style.TextAppearanceSpan; 4269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.view.KeyEvent; 4369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.view.inputmethod.EditorInfo; 4469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.view.inputmethod.InputMethodInfo; 4569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.view.inputmethod.InputMethodManager; 4669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.view.inputmethod.InputMethodSubtype; 4769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.widget.Button; 4869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.widget.EditText; 4969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.widget.LinearLayout; 5069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.widget.TextView; 5169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport android.widget.TextView.OnEditorActionListener; 5269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 5369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerimport com.android.internal.R; 5469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 5569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler/** 5669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler * Base class for PIN and password unlock screens. 5769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler */ 5869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandlerpublic abstract class KeyguardAbsKeyInputView extends LinearLayout 5969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler implements KeyguardSecurityView, OnEditorActionListener, TextWatcher { 6069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler protected KeyguardSecurityCallback mCallback; 61d5692742c1ff056e9fe55a495632229c86ed5384Daniel Sandler protected TextView mPasswordEntry; 6269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler protected LockPatternUtils mLockPatternUtils; 6369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler protected SecurityMessageDisplay mSecurityMessageDisplay; 6469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 6569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler // To avoid accidental lockout due to events while the device in in the pocket, ignore 6669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler // any passwords with length less than or equal to this length. 6769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler protected static final int MINIMUM_PASSWORD_LENGTH_BEFORE_REPORT = 3; 6869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 6969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public KeyguardAbsKeyInputView(Context context) { 7069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler this(context, null); 7169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 7269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 7369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public KeyguardAbsKeyInputView(Context context, AttributeSet attrs) { 7469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler super(context, attrs); 7569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 7669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 7769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public void setKeyguardCallback(KeyguardSecurityCallback callback) { 7869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mCallback = callback; 7969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 8069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 8169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public void setLockPatternUtils(LockPatternUtils utils) { 8269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mLockPatternUtils = utils; 8369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 8469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 8569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler @Override 8669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public void onWindowFocusChanged(boolean hasWindowFocus) { 8769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler if (hasWindowFocus) { 8869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler reset(); 8969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 9069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 9169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 9269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public void reset() { 9369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler // start fresh 9469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mPasswordEntry.setText(""); 9569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mPasswordEntry.requestFocus(); 9669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 9769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler // if the user is currently locked out, enforce it. 9869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler long deadline = mLockPatternUtils.getLockoutAttemptDeadline(); 9969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler if (deadline != 0) { 10069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler handleAttemptLockout(deadline); 10169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } else { 10269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler resetState(); 10369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 10469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 10569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 10669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler protected abstract void resetState(); 10769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 10869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler @Override 10969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler protected void onFinishInflate() { 11069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler // We always set a dummy NavigationManager to avoid null checks 11169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mSecurityMessageDisplay = new KeyguardNavigationManager(null); 11269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 11369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mLockPatternUtils = new LockPatternUtils(mContext); // TODO: use common one 11469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 115d5692742c1ff056e9fe55a495632229c86ed5384Daniel Sandler mPasswordEntry = (TextView) findViewById(R.id.passwordEntry); 11669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mPasswordEntry.setOnEditorActionListener(this); 11769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mPasswordEntry.addTextChangedListener(this); 11869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 11969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler // Poke the wakelock any time the text is selected or modified 12069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mPasswordEntry.setOnClickListener(new OnClickListener() { 12169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public void onClick(View v) { 12269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mCallback.userActivity(0); // TODO: customize timeout for text? 12369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 12469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler }); 12569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 12669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mPasswordEntry.addTextChangedListener(new TextWatcher() { 12769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public void onTextChanged(CharSequence s, int start, int before, int count) { 12869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 12969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 13069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public void beforeTextChanged(CharSequence s, int start, int count, int after) { 13169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 13269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 13369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public void afterTextChanged(Editable s) { 13469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler if (mCallback != null) { 13569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mCallback.userActivity(0); 13669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 13769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 13869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler }); 13969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 14069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 14169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler @Override 14269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) { 14369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler // send focus to the password field 14469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler return mPasswordEntry.requestFocus(direction, previouslyFocusedRect); 14569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 14669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 14769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler protected void verifyPasswordAndUnlock() { 14869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler String entry = mPasswordEntry.getText().toString(); 14969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler if (mLockPatternUtils.checkPassword(entry)) { 15069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mCallback.reportSuccessfulUnlockAttempt(); 15169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mCallback.dismiss(true); 15269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } else if (entry.length() > MINIMUM_PASSWORD_LENGTH_BEFORE_REPORT ) { 15369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler // to avoid accidental lockout, only count attempts that are long enough to be a 15469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler // real password. This may require some tweaking. 15569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mCallback.reportFailedUnlockAttempt(); 15669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler if (0 == (mCallback.getFailedAttempts() 15769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler % LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT)) { 15869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler long deadline = mLockPatternUtils.setLockoutAttemptDeadline(); 15969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler handleAttemptLockout(deadline); 16069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 16169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mSecurityMessageDisplay.setMessage(R.string.kg_wrong_pin, true); 16269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 16369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mPasswordEntry.setText(""); 16469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 16569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 16669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler // Prevent user from using the PIN/Password entry until scheduled deadline. 16769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler protected void handleAttemptLockout(long elapsedRealtimeDeadline) { 16869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mPasswordEntry.setEnabled(false); 16969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler long elapsedRealtime = SystemClock.elapsedRealtime(); 17069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler new CountDownTimer(elapsedRealtimeDeadline - elapsedRealtime, 1000) { 17169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 17269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler @Override 17369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public void onTick(long millisUntilFinished) { 17469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler int secondsRemaining = (int) (millisUntilFinished / 1000); 17569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mSecurityMessageDisplay.setMessage( 17669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler R.string.kg_too_many_failed_attempts_countdown, true, secondsRemaining); 17769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 17869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 17969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler @Override 18069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public void onFinish() { 18169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler resetState(); 18269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 18369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler }.start(); 18469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 18569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 18669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler @Override 18769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public boolean onKeyDown(int keyCode, KeyEvent event) { 18869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mCallback.userActivity(0); 18969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler return false; 19069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 19169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 19269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler @Override 19369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 19469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler // Check if this was the result of hitting the enter key 19569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler if (actionId == EditorInfo.IME_NULL || actionId == EditorInfo.IME_ACTION_DONE 19669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler || actionId == EditorInfo.IME_ACTION_NEXT) { 19769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler verifyPasswordAndUnlock(); 19869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler return true; 19969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 20069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler return false; 20169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 20269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 20369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler @Override 20469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public boolean needsInput() { 20569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler return false; 20669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 20769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 20869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler @Override 20969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public void onPause() { 21069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 21169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 21269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 21369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler @Override 21469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public void onResume() { 21569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler reset(); 21669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 21769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 21869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler @Override 21969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public KeyguardSecurityCallback getCallback() { 22069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler return mCallback; 22169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 22269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 22369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler @Override 22469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public void beforeTextChanged(CharSequence s, int start, int count, int after) { 22569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler if (mCallback != null) { 22669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mCallback.userActivity(KeyguardViewManager.DIGIT_PRESS_WAKE_MILLIS); 22769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 22869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 22969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 23069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler @Override 23169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public void onTextChanged(CharSequence s, int start, int before, int count) { 23269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 23369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 23469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler @Override 23569bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public void afterTextChanged(Editable s) { 23669bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 23769bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 23869bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler @Override 23969bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler public void setSecurityMessageDisplay(SecurityMessageDisplay display) { 24069bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler mSecurityMessageDisplay = display; 24169bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler reset(); 24269bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler } 24369bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler} 24469bdee7c873c4a2295651efda2d0e79c515acc17Daniel Sandler 245