Skip to content

Commit 7c3ecec

Browse files
authored
Merge pull request #8426 from vector-im/feature/bma/a11yFixes
A11y fixes
2 parents 0b374bf + 14884b7 commit 7c3ecec

24 files changed

+242
-55
lines changed

changelog.d/8426.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Improve keyboard navigation and accessibility when using a screen reader.

library/ui-strings/src/main/res/values/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1470,6 +1470,9 @@
14701470
<string name="reason_colon">Reason: %1$s</string>
14711471

14721472
<string name="avatar">Avatar</string>
1473+
<string name="avatar_of_space">Avatar of space %1$s</string>
1474+
<string name="avatar_of_room">Avatar of room %1$s</string>
1475+
<string name="avatar_of_user">Profile picture of user %1$s</string>
14731476

14741477
<!-- Consent modal -->
14751478
<string name="dialog_user_consent_content">To continue using the %1$s homeserver you must review and agree to the terms and conditions.</string>

library/ui-styles/src/main/res/values/styles_app_bar_layout.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
<style name="Widget.Vector.AppBarLayout" parent="Widget.MaterialComponents.AppBarLayout.Primary">
55
<item name="android:background">?vctr_toolbar_background</item>
66
<item name="elevation">4dp</item>
7+
8+
<!-- a11y -->
9+
<item name="android:touchscreenBlocksFocus">false</item>
710
</style>
811

9-
</resources>
12+
</resources>

library/ui-styles/src/main/res/values/styles_toolbar.xml

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
<item name="subtitleTextAppearance">@style/TextAppearance.Vector.Widget.ActionBarSubTitle</item>
1313

1414
<item name="navigationIconTint">?vctr_content_secondary</item>
15+
16+
<!-- a11y -->
17+
<item name="android:touchscreenBlocksFocus">false</item>
1518
</style>
1619

1720
<!-- Default toolbar style -->
@@ -39,14 +42,24 @@
3942
<item name="android:textSize">12sp</item>
4043
</style>
4144

42-
<!-- Material 3 -->
45+
<!-- CollapsingToolbar -->
4346

44-
<style name="Widget.Vector.Material3.Toolbar" parent="Widget.Material3.Toolbar" />
47+
<style name="Widget.Vector.CollapsingToolbar" parent="Widget.Material3.CollapsingToolbar">
48+
<!-- a11y -->
49+
<item name="android:touchscreenBlocksFocus">false</item>
50+
</style>
4551

46-
<style name="Widget.Vector.Material3.CollapsingToolbar.Medium" parent="Widget.Material3.CollapsingToolbar.Medium">
52+
<style name="Widget.Vector.CollapsingToolbar.Medium" parent="Widget.Material3.CollapsingToolbar.Medium">
4753
<item name="expandedTitleTextAppearance">@style/TextAppearance.Vector.Title.Medium</item>
4854
<item name="expandedTitleMarginBottom">20dp</item>
4955
<item name="collapsedTitleTextAppearance">@style/TextAppearance.Vector.Headline.Bold</item>
56+
<!-- a11y -->
57+
<item name="android:touchscreenBlocksFocus">false</item>
58+
</style>
59+
60+
<style name="Widget.Vector.CollapsingToolbar.Large" parent="Widget.Material3.CollapsingToolbar.Large">
61+
<!-- a11y -->
62+
<item name="android:touchscreenBlocksFocus">false</item>
5063
</style>
5164

5265
</resources>

library/ui-styles/src/main/res/values/theme_dark.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@
8383
<item name="android:textViewStyle">@style/Widget.Vector.TextView.Body</item>
8484
<item name="materialButtonStyle">@style/Widget.Vector.Button</item>
8585
<item name="toolbarStyle">@style/Widget.Vector.Toolbar</item>
86+
<item name="collapsingToolbarLayoutStyle">@style/Widget.Vector.CollapsingToolbar</item>
87+
<item name="collapsingToolbarLayoutMediumStyle">@style/Widget.Vector.CollapsingToolbar.Medium</item>
88+
<item name="collapsingToolbarLayoutLargeStyle">@style/Widget.Vector.CollapsingToolbar.Large</item>
8689
<item name="bottomNavigationStyle">@style/BottomNavigation.Vector</item>
8790
<item name="searchViewStyle">@style/Widget.Vector.SearchView</item>
8891
<item name="textInputStyle">@style/Widget.Vector.TextInputLayout</item>

library/ui-styles/src/main/res/values/theme_light.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@
8383
<item name="android:textViewStyle">@style/Widget.Vector.TextView.Body</item>
8484
<item name="materialButtonStyle">@style/Widget.Vector.Button</item>
8585
<item name="toolbarStyle">@style/Widget.Vector.Toolbar</item>
86+
<item name="collapsingToolbarLayoutStyle">@style/Widget.Vector.CollapsingToolbar</item>
87+
<item name="collapsingToolbarLayoutMediumStyle">@style/Widget.Vector.CollapsingToolbar.Medium</item>
88+
<item name="collapsingToolbarLayoutLargeStyle">@style/Widget.Vector.CollapsingToolbar.Large</item>
8689
<item name="bottomNavigationStyle">@style/BottomNavigation.Vector</item>
8790
<item name="searchViewStyle">@style/Widget.Vector.SearchView</item>
8891
<item name="textInputStyle">@style/Widget.Vector.TextInputLayout</item>

vector/src/main/java/im/vector/app/core/extensions/ViewExtensions.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import android.graphics.drawable.Drawable
2020
import android.text.InputType
2121
import android.view.View
2222
import android.view.ViewGroup
23+
import android.view.accessibility.AccessibilityEvent
24+
import android.view.accessibility.AccessibilityNodeInfo
2325
import android.widget.EditText
2426
import android.widget.ImageView
2527
import androidx.annotation.AttrRes
@@ -28,6 +30,7 @@ import androidx.annotation.DrawableRes
2830
import androidx.appcompat.widget.SearchView
2931
import androidx.core.content.ContextCompat
3032
import androidx.core.graphics.drawable.DrawableCompat
33+
import androidx.core.view.ViewCompat
3134
import androidx.core.view.isVisible
3235
import androidx.transition.ChangeBounds
3336
import androidx.transition.Fade
@@ -97,6 +100,14 @@ fun View.setAttributeBackground(@AttrRes attributeId: Int) {
97100
setBackgroundResource(attribute.resourceId)
98101
}
99102

103+
/**
104+
* Inspired from https://stackoverflow.com/a/64597532/1472514. Safer to call the 2 available API.
105+
*/
106+
fun View.giveAccessibilityFocus() {
107+
ViewCompat.performAccessibilityAction(this, AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null)
108+
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED)
109+
}
110+
100111
fun ViewGroup.animateLayoutChange(animationDuration: Long, transitionComplete: (() -> Unit)? = null) {
101112
val transition = TransitionSet().apply {
102113
ordering = TransitionSet.ORDERING_SEQUENTIAL

vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import im.vector.app.R
4545
import im.vector.app.core.di.ActivityEntryPoint
4646
import im.vector.app.core.dialogs.UnrecognizedCertificateDialog
4747
import im.vector.app.core.error.ErrorFormatter
48+
import im.vector.app.core.extensions.giveAccessibilityFocus
4849
import im.vector.app.core.extensions.singletonEntryPoint
4950
import im.vector.app.core.extensions.toMvRxBundle
5051
import im.vector.app.core.utils.ToolbarConfig
@@ -318,4 +319,19 @@ abstract class VectorBaseFragment<VB : ViewBinding> : Fragment(), MavericksView
318319
.setPositiveButton(R.string.ok, null)
319320
.show()
320321
}
322+
323+
/* ==========================================================================================
324+
* Accessibility - a11y
325+
* ========================================================================================== */
326+
327+
private var hasBeenAccessibilityFocused = false
328+
329+
/**
330+
* Ensure the View get the accessibility focus. This method has effect only once per fragment instance.
331+
*/
332+
protected fun View.giveAccessibilityFocusOnce() {
333+
if (hasBeenAccessibilityFocused) return
334+
hasBeenAccessibilityFocused = true
335+
giveAccessibilityFocus()
336+
}
321337
}

vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConclusionFragment.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,6 @@ class BootstrapConclusionFragment :
6060
.toSpannable()
6161
.colorizeMatchingText(getString(R.string.recovery_passphrase), colorProvider.getColorFromAttribute(android.R.attr.textColorLink))
6262
.colorizeMatchingText(getString(R.string.message_key), colorProvider.getColorFromAttribute(android.R.attr.textColorLink))
63+
views.bootstrapConclusionText.giveAccessibilityFocusOnce()
6364
}
6465
}

vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class BootstrapConfirmPassphraseFragment :
5252
views.ssssPassphraseSecurityProgress.isGone = true
5353

5454
views.bootstrapDescriptionText.text = getString(R.string.set_a_security_phrase_again_notice)
55+
views.bootstrapDescriptionText.giveAccessibilityFocusOnce()
5556
views.ssssPassphraseEnterEdittext.hint = getString(R.string.set_a_security_phrase_hint)
5657

5758
withState(sharedViewModel) {

0 commit comments

Comments
 (0)