From d320ea1f0ddc54f4e356ef46e899ae1c2be2cd3d Mon Sep 17 00:00:00 2001 From: Quildra Date: Mon, 4 Aug 2025 07:56:23 +0100 Subject: [PATCH] feat: add re-show drawer button and auto-update functionality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add "RESULTS" menu item to floating FAB for re-showing drawer - Implement showLastDetectionResult() to retrieve and display last result - Update ResultsBottomDrawer to auto-refresh when new detection occurs while visible - Replace early return with updateDrawerContent() for seamless drawer updates - Maintain drawer state (collapsed/expanded) during content updates 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../pokegoalshelper/ScreenCaptureService.kt | 111 ++++++++++++------ .../pokegoalshelper/ui/EnhancedFloatingFAB.kt | 6 +- .../pokegoalshelper/ui/ResultsBottomDrawer.kt | 49 +++++++- 3 files changed, 127 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/quillstudios/pokegoalshelper/ScreenCaptureService.kt b/app/src/main/java/com/quillstudios/pokegoalshelper/ScreenCaptureService.kt index 3e3fcf7..d5b4d0b 100644 --- a/app/src/main/java/com/quillstudios/pokegoalshelper/ScreenCaptureService.kt +++ b/app/src/main/java/com/quillstudios/pokegoalshelper/ScreenCaptureService.kt @@ -199,7 +199,8 @@ class ScreenCaptureService : Service() { context = this, onDetectionRequested = { triggerDetection() }, onToggleOverlay = { toggleOverlay() }, - onReturnToApp = { returnToMainApp() } + onReturnToApp = { returnToMainApp() }, + onShowLastResult = { showLastDetectionResult() } ) // Initialize detection result handler @@ -219,41 +220,6 @@ class ScreenCaptureService : Service() { triggerManualDetection() } - /** - * Toggle overlay visibility from UI - */ - fun toggleOverlay() { - overlayEnabled = !overlayEnabled - if (!overlayEnabled) { - hideDetectionOverlay() - PGHLog.i(TAG, "🔇 Detection overlay disabled and hidden") - } else { - // Show cached detections immediately if available - if (lastDetections.isNotEmpty()) { - showYOLODetectionOverlay(lastDetections) - PGHLog.i(TAG, "🔊 Detection overlay enabled and showing ${lastDetections.size} cached detections") - } else { - PGHLog.i(TAG, "🔊 Detection overlay enabled (no cached detections to show)") - } - } - } - - /** - * Return to main app from UI - */ - fun returnToMainApp() { - try { - val intent = Intent(this, MainActivity::class.java).apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK or - Intent.FLAG_ACTIVITY_CLEAR_TOP or - Intent.FLAG_ACTIVITY_SINGLE_TOP - } - startActivity(intent) - PGHLog.i(TAG, "🏠 Returning to main app") - } catch (e: Exception) { - PGHLog.e(TAG, "Failed to return to main app", e) - } - } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { when (intent?.action) { @@ -1293,4 +1259,77 @@ class ScreenCaptureService : Service() { stopScreenCapture() } + /** + * Show the last detection result by re-displaying the drawer + */ + private fun showLastDetectionResult() { + // Run in background to avoid blocking UI + ocrExecutor.execute { + try { + // Use a proper coroutine scope for suspend function + val results = runBlocking { + val storageService = ServiceLocator.getStorageService() + storageService.getDetectionResults( + filter = null, + sortBy = com.quillstudios.pokegoalshelper.models.DetectionSortBy.TIMESTAMP_DESC + ) + } + + val latestResult = results.firstOrNull() + + if (latestResult != null) { + // Show the drawer on the main thread + handler.post { + detectionResultHandler?.let { handler -> + // Use reflection to access the private bottomDrawer field + try { + val bottomDrawer = handler.javaClass.getDeclaredField("bottomDrawer") + bottomDrawer.isAccessible = true + val drawer = bottomDrawer.get(handler) + drawer.javaClass.getMethod("show", com.quillstudios.pokegoalshelper.models.DetectionResult::class.java) + .invoke(drawer, latestResult) + PGHLog.d(TAG, "✅ Re-showed last detection result: ${latestResult.id}") + } catch (e: Exception) { + PGHLog.e(TAG, "❌ Error accessing drawer via reflection", e) + } + } + } + } else { + PGHLog.i(TAG, "â„šī¸ No previous detection results to show") + } + } catch (e: Exception) { + PGHLog.e(TAG, "❌ Error showing last detection result", e) + } + } + } + + /** + * Toggle the detection overlay on/off + */ + private fun toggleOverlay() { + overlayEnabled = !overlayEnabled + + if (overlayEnabled && lastDetections.isNotEmpty()) { + showYOLODetectionOverlay(lastDetections) + PGHLog.d(TAG, "✅ Detection overlay enabled") + } else { + hideDetectionOverlay() + PGHLog.d(TAG, "✅ Detection overlay disabled") + } + } + + /** + * Return to the main app + */ + private fun returnToMainApp() { + try { + val intent = packageManager.getLaunchIntentForPackage(packageName) + intent?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP) + startActivity(intent) + PGHLog.d(TAG, "✅ Returned to main app") + } catch (e: Exception) { + PGHLog.e(TAG, "❌ Error returning to main app", e) + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/quillstudios/pokegoalshelper/ui/EnhancedFloatingFAB.kt b/app/src/main/java/com/quillstudios/pokegoalshelper/ui/EnhancedFloatingFAB.kt index 5479b45..6fbfa88 100644 --- a/app/src/main/java/com/quillstudios/pokegoalshelper/ui/EnhancedFloatingFAB.kt +++ b/app/src/main/java/com/quillstudios/pokegoalshelper/ui/EnhancedFloatingFAB.kt @@ -32,7 +32,8 @@ class EnhancedFloatingFAB( private val context: Context, private val onDetectionRequested: () -> Unit, private val onToggleOverlay: () -> Unit, - private val onReturnToApp: () -> Unit + private val onReturnToApp: () -> Unit, + private val onShowLastResult: () -> Unit ) { companion object { private const val FAB_SIZE_DP = 56 @@ -217,6 +218,9 @@ class EnhancedFloatingFAB( MenuItemData("DETECT", android.R.drawable.ic_menu_search, android.R.color.holo_blue_dark) { onDetectionRequested() }, + MenuItemData("RESULTS", android.R.drawable.ic_menu_info_details, android.R.color.holo_purple) { + onShowLastResult() + }, MenuItemData("OVERLAY", android.R.drawable.ic_menu_view, android.R.color.holo_green_dark) { onToggleOverlay() }, diff --git a/app/src/main/java/com/quillstudios/pokegoalshelper/ui/ResultsBottomDrawer.kt b/app/src/main/java/com/quillstudios/pokegoalshelper/ui/ResultsBottomDrawer.kt index 928b082..1472af2 100644 --- a/app/src/main/java/com/quillstudios/pokegoalshelper/ui/ResultsBottomDrawer.kt +++ b/app/src/main/java/com/quillstudios/pokegoalshelper/ui/ResultsBottomDrawer.kt @@ -55,10 +55,17 @@ class ResultsBottomDrawer(private val context: Context) fun show(result: DetectionResult) { - if (isShowing) return - try { + if (isShowing) + { + // Update existing drawer with new content + updateDrawerContent(result) + PGHLog.d(TAG, "Bottom drawer updated with new detection: ${result.id}") + return + } + + // Show new drawer windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager currentDetectionResult = result createDrawerView(result) @@ -901,6 +908,44 @@ class ResultsBottomDrawer(private val context: Context) } } + /** + * Update the existing drawer content with new detection results. + * This allows the drawer to refresh its data when already visible. + */ + private fun updateDrawerContent(result: DetectionResult) + { + try + { + currentDetectionResult = result + + drawerContainer?.let { container -> + // Find the collapsed and expanded content views and update them + // The container structure is: drag handle (index 0), collapsed content (index 1), expanded content (index 2) + + if (container.childCount >= 3) + { + // Remove old collapsed content and replace with new + container.removeViewAt(1) // Remove collapsed content + container.addView(createCollapsedContent(result), 1) // Add new collapsed content at index 1 + + // Remove old expanded content and replace with new + container.removeViewAt(2) // Remove expanded content (now at index 2 after previous removal) + container.addView(createExpandedContent(result), 2) // Add new expanded content at index 2 + + PGHLog.d(TAG, "Drawer content updated successfully") + } + else + { + PGHLog.w(TAG, "Unexpected drawer container structure, cannot update content") + } + } + } + catch (e: Exception) + { + PGHLog.e(TAG, "Error updating drawer content", e) + } + } + private fun cleanup() { drawerContainer = null