@@ -11,6 +11,8 @@ import android.content.res.Configuration
1111import android.graphics.Path
1212import android.graphics.Point
1313import android.os.Build
14+ import android.os.Handler
15+ import android.os.HandlerThread
1416import android.view.KeyEvent
1517import android.view.accessibility.AccessibilityEvent
1618import 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