File tree Expand file tree Collapse file tree 5 files changed +19
-11
lines changed
base/src/main/java/io/github/sds100/keymapper/base Expand file tree Collapse file tree 5 files changed +19
-11
lines changed Original file line number Diff line number Diff line change @@ -212,7 +212,7 @@ class DisplayKeyMapUseCaseImpl @Inject constructor(
212212 inputMethodAdapter.showImePicker(fromForeground = true )
213213 }
214214
215- KMError .NoCompatibleImeEnabled -> keyMapperImeHelper.enableCompatibleInputMethods ()
215+ KMError .NoCompatibleImeEnabled -> keyMapperImeHelper.enableCompatibleInputMethod ()
216216
217217 is ImeDisabled -> switchImeInterface.enableIme(error.ime.id)
218218
@@ -224,7 +224,7 @@ class DisplayKeyMapUseCaseImpl @Inject constructor(
224224
225225 is KMError .CantDetectKeyEventsInPhoneCall -> {
226226 if (! keyMapperImeHelper.isCompatibleImeEnabled()) {
227- keyMapperImeHelper.enableCompatibleInputMethods ()
227+ keyMapperImeHelper.enableCompatibleInputMethod ()
228228 }
229229
230230 // wait for compatible ime to be enabled then choose it.
@@ -244,7 +244,7 @@ class DisplayKeyMapUseCaseImpl @Inject constructor(
244244 if (keyMapperImeHelper.isCompatibleImeEnabled()) {
245245 keyMapperImeHelper.chooseCompatibleInputMethod()
246246 } else {
247- keyMapperImeHelper.enableCompatibleInputMethods ()
247+ keyMapperImeHelper.enableCompatibleInputMethod ()
248248 }
249249 }
250250
Original file line number Diff line number Diff line change @@ -102,7 +102,7 @@ class ConfigSettingsUseCaseImpl @Inject constructor(
102102 get() = devicesAdapter.connectedInputDevices
103103
104104 override suspend fun enableCompatibleIme () {
105- imeHelper.enableCompatibleInputMethods ()
105+ imeHelper.enableCompatibleInputMethod ()
106106 }
107107
108108 override suspend fun chooseCompatibleIme (): KMResult <ImeInfo > =
Original file line number Diff line number Diff line change @@ -4,6 +4,7 @@ import io.github.sds100.keymapper.common.utils.KMError
44import io.github.sds100.keymapper.common.utils.KMResult
55import io.github.sds100.keymapper.common.utils.Success
66import io.github.sds100.keymapper.common.utils.firstBlocking
7+ import io.github.sds100.keymapper.common.utils.isSuccess
78import io.github.sds100.keymapper.common.utils.onSuccess
89import io.github.sds100.keymapper.common.utils.then
910import io.github.sds100.keymapper.common.utils.valueOrNull
@@ -58,14 +59,19 @@ class KeyMapperImeHelper(
5859 }
5960 }
6061
61- fun enableCompatibleInputMethods (): KMResult <Unit > {
62+ fun enableCompatibleInputMethod (): KMResult <Unit > {
6263 var result: KMResult <Unit >? = null
6364
6465 for (imePackageName in keyMapperImePackageList) {
6566 val imeId =
6667 imeAdapter.getInfoByPackageName(imePackageName).valueOrNull()?.id ? : continue
6768
6869 result = switchImeInterface.enableIme(imeId)
70+
71+ // Stop trying to enable IMEs if one is enabled.
72+ if (result.isSuccess) {
73+ break
74+ }
6975 }
7076
7177 return result ? : KMError .InputMethodNotFound (packageName)
Original file line number Diff line number Diff line change @@ -55,14 +55,16 @@ class SwitchImeAsyncImpl @Inject constructor(
5555 }
5656
5757 private fun enableImeWithoutUserInput (imeId : String ): KMResult <Unit > {
58- return inputMethodAdapter.getInfoByPackageName(buildConfigProvider.packageName)
59- .then { keyMapperImeInfo ->
58+ return inputMethodAdapter.getInfoById(imeId)
59+ .then { imeInfo ->
60+ // The accessibility service can only enable IMEs that have the same
61+ // package name as the accessibility service.
6062 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .TIRAMISU &&
61- imeId == keyMapperImeInfo.id
63+ imeInfo.packageName == buildConfigProvider.packageName
6264 ) {
6365 serviceAdapter.sendAsync(
6466 AccessibilityServiceEvent .EnableInputMethod (
65- keyMapperImeInfo .id,
67+ imeInfo .id,
6668 ),
6769 )
6870 } else {
Original file line number Diff line number Diff line change @@ -29,7 +29,7 @@ class SetupInputMethodUseCaseImpl @Inject constructor(
2929 override val isEnabled: Flow <Boolean > = keyMapperImeHelper.isCompatibleImeEnabledFlow
3030
3131 override suspend fun enableInputMethod (): KMResult <Unit > {
32- return keyMapperImeHelper.enableCompatibleInputMethods ()
32+ return keyMapperImeHelper.enableCompatibleInputMethod ()
3333 }
3434
3535 override val isChosen: Flow <Boolean > = keyMapperImeHelper.isCompatibleImeChosenFlow
@@ -38,7 +38,7 @@ class SetupInputMethodUseCaseImpl @Inject constructor(
3838 // On Android 13+, the accessibility service can enable the input method without
3939 // any user input
4040 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .TIRAMISU ) {
41- return keyMapperImeHelper.enableCompatibleInputMethods ()
41+ return keyMapperImeHelper.enableCompatibleInputMethod ()
4242 .onFailure {
4343 Timber .e(" Failed to enable compatible input method: $it " )
4444 }
You can’t perform that action at this time.
0 commit comments