diff --git a/lib/src/platform/android/map_state.dart b/lib/src/platform/android/map_state.dart index 13bb267e..4c136447 100644 --- a/lib/src/platform/android/map_state.dart +++ b/lib/src/platform/android/map_state.dart @@ -221,6 +221,12 @@ final class MapLibreMapStateAndroid extends MapLibreMapStateNative { }); } + Completer? _moveCameraLock; + Position? _moveCameraCenter; + double? _moveCameraZoom; + double? _moveCameraBearing; + double? _moveCameraPitch; + @override Future moveCamera({ Position? center, @@ -228,22 +234,37 @@ final class MapLibreMapStateAndroid extends MapLibreMapStateNative { double? bearing, double? pitch, }) async { + // always use the newest camera positioning + _moveCameraCenter = center; + _moveCameraZoom = zoom; + _moveCameraBearing = bearing; + _moveCameraPitch = pitch; + // only allow one pending call + if (_moveCameraLock != null) return; + _moveCameraLock = Completer(); final jniMap = _jniMapLibreMap; - final cameraPositionBuilder = jni.CameraPosition_Builder(); - if (center != null) cameraPositionBuilder.target(center.toLatLng()); - if (zoom != null) cameraPositionBuilder.zoom(zoom); - if (pitch != null) cameraPositionBuilder.tilt(pitch); - if (bearing != null) cameraPositionBuilder.bearing(bearing); - final cameraPosition = cameraPositionBuilder.build(); - cameraPositionBuilder.release(); - final cameraUpdate = - jni.CameraUpdateFactory.newCameraPosition(cameraPosition); await runOnPlatformThread(() { - final completer = Completer(); + final cameraPositionBuilder = jni.CameraPosition_Builder(); + if (_moveCameraCenter case final Position center) { + cameraPositionBuilder.target(center.toLatLng()); + } + if (_moveCameraZoom case final double zoom) { + cameraPositionBuilder.zoom(zoom); + } + if (_moveCameraPitch case final double pitch) { + cameraPositionBuilder.tilt(pitch); + } + if (_moveCameraBearing case final double bearing) { + cameraPositionBuilder.bearing(bearing); + } + + final cameraPosition = cameraPositionBuilder.build(); + cameraPositionBuilder.release(); + final cameraUpdate = + jni.CameraUpdateFactory.newCameraPosition(cameraPosition); + jniMap.moveCamera(cameraUpdate); - // TODO: jni causes sometimes a deadlock, complete immediately for now - completer.complete(); /*jniMap.moveCamera$1( cameraUpdate, jni.MapLibreMap_CancelableCallback.implement( @@ -256,9 +277,9 @@ final class MapLibreMapStateAndroid extends MapLibreMapStateNative { ), ), );*/ - return completer.future; + cameraUpdate.release(); }); - cameraUpdate.release(); + _moveCameraLock?.complete(); } @override