blob: 532670f6a5d04b11b31de89032a7d33db12a64fe [file] [log] [blame]
Daniel Sandler69bdee72012-10-23 16:45:50 -04001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Jim Miller5ecd8112013-01-09 18:50:26 -080017package com.android.keyguard;
Daniel Sandler69bdee72012-10-23 16:45:50 -040018
19import android.content.Context;
20import android.content.res.TypedArray;
21import android.text.SpannableStringBuilder;
22import android.text.style.TextAppearanceSpan;
23import android.util.AttributeSet;
Daniel Sandleracb60fb2012-10-25 10:46:37 -040024import android.view.HapticFeedbackConstants;
Daniel Sandler69bdee72012-10-23 16:45:50 -040025import android.view.View;
26import android.widget.Button;
Daniel Sandler69bdee72012-10-23 16:45:50 -040027import android.widget.TextView;
28
Daniel Sandleracb60fb2012-10-25 10:46:37 -040029import com.android.internal.widget.LockPatternUtils;
Daniel Sandler69bdee72012-10-23 16:45:50 -040030
31public class NumPadKey extends Button {
Daniel Sandlerd5692742012-10-24 00:21:32 -040032 // list of "ABC", etc per digit, starting with '0'
33 static String sKlondike[];
Daniel Sandler69bdee72012-10-23 16:45:50 -040034
35 int mDigit = -1;
36 int mTextViewResId;
37 TextView mTextView = null;
Daniel Sandleracb60fb2012-10-25 10:46:37 -040038 boolean mEnableHaptics;
Daniel Sandler69bdee72012-10-23 16:45:50 -040039
40 private View.OnClickListener mListener = new View.OnClickListener() {
41 @Override
42 public void onClick(View thisView) {
43 if (mTextView == null) {
44 if (mTextViewResId > 0) {
45 final View v = NumPadKey.this.getRootView().findViewById(mTextViewResId);
46 if (v != null && v instanceof TextView) {
47 mTextView = (TextView) v;
48 }
49 }
50 }
Daniel Sandler6a64ac52012-11-01 11:58:13 -040051 // check for time-based lockouts
52 if (mTextView != null && mTextView.isEnabled()) {
Daniel Sandler69bdee72012-10-23 16:45:50 -040053 mTextView.append(String.valueOf(mDigit));
54 }
Daniel Sandleracb60fb2012-10-25 10:46:37 -040055 doHapticKeyClick();
Daniel Sandler69bdee72012-10-23 16:45:50 -040056 }
57 };
58
59 public NumPadKey(Context context) {
60 this(context, null);
61 }
62
63 public NumPadKey(Context context, AttributeSet attrs) {
64 this(context, attrs, 0);
65 }
66
67 public NumPadKey(Context context, AttributeSet attrs, int defStyle) {
68 super(context, attrs, defStyle);
69
70 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.NumPadKey);
71 mDigit = a.getInt(R.styleable.NumPadKey_digit, mDigit);
72 setTextViewResId(a.getResourceId(R.styleable.NumPadKey_textView, 0));
73
74 setOnClickListener(mListener);
alanvc7375af2012-10-30 17:07:37 -070075 setOnHoverListener(new LiftToActivateListener(context));
alanv0cbbc572012-11-02 11:56:27 -070076 setAccessibilityDelegate(new ObscureSpeechDelegate(context));
Daniel Sandler69bdee72012-10-23 16:45:50 -040077
Daniel Sandleracb60fb2012-10-25 10:46:37 -040078 mEnableHaptics = new LockPatternUtils(context).isTactileFeedbackEnabled();
79
Daniel Sandler69bdee72012-10-23 16:45:50 -040080 SpannableStringBuilder builder = new SpannableStringBuilder();
81 builder.append(String.valueOf(mDigit));
82 if (mDigit >= 0) {
Daniel Sandlerd5692742012-10-24 00:21:32 -040083 if (sKlondike == null) {
84 sKlondike = context.getResources().getStringArray(
85 R.array.lockscreen_num_pad_klondike);
86 }
87 if (sKlondike != null && sKlondike.length > mDigit) {
88 final String extra = sKlondike[mDigit];
89 final int extraLen = extra.length();
90 if (extraLen > 0) {
Daniel Sandler80bc85a2012-11-02 15:00:22 -040091 builder.append(" ");
Daniel Sandlerd5692742012-10-24 00:21:32 -040092 builder.append(extra);
93 builder.setSpan(
94 new TextAppearanceSpan(context, R.style.TextAppearance_NumPadKey_Klondike),
Daniel Sandler69bdee72012-10-23 16:45:50 -040095 builder.length()-extraLen, builder.length(), 0);
Daniel Sandlerd5692742012-10-24 00:21:32 -040096 }
Daniel Sandler69bdee72012-10-23 16:45:50 -040097 }
98 }
99 setText(builder);
100 }
101
alanv0cbbc572012-11-02 11:56:27 -0700102 @Override
103 public void onDetachedFromWindow() {
104 super.onDetachedFromWindow();
105
106 // Reset the "announced headset" flag when detached.
107 ObscureSpeechDelegate.sAnnouncedHeadset = false;
108 }
109
Daniel Sandler69bdee72012-10-23 16:45:50 -0400110 public void setTextView(TextView tv) {
111 mTextView = tv;
112 }
113
114 public void setTextViewResId(int resId) {
115 mTextView = null;
116 mTextViewResId = resId;
117 }
Daniel Sandleracb60fb2012-10-25 10:46:37 -0400118
119 // Cause a VIRTUAL_KEY vibration
120 public void doHapticKeyClick() {
121 if (mEnableHaptics) {
122 performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY,
123 HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING
124 | HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
125 }
126 }
Daniel Sandlerd5692742012-10-24 00:21:32 -0400127}