From 42c17888e8ad1bcedd5dde4a8555e5c88a80d9db Mon Sep 17 00:00:00 2001 From: Jordan Demeulenaere Date: Wed, 15 Dec 2021 12:28:44 +0100 Subject: [PATCH] Fix dialog accessibility issues. This CL fixes some accessibility issues that would happen with dialogs launched by the DialogLaunchAnimator. See bugs for more info. Bug: 204944038 Bug: 208951968 Bug: 208951526 Fixes: 204944038 Fixes: 208951968 Fixes: 208951526 Test: Manual Change-Id: I35b12a6e2bb2c4ae8556178fb634deb963457db6 --- .../systemui/animation/DialogLaunchAnimator.kt | 13 +++++++++++-- .../GhostedViewLaunchAnimatorController.kt | 10 +++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt index 066e169dcde35..f7a7603944f6e 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt @@ -299,6 +299,13 @@ private class AnimatedDialog( fullscreenTransparentBackground.setOnClickListener { dialog.dismiss() } dialogContentWithBackground.isClickable = true + // Make sure the transparent and dialog backgrounds are not focusable by accessibility + // features. + fullscreenTransparentBackground.importantForAccessibility = + View.IMPORTANT_FOR_ACCESSIBILITY_NO + dialogContentWithBackground.importantForAccessibility = + View.IMPORTANT_FOR_ACCESSIBILITY_NO + fullscreenTransparentBackground.addView( dialogContentWithBackground, FrameLayout.LayoutParams( @@ -342,8 +349,10 @@ private class AnimatedDialog( ?.color ?.defaultColor ?: Color.BLACK - // Make the background view invisible until we start the animation. - dialogContentWithBackground.visibility = View.INVISIBLE + // Make the background view invisible until we start the animation. We use the transition + // visibility like GhostView does so that we don't mess up with the accessibility tree (see + // b/204944038#comment17). + dialogContentWithBackground.setTransitionVisibility(View.INVISIBLE) // Make sure the dialog is visible instantly and does not do any window animation. window.attributes.windowAnimations = R.style.Animation_LaunchAnimation diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewLaunchAnimatorController.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewLaunchAnimatorController.kt index 3ccf5e4fbdd0f..86cd357d061e9 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewLaunchAnimatorController.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewLaunchAnimatorController.kt @@ -186,7 +186,11 @@ open class GhostedViewLaunchAnimatorController( // Making the ghost view invisible will make the ghosted view visible, so order is // important here. ghostView.visibility = View.INVISIBLE - ghostedView.visibility = View.INVISIBLE + + // Make the ghosted view invisible again. We use the transition visibility like + // GhostView does so that we don't mess up with the accessibility tree (see + // b/204944038#comment17). + ghostedView.setTransitionVisibility(View.INVISIBLE) backgroundView.visibility = View.INVISIBLE } return @@ -257,6 +261,10 @@ open class GhostedViewLaunchAnimatorController( GhostView.removeGhost(ghostedView) launchContainerOverlay.remove(backgroundView) + + // Make sure that the view is considered VISIBLE by accessibility by first making it + // INVISIBLE then VISIBLE (see b/204944038#comment17 for more info). + ghostedView.visibility = View.INVISIBLE ghostedView.visibility = View.VISIBLE ghostedView.invalidate() }