Skip to content

Commit de607f5

Browse files
committed
#1819 feat: refactor dialogs for setting up the accessibility service
1 parent 42bf384 commit de607f5

File tree

26 files changed

+481
-176
lines changed

26 files changed

+481
-176
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
- #1335 Intent API to enable/disable/toggle a key map.
1616
- #114 action to force stop app, and an action to clear an app from recents
1717
- #727 Actions to send SMS messages: "Send SMS" and "Compose SMS"
18+
- #1819 Explain how to enable the accessibility service restricted setting
1819

1920
## Removed
2021

app/src/main/java/io/github/sds100/keymapper/MainFragment.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import io.github.sds100.keymapper.base.home.HomeKeyMapListScreen
3737
import io.github.sds100.keymapper.base.keymaps.ConfigKeyMapScreen
3838
import io.github.sds100.keymapper.base.keymaps.ConfigKeyMapViewModel
3939
import io.github.sds100.keymapper.base.keymaps.KeyMapOptionsScreen
40+
import io.github.sds100.keymapper.base.onboarding.SetupAccessibilityServiceDelegateImpl
4041
import io.github.sds100.keymapper.base.utils.navigation.NavDestination
4142
import io.github.sds100.keymapper.base.utils.navigation.NavigationProviderImpl
4243
import io.github.sds100.keymapper.base.utils.navigation.SetupNavigation
@@ -54,6 +55,9 @@ class MainFragment : Fragment() {
5455
@Inject
5556
lateinit var navigationProvider: NavigationProviderImpl
5657

58+
@Inject
59+
lateinit var setupAccessibilityServiceDelegate: SetupAccessibilityServiceDelegateImpl
60+
5761
private lateinit var composeView: ComposeView
5862

5963
private lateinit var navController: NavHostController
@@ -104,6 +108,7 @@ class MainFragment : Fragment() {
104108
.add(WindowInsets.displayCutout.only(sides = WindowInsetsSides.Horizontal)),
105109
),
106110
navController = navController,
111+
setupAccessibilityServiceDelegate = setupAccessibilityServiceDelegate,
107112
composableDestinations = {
108113
composableDestinations(navController)
109114
},
@@ -130,6 +135,7 @@ class MainFragment : Fragment() {
130135
private fun NavGraphBuilder.composableDestinations(navController: NavController) {
131136
composable<NavDestination.Home> {
132137
val snackbarState = remember { SnackbarHostState() }
138+
133139
val viewModel: HomeViewModel = hiltViewModel()
134140

135141
HomeKeyMapListScreen(

app/src/main/java/io/github/sds100/keymapper/home/HomeViewModel.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import io.github.sds100.keymapper.base.home.ListKeyMapsUseCase
88
import io.github.sds100.keymapper.base.home.ShowHomeScreenAlertsUseCase
99
import io.github.sds100.keymapper.base.keymaps.PauseKeyMapsUseCase
1010
import io.github.sds100.keymapper.base.onboarding.OnboardingUseCase
11+
import io.github.sds100.keymapper.base.onboarding.SetupAccessibilityServiceDelegate
1112
import io.github.sds100.keymapper.base.sorting.SortKeyMapsUseCase
1213
import io.github.sds100.keymapper.base.system.inputmethod.ShowInputMethodPickerUseCase
1314
import io.github.sds100.keymapper.base.utils.navigation.NavigationProvider
@@ -25,6 +26,7 @@ class HomeViewModel @Inject constructor(
2526
resourceProvider: ResourceProvider,
2627
private val sortKeyMaps: SortKeyMapsUseCase,
2728
private val showInputMethodPickerUseCase: ShowInputMethodPickerUseCase,
29+
val setupAccessibilityServiceDelegate: SetupAccessibilityServiceDelegate,
2830
fixKeyEventActionDelegate: FixKeyEventActionDelegate,
2931
navigationProvider: NavigationProvider,
3032
dialogProvider: DialogProvider,
@@ -37,6 +39,7 @@ class HomeViewModel @Inject constructor(
3739
resourceProvider,
3840
sortKeyMaps,
3941
showInputMethodPickerUseCase,
42+
setupAccessibilityServiceDelegate,
4043
fixKeyEventActionDelegate,
4144
navigationProvider,
4245
dialogProvider,

app/src/main/java/io/github/sds100/keymapper/trigger/ConfigTriggerViewModel.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import io.github.sds100.keymapper.base.keymaps.DisplayKeyMapUseCase
66
import io.github.sds100.keymapper.base.keymaps.FingerprintGesturesSupportedUseCase
77
import io.github.sds100.keymapper.base.onboarding.OnboardingTipDelegate
88
import io.github.sds100.keymapper.base.onboarding.OnboardingUseCase
9+
import io.github.sds100.keymapper.base.onboarding.SetupAccessibilityServiceDelegate
910
import io.github.sds100.keymapper.base.shortcuts.CreateKeyMapShortcutUseCase
1011
import io.github.sds100.keymapper.base.trigger.BaseConfigTriggerViewModel
1112
import io.github.sds100.keymapper.base.trigger.ConfigTriggerUseCase
@@ -26,6 +27,7 @@ class ConfigTriggerViewModel @Inject constructor(
2627
private val createKeyMapShortcut: CreateKeyMapShortcutUseCase,
2728
private val displayKeyMap: DisplayKeyMapUseCase,
2829
private val fingerprintGesturesSupported: FingerprintGesturesSupportedUseCase,
30+
setupAccessibilityServiceDelegate: SetupAccessibilityServiceDelegate,
2931
onboardingTipDelegate: OnboardingTipDelegate,
3032
triggerSetupDelegate: TriggerSetupDelegate,
3133
resourceProvider: ResourceProvider,
@@ -38,6 +40,7 @@ class ConfigTriggerViewModel @Inject constructor(
3840
createKeyMapShortcut = createKeyMapShortcut,
3941
displayKeyMap = displayKeyMap,
4042
fingerprintGesturesSupported = fingerprintGesturesSupported,
43+
setupAccessibilityServiceDelegate = setupAccessibilityServiceDelegate,
4144
onboardingTipDelegate = onboardingTipDelegate,
4245
triggerSetupDelegate = triggerSetupDelegate,
4346
resourceProvider = resourceProvider,

base/src/main/java/io/github/sds100/keymapper/base/ActivityViewModel.kt

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,18 @@ package io.github.sds100.keymapper.base
33
import androidx.lifecycle.ViewModel
44
import androidx.lifecycle.viewModelScope
55
import dagger.hilt.android.lifecycle.HiltViewModel
6+
import io.github.sds100.keymapper.base.onboarding.SetupAccessibilityServiceDelegate
67
import io.github.sds100.keymapper.base.utils.navigation.NavDestination
78
import io.github.sds100.keymapper.base.utils.navigation.NavigationProvider
89
import io.github.sds100.keymapper.base.utils.navigation.navigate
910
import io.github.sds100.keymapper.base.utils.ui.DialogProvider
1011
import io.github.sds100.keymapper.base.utils.ui.ResourceProvider
11-
import io.github.sds100.keymapper.base.utils.ui.ViewModelHelper
1212
import kotlinx.coroutines.launch
1313
import javax.inject.Inject
1414

1515
@HiltViewModel
1616
class ActivityViewModel @Inject constructor(
17+
private val setupAccessibilityServiceDelegate: SetupAccessibilityServiceDelegate,
1718
resourceProvider: ResourceProvider,
1819
dialogProvider: DialogProvider,
1920
navigationProvider: NavigationProvider,
@@ -25,12 +26,7 @@ class ActivityViewModel @Inject constructor(
2526
var previousNightMode: Int? = null
2627

2728
fun onCantFindAccessibilitySettings() {
28-
viewModelScope.launch {
29-
ViewModelHelper.handleCantFindAccessibilitySettings(
30-
resourceProvider = this@ActivityViewModel,
31-
dialogProvider = this@ActivityViewModel,
32-
)
33-
}
29+
setupAccessibilityServiceDelegate.showCantFindAccessibilitySettingsDialog()
3430
}
3531

3632
fun launchProModeSetup() {

base/src/main/java/io/github/sds100/keymapper/base/BaseMainNavHost.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import io.github.sds100.keymapper.base.actions.uielement.InteractUiElementViewMo
2323
import io.github.sds100.keymapper.base.constraints.ChooseConstraintScreen
2424
import io.github.sds100.keymapper.base.constraints.ChooseConstraintViewModel
2525
import io.github.sds100.keymapper.base.logging.LogScreen
26+
import io.github.sds100.keymapper.base.onboarding.HandleAccessibilityServiceDialogs
27+
import io.github.sds100.keymapper.base.onboarding.SetupAccessibilityServiceDelegateImpl
2628
import io.github.sds100.keymapper.base.promode.ProModeScreen
2729
import io.github.sds100.keymapper.base.promode.ProModeSetupScreen
2830
import io.github.sds100.keymapper.base.settings.AutomaticChangeImeSettingsScreen
@@ -37,8 +39,11 @@ import kotlinx.serialization.json.Json
3739
fun BaseMainNavHost(
3840
modifier: Modifier = Modifier,
3941
navController: NavHostController,
42+
setupAccessibilityServiceDelegate: SetupAccessibilityServiceDelegateImpl,
4043
composableDestinations: NavGraphBuilder.() -> Unit = {},
4144
) {
45+
HandleAccessibilityServiceDialogs(setupAccessibilityServiceDelegate)
46+
4247
NavHost(
4348
modifier = modifier,
4449
navController = navController,

base/src/main/java/io/github/sds100/keymapper/base/BaseSingletonHiltModule.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ import io.github.sds100.keymapper.base.keymaps.PauseKeyMapsUseCase
2828
import io.github.sds100.keymapper.base.keymaps.PauseKeyMapsUseCaseImpl
2929
import io.github.sds100.keymapper.base.onboarding.OnboardingUseCase
3030
import io.github.sds100.keymapper.base.onboarding.OnboardingUseCaseImpl
31+
import io.github.sds100.keymapper.base.onboarding.SetupAccessibilityServiceDelegate
32+
import io.github.sds100.keymapper.base.onboarding.SetupAccessibilityServiceDelegateImpl
3133
import io.github.sds100.keymapper.base.system.accessibility.AccessibilityServiceAdapterImpl
3234
import io.github.sds100.keymapper.base.system.accessibility.ControlAccessibilityServiceUseCase
3335
import io.github.sds100.keymapper.base.system.accessibility.ControlAccessibilityServiceUseCaseImpl
@@ -170,4 +172,8 @@ abstract class BaseSingletonHiltModule {
170172
@Binds
171173
@Singleton
172174
abstract fun bindEnableKeyMapsUseCase(impl: EnableKeyMapsUseCaseImpl): EnableKeyMapsUseCase
175+
176+
@Binds
177+
@Singleton
178+
abstract fun bindSetupAccessibilityServiceDelegate(impl: SetupAccessibilityServiceDelegateImpl): SetupAccessibilityServiceDelegate
173179
}

base/src/main/java/io/github/sds100/keymapper/base/BaseViewModelHiltModule.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,5 @@ abstract class BaseViewModelHiltModule {
168168
@Binds
169169
@ViewModelScoped
170170
abstract fun bindFixKeyEventActionDelegate(impl: FixKeyEventActionDelegateImpl): FixKeyEventActionDelegate
171+
171172
}

base/src/main/java/io/github/sds100/keymapper/base/actions/ConfigActionsViewModel.kt

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import io.github.sds100.keymapper.base.R
77
import io.github.sds100.keymapper.base.actions.keyevent.FixKeyEventActionDelegate
88
import io.github.sds100.keymapper.base.keymaps.KeyMap
99
import io.github.sds100.keymapper.base.keymaps.ShortcutModel
10+
import io.github.sds100.keymapper.base.onboarding.SetupAccessibilityServiceDelegate
1011
import io.github.sds100.keymapper.base.utils.getFullMessage
1112
import io.github.sds100.keymapper.base.utils.isFixable
1213
import io.github.sds100.keymapper.base.utils.navigation.NavDestination
@@ -17,6 +18,7 @@ import io.github.sds100.keymapper.base.utils.ui.LinkType
1718
import io.github.sds100.keymapper.base.utils.ui.ResourceProvider
1819
import io.github.sds100.keymapper.base.utils.ui.ViewModelHelper
1920
import io.github.sds100.keymapper.base.utils.ui.compose.ComposeIconInfo
21+
import io.github.sds100.keymapper.common.utils.AccessibilityServiceError
2022
import io.github.sds100.keymapper.common.utils.KMError
2123
import io.github.sds100.keymapper.common.utils.State
2224
import io.github.sds100.keymapper.common.utils.dataOrNull
@@ -44,12 +46,14 @@ class ConfigActionsViewModel @Inject constructor(
4446
private val createAction: CreateActionUseCase,
4547
private val testAction: TestActionUseCase,
4648
private val config: ConfigActionsUseCase,
49+
setupAccessibilityServiceDelegate: SetupAccessibilityServiceDelegate,
4750
fixKeyEventActionDelegate: FixKeyEventActionDelegate,
4851
resourceProvider: ResourceProvider,
4952
navigationProvider: NavigationProvider,
5053
dialogProvider: DialogProvider,
5154
) : ViewModel(),
5255
ActionOptionsBottomSheetCallback,
56+
SetupAccessibilityServiceDelegate by setupAccessibilityServiceDelegate,
5357
ResourceProvider by resourceProvider,
5458
DialogProvider by dialogProvider,
5559
NavigationProvider by navigationProvider,
@@ -248,21 +252,8 @@ class ConfigActionsViewModel @Inject constructor(
248252

249253
private suspend fun attemptTestAction(actionData: ActionData) {
250254
testAction.invoke(actionData).onFailure { error ->
251-
252-
if (error is KMError.AccessibilityServiceDisabled) {
253-
ViewModelHelper.handleAccessibilityServiceStoppedDialog(
254-
resourceProvider = this,
255-
dialogProvider = this,
256-
startService = displayAction::startAccessibilityService,
257-
)
258-
}
259-
260-
if (error is KMError.AccessibilityServiceCrashed) {
261-
ViewModelHelper.handleAccessibilityServiceCrashedDialog(
262-
resourceProvider = this,
263-
dialogProvider = this,
264-
restartService = displayAction::restartAccessibilityService,
265-
)
255+
if (error is AccessibilityServiceError) {
256+
showFixAccessibilityServiceDialog(error)
266257
}
267258
}
268259
}

base/src/main/java/io/github/sds100/keymapper/base/actions/keyevent/FixKeyEventActionDelegate.kt

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package io.github.sds100.keymapper.base.actions.keyevent
22

33
import android.os.Build
44
import dagger.hilt.android.scopes.ViewModelScoped
5+
import io.github.sds100.keymapper.base.onboarding.SetupAccessibilityServiceDelegate
56
import io.github.sds100.keymapper.base.system.accessibility.ControlAccessibilityServiceUseCase
67
import io.github.sds100.keymapper.base.trigger.ProModeStatus
78
import io.github.sds100.keymapper.base.trigger.SetupInputMethodUseCase
@@ -10,7 +11,6 @@ import io.github.sds100.keymapper.base.utils.navigation.NavigationProvider
1011
import io.github.sds100.keymapper.base.utils.navigation.navigate
1112
import io.github.sds100.keymapper.base.utils.ui.DialogProvider
1213
import io.github.sds100.keymapper.base.utils.ui.ResourceProvider
13-
import io.github.sds100.keymapper.base.utils.ui.ViewModelHelper
1414
import io.github.sds100.keymapper.common.utils.Constants
1515
import io.github.sds100.keymapper.common.utils.onFailure
1616
import io.github.sds100.keymapper.data.Keys
@@ -26,7 +26,6 @@ import kotlinx.coroutines.flow.MutableStateFlow
2626
import kotlinx.coroutines.flow.SharingStarted
2727
import kotlinx.coroutines.flow.StateFlow
2828
import kotlinx.coroutines.flow.combine
29-
import kotlinx.coroutines.flow.first
3029
import kotlinx.coroutines.flow.flatMapLatest
3130
import kotlinx.coroutines.flow.flowOf
3231
import kotlinx.coroutines.flow.map
@@ -44,6 +43,7 @@ class FixKeyEventActionDelegateImpl @Inject constructor(
4443
val systemBridgeConnectionManager: SystemBridgeConnectionManager,
4544
val setupInputMethodUseCase: SetupInputMethodUseCase,
4645
val preferenceRepository: PreferenceRepository,
46+
val setupAccessibilityServiceDelegate: SetupAccessibilityServiceDelegate,
4747
resourceProvider: ResourceProvider,
4848
dialogProvider: DialogProvider,
4949
navigationProvider: NavigationProvider,
@@ -128,21 +128,7 @@ class FixKeyEventActionDelegateImpl @Inject constructor(
128128

129129
override fun onEnableAccessibilityServiceClick() {
130130
viewModelScope.launch {
131-
val state = controlAccessibilityServiceUseCase.serviceState.first()
132-
133-
if (state == AccessibilityServiceState.DISABLED) {
134-
ViewModelHelper.handleAccessibilityServiceStoppedDialog(
135-
resourceProvider = this@FixKeyEventActionDelegateImpl,
136-
dialogProvider = this@FixKeyEventActionDelegateImpl,
137-
startService = controlAccessibilityServiceUseCase::startService,
138-
)
139-
} else if (state == AccessibilityServiceState.CRASHED) {
140-
ViewModelHelper.handleAccessibilityServiceCrashedDialog(
141-
resourceProvider = this@FixKeyEventActionDelegateImpl,
142-
dialogProvider = this@FixKeyEventActionDelegateImpl,
143-
restartService = controlAccessibilityServiceUseCase::restartService,
144-
)
145-
}
131+
setupAccessibilityServiceDelegate.showEnableAccessibilityServiceDialog()
146132
}
147133
}
148134

0 commit comments

Comments
 (0)