From c199ef37594b946cb295c29df321e74332ee5408 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Tue, 9 Dec 2014 18:49:42 +0100 Subject: [PATCH] Fixed accessibility for the pin input view on keyguard. Passwords are not spoken out loud anymore if the user did not select that option. Bug: 18528774 Change-Id: I3dd05fa1714da36795f448718fd70f1cdbfe2584 --- .../keyguard/KeyguardPinBasedInputView.java | 67 +++++++++++++------ .../src/com/android/keyguard/NumPadKey.java | 23 ++++++- 2 files changed, 69 insertions(+), 21 deletions(-) diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java index bca030527ac94..7c56e84a464e1 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java @@ -17,7 +17,11 @@ package com.android.keyguard; import android.content.Context; +import android.database.ContentObserver; import android.graphics.Rect; +import android.os.Handler; +import android.os.UserHandle; +import android.provider.Settings; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.View; @@ -28,19 +32,39 @@ import android.view.View; public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView implements View.OnKeyListener { + private final android.database.ContentObserver mSpeakPasswordObserver + = new ContentObserver(new Handler()) { + @Override + public void onChange(boolean selfChange) { + super.onChange(selfChange); + // Ensure that it's not called too early + if (mButton0 != null) { + mButton0.updateContentDescription(); + mButton1.updateContentDescription(); + mButton2.updateContentDescription(); + mButton3.updateContentDescription(); + mButton4.updateContentDescription(); + mButton5.updateContentDescription(); + mButton6.updateContentDescription(); + mButton7.updateContentDescription(); + mButton8.updateContentDescription(); + mButton9.updateContentDescription(); + } + } + }; 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; + private NumPadKey mButton0; + private NumPadKey mButton1; + private NumPadKey mButton2; + private NumPadKey mButton3; + private NumPadKey mButton4; + private NumPadKey mButton5; + private NumPadKey mButton6; + private NumPadKey mButton7; + private NumPadKey mButton8; + private NumPadKey mButton9; public KeyguardPinBasedInputView(Context context) { this(context, null); @@ -48,6 +72,9 @@ public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView public KeyguardPinBasedInputView(Context context, AttributeSet attrs) { super(context, attrs); + context.getContentResolver().registerContentObserver( + Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD), true, + mSpeakPasswordObserver, UserHandle.USER_ALL); } @Override @@ -188,16 +215,16 @@ public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView } }); - 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); + mButton0 = (NumPadKey) findViewById(R.id.key0); + mButton1 = (NumPadKey) findViewById(R.id.key1); + mButton2 = (NumPadKey) findViewById(R.id.key2); + mButton3 = (NumPadKey) findViewById(R.id.key3); + mButton4 = (NumPadKey) findViewById(R.id.key4); + mButton5 = (NumPadKey) findViewById(R.id.key5); + mButton6 = (NumPadKey) findViewById(R.id.key6); + mButton7 = (NumPadKey) findViewById(R.id.key7); + mButton8 = (NumPadKey) findViewById(R.id.key8); + mButton9 = (NumPadKey) findViewById(R.id.key9); mPasswordEntry.requestFocus(); super.onFinishInflate(); diff --git a/packages/Keyguard/src/com/android/keyguard/NumPadKey.java b/packages/Keyguard/src/com/android/keyguard/NumPadKey.java index d539856fe6f52..70a41081f0063 100644 --- a/packages/Keyguard/src/com/android/keyguard/NumPadKey.java +++ b/packages/Keyguard/src/com/android/keyguard/NumPadKey.java @@ -22,6 +22,8 @@ import android.graphics.drawable.Drawable; import android.os.Debug; import android.os.PowerManager; import android.os.SystemClock; +import android.os.UserHandle; +import android.provider.Settings; import android.util.AttributeSet; import android.view.HapticFeedbackConstants; import android.view.KeyEvent; @@ -118,7 +120,17 @@ public class NumPadKey extends ViewGroup { } setBackground(mContext.getDrawable(R.drawable.ripple_drawable)); - setContentDescription(mDigitText.getText().toString() + mKlondikeText.getText().toString()); + updateContentDescription(); + } + + public void updateContentDescription() { + if (shouldSpeakPasswordsForAccessibility()) { + setContentDescription( + mDigitText.getText().toString() + mKlondikeText.getText().toString()); + } else { + setContentDescription(getContext().getString( + com.android.internal.R.string.keyboard_password_character_no_headset)); + } } @Override @@ -152,6 +164,15 @@ public class NumPadKey extends ViewGroup { mKlondikeText.layout(left, top, left + mKlondikeText.getMeasuredWidth(), bottom); } + /** + * @return true if the user has explicitly allowed accessibility services + * to speak passwords. + */ + private boolean shouldSpeakPasswordsForAccessibility() { + return (Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, 0, UserHandle.USER_CURRENT) == 1); + } + @Override public boolean hasOverlappingRendering() { return false;