Skip to content

Commit

Permalink
implement android
Browse files Browse the repository at this point in the history
  • Loading branch information
JulianBissekkou committed Nov 29, 2023
1 parent df29f97 commit eca8c59
Show file tree
Hide file tree
Showing 9 changed files with 204 additions and 36 deletions.
6 changes: 0 additions & 6 deletions arcgis_map_sdk/lib/src/arcgis_location_display.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:arcgis_map_sdk_platform_interface/arcgis_map_sdk_platform_interface.dart';
import 'package:flutter/cupertino.dart';

class ArcgisManualLocationDisplay extends ArcgisLocationDisplay {
@override
Expand Down Expand Up @@ -37,11 +36,6 @@ class ArcgisLocationDisplay {
return ArcgisMapPlatform.instance.stopLocationDisplayDataSource(_mapId!);
}

Future<void> setDataSource() {
_assertAttached();
return ArcgisMapPlatform.instance.setLocationDisplayDataSource(_mapId!);
}

Future<void> setDefaultSymbol(Symbol symbol) {
_assertAttached();
return ArcgisMapPlatform.instance
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import com.esri.arcgisruntime.geometry.GeometryEngine
import com.esri.arcgisruntime.geometry.Point
import com.esri.arcgisruntime.geometry.SpatialReferences
import com.esri.arcgisruntime.layers.ArcGISVectorTiledLayer
import com.esri.arcgisruntime.location.AndroidLocationDataSource
import com.esri.arcgisruntime.location.LocationDataSource
import com.esri.arcgisruntime.mapping.ArcGISMap
import com.esri.arcgisruntime.mapping.Basemap
import com.esri.arcgisruntime.mapping.BasemapStyle
Expand All @@ -16,10 +18,12 @@ import com.esri.arcgisruntime.mapping.view.AnimationCurve
import com.esri.arcgisruntime.mapping.view.Graphic
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay
import com.esri.arcgisruntime.mapping.view.MapView
import com.esri.arcgisruntime.symbology.Symbol
import com.google.gson.reflect.TypeToken
import dev.fluttercommunity.arcgis_map_sdk_android.model.AnimationOptions
import dev.fluttercommunity.arcgis_map_sdk_android.model.ArcgisMapOptions
import dev.fluttercommunity.arcgis_map_sdk_android.model.LatLng
import dev.fluttercommunity.arcgis_map_sdk_android.model.UserPosition
import dev.fluttercommunity.arcgis_map_sdk_android.model.ViewPadding
import dev.fluttercommunity.arcgis_map_sdk_android.util.GraphicsParser
import io.flutter.plugin.common.BinaryMessenger
Expand All @@ -37,7 +41,7 @@ import kotlin.math.roundToInt
* A starting point for documentation can be found here: https://developers.arcgis.com/android/maps-2d/tutorials/display-a-map/
* */
internal class ArcgisMapView(
context: Context,
private val context: Context,
private val viewId: Int,
private val binaryMessenger: BinaryMessenger,
private val mapOptions: ArcgisMapOptions,
Expand Down Expand Up @@ -109,19 +113,171 @@ internal class ArcgisMapView(
private fun setupMethodChannel() {
methodChannel.setMethodCallHandler { call, result ->
when (call.method) {
"zoom_in" -> onZoomIn(call = call, result = result)
"zoom_out" -> onZoomOut(call = call, result = result)
"add_view_padding" -> onAddViewPadding(call = call, result = result)
"set_interaction" -> onSetInteraction(call = call, result = result)
"move_camera" -> onMoveCamera(call = call, result = result)
"add_graphic" -> onAddGraphic(call = call, result = result)
"remove_graphic" -> onRemoveGraphic(call = call, result = result)
"toggle_base_map" -> onToggleBaseMap(call = call, result = result)
"zoom_in" -> onZoomIn(call, result)
"zoom_out" -> onZoomOut(call, result)
"add_view_padding" -> onAddViewPadding(call, result)
"set_interaction" -> onSetInteraction(call, result)
"move_camera" -> onMoveCamera(call, result)
"add_graphic" -> onAddGraphic(call, result)
"remove_graphic" -> onRemoveGraphic(call, result)
"toggle_base_map" -> onToggleBaseMap(call, result)
"location_display_start_data_source" -> onStartLocationDisplayDataSource(result)
"location_display_stop_data_source" -> onStopLocationDisplayDataSource(result)
"location_display_set_default_symbol" -> onSetLocationDisplayDefaultSymbol(
call,
result
)

"location_display_set_accuracy_symbol" -> onSetLocationDisplayAccuracySymbol(
call,
result
)

"location_display_set_ping_animation_symbol" -> onSetLocationDisplayPingAnimationSymbol(
call,
result
)

"location_display_set_use_course_symbol_on_move" -> onSetLocationDisplayUseCourseSymbolOnMove(
call,
result
)

"location_display_update_display_source_position_manually" -> onUpdateLocationDisplaySourcePositionManually(
call,
result
)

"location_display_set_data_source_type" -> onSetLocationDisplayDataSourceType(
call,
result
)

else -> result.notImplemented()
}
}
}

private fun onStartLocationDisplayDataSource(result: MethodChannel.Result) {
val future = mapView.locationDisplay.locationDataSource.startAsync()
future.addDoneListener {
try {
result.success(future.get())
} catch (e: Exception) {
result.error("Error", e.message, null)
}
}
}

private fun onStopLocationDisplayDataSource(result: MethodChannel.Result) {
val future = mapView.locationDisplay.locationDataSource.stopAsync()
future.addDoneListener {
try {
result.success(future.get())
} catch (e: Exception) {
result.error("Error", e.message, null)
}
}
}

private fun onSetLocationDisplayDefaultSymbol(call: MethodCall, result: MethodChannel.Result) {
operationWithSymbol(call, result) { symbol ->
mapView.locationDisplay.defaultSymbol = symbol
}
}

private fun onSetLocationDisplayAccuracySymbol(call: MethodCall, result: MethodChannel.Result) {
operationWithSymbol(call, result) { symbol ->
mapView.locationDisplay.accuracySymbol = symbol
}
}

private fun onSetLocationDisplayPingAnimationSymbol(
call: MethodCall,
result: MethodChannel.Result
) {
operationWithSymbol(call, result) { symbol ->
mapView.locationDisplay.pingAnimationSymbol = symbol
}
}

private fun onSetLocationDisplayUseCourseSymbolOnMove(
call: MethodCall,
result: MethodChannel.Result
) {
val active = call.arguments as? Boolean
if (active == null) {
result.error("missing_data", "Invalid arguments.", null)
return
}

mapView.locationDisplay.isUseCourseSymbolOnMovement = active
result.success(true)
}

private fun onUpdateLocationDisplaySourcePositionManually(
call: MethodCall,
result: MethodChannel.Result
) {
val dataSource =
mapView.locationDisplay.locationDataSource as? ManualLocationDisplayDataSource
if (dataSource == null) {
result.error(
"invalid_state",
"Expected ManualLocationDataSource but got $dataSource",
null
)
return
}

val optionParams = call.arguments as Map<String, Any>
val position = optionParams.parseToClass<UserPosition>()

dataSource.setNewLocation(position)
}

private fun onSetLocationDisplayDataSourceType(call: MethodCall, result: MethodChannel.Result) {
if (mapView.locationDisplay.locationDataSource.status == LocationDataSource.Status.STARTED) {
result.error(
"invalid_state",
"Current data source is running. Make sure to stop it before setting a new data source",
null
)
return
}

when (call.arguments as String) {
"manual" -> {
mapView.locationDisplay.locationDataSource = ManualLocationDisplayDataSource()
result.success(true)
}

"system" -> {
mapView.locationDisplay.locationDataSource = AndroidLocationDataSource(context)
result.success(true)
}

else -> result.error("invalid_data", "Unknown data source type ${call.arguments}", null)
}
}


private fun operationWithSymbol(
call: MethodCall,
result: MethodChannel.Result,
function: (Symbol) -> Unit
) {
try {
val map = call.arguments as Map<String, Any>
val symbol = GraphicsParser.parseSymbol(map)
function(symbol)
result.success(true)
} catch (e: Throwable) {
result.error("unknown_error", "Error while adding graphic. $e)", null)
return
}
}

private fun setupEventChannel() {
zoomStreamHandler = ZoomStreamHandler()
centerPositionStreamHandler = CenterPositionStreamHandler()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package dev.fluttercommunity.arcgis_map_sdk_android

import com.esri.arcgisruntime.location.LocationDataSource
import dev.fluttercommunity.arcgis_map_sdk_android.model.UserPosition
import dev.fluttercommunity.arcgis_map_sdk_android.model.toAGSPoint

class ManualLocationDisplayDataSource : LocationDataSource() {

override fun onStart() {
this.onStartCompleted(null)
}

override fun onStop() {

}

fun setNewLocation(userPosition: UserPosition) {
val loc = Location(
userPosition.latLng.toAGSPoint(),
userPosition.accuracy ?: 0.0,
userPosition.velocity ?: 0.0,
userPosition.heading ?: 0.0,
false
)
updateLocation(loc)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package dev.fluttercommunity.arcgis_map_sdk_android.model

data class UserPosition(
val latLng: LatLng,
val accuracy: Double?,
val heading: Double?,
val velocity: Double?
)
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package dev.fluttercommunity.arcgis_map_sdk_android.model

class ViewPadding(
data class ViewPadding(
val left: Double,
val top: Double,
val right: Double,
val bottom: Double,
)
)
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ class GraphicsParser {
}
}

private fun parseSymbol(map: Map<String, Any>): Symbol {
fun parseSymbol(map: Map<String, Any>): Symbol {
val symbolMap = map["symbol"] as Map<String, Any>

val symbol = when (val type = symbolMap["type"]) {
Expand Down
7 changes: 1 addition & 6 deletions arcgis_map_sdk_ios/ios/Classes/ArcgisMapView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,6 @@ class ArcgisMapView: NSObject, FlutterPlatformView {
case "toggle_base_map" : onToggleBaseMap(call, result)
case "location_display_start_data_source" : onStartLocationDisplayDataSource(call, result)
case "location_display_stop_data_source" : onStopLocationDisplayDataSource(call, result)
case "location_display_set_data_source" : onSetLocationDisplayDataSource(call, result)
case "location_display_set_default_symbol": onSetLocationDisplayDefaultSymbol(call, result)
case "location_display_set_accuracy_symbol": onSetLocationDisplayAccuracySymbol(call, result)
case "location_display_set_ping_animation_symbol" : onSetLocationDisplayPingAnimationSymbol(call, result)
Expand Down Expand Up @@ -318,10 +317,6 @@ class ArcgisMapView: NSObject, FlutterPlatformView {
}
}

private func onSetLocationDisplayDataSource(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) {
result(true)
}

private func onSetLocationDisplayDefaultSymbol(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) {
operationWithSymbol(call, result) { mapView.locationDisplay.defaultSymbol = $0 }
}
Expand Down Expand Up @@ -380,7 +375,7 @@ class ArcgisMapView: NSObject, FlutterPlatformView {
mapView.locationDisplay.dataSource = AGSCLLocationDataSource()
result(true)
default:
result(FlutterError(code: "missing_data", message: "Unknown data source type \(String(describing: type))", details: nil))
result(FlutterError(code: "invalid_data", message: "Unknown data source type \(String(describing: type))", details: nil))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -223,12 +223,6 @@ class MethodChannelArcgisMapPlugin extends ArcgisMapPlatform {
.invokeMethod("location_display_stop_data_source");
}

@override
Future<void> setLocationDisplayDataSource(int mapId) {
return _methodChannelBuilder(mapId)
.invokeMethod("location_display_set_data_source");
}

@override
Future<void> setLocationDisplayDefaultSymbol(int mapId, Symbol symbol) {
return _methodChannelBuilder(mapId).invokeMethod(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -215,12 +215,6 @@ class ArcgisMapPlatform extends PlatformInterface {
);
}

Future<void> setLocationDisplayDataSource(int mapId) {
throw UnimplementedError(
'setLocationDisplayDataSource() has not been implemented.',
);
}

Future<void> setLocationDisplayDefaultSymbol(int mapId, Symbol symbol) {
throw UnimplementedError(
'setLocationDisplayDefaultSymbol() has not been implemented.',
Expand Down

0 comments on commit eca8c59

Please sign in to comment.