Skip to content

Commit 4720b41

Browse files
authored
Merge pull request #883 from wordpress-mobile/issue/accessible-formatting-toolbar
Accessibility : Improve TalkBack behavior of the formatting toolbar
2 parents 75c0b6c + 2a67b65 commit 4720b41

File tree

5 files changed

+63
-4
lines changed

5 files changed

+63
-4
lines changed

aztec/src/main/kotlin/org/wordpress/aztec/toolbar/AztecToolbar.kt

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import org.wordpress.aztec.R
3232
import org.wordpress.aztec.plugins.IMediaToolbarButton
3333
import org.wordpress.aztec.plugins.IToolbarButton
3434
import org.wordpress.aztec.source.SourceViewEditText
35+
import org.wordpress.aztec.util.convertToButtonAccessibilityProperties
3536
import java.util.Arrays
3637
import java.util.ArrayList
3738
import java.util.Locale
@@ -407,6 +408,7 @@ class AztecToolbar : FrameLayout, IAztecToolbar, OnMenuItemClickListener {
407408

408409
setAdvancedState()
409410
setupMediaToolbar()
411+
setupToolbarButtonsForAccessibility()
410412

411413
for (toolbarAction in ToolbarAction.values()) {
412414
val button = findViewById<ToggleButton>(toolbarAction.buttonId)
@@ -434,7 +436,33 @@ class AztecToolbar : FrameLayout, IAztecToolbar, OnMenuItemClickListener {
434436
toolbarButtonPlugins.add(buttonPlugin)
435437

436438
val button = findViewById<ToggleButton>(buttonPlugin.action.buttonId)
437-
button.setOnClickListener { _: View -> buttonPlugin.toggle() }
439+
button.setOnClickListener { buttonPlugin.toggle() }
440+
441+
setupMediaButtonForAccessibility(buttonPlugin)
442+
}
443+
444+
private fun setupMediaButtonForAccessibility(buttonPlugin: IToolbarButton) {
445+
val button = findViewById<ToggleButton>(buttonPlugin.action.buttonId)
446+
447+
if (buttonPlugin is IMediaToolbarButton) {
448+
button.convertToButtonAccessibilityProperties()
449+
}
450+
}
451+
452+
private fun setupToolbarButtonsForAccessibility() {
453+
val targetActions = listOf(ToolbarAction.ADD_MEDIA_EXPAND,
454+
ToolbarAction.ADD_MEDIA_COLLAPSE,
455+
ToolbarAction.HORIZONTAL_RULE,
456+
ToolbarAction.HEADING,
457+
ToolbarAction.LIST,
458+
ToolbarAction.LINK
459+
)
460+
461+
ToolbarAction.values().forEach { action ->
462+
if (targetActions.contains(action)) {
463+
findViewById<ToggleButton>(action.buttonId).convertToButtonAccessibilityProperties()
464+
}
465+
}
438466
}
439467

440468
fun highlightActionButtons(toolbarActions: ArrayList<IToolbarAction>) {

aztec/src/main/kotlin/org/wordpress/aztec/util/Extensions.kt

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,15 @@ import android.content.Context
55
import android.text.Editable
66
import android.text.Spannable
77
import android.text.Spanned
8+
import android.view.View
9+
import android.view.accessibility.AccessibilityNodeInfo.ACTION_CLICK
10+
import android.widget.Button
11+
import android.widget.ToggleButton
12+
import androidx.core.view.AccessibilityDelegateCompat
13+
import androidx.core.view.ViewCompat
14+
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
815
import org.wordpress.aztec.AztecParser
16+
import org.wordpress.aztec.R
917

1018
fun Editable.getLast(kind: Class<*>): Any? {
1119
val spans = this.getSpans(0, this.length, kind)
@@ -55,4 +63,19 @@ fun ClipData.Item.coerceToHtmlText(parser: AztecParser): String {
5563
}
5664

5765
return text.toString()
58-
}
66+
}
67+
68+
/**
69+
* Some of the toggle button controls that exist on the Aztec formatting toolbar act as buttons but are
70+
* announced as switches so this function converts the accessibility properties to that of a button.
71+
*/
72+
fun ToggleButton.convertToButtonAccessibilityProperties() {
73+
ViewCompat.setAccessibilityDelegate(this, object : AccessibilityDelegateCompat() {
74+
override fun onInitializeAccessibilityNodeInfo(host: View?, info: AccessibilityNodeInfoCompat?) {
75+
super.onInitializeAccessibilityNodeInfo(host, info)
76+
info?.className = Button::class.java.name
77+
info?.isCheckable = false
78+
info?.addAction(AccessibilityNodeInfoCompat.AccessibilityActionCompat(ACTION_CLICK, context.getString(R.string.accessibility_action_click_label)))
79+
}
80+
})
81+
}

aztec/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<!-- GENERAL -->
44
<string name="cursor_moved">Cursor moved</string>
55
<string name="samsung_disabled_custom_clipboard">Sorry, this feature is disabled on Android %1$s. Please use the Paste action instead.</string>
6+
<string name="accessibility_action_click_label">activate</string>
67

78
<!-- LINK DIALOG -->
89
<string name="link_dialog_title">Insert link</string>

wordpress-comments/src/main/java/org/wordpress/aztec/plugins/wpcomments/toolbar/MoreToolbarButton.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import org.wordpress.aztec.plugins.wpcomments.spans.WordPressCommentSpan
1616
import org.wordpress.aztec.spans.IAztecNestable
1717
import org.wordpress.aztec.toolbar.AztecToolbar
1818
import org.wordpress.aztec.toolbar.IToolbarAction
19+
import org.wordpress.aztec.util.convertToButtonAccessibilityProperties
1920

2021
class MoreToolbarButton(val visualEditor: AztecText) : IToolbarButton {
2122
override val action: IToolbarAction = CommentsToolbarAction.MORE
@@ -54,7 +55,9 @@ class MoreToolbarButton(val visualEditor: AztecText) : IToolbarButton {
5455
}
5556

5657
override fun inflateButton(parent: ViewGroup) {
57-
LayoutInflater.from(context).inflate(R.layout.more_button, parent)
58+
val rootView = LayoutInflater.from(context).inflate(R.layout.more_button, parent)
59+
val button = rootView.findViewById<ToggleButton>(R.id.format_bar_button_more)
60+
button.convertToButtonAccessibilityProperties()
5861
}
5962

6063
override fun toolbarStateAboutToChange(toolbar: AztecToolbar, enable: Boolean) {

wordpress-comments/src/main/java/org/wordpress/aztec/plugins/wpcomments/toolbar/PageToolbarButton.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import android.text.Spanned
66
import android.view.KeyEvent
77
import android.view.LayoutInflater
88
import android.view.ViewGroup
9+
import android.widget.ToggleButton
910
import org.wordpress.aztec.AztecText
1011
import org.wordpress.aztec.Constants
1112
import org.wordpress.aztec.plugins.IToolbarButton
@@ -14,6 +15,7 @@ import org.wordpress.aztec.plugins.wpcomments.spans.WordPressCommentSpan
1415
import org.wordpress.aztec.spans.IAztecNestable
1516
import org.wordpress.aztec.toolbar.AztecToolbar
1617
import org.wordpress.aztec.toolbar.IToolbarAction
18+
import org.wordpress.aztec.util.convertToButtonAccessibilityProperties
1719

1820
class PageToolbarButton(val visualEditor: AztecText) : IToolbarButton {
1921

@@ -49,7 +51,9 @@ class PageToolbarButton(val visualEditor: AztecText) : IToolbarButton {
4951
}
5052

5153
override fun inflateButton(parent: ViewGroup) {
52-
LayoutInflater.from(context).inflate(R.layout.page_button, parent)
54+
val rootView = LayoutInflater.from(context).inflate(R.layout.page_button, parent)
55+
val button = rootView.findViewById<ToggleButton>(R.id.format_bar_button_page)
56+
button.convertToButtonAccessibilityProperties()
5357
}
5458

5559
override fun toolbarStateAboutToChange(toolbar: AztecToolbar, enable: Boolean) {

0 commit comments

Comments
 (0)