Added interupt to accessibility interactor

Test: Verified manually
Bug: 366219635
Flag: EXEMPT bugfix
Change-Id: If1dea7b3efd23e40c6c2668867b175ba84f11550
This commit is contained in:
Joshua McCloskey
2024-10-23 17:34:16 +00:00
parent 01359592a2
commit 5e2adc2683
3 changed files with 29 additions and 9 deletions

View File

@@ -16,6 +16,7 @@
package com.android.settings.biometrics.fingerprint2.domain.interactor package com.android.settings.biometrics.fingerprint2.domain.interactor
import android.util.Log
import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityEvent
import android.view.accessibility.AccessibilityEvent.TYPE_ANNOUNCEMENT import android.view.accessibility.AccessibilityEvent.TYPE_ANNOUNCEMENT
import android.view.accessibility.AccessibilityManager import android.view.accessibility.AccessibilityManager
@@ -30,23 +31,26 @@ import kotlinx.coroutines.flow.stateIn
interface AccessibilityInteractor { interface AccessibilityInteractor {
/** A flow that contains whether or not accessibility is enabled */ /** A flow that contains whether or not accessibility is enabled */
fun isEnabledFlow(scope: CoroutineScope): Flow<Boolean> fun isEnabledFlow(scope: CoroutineScope): Flow<Boolean>
val isEnabled: Boolean val isEnabled: Boolean
fun announce(clazz: Class<*>, announcement: CharSequence?) fun announce(clazz: Class<*>, announcement: CharSequence?)
fun interrupt()
} }
class AccessibilityInteractorImpl( class AccessibilityInteractorImpl(private val accessibilityManager: AccessibilityManager) :
private val accessibilityManager: AccessibilityManager, AccessibilityInteractor {
) : AccessibilityInteractor {
/** A flow that contains whether or not accessibility is enabled */ /** A flow that contains whether or not accessibility is enabled */
override fun isEnabledFlow(scope: CoroutineScope): Flow<Boolean> = override fun isEnabledFlow(scope: CoroutineScope): Flow<Boolean> =
callbackFlow { callbackFlow {
val listener = val listener =
AccessibilityManager.AccessibilityStateChangeListener { enabled -> trySend(enabled) } AccessibilityManager.AccessibilityStateChangeListener { enabled -> trySend(enabled) }
accessibilityManager.addAccessibilityStateChangeListener(listener) accessibilityManager.addAccessibilityStateChangeListener(listener)
// This clause will be called when no one is listening to the flow // This clause will be called when no one is listening to the flow
awaitClose { accessibilityManager.removeAccessibilityStateChangeListener(listener) } awaitClose { accessibilityManager.removeAccessibilityStateChangeListener(listener) }
} }
.stateIn( .stateIn(
scope, scope,
SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener
@@ -63,4 +67,17 @@ class AccessibilityInteractorImpl(
event.text.add(announcement) event.text.add(announcement)
accessibilityManager.sendAccessibilityEvent(event) accessibilityManager.sendAccessibilityEvent(event)
} }
/** Interrupts the current accessibility manager from announcing a phrase. */
override fun interrupt() {
try {
accessibilityManager.interrupt()
} catch (e: IllegalStateException) {
Log.e(TAG, "Error trying to interrupt when accessibility isn't enabled $e")
}
}
companion object {
const val TAG = "AccessibilityInteractor"
}
} }

View File

@@ -78,6 +78,7 @@ class Injector(step: FingerprintNavigationStep.UiStep) {
override val isEnabled: Boolean override val isEnabled: Boolean
get() = true get() = true
override fun announce(clazz: Class<*>, announcement: CharSequence?) {} override fun announce(clazz: Class<*>, announcement: CharSequence?) {}
override fun interrupt() {}
} }
var foldStateInteractor = var foldStateInteractor =

View File

@@ -111,6 +111,8 @@ class FingerprintEnrollFindSensorViewModelV2Test {
override val isEnabled: Boolean override val isEnabled: Boolean
get() = true get() = true
override fun announce(clazz: Class<*>, announcement: CharSequence?) {} override fun announce(clazz: Class<*>, announcement: CharSequence?) {}
override fun interrupt() {
}
} }
foldStateInteractor = foldStateInteractor =
object : FoldStateInteractor { object : FoldStateInteractor {