maps icon indicating copy to clipboard operation
maps copied to clipboard

[Bug]: isUserInteraction is always true when locationPuck is shown on Android

Open ipoogleduck opened this issue 10 months ago • 2 comments

Mapbox Implementation

Mapbox

Mapbox Version

11.8.0

React Native Version

0.74.5

Platform

Android

@rnmapbox/maps version

10.1.35

Standalone component to reproduce

import React, { useEffect, useRef } from 'react';
import {
    MapView,
    ShapeSource,
    LineLayer,
    Camera,
    LocationPuck,
} from '@rnmapbox/maps';

const aLine = {
    type: 'LineString',
    coordinates: [
        [-74.00597, 40.71427],
        [-74.00697, 40.71527],
    ],
}

const BugReportExample = () => {

    const mapCameraRef = useRef()
    const locationPuck = true // Set this to false to hide the location puck. The issue only presents itself when the locationPuck is shown

    useEffect(() => {
        // Re-center the map every 5 seconds. When this is done, isUserInteraction should log as false (but it doesn't when locationPuck is true)
        const interval = setInterval(() => {
            mapCameraRef.current?.setCamera({
                centerCoordinate: [-74.00597, 40.71427],
                animationDuration: 1000,
                animationMode: 'linear',
            })
        }, 5_000)

        return () => {
            clearInterval(interval)
        }

    }, [])

    const regionIsChanging = (region) => {
        console.log("isUserInteraction:", region.properties.isUserInteraction)
    }

    return (
        <MapView style={{ flex: 1 }} onRegionIsChanging={regionIsChanging}>
            <Camera ref={mapCameraRef} centerCoordinate={[-74.00597, 40.71427]} zoomLevel={14} />
            <ShapeSource id="idStreetLayer" shape={aLine}>
                <LineLayer id="idStreetLayer" />
            </ShapeSource>
            {locationPuck ? <LocationPuck puckBearingEnabled={true} puckBearing="heading" pulsing={"default"} /> : null}
        </MapView>
    )
}

Observed behavior and steps to reproduce

When the location puck is show on Android (this issue is not present on iOS), and mapCameraRef.current?.setCamera is used to animate to a location, the region.properties.isUserInteraction returned from onRegionIsChanging is true, when it should be false. The issue only occurs after the user interacts with the map for the first time.

Steps to reproduce:

  1. Use the component and view the console logs
  2. Move the map around a bit, then wait for it to recenter (recenters every 5 seconds)
  3. isUserInteraction will print as true when this animation happens, even though it should be false. The issue does not occur on iOS.
  4. Set the locationPuck constant I added to false (or comment out the locationPuck component) and the issue no longer occurs on Android

Expected behavior

isUserInteraction should print as false when a mapCameraRef.current?.setCamera animation is used

Notes / preliminary analysis

No response

Additional links and references

No response

ipoogleduck avatar Mar 09 '25 22:03 ipoogleduck

Interesting, seems to be related to #3801... the bug only exists when pulsing={"default"} is set

ipoogleduck avatar Mar 09 '25 23:03 ipoogleduck

+1, same issue. Removing LocationPuck also fixed an other issue i had: LocationPuck Prevents onRegionDidChange from triggering properly.

CleverTomatoe avatar Jun 26 '25 01:06 CleverTomatoe