summaryrefslogtreecommitdiff
path: root/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
diff options
context:
space:
mode:
authorJason Monk <jmonk@google.com>2017-01-31 14:29:32 -0500
committerJason Monk <jmonk@google.com>2017-02-10 07:45:58 -0800
commit23f85ec14dab49b2c525dc266d2a1f74f7f9d07c (patch)
treef7543adafe98131df4e94785f26f3cb3dab1ba16 /packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
parentefdb4289597ad1594eb906aeafd2ebdf8854bdc7 (diff)
Move Keyguard to SystemUI
Test: make Change-Id: I3abb67e2b022737d2aa0226bb07f3966ad68fff7
Diffstat (limited to 'packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java')
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java255
1 files changed, 255 insertions, 0 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
new file mode 100644
index 000000000000..108b466e44af
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.keyguard;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.View;
+
+/**
+ * A Pin based Keyguard input view
+ */
+public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView
+ implements View.OnKeyListener, View.OnTouchListener {
+
+ protected PasswordTextView mPasswordEntry;
+ private View mOkButton;
+ private View mDeleteButton;
+ private View mButton0;
+ private View mButton1;
+ private View mButton2;
+ private View mButton3;
+ private View mButton4;
+ private View mButton5;
+ private View mButton6;
+ private View mButton7;
+ private View mButton8;
+ private View mButton9;
+
+ public KeyguardPinBasedInputView(Context context) {
+ this(context, null);
+ }
+
+ public KeyguardPinBasedInputView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ public void reset() {
+ mPasswordEntry.requestFocus();
+ super.reset();
+ }
+
+ @Override
+ protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
+ // send focus to the password field
+ return mPasswordEntry.requestFocus(direction, previouslyFocusedRect);
+ }
+
+ @Override
+ protected void resetState() {
+ setPasswordEntryEnabled(true);
+ }
+
+ @Override
+ protected void setPasswordEntryEnabled(boolean enabled) {
+ mPasswordEntry.setEnabled(enabled);
+ mOkButton.setEnabled(enabled);
+ }
+
+ @Override
+ protected void setPasswordEntryInputEnabled(boolean enabled) {
+ mPasswordEntry.setEnabled(enabled);
+ mOkButton.setEnabled(enabled);
+ }
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if (KeyEvent.isConfirmKey(keyCode)) {
+ performClick(mOkButton);
+ return true;
+ } else if (keyCode == KeyEvent.KEYCODE_DEL) {
+ performClick(mDeleteButton);
+ return true;
+ }
+ if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {
+ int number = keyCode - KeyEvent.KEYCODE_0;
+ performNumberClick(number);
+ return true;
+ }
+ if (keyCode >= KeyEvent.KEYCODE_NUMPAD_0 && keyCode <= KeyEvent.KEYCODE_NUMPAD_9) {
+ int number = keyCode - KeyEvent.KEYCODE_NUMPAD_0;
+ performNumberClick(number);
+ return true;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ @Override
+ protected int getPromtReasonStringRes(int reason) {
+ switch (reason) {
+ case PROMPT_REASON_RESTART:
+ return R.string.kg_prompt_reason_restart_pin;
+ case PROMPT_REASON_TIMEOUT:
+ return R.string.kg_prompt_reason_timeout_pin;
+ case PROMPT_REASON_DEVICE_ADMIN:
+ return R.string.kg_prompt_reason_device_admin;
+ case PROMPT_REASON_USER_REQUEST:
+ return R.string.kg_prompt_reason_user_request;
+ case PROMPT_REASON_NONE:
+ return 0;
+ default:
+ return R.string.kg_prompt_reason_timeout_pin;
+ }
+ }
+
+ private void performClick(View view) {
+ view.performClick();
+ }
+
+ private void performNumberClick(int number) {
+ switch (number) {
+ case 0:
+ performClick(mButton0);
+ break;
+ case 1:
+ performClick(mButton1);
+ break;
+ case 2:
+ performClick(mButton2);
+ break;
+ case 3:
+ performClick(mButton3);
+ break;
+ case 4:
+ performClick(mButton4);
+ break;
+ case 5:
+ performClick(mButton5);
+ break;
+ case 6:
+ performClick(mButton6);
+ break;
+ case 7:
+ performClick(mButton7);
+ break;
+ case 8:
+ performClick(mButton8);
+ break;
+ case 9:
+ performClick(mButton9);
+ break;
+ }
+ }
+
+ @Override
+ protected void resetPasswordText(boolean animate, boolean announce) {
+ mPasswordEntry.reset(animate, announce);
+ }
+
+ @Override
+ protected String getPasswordText() {
+ return mPasswordEntry.getText();
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ mPasswordEntry = (PasswordTextView) findViewById(getPasswordTextViewId());
+ mPasswordEntry.setOnKeyListener(this);
+
+ // Set selected property on so the view can send accessibility events.
+ mPasswordEntry.setSelected(true);
+
+ mPasswordEntry.setUserActivityListener(new PasswordTextView.UserActivityListener() {
+ @Override
+ public void onUserActivity() {
+ onUserInput();
+ }
+ });
+
+ mOkButton = findViewById(R.id.key_enter);
+ if (mOkButton != null) {
+ mOkButton.setOnTouchListener(this);
+ mOkButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mPasswordEntry.isEnabled()) {
+ verifyPasswordAndUnlock();
+ }
+ }
+ });
+ mOkButton.setOnHoverListener(new LiftToActivateListener(getContext()));
+ }
+
+ mDeleteButton = findViewById(R.id.delete_button);
+ mDeleteButton.setVisibility(View.VISIBLE);
+ mDeleteButton.setOnTouchListener(this);
+ mDeleteButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // check for time-based lockouts
+ if (mPasswordEntry.isEnabled()) {
+ mPasswordEntry.deleteLastChar();
+ }
+ }
+ });
+ mDeleteButton.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ // check for time-based lockouts
+ if (mPasswordEntry.isEnabled()) {
+ resetPasswordText(true /* animate */, true /* announce */);
+ }
+ doHapticKeyClick();
+ return true;
+ }
+ });
+
+ mButton0 = findViewById(R.id.key0);
+ mButton1 = findViewById(R.id.key1);
+ mButton2 = findViewById(R.id.key2);
+ mButton3 = findViewById(R.id.key3);
+ mButton4 = findViewById(R.id.key4);
+ mButton5 = findViewById(R.id.key5);
+ mButton6 = findViewById(R.id.key6);
+ mButton7 = findViewById(R.id.key7);
+ mButton8 = findViewById(R.id.key8);
+ mButton9 = findViewById(R.id.key9);
+
+ mPasswordEntry.requestFocus();
+ super.onFinishInflate();
+ }
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
+ doHapticKeyClick();
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ return onKeyDown(keyCode, event);
+ }
+ return false;
+ }
+}