Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c199ef37 authored by Selim Cinek's avatar Selim Cinek
Browse files

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
parent 9ba89ad8
Loading
Loading
Loading
Loading
+47 −20
Original line number Diff line number Diff line
@@ -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();
+22 −1
Original line number Diff line number Diff line
@@ -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;