Update: 2026-05-16 02:03:46

This commit is contained in:
Hamza-Ayed
2026-05-16 02:03:46 +03:00
parent dec472dea9
commit 96e53e8c95

View File

@@ -17,6 +17,8 @@ import com.jordanbot.autoride.subscription.SubscriptionManager
class RideAccessibilityService : AccessibilityService() {
private val handler = Handler(Looper.getMainLooper())
private var lastScrapeTime = 0L
private val SCRAPE_THROTTLE_MS = 1000L // 1 second throttle
override fun onAccessibilityEvent(event: AccessibilityEvent) {
val rootNode = rootInActiveWindow ?: return
@@ -28,6 +30,13 @@ class RideAccessibilityService : AccessibilityService() {
if (event.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED ||
event.eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
// Throttle scraping to save battery and prevent device heating
val currentTime = System.currentTimeMillis()
if (currentTime - lastScrapeTime < SCRAPE_THROTTLE_MS) {
return // Ignore this event, it's too soon
}
lastScrapeTime = currentTime
val screenData = scrapeScreen(rootNode, packageName)
if (screenData != null) {
RideDataMerger.updateFromScreen(screenData)
@@ -44,6 +53,31 @@ class RideAccessibilityService : AccessibilityService() {
}
private fun scrapeScreen(root: AccessibilityNodeInfo, pkg: String): RideRequest? {
// ULTRA-FAST CHECK 1: Ask Android native layer to find currency symbols
val jodNodes = root.findAccessibilityNodeInfosByText("JOD")
val dinarArNodes = root.findAccessibilityNodeInfosByText("د.أ")
val dinarWordNodes = root.findAccessibilityNodeInfosByText("دينار")
val hasCurrency = jodNodes.isNotEmpty() || dinarArNodes.isNotEmpty() || dinarWordNodes.isNotEmpty()
// ULTRA-FAST CHECK 2: Look for Accept buttons
val acceptEnNodes = root.findAccessibilityNodeInfosByText("Accept")
val acceptArNodes = root.findAccessibilityNodeInfosByText("قبول")
val confirmNodes = root.findAccessibilityNodeInfosByText("Confirm")
val confirmArNodes = root.findAccessibilityNodeInfosByText("تأكيد")
val tapToAcceptNodes = root.findAccessibilityNodeInfosByText("Tap to accept")
val hasAcceptButton = acceptEnNodes.isNotEmpty() || acceptArNodes.isNotEmpty() ||
confirmNodes.isNotEmpty() || confirmArNodes.isNotEmpty() ||
tapToAcceptNodes.isNotEmpty()
// If it doesn't have BOTH a price indicator AND an accept button, it's not a ride request!
if (!hasCurrency || !hasAcceptButton) {
return null
}
// We only reach here if BOTH currency and an accept button are detected.
// Now it's safe to collect text to extract the exact price.
val allText = mutableListOf<String>()
collectAllText(root, allText)
val combinedText = allText.joinToString(" ")