Skip to content

Commit 3a3034c

Browse files
committed
fix: use separate thread for dispatching gestures in accessibility service
1 parent 63f67ff commit 3a3034c

1 file changed

Lines changed: 16 additions & 3 deletions

File tree

base/src/main/java/io/github/sds100/keymapper/base/system/accessibility/BaseAccessibilityService.kt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import android.content.res.Configuration
1111
import android.graphics.Path
1212
import android.graphics.Point
1313
import android.os.Build
14+
import android.os.Handler
15+
import android.os.HandlerThread
1416
import android.view.KeyEvent
1517
import android.view.accessibility.AccessibilityEvent
1618
import android.view.accessibility.AccessibilityNodeInfo
@@ -156,6 +158,12 @@ abstract class BaseAccessibilityService :
156158

157159
abstract fun getController(): BaseAccessibilityServiceController?
158160

161+
/**
162+
* Use a separate thread for dispatching gestures so they do not cause an ANR.
163+
*/
164+
private val gestureHandlerThread: HandlerThread = HandlerThread("gesture_thread")
165+
private var gestureHandler: Handler? = null
166+
159167
override fun onCreate() {
160168
super.onCreate()
161169
Timber.i("Accessibility service: onCreate")
@@ -210,6 +218,9 @@ abstract class BaseAccessibilityService :
210218
fingerprintGestureCallback?.let {
211219
fingerprintGestureController.registerFingerprintGestureCallback(it, null)
212220
}
221+
222+
gestureHandlerThread.start()
223+
gestureHandler = Handler(gestureHandlerThread.looper)
213224
}
214225

215226
override fun onUnbind(intent: Intent?): Boolean {
@@ -222,6 +233,8 @@ abstract class BaseAccessibilityService :
222233
override fun onDestroy() {
223234
lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
224235

236+
gestureHandlerThread.quit()
237+
225238
fingerprintGestureController
226239
.unregisterFingerprintGestureCallback(fingerprintGestureCallback)
227240

@@ -352,7 +365,7 @@ abstract class BaseAccessibilityService :
352365
addStroke(it)
353366
}.build()
354367

355-
val success = dispatchGesture(gestureDescription, null, null)
368+
val success = dispatchGesture(gestureDescription, null, gestureHandler)
356369

357370
return if (success) {
358371
Success(Unit)
@@ -451,7 +464,7 @@ abstract class BaseAccessibilityService :
451464
}
452465
}
453466

454-
val success = dispatchGesture(gestureBuilder.build(), null, null)
467+
val success = dispatchGesture(gestureBuilder.build(), null, gestureHandler)
455468

456469
return if (success) {
457470
Success(Unit)
@@ -499,7 +512,7 @@ abstract class BaseAccessibilityService :
499512
gestureBuilder.addStroke(StrokeDescription(p, 0, duration.toLong()))
500513
}
501514

502-
val success = dispatchGesture(gestureBuilder.build(), null, null)
515+
val success = dispatchGesture(gestureBuilder.build(), null, gestureHandler)
503516

504517
return if (success) {
505518
Success(Unit)

0 commit comments

Comments
 (0)