From 2edfd4e830b35947f6588af7b3b4989c0fcdb4cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Sat, 29 Jun 2019 22:05:36 +0200 Subject: [PATCH 1/9] Message composer: add content descriptions to image buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Vágner --- .../features/home/room/detail/RoomDetailFragment.kt | 11 ++++++++--- vector/src/main/res/layout/merge_composer_layout.xml | 5 ++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt index 423dd7dc5d..ea5dc83997 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt @@ -260,9 +260,9 @@ class RoomDetailFragment : roomDetailViewModel.selectSubscribe(RoomDetailViewState::sendMode) { mode -> when (mode) { is SendMode.REGULAR -> renderRegularMode(mode.text) - is SendMode.EDIT -> renderSpecialMode(mode.timelineEvent, R.drawable.ic_edit, mode.text) - is SendMode.QUOTE -> renderSpecialMode(mode.timelineEvent, R.drawable.ic_quote, mode.text) - is SendMode.REPLY -> renderSpecialMode(mode.timelineEvent, R.drawable.ic_reply, mode.text) + is SendMode.EDIT -> renderSpecialMode(mode.timelineEvent, R.drawable.ic_edit, R.string.edit, mode.text) + is SendMode.QUOTE -> renderSpecialMode(mode.timelineEvent, R.drawable.ic_quote, R.string.quote, mode.text) + is SendMode.REPLY -> renderSpecialMode(mode.timelineEvent, R.drawable.ic_reply, R.string.reply, mode.text) } } @@ -357,10 +357,12 @@ class RoomDetailFragment : composerLayout.collapse() updateComposerText(text) + composerLayout.sendButton.setContentDescription(getString(R.string.send)) } private fun renderSpecialMode(event: TimelineEvent, @DrawableRes iconRes: Int, + descriptionRes: Int, defaultContent: String) { commandAutocompletePolicy.enabled = false //switch to expanded bar @@ -384,6 +386,8 @@ class RoomDetailFragment : updateComposerText(defaultContent) composerLayout.composerRelatedMessageActionIcon.setImageDrawable(ContextCompat.getDrawable(requireContext(), iconRes)) + composerLayout.sendButton.setContentDescription(getString(descriptionRes)) + avatarRenderer.render(event.senderAvatar, event.root.senderId ?: "", event.senderName, composerLayout.composerRelatedMessageAvatar) @@ -592,6 +596,7 @@ class RoomDetailFragment : Timber.w("Send button is locked") return@setOnClickListener } + composerLayout.sendButton.setContentDescription(getString(R.string.send)) val textMessage = composerLayout.composerEditText.text.toString() if (textMessage.isNotBlank()) { lockSendButton = true diff --git a/vector/src/main/res/layout/merge_composer_layout.xml b/vector/src/main/res/layout/merge_composer_layout.xml index 641ce666ca..0142f65a3e 100644 --- a/vector/src/main/res/layout/merge_composer_layout.xml +++ b/vector/src/main/res/layout/merge_composer_layout.xml @@ -73,6 +73,7 @@ android:background="?android:attr/selectableItemBackground" android:contentDescription="@string/action_close" android:src="@drawable/ic_close_round" + android:contentDescription="@string/action_close" android:tint="@color/riotx_notice" tools:ignore="MissingConstraints" /> @@ -91,6 +92,7 @@ android:background="?android:attr/selectableItemBackground" android:contentDescription="@string/send_attachment" android:src="@drawable/ic_attachment" + android:contentDescription="@string/option_send_files" android:tint="?attr/colorAccent" tools:ignore="MissingConstraints" /> @@ -111,6 +113,7 @@ android:background="?android:attr/selectableItemBackground" android:contentDescription="@string/send" android:src="@drawable/ic_send" + android:contentDescription="@string/send" android:tint="?attr/colorAccent" tools:ignore="MissingConstraints" /> @@ -128,4 +131,4 @@ tools:hint="@string/room_message_placeholder_not_encrypted" tools:ignore="MissingConstraints" /> - \ No newline at end of file + From 2f6d3adb179b288f42840bdc5ab93a6a0851da0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Sun, 30 Jun 2019 19:41:42 +0200 Subject: [PATCH 2/9] Message composer: describe the image button for dismissing as cancel rather than close MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Vágner --- vector/src/main/res/layout/merge_composer_layout.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/res/layout/merge_composer_layout.xml b/vector/src/main/res/layout/merge_composer_layout.xml index 0142f65a3e..97ef31eb84 100644 --- a/vector/src/main/res/layout/merge_composer_layout.xml +++ b/vector/src/main/res/layout/merge_composer_layout.xml @@ -73,7 +73,7 @@ android:background="?android:attr/selectableItemBackground" android:contentDescription="@string/action_close" android:src="@drawable/ic_close_round" - android:contentDescription="@string/action_close" + android:contentDescription="@string/cancel" android:tint="@color/riotx_notice" tools:ignore="MissingConstraints" /> From 73dd735ba611b8be685ea56e593692a9f1d248bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Mon, 1 Jul 2019 13:30:26 +0200 Subject: [PATCH 3/9] Reactions: Add content descriptions to emoji chooser category tabs and individual emojis MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Vágner --- .../riotx/features/reactions/EmojiReactionPickerActivity.kt | 5 ++++- .../vector/riotx/features/reactions/EmojiRecyclerAdapter.kt | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/vector/src/main/java/im/vector/riotx/features/reactions/EmojiReactionPickerActivity.kt b/vector/src/main/java/im/vector/riotx/features/reactions/EmojiReactionPickerActivity.kt index d8d0fb04da..c9bddbbe72 100644 --- a/vector/src/main/java/im/vector/riotx/features/reactions/EmojiReactionPickerActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/reactions/EmojiReactionPickerActivity.kt @@ -92,7 +92,10 @@ class EmojiReactionPickerActivity : VectorBaseActivity(), EmojiCompatFontProvide it.rawData?.categories?.let { categories -> for (category in categories) { val s = category.emojis[0] - tabLayout.addTab(tabLayout.newTab().setText(it.rawData!!.emojis[s]!!.emojiString())) + val newTab =tabLayout.newTab() + newTab.setText(it.rawData!!.emojis[s]!!.emojiString()) + newTab.setContentDescription(category.name) + tabLayout.addTab(newTab) } tabLayout.addOnTabSelectedListener(tabLayoutSelectionListener) } diff --git a/vector/src/main/java/im/vector/riotx/features/reactions/EmojiRecyclerAdapter.kt b/vector/src/main/java/im/vector/riotx/features/reactions/EmojiRecyclerAdapter.kt index a8a7be6f15..cbdbcc11d2 100644 --- a/vector/src/main/java/im/vector/riotx/features/reactions/EmojiRecyclerAdapter.kt +++ b/vector/src/main/java/im/vector/riotx/features/reactions/EmojiRecyclerAdapter.kt @@ -258,6 +258,7 @@ class EmojiRecyclerAdapter(val dataSource: EmojiDataSource? = null, var reaction emojiView.emoji = s if (s != null) { emojiView.mLayout = getStaticLayoutForEmoji(s) + emojiView.setContentDescription(s) placeHolder.visibility = View.GONE // emojiView.visibility = View.VISIBLE } else { @@ -361,4 +362,4 @@ class EmojiRecyclerAdapter(val dataSource: EmojiDataSource? = null, var reaction } } } -} \ No newline at end of file +} From 7ef471ad0deb9bd72b5eca2efb7465aa22e6a439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Wed, 21 Aug 2019 22:39:17 +0200 Subject: [PATCH 4/9] Add contentDescription for the read receipts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Vágner --- .../vector/riotx/core/ui/views/ReadReceiptsView.kt | 12 ++++++++++++ vector/src/main/res/layout/view_read_receipts.xml | 1 + vector/src/main/res/values/strings_riotX.xml | 12 +++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/riotx/core/ui/views/ReadReceiptsView.kt b/vector/src/main/java/im/vector/riotx/core/ui/views/ReadReceiptsView.kt index 15a54248d7..cf5af902b0 100644 --- a/vector/src/main/java/im/vector/riotx/core/ui/views/ReadReceiptsView.kt +++ b/vector/src/main/java/im/vector/riotx/core/ui/views/ReadReceiptsView.kt @@ -28,6 +28,7 @@ import im.vector.riotx.features.home.room.detail.timeline.item.ReadReceiptData import kotlinx.android.synthetic.main.view_read_receipts.view.* private const val MAX_RECEIPT_DISPLAYED = 5 +private const val MAX_RECEIPT_DESCRIBED = 4 class ReadReceiptsView @JvmOverloads constructor( context: Context, @@ -51,6 +52,7 @@ class ReadReceiptsView @JvmOverloads constructor( setOnClickListener(clickListener) if (readReceipts.isNotEmpty()) { isVisible = true + val displayNames = arrayListOf() for (index in 0 until MAX_RECEIPT_DISPLAYED) { val receiptData = readReceipts.getOrNull(index) if (receiptData == null) { @@ -58,6 +60,9 @@ class ReadReceiptsView @JvmOverloads constructor( } else { receiptAvatars[index].visibility = View.VISIBLE avatarRenderer.render(receiptData.avatarUrl, receiptData.userId, receiptData.displayName, receiptAvatars[index]) + if (null !=receiptData.displayName && displayNames.size MAX_RECEIPT_DISPLAYED) { @@ -68,6 +73,13 @@ class ReadReceiptsView @JvmOverloads constructor( } else { receiptMore.visibility = View.GONE } + when (displayNames.size) { + 0 -> setContentDescription(context.getResources().getQuantityString(R.plurals.fallback_users_read, readReceipts.size)) + 1 -> setContentDescription(context.getString(R.string.one_user_read, displayNames.get(0))) + 2 -> setContentDescription(context.getString(R.string.two_users_read, displayNames.get(0), displayNames.get(1))) + 3 -> setContentDescription(context.getString(R.string.three_users_read, displayNames.get(0), displayNames.get(1), displayNames.get(2))) + else -> setContentDescription(context.getString(R.string.two_and_some_others_read, displayNames.get(0), displayNames.get(1), (readReceipts.size -2))) + } } else { isVisible = false } diff --git a/vector/src/main/res/layout/view_read_receipts.xml b/vector/src/main/res/layout/view_read_receipts.xml index f477a979ec..4a6629d43e 100644 --- a/vector/src/main/res/layout/view_read_receipts.xml +++ b/vector/src/main/res/layout/view_read_receipts.xml @@ -15,6 +15,7 @@ android:background="?vctr_pill_receipt" android:paddingStart="4dp" android:paddingEnd="4dp" + android:importantForAccessibility = "no" tools:text="999+" /> Create a new room Close keys backup banner + + %s, %s and %d others read + %s, %s and %s read + %s and %s read + %s read + + 1 user read + %d users read + + "The file '%1$s' (%2$s) is too large to upload. The limit is %3$s." - \ No newline at end of file + From d4be68191c5342cd205b9a021c96cf9f233d3aa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Sat, 28 Sep 2019 18:16:00 +0200 Subject: [PATCH 5/9] Fix conflicts after rebase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Vágner --- vector/src/main/res/layout/merge_composer_layout.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/vector/src/main/res/layout/merge_composer_layout.xml b/vector/src/main/res/layout/merge_composer_layout.xml index 97ef31eb84..95babeb8c7 100644 --- a/vector/src/main/res/layout/merge_composer_layout.xml +++ b/vector/src/main/res/layout/merge_composer_layout.xml @@ -71,7 +71,6 @@ android:layout_width="22dp" android:layout_height="22dp" android:background="?android:attr/selectableItemBackground" - android:contentDescription="@string/action_close" android:src="@drawable/ic_close_round" android:contentDescription="@string/cancel" android:tint="@color/riotx_notice" @@ -90,7 +89,6 @@ android:layout_width="0dp" android:layout_height="0dp" android:background="?android:attr/selectableItemBackground" - android:contentDescription="@string/send_attachment" android:src="@drawable/ic_attachment" android:contentDescription="@string/option_send_files" android:tint="?attr/colorAccent" @@ -113,7 +111,6 @@ android:background="?android:attr/selectableItemBackground" android:contentDescription="@string/send" android:src="@drawable/ic_send" - android:contentDescription="@string/send" android:tint="?attr/colorAccent" tools:ignore="MissingConstraints" /> From 53543453b3ce1e79c1e3da1c9a02163a225032dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Sat, 28 Sep 2019 20:59:41 +0200 Subject: [PATCH 6/9] Login: add contentDescription to password reveal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Vágner --- .../main/java/im/vector/riotx/features/login/LoginFragment.kt | 3 ++- vector/src/main/res/layout/fragment_login.xml | 1 + vector/src/main/res/values/strings_riotX.xml | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginFragment.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginFragment.kt index 3c477c8a90..c5bc4dd9c8 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginFragment.kt @@ -143,6 +143,7 @@ class LoginFragment : VectorBaseFragment() { passwordField.showPassword(passwordShown) passwordReveal.setImageResource(if (passwordShown) R.drawable.ic_eye_closed_black else R.drawable.ic_eye_black) + passwordReveal.setContentDescription(if (passwordShown) getString(R.string.a11y_hide_password) else getString(R.string.a11y_show_password)) } override fun invalidate() = withState(viewModel) { state -> @@ -217,4 +218,4 @@ class LoginFragment : VectorBaseFragment() { is Success -> Unit } } -} \ No newline at end of file +} diff --git a/vector/src/main/res/layout/fragment_login.xml b/vector/src/main/res/layout/fragment_login.xml index 173527f995..a3a1187a64 100644 --- a/vector/src/main/res/layout/fragment_login.xml +++ b/vector/src/main/res/layout/fragment_login.xml @@ -87,6 +87,7 @@ android:layout_marginTop="8dp" android:background="?attr/selectableItemBackground" android:scaleType="center" + android:contentDescription="@string/a11y_show_password" android:src="@drawable/ic_eye_black" android:tint="?attr/colorAccent" /> diff --git a/vector/src/main/res/values/strings_riotX.xml b/vector/src/main/res/values/strings_riotX.xml index 6ee8229c35..1ef1587c70 100644 --- a/vector/src/main/res/values/strings_riotX.xml +++ b/vector/src/main/res/values/strings_riotX.xml @@ -21,6 +21,8 @@ Create a new direct conversation Create a new room Close keys backup banner + Show password + Hide password %s, %s and %d others read From 11d72b81f62d4375e48072d68f127d40007c2b01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Sat, 28 Sep 2019 21:24:55 +0200 Subject: [PATCH 7/9] Add CHANGES.md entry --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 531bc25e25..edaa8b3c01 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,7 +10,7 @@ Improvements: - Handle read markers (#84) Other changes: - - + - Accessibility improvements to read receipts in the room timeline and reactions emoji chooser Bugfix: - Fix issue on upload error in loop (#587) From 5db3c81aa93f012d16a922367b8bf9767bc3a2f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Wed, 2 Oct 2019 20:51:57 +0200 Subject: [PATCH 8/9] Add contentDescription to the jump to botton view MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Vágner --- vector/src/main/res/layout/fragment_room_detail.xml | 3 ++- vector/src/main/res/values/strings_riotX.xml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/vector/src/main/res/layout/fragment_room_detail.xml b/vector/src/main/res/layout/fragment_room_detail.xml index a9385f4eeb..f93ee48990 100644 --- a/vector/src/main/res/layout/fragment_room_detail.xml +++ b/vector/src/main/res/layout/fragment_room_detail.xml @@ -166,6 +166,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="16dp" + android:contentDescription="@string/a11y_jump_to_bottom" android:src="@drawable/chevron_down" app:backgroundTint="#FFFFFF" app:badgeBackgroundColor="@color/riotx_accent" @@ -178,4 +179,4 @@ app:tint="@color/black" /> - \ No newline at end of file + diff --git a/vector/src/main/res/values/strings_riotX.xml b/vector/src/main/res/values/strings_riotX.xml index 1ef1587c70..370b17be22 100644 --- a/vector/src/main/res/values/strings_riotX.xml +++ b/vector/src/main/res/values/strings_riotX.xml @@ -23,6 +23,7 @@ Close keys backup banner Show password Hide password + Jump to bottom %s, %s and %d others read From aab41d7358e4879b7385ffc1c27771d8f4fc843a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Thu, 3 Oct 2019 16:34:31 +0200 Subject: [PATCH 9/9] Code quality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Vágner --- .../java/im/vector/riotx/core/ui/views/ReadReceiptsView.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/riotx/core/ui/views/ReadReceiptsView.kt b/vector/src/main/java/im/vector/riotx/core/ui/views/ReadReceiptsView.kt index cf5af902b0..2cb0a75e20 100644 --- a/vector/src/main/java/im/vector/riotx/core/ui/views/ReadReceiptsView.kt +++ b/vector/src/main/java/im/vector/riotx/core/ui/views/ReadReceiptsView.kt @@ -78,7 +78,8 @@ class ReadReceiptsView @JvmOverloads constructor( 1 -> setContentDescription(context.getString(R.string.one_user_read, displayNames.get(0))) 2 -> setContentDescription(context.getString(R.string.two_users_read, displayNames.get(0), displayNames.get(1))) 3 -> setContentDescription(context.getString(R.string.three_users_read, displayNames.get(0), displayNames.get(1), displayNames.get(2))) - else -> setContentDescription(context.getString(R.string.two_and_some_others_read, displayNames.get(0), displayNames.get(1), (readReceipts.size -2))) + else -> setContentDescription(context.getString(R.string.two_and_some_others_read, + displayNames.get(0), displayNames.get(1), (readReceipts.size -2))) } } else { isVisible = false