Merge "Fixed talkback issue" into qt-r1-dev

This commit is contained in:
Joshua Mccloskey
2019-06-05 04:24:34 +00:00
committed by Android (Google) Code Review
2 changed files with 34 additions and 4 deletions

View File

@@ -16,6 +16,8 @@
package com.android.systemui.biometrics; package com.android.systemui.biometrics;
import static android.view.accessibility.AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import android.graphics.PixelFormat; import android.graphics.PixelFormat;
@@ -36,6 +38,7 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
import android.view.animation.Interpolator; import android.view.animation.Interpolator;
import android.widget.Button; import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
@@ -280,6 +283,7 @@ public abstract class BiometricDialogView extends LinearLayout {
final CharSequence subtitleText = mBundle.getCharSequence(BiometricPrompt.KEY_SUBTITLE); final CharSequence subtitleText = mBundle.getCharSequence(BiometricPrompt.KEY_SUBTITLE);
if (TextUtils.isEmpty(subtitleText)) { if (TextUtils.isEmpty(subtitleText)) {
mSubtitleText.setVisibility(View.GONE); mSubtitleText.setVisibility(View.GONE);
announceAccessibilityEvent();
} else { } else {
mSubtitleText.setVisibility(View.VISIBLE); mSubtitleText.setVisibility(View.VISIBLE);
mSubtitleText.setText(subtitleText); mSubtitleText.setText(subtitleText);
@@ -289,6 +293,7 @@ public abstract class BiometricDialogView extends LinearLayout {
mBundle.getCharSequence(BiometricPrompt.KEY_DESCRIPTION); mBundle.getCharSequence(BiometricPrompt.KEY_DESCRIPTION);
if (TextUtils.isEmpty(descriptionText)) { if (TextUtils.isEmpty(descriptionText)) {
mDescriptionText.setVisibility(View.GONE); mDescriptionText.setVisibility(View.GONE);
announceAccessibilityEvent();
} else { } else {
mDescriptionText.setVisibility(View.VISIBLE); mDescriptionText.setVisibility(View.VISIBLE);
mDescriptionText.setText(descriptionText); mDescriptionText.setText(descriptionText);
@@ -447,12 +452,14 @@ public abstract class BiometricDialogView extends LinearLayout {
if (newState == STATE_PENDING_CONFIRMATION) { if (newState == STATE_PENDING_CONFIRMATION) {
mHandler.removeMessages(MSG_RESET_MESSAGE); mHandler.removeMessages(MSG_RESET_MESSAGE);
mErrorText.setVisibility(View.INVISIBLE); mErrorText.setVisibility(View.INVISIBLE);
announceAccessibilityEvent();
mPositiveButton.setVisibility(View.VISIBLE); mPositiveButton.setVisibility(View.VISIBLE);
mPositiveButton.setEnabled(true); mPositiveButton.setEnabled(true);
} else if (newState == STATE_AUTHENTICATED) { } else if (newState == STATE_AUTHENTICATED) {
mPositiveButton.setVisibility(View.GONE); mPositiveButton.setVisibility(View.GONE);
mNegativeButton.setVisibility(View.GONE); mNegativeButton.setVisibility(View.GONE);
mErrorText.setVisibility(View.INVISIBLE); mErrorText.setVisibility(View.INVISIBLE);
announceAccessibilityEvent();
} }
if (newState == STATE_PENDING_CONFIRMATION || newState == STATE_AUTHENTICATED) { if (newState == STATE_PENDING_CONFIRMATION || newState == STATE_AUTHENTICATED) {
@@ -471,14 +478,20 @@ public abstract class BiometricDialogView extends LinearLayout {
public void restoreState(Bundle bundle) { public void restoreState(Bundle bundle) {
mRestoredState = bundle; mRestoredState = bundle;
mTryAgainButton.setVisibility(bundle.getInt(KEY_TRY_AGAIN_VISIBILITY)); final int tryAgainVisibility = bundle.getInt(KEY_TRY_AGAIN_VISIBILITY);
mPositiveButton.setVisibility(bundle.getInt(KEY_CONFIRM_VISIBILITY)); mTryAgainButton.setVisibility(tryAgainVisibility);
final int confirmVisibility = bundle.getInt(KEY_CONFIRM_VISIBILITY);
mPositiveButton.setVisibility(confirmVisibility);
mState = bundle.getInt(KEY_STATE); mState = bundle.getInt(KEY_STATE);
mErrorText.setText(bundle.getCharSequence(KEY_ERROR_TEXT_STRING)); mErrorText.setText(bundle.getCharSequence(KEY_ERROR_TEXT_STRING));
mErrorText.setContentDescription(bundle.getCharSequence(KEY_ERROR_TEXT_STRING)); mErrorText.setContentDescription(bundle.getCharSequence(KEY_ERROR_TEXT_STRING));
mErrorText.setVisibility(bundle.getInt(KEY_ERROR_TEXT_VISIBILITY)); final int errorTextVisibility = bundle.getInt(KEY_ERROR_TEXT_VISIBILITY);
mErrorText.setVisibility(errorTextVisibility);
if (errorTextVisibility == View.INVISIBLE || tryAgainVisibility == View.INVISIBLE
|| confirmVisibility == View.INVISIBLE) {
announceAccessibilityEvent();
}
mErrorText.setTextColor(bundle.getInt(KEY_ERROR_TEXT_COLOR)); mErrorText.setTextColor(bundle.getInt(KEY_ERROR_TEXT_COLOR));
if (bundle.getBoolean(KEY_ERROR_TEXT_IS_TEMPORARY)) { if (bundle.getBoolean(KEY_ERROR_TEXT_IS_TEMPORARY)) {
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_RESET_MESSAGE), mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_RESET_MESSAGE),
BiometricPrompt.HIDE_DIALOG_DELAY); BiometricPrompt.HIDE_DIALOG_DELAY);
@@ -501,4 +514,16 @@ public abstract class BiometricDialogView extends LinearLayout {
lp.token = mWindowToken; lp.token = mWindowToken;
return lp; return lp;
} }
// Every time a view becomes invisible we need to announce an accessibility event.
// This is due to an issue in the framework, b/132298701 recommended this workaround.
protected void announceAccessibilityEvent() {
AccessibilityEvent event = AccessibilityEvent.obtain();
event.setEventType(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
event.setContentChangeTypes(CONTENT_CHANGE_TYPE_SUBTREE);
mDialog.sendAccessibilityEventUnchecked(event);
mDialog.notifySubtreeAccessibilityStateChanged(mDialog, mDialog,
CONTENT_CHANGE_TYPE_SUBTREE);
event.recycle();
}
} }

View File

@@ -149,6 +149,7 @@ public class FaceDialogView extends BiometricDialogView {
private final Runnable mErrorToIdleAnimationRunnable = () -> { private final Runnable mErrorToIdleAnimationRunnable = () -> {
updateState(STATE_IDLE); updateState(STATE_IDLE);
mErrorText.setVisibility(View.INVISIBLE); mErrorText.setVisibility(View.INVISIBLE);
announceAccessibilityEvent();
}; };
public FaceDialogView(Context context, public FaceDialogView(Context context,
@@ -188,6 +189,7 @@ public class FaceDialogView extends BiometricDialogView {
mDialog.invalidateOutline(); mDialog.invalidateOutline();
mSize = newSize; mSize = newSize;
announceAccessibilityEvent();
} else if (mSize == SIZE_SMALL && newSize == SIZE_BIG) { } else if (mSize == SIZE_SMALL && newSize == SIZE_BIG) {
mSize = SIZE_GROWING; mSize = SIZE_GROWING;
@@ -294,6 +296,7 @@ public class FaceDialogView extends BiometricDialogView {
mErrorText.setVisibility(View.VISIBLE); mErrorText.setVisibility(View.VISIBLE);
} else { } else {
mErrorText.setVisibility(View.INVISIBLE); mErrorText.setVisibility(View.INVISIBLE);
announceAccessibilityEvent();
} }
} }
@@ -368,11 +371,13 @@ public class FaceDialogView extends BiometricDialogView {
mTryAgainButton.setVisibility(View.VISIBLE); mTryAgainButton.setVisibility(View.VISIBLE);
} else { } else {
mTryAgainButton.setVisibility(View.GONE); mTryAgainButton.setVisibility(View.GONE);
announceAccessibilityEvent();
} }
} }
if (show) { if (show) {
mPositiveButton.setVisibility(View.GONE); mPositiveButton.setVisibility(View.GONE);
announceAccessibilityEvent();
} }
} }