rnmapbox / rnmapbox/maps

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

Open
#3,805 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug 🪲
Dominant language
Kotlin
Stars
2.9k
Forks
947
Avg merge
6d 37m
Merged PRs (30d)
1

Description

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

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Run the standalone JavaScript reproduction on Android with LocationPuck enabled, then follow onRegionIsChanging and the region.properties.isUserInteraction value after the user moves the map. Compare the behavior with LocationPuck disabled and with iOS. Done means programmatic setCamera animations report isUserInteraction as false after prior user interaction.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, javascript, kotlin, react-native
Domain
mobile
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.