@@ -2,8 +2,10 @@ package io.github.sds100.keymapper.base.onboarding
22
33import dagger.hilt.android.scopes.ViewModelScoped
44import io.github.sds100.keymapper.base.R
5+ import io.github.sds100.keymapper.base.keymaps.DisplayKeyMapUseCase
56import io.github.sds100.keymapper.base.trigger.ConfigTriggerUseCase
67import io.github.sds100.keymapper.base.trigger.KeyCodeTriggerKey
8+ import io.github.sds100.keymapper.base.trigger.KeyEventTriggerKey
79import io.github.sds100.keymapper.base.trigger.Trigger
810import io.github.sds100.keymapper.base.trigger.TriggerMode
911import io.github.sds100.keymapper.base.utils.ui.ResourceProvider
@@ -26,6 +28,7 @@ class OnboardingTipDelegateImpl @Inject constructor(
2628 private val viewModelScope : CoroutineScope ,
2729 private val preferenceRepository : PreferenceRepository ,
2830 private val configTriggerUseCase : ConfigTriggerUseCase ,
31+ private val displayKeyMap : DisplayKeyMapUseCase ,
2932 resourceProvider : ResourceProvider
3033) : OnboardingTipDelegate, PreferenceRepository by preferenceRepository,
3134 ResourceProvider by resourceProvider {
@@ -35,6 +38,9 @@ class OnboardingTipDelegateImpl @Inject constructor(
3538 private const val PARALLEL_TRIGGER_TIP_ID = " parallel_trigger_tip"
3639 private const val SEQUENCE_TRIGGER_TIP_ID = " sequence_trigger_tip"
3740 private const val TRIGGER_CONSTRAINTS_TIP_ID = " trigger_constraints_tip"
41+ const val CAPS_LOCK_TIP_ID = " caps_lock_tip"
42+ const val SCREEN_PINNING_TIP_ID = " screen_pinning_tip"
43+ const val IME_DETECTION_TIP_ID = " ime_detection_tip"
3844 }
3945
4046 override val triggerTip: MutableStateFlow <OnboardingTipModel ?> = MutableStateFlow (null )
@@ -54,6 +60,21 @@ class OnboardingTipDelegateImpl @Inject constructor(
5460 false ,
5561 )
5662
63+ private var shownCapsLockTip: Boolean by PrefDelegate (
64+ Keys .shownCapsLockTip,
65+ false ,
66+ )
67+
68+ private var shownScreenPinningTip: Boolean by PrefDelegate (
69+ Keys .shownScreenPinningTip,
70+ false ,
71+ )
72+
73+ private var shownImeDetectionTip: Boolean by PrefDelegate (
74+ Keys .shownTriggerKeyboardIconExplanation,
75+ false ,
76+ )
77+
5778 init {
5879 viewModelScope.launch {
5980 configTriggerUseCase.keyMap
@@ -79,58 +100,119 @@ class OnboardingTipDelegateImpl @Inject constructor(
79100 TRIGGER_CONSTRAINTS_TIP_ID -> {
80101 shownTriggerConstraintsTip = true
81102 }
103+
104+ CAPS_LOCK_TIP_ID -> {
105+ shownCapsLockTip = true
106+ }
107+
108+ SCREEN_PINNING_TIP_ID -> {
109+ shownScreenPinningTip = true
110+ }
111+
112+ IME_DETECTION_TIP_ID -> {
113+ shownImeDetectionTip = true
114+ }
115+
82116 // POWER_BUTTON_EMERGENCY_TIP_ID doesn't need preference setting as it's non-dismissable
83117 }
84118
85119 triggerTip.value = null
86120 }
87121
88- private fun onCollectTrigger (trigger : Trigger ) {
122+ private suspend fun onCollectTrigger (trigger : Trigger ) {
89123 val showPowerButtonEmergencyTip = trigger.keys.any {
90124 it is KeyCodeTriggerKey && KeyEventUtils .isPowerButtonKey(
91125 it.keyCode,
92126 it.scanCode ? : - 1 ,
93127 )
94128 }
95129
96- if (showPowerButtonEmergencyTip) {
97- val tipModel = OnboardingTipModel (
98- id = POWER_BUTTON_EMERGENCY_TIP_ID ,
99- title = getString(R .string.pro_mode_emergency_tip_title),
100- message = getString(R .string.pro_mode_emergency_tip_text),
101- isDismissable = false
102- )
130+ val hasCapsLockKey =
131+ trigger.keys.any { it is KeyEventTriggerKey && it.keyCode == android.view.KeyEvent .KEYCODE_CAPS_LOCK }
132+ val hasBackKey =
133+ trigger.keys.any { it is KeyEventTriggerKey && it.keyCode == android.view.KeyEvent .KEYCODE_BACK }
134+ val hasImeKey = trigger.keys.any { it is KeyEventTriggerKey && it.requiresIme }
103135
104- triggerTip.value = tipModel
136+ when {
137+ showPowerButtonEmergencyTip -> {
138+ val tipModel = OnboardingTipModel (
139+ id = POWER_BUTTON_EMERGENCY_TIP_ID ,
140+ title = getString(R .string.pro_mode_emergency_tip_title),
141+ message = getString(R .string.pro_mode_emergency_tip_text),
142+ isDismissable = false
143+ )
144+
145+ triggerTip.value = tipModel
105146
106- } else if (trigger.mode is TriggerMode .Parallel ) {
107- if (shownParallelTriggerOrderExplanation) {
108- return
109147 }
110148
111- val tipModel = OnboardingTipModel (
112- id = PARALLEL_TRIGGER_TIP_ID ,
113- title = getString(R .string.tip_parallel_trigger_title),
114- message = getString(R .string.dialog_message_parallel_trigger_order),
115- isDismissable = true
116- )
149+ trigger.mode is TriggerMode .Parallel && ! shownParallelTriggerOrderExplanation -> {
150+ val tipModel = OnboardingTipModel (
151+ id = PARALLEL_TRIGGER_TIP_ID ,
152+ title = getString(R .string.tip_parallel_trigger_title),
153+ message = getString(R .string.dialog_message_parallel_trigger_order),
154+ isDismissable = true
155+ )
117156
118- triggerTip.value = tipModel
119- } else if (trigger.mode is TriggerMode .Sequence ) {
120- if (shownSequenceTriggerExplanation) {
121- return
157+ triggerTip.value = tipModel
122158 }
123159
124- val tipModel = OnboardingTipModel (
125- id = SEQUENCE_TRIGGER_TIP_ID ,
126- title = getString(R .string.tip_sequence_trigger_title),
127- message = getString(R .string.dialog_message_sequence_trigger_explanation),
128- isDismissable = true
129- )
160+ trigger.mode is TriggerMode .Sequence && ! shownSequenceTriggerExplanation -> {
161+
162+ val tipModel = OnboardingTipModel (
163+ id = SEQUENCE_TRIGGER_TIP_ID ,
164+ title = getString(R .string.tip_sequence_trigger_title),
165+ message = getString(R .string.dialog_message_sequence_trigger_explanation),
166+ isDismissable = true
167+ )
168+
169+ triggerTip.value = tipModel
170+ }
171+
172+ trigger.keys.isNotEmpty() && ! shownTriggerConstraintsTip -> {
173+ val tipModel = OnboardingTipModel (
174+ id = TRIGGER_CONSTRAINTS_TIP_ID ,
175+ title = getString(R .string.trigger_constraints_tip_title),
176+ message = getString(R .string.trigger_constraints_tip_text),
177+ isDismissable = true
178+ )
179+
180+ triggerTip.value = tipModel
181+ }
182+
183+ hasCapsLockKey && ! shownCapsLockTip -> {
184+ val tip = OnboardingTipModel (
185+ id = CAPS_LOCK_TIP_ID ,
186+ title = getString(R .string.tip_caps_lock_title),
187+ message = getString(R .string.tip_caps_lock_text),
188+ isDismissable = true ,
189+ )
190+ triggerTip.value = tip
191+ }
192+
193+ hasBackKey && ! shownScreenPinningTip -> {
194+ val tip = OnboardingTipModel (
195+ id = SCREEN_PINNING_TIP_ID ,
196+ title = getString(R .string.tip_screen_pinning_title),
197+ message = getString(R .string.tip_screen_pinning_text),
198+ isDismissable = true ,
199+ )
200+ triggerTip.value = tip
201+ }
202+
203+ hasImeKey && ! shownImeDetectionTip -> {
204+ val tip = OnboardingTipModel (
205+ id = IME_DETECTION_TIP_ID ,
206+ title = getString(R .string.tip_ime_detection_title),
207+ message = getString(R .string.tip_ime_detection_text),
208+ isDismissable = true ,
209+ )
210+ triggerTip.value = tip
211+ }
130212
131- triggerTip.value = tipModel
132- } else {
133- triggerTip.value = null
213+ else -> {
214+ triggerTip.value = null
215+ }
134216 }
135217 }
136218}
0 commit comments