diff --git a/vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt b/vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt index 156809d5ad..55ad5294d9 100644 --- a/vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt +++ b/vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt @@ -20,6 +20,8 @@ import android.graphics.drawable.Drawable import android.text.InputType import android.view.View import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent +import android.view.accessibility.AccessibilityNodeInfo import android.widget.EditText import android.widget.ImageView import androidx.annotation.AttrRes @@ -28,6 +30,7 @@ import androidx.annotation.DrawableRes import androidx.appcompat.widget.SearchView import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat +import androidx.core.view.ViewCompat import androidx.core.view.isVisible import androidx.transition.ChangeBounds import androidx.transition.Fade @@ -97,6 +100,14 @@ fun View.setAttributeBackground(@AttrRes attributeId: Int) { setBackgroundResource(attribute.resourceId) } +/** + * Inspired from https://stackoverflow.com/a/64597532/1472514. Safer to call the 2 available API. + */ +fun View.giveAccessibilityFocus() { + ViewCompat.performAccessibilityAction(this, AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null) + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED) +} + fun ViewGroup.animateLayoutChange(animationDuration: Long, transitionComplete: (() -> Unit)? = null) { val transition = TransitionSet().apply { ordering = TransitionSet.ORDERING_SEQUENTIAL diff --git a/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt b/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt index 29aa623c9b..02275c933e 100644 --- a/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt +++ b/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt @@ -24,6 +24,7 @@ import android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS import androidx.core.view.ViewCompat import com.tapadoo.alerter.Alerter import im.vector.app.R +import im.vector.app.core.extensions.giveAccessibilityFocus import im.vector.app.core.platform.VectorBaseActivity import im.vector.app.core.resources.StringProvider import im.vector.app.core.utils.isAnimationEnabled @@ -286,7 +287,7 @@ class PopupAlertManager @Inject constructor( currentIsDismissed() } .setOnShowListener { - handleAccessibility(activity) + handleAccessibility(activity, animate) } .enableSwipeToDismiss() .enableInfiniteDuration(true) @@ -304,7 +305,7 @@ class PopupAlertManager @Inject constructor( } /* a11y */ - private fun handleAccessibility(activity: Activity) { + private fun handleAccessibility(activity: Activity, giveFocus: Boolean) { activity.window.decorView.findViewById(R.id.llAlertBackground)?.let { alertView -> alertView.importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_YES @@ -318,6 +319,11 @@ class PopupAlertManager @Inject constructor( Alerter.hide() true } + + // And give focus to the alert right now, only for first display, i.e. when there is an animation. + if (giveFocus) { + alertView.giveAccessibilityFocus() + } } }