11package io.github.sds100.keymapper.base.keymaps
22
33import android.graphics.drawable.Drawable
4+ import android.os.Build
45import dagger.hilt.android.scopes.ViewModelScoped
56import io.github.sds100.keymapper.base.actions.DisplayActionUseCase
67import io.github.sds100.keymapper.base.actions.GetActionErrorUseCase
78import io.github.sds100.keymapper.base.constraints.DisplayConstraintUseCase
89import io.github.sds100.keymapper.base.constraints.GetConstraintErrorUseCase
10+ import io.github.sds100.keymapper.base.input.EvdevHandleCache
911import io.github.sds100.keymapper.base.purchasing.ProductId
10- import io.github.sds100.keymapper.base.purchasing.PurchasingError
12+ import io.github.sds100.keymapper.base.purchasing.PurchasingError.ProductNotPurchased
1113import io.github.sds100.keymapper.base.purchasing.PurchasingManager
1214import io.github.sds100.keymapper.base.system.inputmethod.KeyMapperImeHelper
1315import io.github.sds100.keymapper.base.system.inputmethod.SwitchImeInterface
@@ -17,6 +19,7 @@ import io.github.sds100.keymapper.base.utils.navigation.NavDestination
1719import io.github.sds100.keymapper.base.utils.navigation.NavigationProvider
1820import io.github.sds100.keymapper.base.utils.navigation.navigate
1921import io.github.sds100.keymapper.common.BuildConfigProvider
22+ import io.github.sds100.keymapper.common.models.EvdevDeviceInfo
2023import io.github.sds100.keymapper.common.utils.KMError
2124import io.github.sds100.keymapper.common.utils.KMResult
2225import io.github.sds100.keymapper.common.utils.State
@@ -27,8 +30,11 @@ import io.github.sds100.keymapper.common.utils.then
2730import io.github.sds100.keymapper.common.utils.valueIfFailure
2831import io.github.sds100.keymapper.data.Keys
2932import io.github.sds100.keymapper.data.repositories.PreferenceRepository
33+ import io.github.sds100.keymapper.sysbridge.manager.SystemBridgeConnectionManager
34+ import io.github.sds100.keymapper.sysbridge.manager.SystemBridgeConnectionState
3035import io.github.sds100.keymapper.sysbridge.utils.SystemBridgeError
31- import io.github.sds100.keymapper.system.SystemError
36+ import io.github.sds100.keymapper.system.SystemError.ImeDisabled
37+ import io.github.sds100.keymapper.system.SystemError.PermissionDenied
3238import io.github.sds100.keymapper.system.accessibility.AccessibilityServiceAdapter
3339import io.github.sds100.keymapper.system.apps.PackageManagerAdapter
3440import io.github.sds100.keymapper.system.inputmethod.InputMethodAdapter
@@ -42,7 +48,9 @@ import kotlinx.coroutines.flow.callbackFlow
4248import kotlinx.coroutines.flow.combine
4349import kotlinx.coroutines.flow.filterIsInstance
4450import kotlinx.coroutines.flow.first
51+ import kotlinx.coroutines.flow.flowOf
4552import kotlinx.coroutines.flow.map
53+ import kotlinx.coroutines.flow.merge
4654import kotlinx.coroutines.flow.onStart
4755import kotlinx.coroutines.withTimeout
4856import javax.inject.Inject
@@ -61,6 +69,8 @@ class DisplayKeyMapUseCaseImpl @Inject constructor(
6169 private val getConstraintErrorUseCase : GetConstraintErrorUseCase ,
6270 private val buildConfigProvider : BuildConfigProvider ,
6371 private val navigationProvider : NavigationProvider ,
72+ private val systemBridgeConnectionManager : SystemBridgeConnectionManager ,
73+ private val evdevHandleCache : EvdevHandleCache
6474) : DisplayKeyMapUseCase,
6575 GetActionErrorUseCase by getActionErrorUseCase,
6676 GetConstraintErrorUseCase by getConstraintErrorUseCase {
@@ -94,22 +104,42 @@ class DisplayKeyMapUseCaseImpl @Inject constructor(
94104 purchasingManager.purchases.collect(this ::send)
95105 }
96106
107+ private val systemBridgeConnectionState: Flow <SystemBridgeConnectionState ?> =
108+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .Q ) {
109+ systemBridgeConnectionManager.connectionState
110+ } else {
111+ flowOf(null )
112+ }
113+
114+ private val evdevDevices: Flow <List <EvdevDeviceInfo >? > =
115+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .Q ) {
116+ evdevHandleCache.devices
117+ } else {
118+ flowOf(null )
119+ }
120+
97121 /* *
98122 * Cache the data required for checking errors to reduce the latency of repeatedly checking
99123 * the errors.
100124 */
101125 override val triggerErrorSnapshot: Flow <TriggerErrorSnapshot > = combine(
102- permissionAdapter.onPermissionsUpdate.onStart { emit(Unit ) },
126+ merge(
127+ permissionAdapter.onPermissionsUpdate.onStart { emit(Unit ) },
128+ inputMethodAdapter.chosenIme
129+ ),
103130 purchasesFlow,
104- inputMethodAdapter.chosenIme,
105131 showDpadImeSetupError,
106- ) { _, purchases, _, showDpadImeSetupError ->
132+ systemBridgeConnectionState,
133+ evdevDevices
134+ ) { _, purchases, showDpadImeSetupError, systemBridgeConnectionState, evdevDevices ->
107135 TriggerErrorSnapshot (
108136 isKeyMapperImeChosen = keyMapperImeHelper.isCompatibleImeChosen(),
109137 isDndAccessGranted = permissionAdapter.isGranted(Permission .ACCESS_NOTIFICATION_POLICY ),
110138 isRootGranted = permissionAdapter.isGranted(Permission .ROOT ),
111139 purchases = purchases.dataOrNull() ? : Success (emptySet()),
112140 showDpadImeSetupError = showDpadImeSetupError,
141+ isSystemBridgeConnected = systemBridgeConnectionState is SystemBridgeConnectionState .Connected ,
142+ evdevDevices = evdevDevices
113143 )
114144 }
115145
@@ -126,24 +156,25 @@ class DisplayKeyMapUseCaseImpl @Inject constructor(
126156
127157 override suspend fun fixTriggerError (error : TriggerError ) {
128158 when (error) {
129- TriggerError .DND_ACCESS_DENIED -> fixError(SystemError . PermissionDenied (Permission .ACCESS_NOTIFICATION_POLICY ))
159+ TriggerError .DND_ACCESS_DENIED -> fixError(PermissionDenied (Permission .ACCESS_NOTIFICATION_POLICY ))
130160
131161 TriggerError .CANT_DETECT_IN_PHONE_CALL -> fixError(KMError .CantDetectKeyEventsInPhoneCall )
132162 TriggerError .ASSISTANT_TRIGGER_NOT_PURCHASED -> fixError(
133- PurchasingError . ProductNotPurchased (
163+ ProductNotPurchased (
134164 ProductId .ASSISTANT_TRIGGER ,
135165 ),
136166 )
137167
138168 TriggerError .DPAD_IME_NOT_SELECTED -> fixError(KMError .DpadTriggerImeNotSelected )
139- TriggerError .FLOATING_BUTTON_DELETED -> {}
140169 TriggerError .FLOATING_BUTTONS_NOT_PURCHASED -> fixError(
141- PurchasingError . ProductNotPurchased (
170+ ProductNotPurchased (
142171 ProductId .FLOATING_BUTTONS ,
143172 ),
144173 )
145174
146175 TriggerError .PURCHASE_VERIFICATION_FAILED -> purchasingManager.refresh()
176+ TriggerError .SYSTEM_BRIDGE_DISCONNECTED -> fixError(SystemBridgeError .Disconnected )
177+ TriggerError .EVDEV_DEVICE_NOT_FOUND , TriggerError .FLOATING_BUTTON_DELETED , TriggerError .SYSTEM_BRIDGE_UNSUPPORTED -> {}
147178 }
148179 }
149180
@@ -166,8 +197,8 @@ class DisplayKeyMapUseCaseImpl @Inject constructor(
166197 }
167198
168199 KMError .NoCompatibleImeEnabled -> keyMapperImeHelper.enableCompatibleInputMethods()
169- is SystemError . ImeDisabled -> switchImeInterface.enableIme(error.ime.id)
170- is SystemError . PermissionDenied -> permissionAdapter.request(error.permission)
200+ is ImeDisabled -> switchImeInterface.enableIme(error.ime.id)
201+ is PermissionDenied -> permissionAdapter.request(error.permission)
171202 is KMError .ShizukuNotStarted -> packageManagerAdapter.openApp(ShizukuUtils .SHIZUKU_PACKAGE )
172203 is KMError .CantDetectKeyEventsInPhoneCall -> {
173204 if (! keyMapperImeHelper.isCompatibleImeEnabled()) {
0 commit comments