From 96e53e8c95ead3d350f8127d4991186f3a340d9b Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Sat, 16 May 2026 02:03:46 +0300 Subject: [PATCH] Update: 2026-05-16 02:03:46 --- .../service/RideAccessibilityService.kt | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/app/src/main/java/com/jordanbot/autoride/service/RideAccessibilityService.kt b/app/src/main/java/com/jordanbot/autoride/service/RideAccessibilityService.kt index 0dd8cbe..fcc87c9 100644 --- a/app/src/main/java/com/jordanbot/autoride/service/RideAccessibilityService.kt +++ b/app/src/main/java/com/jordanbot/autoride/service/RideAccessibilityService.kt @@ -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() collectAllText(root, allText) val combinedText = allText.joinToString(" ")