From f0508d342f01b42c7427ff177fc6eeeb22d1a258 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 20 Jun 2025 09:43:01 +0200 Subject: [PATCH] a11y: Make isTalkbackActive() live. We made the assumption that the user needs to navigate to the setting to enable or disable the talkback, but there is a way to add a talkback switch on the bottom navigation bar. So the talkback can be enabled/disabled when the application is resumed. Since the UI may render differently depending on the talkback state, we need to make the composable `isTalkbackActive()` backed on a mutable state. --- .../libraries/ui/utils/time/IsTalkbackEnabled.kt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/time/IsTalkbackEnabled.kt b/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/time/IsTalkbackEnabled.kt index d8be4cb54a..40b0a3cc76 100644 --- a/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/time/IsTalkbackEnabled.kt +++ b/libraries/ui-utils/src/main/kotlin/io/element/android/libraries/ui/utils/time/IsTalkbackEnabled.kt @@ -9,12 +9,26 @@ package io.element.android.libraries.ui.utils.time import android.view.accessibility.AccessibilityManager import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext @Composable fun isTalkbackActive(): Boolean { val context = LocalContext.current val accessibilityManager = remember { context.getSystemService(AccessibilityManager::class.java) } - return accessibilityManager.isTouchExplorationEnabled + var isTouchExplorationEnabled by remember { mutableStateOf(accessibilityManager.isTouchExplorationEnabled) } + DisposableEffect(Unit) { + val listener = AccessibilityManager.TouchExplorationStateChangeListener { enabled -> + isTouchExplorationEnabled = enabled + } + accessibilityManager.addTouchExplorationStateChangeListener(listener) + onDispose { + accessibilityManager.removeTouchExplorationStateChangeListener(listener) + } + } + return isTouchExplorationEnabled }