• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.systemui.accessibility.data.repository
18 
19 import android.view.accessibility.AccessibilityManager
20 import android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener
21 import com.android.app.tracing.FlowTracing.tracedAwaitClose
22 import com.android.app.tracing.FlowTracing.tracedConflatedCallbackFlow
23 import dagger.Module
24 import dagger.Provides
25 import kotlin.time.Duration
26 import kotlin.time.Duration.Companion.milliseconds
27 import kotlinx.coroutines.flow.Flow
28 import kotlinx.coroutines.flow.distinctUntilChanged
29 
30 /** Exposes accessibility-related state. */
31 interface AccessibilityRepository {
32     /** @see [AccessibilityManager.isTouchExplorationEnabled] */
33     val isTouchExplorationEnabled: Flow<Boolean>
34     /** @see [AccessibilityManager.isEnabled] */
35     val isEnabled: Flow<Boolean>
36 
getRecommendedTimeoutnull37     fun getRecommendedTimeout(originalTimeout: Duration, uiFlags: Int): Duration
38 
39     companion object {
40         operator fun invoke(a11yManager: AccessibilityManager): AccessibilityRepository =
41             AccessibilityRepositoryImpl(a11yManager)
42     }
43 }
44 
45 private const val TAG = "AccessibilityRepository"
46 
47 private class AccessibilityRepositoryImpl(private val manager: AccessibilityManager) :
48     AccessibilityRepository {
49     override val isTouchExplorationEnabled: Flow<Boolean> =
<lambda>null50         tracedConflatedCallbackFlow(TAG) {
51                 val listener = TouchExplorationStateChangeListener(::trySend)
52                 manager.addTouchExplorationStateChangeListener(listener)
53                 trySend(manager.isTouchExplorationEnabled)
54                 tracedAwaitClose(TAG) {
55                     manager.removeTouchExplorationStateChangeListener(listener)
56                 }
57             }
58             .distinctUntilChanged()
59 
60     override val isEnabled: Flow<Boolean> =
<lambda>null61         tracedConflatedCallbackFlow(TAG) {
62                 val listener = AccessibilityManager.AccessibilityStateChangeListener(::trySend)
63                 manager.addAccessibilityStateChangeListener(listener)
64                 trySend(manager.isEnabled)
65                 tracedAwaitClose(TAG) { manager.removeAccessibilityStateChangeListener(listener) }
66             }
67             .distinctUntilChanged()
68 
getRecommendedTimeoutnull69     override fun getRecommendedTimeout(originalTimeout: Duration, uiFlags: Int): Duration {
70         return manager
71             .getRecommendedTimeoutMillis(originalTimeout.inWholeMilliseconds.toInt(), uiFlags)
72             .milliseconds
73     }
74 }
75 
76 @Module
77 object AccessibilityRepositoryModule {
provideReponull78     @Provides fun provideRepo(manager: AccessibilityManager) = AccessibilityRepository(manager)
79 }
80