Skip to content

Commit 9c9dcaf

Browse files
committed
fix: choosing key mapper input method does not launch IME settings screen if GUI keyboard also installed
1 parent bf74cfe commit 9c9dcaf

File tree

5 files changed

+19
-11
lines changed

5 files changed

+19
-11
lines changed

base/src/main/java/io/github/sds100/keymapper/base/keymaps/DisplayKeyMapUseCase.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff 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

base/src/main/java/io/github/sds100/keymapper/base/settings/ConfigSettingsUseCase.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff 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> =

base/src/main/java/io/github/sds100/keymapper/base/system/inputmethod/KeyMapperImeHelper.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import io.github.sds100.keymapper.common.utils.KMError
44
import io.github.sds100.keymapper.common.utils.KMResult
55
import io.github.sds100.keymapper.common.utils.Success
66
import io.github.sds100.keymapper.common.utils.firstBlocking
7+
import io.github.sds100.keymapper.common.utils.isSuccess
78
import io.github.sds100.keymapper.common.utils.onSuccess
89
import io.github.sds100.keymapper.common.utils.then
910
import 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)

base/src/main/java/io/github/sds100/keymapper/base/system/inputmethod/SwitchImeAsyncImpl.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff 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 {

base/src/main/java/io/github/sds100/keymapper/base/trigger/SetupInputMethodUseCase.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff 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
}

0 commit comments

Comments
 (0)