eb26def14b
- Bug: dragging the bubble panned the OSM map instead of moving the bubble. The OnTouchListener was attached to the ComposeView, but the inner MapView consumed ACTION_DOWN for its own pan handling before the listener fired. Fix: wrap the ComposeView in a custom TouchInterceptor FrameLayout whose onInterceptTouchEvent always returns true. Touches go to the wrapper's OnTouchListener; child views (including MapView) never see them. Bubble is now purely a visualization — pan/zoom is impossible. - Drag-to-dismiss: when the user starts dragging (after passing TAP_SLOP), a translucent dark circle with a white X appears at bottom-center via a separate WindowManager view. Highlights red when the bubble's screen-space center is within hit slop of the X. Releasing on the X tears down the bubble AND fires onDismissed — DetectionService flips setOverlayEnabled(false) so the toggle and the bubble state stay in sync. Releasing elsewhere is a normal drag (just repositions). The dismiss zone uses FLAG_NOT_TOUCHABLE so it never steals the gesture; it's purely visual feedback.