diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/DeckPickerFloatingActionMenu.kt b/AnkiDroid/src/main/java/com/ichi2/anki/DeckPickerFloatingActionMenu.kt
index b2eb9971a4ea..6cf6a758c425 100644
--- a/AnkiDroid/src/main/java/com/ichi2/anki/DeckPickerFloatingActionMenu.kt
+++ b/AnkiDroid/src/main/java/com/ichi2/anki/DeckPickerFloatingActionMenu.kt
@@ -18,10 +18,14 @@ package com.ichi2.anki
import android.animation.Animator
import android.content.Context
import android.content.res.ColorStateList
+import android.os.Bundle
import android.view.KeyEvent
import android.view.MotionEvent
import android.view.View
import android.widget.LinearLayout
+import androidx.core.view.AccessibilityDelegateCompat
+import androidx.core.view.ViewCompat
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
import com.google.android.material.color.MaterialColors
import com.ichi2.anki.databinding.ActivityHomescreenBinding
import com.ichi2.anki.databinding.FloatingAddButtonBinding
@@ -59,9 +63,11 @@ class DeckPickerFloatingActionMenu(
val isFragmented: Boolean
get() = studyOptionsFrame != null
+ @Suppress("DEPRECATION")
private fun showFloatingActionMenu() {
toggleListener?.onBeginToggle(isOpening = true)
deckPicker.activeSnackBar?.dismiss()
+ binding.fabMain.announceForAccessibility(context.getString(R.string.fab_menu_opened))
linearLayout.alpha = 0.5f
studyOptionsFrame?.let { it.alpha = 0.5f }
isFABOpen = true
@@ -143,8 +149,10 @@ class DeckPickerFloatingActionMenu(
* Case 2: When the user opens the side navigation drawer (without touching the FAB). In that case we don't
* want to show any type of rise and shrink animation for the FAB so we put the value `false` for the parameter.
*/
+ @Suppress("DEPRECATION")
fun closeFloatingActionMenu(applyRiseAndShrinkAnimation: Boolean) {
toggleListener?.onBeginToggle(isOpening = false)
+ binding.fabMain.announceForAccessibility(context.getString(R.string.fab_menu_closed))
if (applyRiseAndShrinkAnimation) {
linearLayout.alpha = 1f
studyOptionsFrame?.let { it.alpha = 1f }
@@ -346,6 +354,28 @@ class DeckPickerFloatingActionMenu(
}
init {
+ ViewCompat.setAccessibilityDelegate(
+ binding.fabMain,
+ object : AccessibilityDelegateCompat() {
+ override fun performAccessibilityAction(
+ host: View,
+ action: Int,
+ args: Bundle?,
+ ): Boolean {
+ if (action == AccessibilityNodeInfoCompat.ACTION_CLICK) {
+ Timber.d("FAB main button: TalkBack CLICK action performed")
+ if (!isFABOpen) {
+ showFloatingActionMenu()
+ } else {
+ addNote()
+ }
+ return true
+ }
+ return super.performAccessibilityAction(host, action, args)
+ }
+ },
+ )
+
binding.fabMain.setOnTouchListener(
object : DoubleTapListener(context) {
override fun onDoubleTap(e: MotionEvent?) {
diff --git a/AnkiDroid/src/main/res/values/02-strings.xml b/AnkiDroid/src/main/res/values/02-strings.xml
index 8c8882821128..8ee8f0e77098 100644
--- a/AnkiDroid/src/main/res/values/02-strings.xml
+++ b/AnkiDroid/src/main/res/values/02-strings.xml
@@ -450,5 +450,7 @@ opening the system text to speech settings fails">Failed to open text to speech
,
+
+ Menu opened
+ Menu closed
-