Files
frameworks_base/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
Phil Weaver 385912ee2d Deprecate "speak passwords" setting.
This will now be controlled by individual accessibility services.
We'll provide the password information to them, and they can
present or hide the information as it makes sense for their users.

Password information was anyway provided when a headset was
connected.

Bug: 28139568
Test: Manually verified that TalkBack now speaks passwords on the
lock screen and in text views. Since I'm removing functionality
that didn't have tests, it's tricky to have specific tests.
Change-Id: Ic3c724ccce5762ee9dcd9e7dcbd4eae6734dd05e
2017-02-21 15:24:54 -08:00

172 lines
6.0 KiB
Java

/*
* Copyright (C) 2012 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.content.res.TypedArray;
import android.os.PowerManager;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.view.HapticFeedbackConstants;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.android.internal.widget.LockPatternUtils;
public class NumPadKey extends ViewGroup {
// list of "ABC", etc per digit, starting with '0'
static String sKlondike[];
private int mDigit = -1;
private int mTextViewResId;
private PasswordTextView mTextView;
private TextView mDigitText;
private TextView mKlondikeText;
private boolean mEnableHaptics;
private PowerManager mPM;
private View.OnClickListener mListener = new View.OnClickListener() {
@Override
public void onClick(View thisView) {
if (mTextView == null && mTextViewResId > 0) {
final View v = NumPadKey.this.getRootView().findViewById(mTextViewResId);
if (v != null && v instanceof PasswordTextView) {
mTextView = (PasswordTextView) v;
}
}
if (mTextView != null && mTextView.isEnabled()) {
mTextView.append(Character.forDigit(mDigit, 10));
}
userActivity();;
}
};
public void userActivity() {
mPM.userActivity(SystemClock.uptimeMillis(), false);
}
public NumPadKey(Context context) {
this(context, null);
}
public NumPadKey(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public NumPadKey(Context context, AttributeSet attrs, int defStyle) {
this(context, attrs, defStyle, R.layout.keyguard_num_pad_key);
}
protected NumPadKey(Context context, AttributeSet attrs, int defStyle, int contentResource) {
super(context, attrs, defStyle);
setFocusable(true);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.NumPadKey);
try {
mDigit = a.getInt(R.styleable.NumPadKey_digit, mDigit);
mTextViewResId = a.getResourceId(R.styleable.NumPadKey_textView, 0);
} finally {
a.recycle();
}
setOnClickListener(mListener);
setOnHoverListener(new LiftToActivateListener(context));
mEnableHaptics = new LockPatternUtils(context).isTactileFeedbackEnabled();
mPM = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(contentResource, this, true);
mDigitText = (TextView) findViewById(R.id.digit_text);
mDigitText.setText(Integer.toString(mDigit));
mKlondikeText = (TextView) findViewById(R.id.klondike_text);
if (mDigit >= 0) {
if (sKlondike == null) {
sKlondike = getResources().getStringArray(R.array.lockscreen_num_pad_klondike);
}
if (sKlondike != null && sKlondike.length > mDigit) {
String klondike = sKlondike[mDigit];
final int len = klondike.length();
if (len > 0) {
mKlondikeText.setText(klondike);
} else {
mKlondikeText.setVisibility(View.INVISIBLE);
}
}
}
a = context.obtainStyledAttributes(attrs, android.R.styleable.View);
if (!a.hasValueOrEmpty(android.R.styleable.View_background)) {
setBackground(mContext.getDrawable(R.drawable.ripple_drawable));
}
a.recycle();
setContentDescription(mDigitText.getText().toString());
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
doHapticKeyClick();
}
return super.onTouchEvent(event);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
measureChildren(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int digitHeight = mDigitText.getMeasuredHeight();
int klondikeHeight = mKlondikeText.getMeasuredHeight();
int totalHeight = digitHeight + klondikeHeight;
int top = getHeight() / 2 - totalHeight / 2;
int centerX = getWidth() / 2;
int left = centerX - mDigitText.getMeasuredWidth() / 2;
int bottom = top + digitHeight;
mDigitText.layout(left, top, left + mDigitText.getMeasuredWidth(), bottom);
top = (int) (bottom - klondikeHeight * 0.35f);
bottom = top + klondikeHeight;
left = centerX - mKlondikeText.getMeasuredWidth() / 2;
mKlondikeText.layout(left, top, left + mKlondikeText.getMeasuredWidth(), bottom);
}
@Override
public boolean hasOverlappingRendering() {
return false;
}
// Cause a VIRTUAL_KEY vibration
public void doHapticKeyClick() {
if (mEnableHaptics) {
performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY,
HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING
| HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
}
}
}