Loading packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java +29 −4 Original line number Original line Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); Loading @@ -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); Loading Loading @@ -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) { Loading @@ -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); Loading @@ -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(); } } } packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -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, Loading Loading @@ -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; Loading Loading @@ -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(); } } } } Loading Loading @@ -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(); } } } } Loading Loading
packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java +29 −4 Original line number Original line Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); Loading @@ -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); Loading Loading @@ -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) { Loading @@ -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); Loading @@ -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(); } } }
packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -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, Loading Loading @@ -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; Loading Loading @@ -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(); } } } } Loading Loading @@ -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(); } } } } Loading