From fde3efdf8ec9eaee8885d3fa6c7625958fe5e66b Mon Sep 17 00:00:00 2001 From: Eoin Landy Date: Tue, 3 Dec 2019 18:30:59 +0000 Subject: [PATCH 01/12] 2.6.0 --- CHANGELOG.md | 4 + ...8_0.xml => com_tuarua_frekotlin_1_9_1.xml} | 4 +- .../.idea/runConfigurations/iOS_Simulator.xml | 3 +- example/GoogleMapsANESample-mobile.iml | 11 +- example/get_android_dependencies.ps1 | 4 +- example/get_android_dependencies.sh | 4 +- example/get_ios_dependencies.sh | 4 +- example/src/Main-app-android.xml | 2 +- example/src/Main-app-ios.xml | 2 +- .../ane/{build_mobile.sh => build.sh} | 2 +- .../{extension_mobile.xml => extension.xml} | 0 .../.idea/codeStyles/Project.xml | 116 ++ .../android/GoogleMapsANE/app/app.iml | 96 +- .../android/GoogleMapsANE/app/build.gradle | 2 +- .../java/com/tuarua/GoogleMapsANEContext.java | 46 +- .../tuarua/googlemapsane/KotlinController.kt | 99 +- .../android/GoogleMapsANE/build.gradle | 4 +- native_library/ios/GoogleMapsANE/Cartfile | 2 +- .../GoogleMapsANE.xcodeproj/project.pbxproj | 116 +- .../contents.xcworkspacedata | 2 +- .../xcshareddata/swiftpm/Package.resolved | 16 + .../Extensions/FreCLLocationCoordinate.swift | 7 +- .../Extensions/FreGMSCameraPosition.swift | 1 + .../Extensions/FreGMSCircle.swift | 26 +- .../Extensions/FreGMSCoordinateBounds.swift | 4 +- .../Extensions/FreGMSGroundOverlay.swift | 22 +- .../Extensions/FreGMSMarker.swift | 42 +- .../Extensions/FreGMSMutablePath.swift | 6 +- .../Extensions/FreGMSPolygon.swift | 31 +- .../Extensions/FreGMSPolyline.swift | 26 +- .../Extensions/FreMKCircle.swift | 12 +- .../Extensions/FreMKPolygon.swift | 18 +- .../Extensions/FreMKPolyline.swift | 12 +- .../GMSMapController+GMSMapViewDelegate.swift | 1 + .../GoogleMapsANE_FW/LocationController.swift | 3 + .../MKMapController+MKMapViewDelegate.swift | 3 + .../MapKit/MapViewExtension.swift | 88 +- .../GoogleMapsANE_FW/Model/Constants.swift | 52 +- .../GoogleMapsANE_FW/Model/Settings.swift | 18 +- .../GoogleMapsANE_FW/SwiftController.swift | 158 +- .../GoogleMapsANE_FW/SwiftyJSON/SwiftyJSON.h | 31 - .../SwiftyJSON/SwiftyJSON.swift | 1485 ----------------- 42 files changed, 585 insertions(+), 2000 deletions(-) rename example/.idea/libraries/{com_tuarua_frekotlin_1_8_0.xml => com_tuarua_frekotlin_1_9_1.xml} (67%) rename native_extension/ane/{build_mobile.sh => build.sh} (98%) rename native_extension/ane/{extension_mobile.xml => extension.xml} (100%) create mode 100644 native_library/android/GoogleMapsANE/.idea/codeStyles/Project.xml create mode 100644 native_library/ios/GoogleMapsANE/GoogleMapsANE.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved delete mode 100644 native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/SwiftyJSON/SwiftyJSON.h delete mode 100644 native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/SwiftyJSON/SwiftyJSON.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fb012e..ee382e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +### 2.6.0 +- AND: Updated to FreKotlin 1.9.1 +- iOS: Updated to FreSwift 4.1.0 + ### 2.5.0 - AND: Updated to FreKotlin 1.8.0 - Updated to AIR 33 ARM 64bit diff --git a/example/.idea/libraries/com_tuarua_frekotlin_1_8_0.xml b/example/.idea/libraries/com_tuarua_frekotlin_1_9_1.xml similarity index 67% rename from example/.idea/libraries/com_tuarua_frekotlin_1_8_0.xml rename to example/.idea/libraries/com_tuarua_frekotlin_1_9_1.xml index 1120a3d..a32adba 100644 --- a/example/.idea/libraries/com_tuarua_frekotlin_1_8_0.xml +++ b/example/.idea/libraries/com_tuarua_frekotlin_1_9_1.xml @@ -1,7 +1,7 @@ - + - + diff --git a/example/.idea/runConfigurations/iOS_Simulator.xml b/example/.idea/runConfigurations/iOS_Simulator.xml index 544bbfb..bc3d2e8 100644 --- a/example/.idea/runConfigurations/iOS_Simulator.xml +++ b/example/.idea/runConfigurations/iOS_Simulator.xml @@ -1,7 +1,8 @@ \ No newline at end of file diff --git a/example/get_android_dependencies.ps1 b/example/get_android_dependencies.ps1 index f7e9941..659db8e 100644 --- a/example/get_android_dependencies.ps1 +++ b/example/get_android_dependencies.ps1 @@ -1,5 +1,5 @@ -$AneVersion = "2.5.0" -$FreKotlinVersion = "1.8.0" +$AneVersion = "2.6.0" +$FreKotlinVersion = "1.9.1" $PlayerServicesVersion = "16.0.1" $MapsVersion = "16.1.0" $LocationVersion = "16.0.0" diff --git a/example/get_android_dependencies.sh b/example/get_android_dependencies.sh index 3ff1157..99dc7de 100755 --- a/example/get_android_dependencies.sh +++ b/example/get_android_dependencies.sh @@ -1,7 +1,7 @@ #!/bin/sh -AneVersion="2.5.0" -FreKotlinVersion="1.8.0" +AneVersion="2.6.0" +FreKotlinVersion="1.9.1" PlayerServicesVersion="16.0.1" MapsVersion="16.1.0" LocationVersion="16.0.0" diff --git a/example/get_ios_dependencies.sh b/example/get_ios_dependencies.sh index 78fba43..8aac601 100755 --- a/example/get_ios_dependencies.sh +++ b/example/get_ios_dependencies.sh @@ -1,7 +1,7 @@ #!/bin/sh -AneVersion="2.5.0" -FreSwiftVersion="3.1.0" +AneVersion="2.6.0" +FreSwiftVersion="4.1.0" rm -r ios_dependencies/device rm -r ios_dependencies/simulator diff --git a/example/src/Main-app-android.xml b/example/src/Main-app-android.xml index 48ab6e8..af62e30 100644 --- a/example/src/Main-app-android.xml +++ b/example/src/Main-app-android.xml @@ -4,7 +4,7 @@ com.tuarua.googlemapsaneexample GoogleMapsANE GoogleMapsANE - 2.5.0 + 2.6.0 diff --git a/example/src/Main-app-ios.xml b/example/src/Main-app-ios.xml index 787a633..841143e 100644 --- a/example/src/Main-app-ios.xml +++ b/example/src/Main-app-ios.xml @@ -4,7 +4,7 @@ com.tuarua.googlemapsaneexample GoogleMapsANE GoogleMapsANE - 2.5.0 + 2.6.0 diff --git a/native_extension/ane/build_mobile.sh b/native_extension/ane/build.sh similarity index 98% rename from native_extension/ane/build_mobile.sh rename to native_extension/ane/build.sh index 04a21c6..2b762cd 100755 --- a/native_extension/ane/build_mobile.sh +++ b/native_extension/ane/build.sh @@ -130,7 +130,7 @@ mv "$pathtome/platforms/android/res" "$pathtome/platforms/android/com.tuarua.$PR #Run the build command. echo "Building ANE." "$AIR_SDK"/bin/adt -package \ --target ane "$pathtome/$PROJECTNAME.ane" "$pathtome/extension_mobile.xml" \ +-target ane "$pathtome/$PROJECTNAME.ane" "$pathtome/extension.xml" \ -swc "$pathtome/$PROJECTNAME.swc" \ -platform Android-x86 \ -C "$pathtome/platforms/android" "library.swf" "classes.jar" \ diff --git a/native_extension/ane/extension_mobile.xml b/native_extension/ane/extension.xml similarity index 100% rename from native_extension/ane/extension_mobile.xml rename to native_extension/ane/extension.xml diff --git a/native_library/android/GoogleMapsANE/.idea/codeStyles/Project.xml b/native_library/android/GoogleMapsANE/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..681f41a --- /dev/null +++ b/native_library/android/GoogleMapsANE/.idea/codeStyles/Project.xml @@ -0,0 +1,116 @@ + + + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+
+
\ No newline at end of file diff --git a/native_library/android/GoogleMapsANE/app/app.iml b/native_library/android/GoogleMapsANE/app/app.iml index 1e7a13d..145fc69 100644 --- a/native_library/android/GoogleMapsANE/app/app.iml +++ b/native_library/android/GoogleMapsANE/app/app.iml @@ -4,6 +4,8 @@ @@ -24,13 +26,13 @@ - + @@ -71,14 +74,14 @@ - - + + - - + + @@ -122,64 +125,35 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - + + + + + + - - - - - + - - - - - - - - - - - + + + + + + + + + + + +
\ No newline at end of file diff --git a/native_library/android/GoogleMapsANE/app/build.gradle b/native_library/android/GoogleMapsANE/app/build.gradle index 11f7634..750d758 100644 --- a/native_library/android/GoogleMapsANE/app/build.gradle +++ b/native_library/android/GoogleMapsANE/app/build.gradle @@ -9,7 +9,7 @@ android { minSdkVersion 19 targetSdkVersion compileSdkVersion versionCode 1 - versionName "2.3.0" + versionName "2.6.0" } buildTypes { release { diff --git a/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/GoogleMapsANEContext.java b/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/GoogleMapsANEContext.java index 59c9751..4deab04 100644 --- a/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/GoogleMapsANEContext.java +++ b/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/GoogleMapsANEContext.java @@ -14,57 +14,33 @@ * limitations under the License. */ package com.tuarua; -import com.adobe.air.TRActivityResultCallback; import com.adobe.air.AndroidActivityWrapper; -import com.adobe.air.TRStateChangeCallback; import com.tuarua.frekotlin.FreKotlinContext; import com.tuarua.frekotlin.FreKotlinMainController; +import com.tuarua.googlemapsane.KotlinController; -public class GoogleMapsANEContext extends FreKotlinContext implements TRActivityResultCallback, TRStateChangeCallback { +public class GoogleMapsANEContext extends FreKotlinContext { private AndroidActivityWrapper aaw; - private FreKotlinMainController controller; + private KotlinController kc; + GoogleMapsANEContext(String name, FreKotlinMainController controller, String[] functions) { super(name, controller, functions); this.controller = controller; + kc = (KotlinController) this.controller; aaw = AndroidActivityWrapper.GetAndroidActivityWrapper(); - aaw.addActivityResultListener(this); - aaw.addActivityStateChangeListner(this); - } - - @Override - public void onActivityStateChanged(AndroidActivityWrapper.ActivityState activityState) { - super.onActivityStateChanged(activityState); - switch (activityState){ - case STARTED: - this.controller.onStarted(); - break; - case RESTARTED: - this.controller.onRestarted(); - break; - case RESUMED: - this.controller.onResumed(); - break; - case PAUSED: - this.controller.onPaused(); - break; - case STOPPED: - this.controller.onStopped(); - break; - case DESTROYED: - this.controller.onDestroyed(); - break; - } + aaw.addActivityResultListener(kc); + aaw.addActivityStateChangeListner(kc); } @Override public void dispose() { super.dispose(); if (aaw != null) { - aaw.removeActivityResultListener(this); - aaw.removeActivityStateChangeListner(this); + aaw.removeActivityResultListener(kc); + aaw.removeActivityStateChangeListner(kc); aaw = null; } - controller.dispose(); - controller = null; + kc.dispose(); + kc = null; } } diff --git a/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/googlemapsane/KotlinController.kt b/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/googlemapsane/KotlinController.kt index 15bba57..ac6fb90 100644 --- a/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/googlemapsane/KotlinController.kt +++ b/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/googlemapsane/KotlinController.kt @@ -24,11 +24,15 @@ import android.content.Intent import android.content.pm.PackageInfo import android.content.pm.PackageManager import android.content.pm.PackageManager.GET_PERMISSIONS +import android.content.res.Configuration import android.graphics.RectF import android.location.Address import android.location.Geocoder import android.support.v4.content.ContextCompat import android.view.ViewGroup +import com.adobe.air.AndroidActivityWrapper +import com.adobe.air.FreKotlinActivityResultCallback +import com.adobe.air.FreKotlinStateChangeCallback import com.adobe.fre.FREContext import com.adobe.fre.FREObject import com.google.android.gms.maps.model.* @@ -49,7 +53,7 @@ import org.greenrobot.eventbus.ThreadMode import java.io.IOException @Suppress("unused", "UNUSED_PARAMETER", "UNCHECKED_CAST", "PrivatePropertyName") -class KotlinController : FreKotlinMainController { +class KotlinController : FreKotlinMainController, FreKotlinStateChangeCallback, FreKotlinActivityResultCallback { private var scaleFactor = 1.0f private lateinit var airView: ViewGroup private val TRACE = "TRACE" @@ -80,7 +84,7 @@ class KotlinController : FreKotlinMainController { } fun reverseGeocodeLocation(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("reverseGeocodeLocation") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val coordinate = LatLng(argv[0]) val appActivity = ctx.activity if (appActivity != null) { @@ -97,7 +101,7 @@ class KotlinController : FreKotlinMainController { } fun forwardGeocodeLocation(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("forwardGeocodeLocation") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val addressSearch = String(argv[0]) ?: return null val appActivity = ctx.activity if (appActivity != null) { @@ -168,7 +172,7 @@ class KotlinController : FreKotlinMainController { } fun capture(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 3 } ?: return FreArgException("initMap") + argv.takeIf { argv.size > 3 } ?: return FreArgException() val xFre = Int(argv[0]) ?: return null val yFre = Int(argv[1]) ?: return null val wFre = Int(argv[2]) ?: return null @@ -233,7 +237,7 @@ class KotlinController : FreKotlinMainController { } fun initMap(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 4 } ?: return FreArgException("initMap") + argv.takeIf { argv.size > 4 } ?: return FreArgException() val centerAt = LatLng(argv[1]) val viewPort = RectF(argv[0]) val zoomLevel = Float(argv[2]) ?: 12.0f @@ -244,7 +248,7 @@ class KotlinController : FreKotlinMainController { } fun addEventListener(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("addEventListener") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val type = String(argv[0]) ?: return null if (mapController == null) { asListeners.add(type) @@ -262,7 +266,7 @@ class KotlinController : FreKotlinMainController { } fun removeEventListener(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("removeEventListener") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val type = String(argv[0]) ?: return null if (mapController == null) { asListeners.remove(type) @@ -278,13 +282,13 @@ class KotlinController : FreKotlinMainController { } fun addCircle(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("addCircle") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val addedCircle: Circle? = mapController?.addCircle(CircleOptions(argv[0])) return addedCircle?.id?.toFREObject() } fun setCircleProp(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 2 } ?: return FreArgException("setCircleProp") + argv.takeIf { argv.size > 2 } ?: return FreArgException() val id = String(argv[0]) ?: return null val name = String(argv[1]) ?: return null mapController?.setCircleProp(id, name, argv[2]) @@ -292,20 +296,20 @@ class KotlinController : FreKotlinMainController { } fun removeCircle(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("removeCircle") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val id = String(argv[0]) ?: return null mapController?.removeCircle(id) return null } fun addMarker(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("addMarker") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val addedMarker: Marker? = mapController?.addMarker(MarkerOptions(argv[0])) return addedMarker?.id?.toFREObject() } fun setMarkerProp(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 2 } ?: return FreArgException("setMarkerProp") + argv.takeIf { argv.size > 2 } ?: return FreArgException() val id = String(argv[0]) ?: return null val name = String(argv[1]) ?: return null mapController?.setMarkerProp(id, name, argv[2]) @@ -313,20 +317,20 @@ class KotlinController : FreKotlinMainController { } fun removeMarker(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("removeMarker") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val id = String(argv[0]) ?: return null mapController?.removeMarker(id) return null } fun addGroundOverlay(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("addGroundOverlay") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val addedOverlay: GroundOverlay? = mapController?.addGroundOverlay(GroundOverlayOptions(argv[0])) return addedOverlay?.id?.toFREObject() } fun setGroundOverlayProp(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 1 } ?: return FreArgException("setGroundOverlayProp") + argv.takeIf { argv.size > 1 } ?: return FreArgException() val id = String(argv[0]) ?: return null val name = String(argv[1]) ?: return null mapController?.setGroundOverlayProp(id, name, argv[2]) @@ -334,20 +338,20 @@ class KotlinController : FreKotlinMainController { } fun removeGroundOverlay(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("removeGroundOverlay") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val id = String(argv[0]) ?: return null mapController?.removeGroundOverlay(id) return null } fun addPolyline(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("addPolyline") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val addedPolyline: Polyline? = mapController?.addPolyline(PolylineOptions(argv[0])) return addedPolyline?.id?.toFREObject() } fun setPolylineProp(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 1 } ?: return FreArgException("setPolylineProp") + argv.takeIf { argv.size > 1 } ?: return FreArgException() val id = String(argv[0]) ?: return null val name = String(argv[1]) ?: return null mapController?.setPolylineProp(id, name, argv[2]) @@ -355,20 +359,20 @@ class KotlinController : FreKotlinMainController { } fun removePolyline(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("removePolyline") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val id = String(argv[0]) ?: return null mapController?.removePolyline(id) ?: return null return null } fun addPolygon(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("addPolygon") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val addedPolygon: Polygon? = mapController?.addPolygon(PolygonOptions(argv[0])) return addedPolygon?.id?.toFREObject() } fun setPolygonProp(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 1 } ?: return FreArgException("setPolygonProp") + argv.takeIf { argv.size > 1 } ?: return FreArgException() val id = String(argv[0]) ?: return null val name = String(argv[1]) ?: return null mapController?.setPolygonProp(id, name, argv[2]) @@ -376,21 +380,21 @@ class KotlinController : FreKotlinMainController { } fun removePolygon(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("removePolygon") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val id = String(argv[0]) ?: return null mapController?.removePolygon(id) return null } fun showInfoWindow(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("showInfoWindow") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val id = String(argv[0]) ?: return null mapController?.showInfoWindow(id) return null } fun hideInfoWindow(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("hideInfoWindow") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val id = String(argv[0]) ?: return null mapController?.hideInfoWindow(id) return null @@ -410,14 +414,14 @@ class KotlinController : FreKotlinMainController { } fun setViewPort(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("initMap") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val viewPortFre = RectF(argv[0]) mapController?.viewPort = scaleViewPort(viewPortFre) return null } fun setVisible(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("setVisible") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val visible = Boolean(argv[0]) == true if (!isAdded) { mapController?.add() @@ -428,7 +432,7 @@ class KotlinController : FreKotlinMainController { } fun moveCamera(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 4 } ?: return FreArgException("moveCamera") + argv.takeIf { argv.size > 4 } ?: return FreArgException() var centerAt: LatLng? = null if (argv[0].type != FreObjectTypeKotlin.NULL) { centerAt = LatLng(argv[0]) @@ -442,7 +446,7 @@ class KotlinController : FreKotlinMainController { } fun setBounds(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 1 } ?: return FreArgException("setBounds") + argv.takeIf { argv.size > 1 } ?: return FreArgException() val bounds = LatLngBounds(argv[0]) val animates = Boolean(argv[1]) == true mapController?.setBounds(bounds, animates) @@ -450,21 +454,21 @@ class KotlinController : FreKotlinMainController { } fun zoomIn(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("zoomIn") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val animates = Boolean(argv[0]) == true mapController?.zoomIn(animates) return null } fun zoomOut(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("zoomOut") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val animates = Boolean(argv[0]) == true mapController?.zoomOut(animates) return null } fun zoomTo(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 1 } ?: return FreArgException("zoomTo") + argv.takeIf { argv.size > 1 } ?: return FreArgException() val zoomLevel = Float(argv[0]) ?: return null val animates = Boolean(argv[1]) == true mapController?.zoomTo(zoomLevel, animates) @@ -472,7 +476,7 @@ class KotlinController : FreKotlinMainController { } fun scrollBy(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 2 } ?: return FreArgException("scrollBy") + argv.takeIf { argv.size > 2 } ?: return FreArgException() val x = Float(argv[0]) ?: return null val y = Float(argv[1]) ?: return null val animates = Boolean(argv[2]) == true @@ -481,70 +485,70 @@ class KotlinController : FreKotlinMainController { } fun setAnimationDuration(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("setAnimationDuration") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val duration = Int(argv[0]) ?: return null mapController?.animationDuration = duration return null } fun setStyle(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("setStyle") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val json = String(argv[0]) ?: return null mapController?.style = json return null } fun setMapType(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("setMapType") + argv.takeIf { argv.size > 0 } ?: return FreArgException() val type = Int(argv[0]) ?: return null mapController?.mapView?.mapType = type return null } fun setBuildingsEnabled(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("setBuildingsEnabled") + argv.takeIf { argv.size > 0 } ?: return FreArgException() mapController?.mapView?.isBuildingsEnabled = Boolean(argv[0]) == true return null } fun setTrafficEnabled(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("setTrafficEnabled") + argv.takeIf { argv.size > 0 } ?: return FreArgException() mapController?.mapView?.isTrafficEnabled = Boolean(argv[0]) == true return null } fun setMinZoom(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("setMinZoom") + argv.takeIf { argv.size > 0 } ?: return FreArgException() Float(argv[0])?.let { mapController?.mapView?.setMinZoomPreference(it) } return null } fun setMaxZoom(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("setMinZoom") + argv.takeIf { argv.size > 0 } ?: return FreArgException() Float(argv[0])?.let { mapController?.mapView?.setMaxZoomPreference(it) } return null } fun setIndoorEnabled(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("setIndoorEnabled") + argv.takeIf { argv.size > 0 } ?: return FreArgException() mapController?.mapView?.isIndoorEnabled = Boolean(argv[0]) == true return null } @SuppressLint("MissingPermission") fun setMyLocationEnabled(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("setIndoorEnabled") + argv.takeIf { argv.size > 0 } ?: return FreArgException() mapController?.mapView?.isMyLocationEnabled = Boolean(argv[0]) == true return null } fun projection_pointForCoordinate(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("projection_pointForCoordinate") + argv.takeIf { argv.size > 0 } ?: return FreArgException() return mapController?.mapView?.projection?.toScreenLocation(LatLng(argv[0]))?.toFREObject() } fun projection_coordinateForPoint(ctx: FREContext, argv: FREArgv): FREObject? { - argv.takeIf { argv.size > 0 } ?: return FreArgException("projection_coordinateForPoint") + argv.takeIf { argv.size > 0 } ?: return FreArgException() return mapController?.mapView?.projection?.fromScreenLocation(Point(argv[0]))?.toFREObject() } @@ -562,6 +566,15 @@ class KotlinController : FreKotlinMainController { return null } + override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) { + } + + override fun onConfigurationChanged(configuration: Configuration?) { + } + + override fun onActivityStateChanged(activityState: AndroidActivityWrapper.ActivityState?) { + } + override fun dispose() { super.dispose() mapController?.dispose() diff --git a/native_library/android/GoogleMapsANE/build.gradle b/native_library/android/GoogleMapsANE/build.gradle index 9fbbec1..ff7d06f 100644 --- a/native_library/android/GoogleMapsANE/build.gradle +++ b/native_library/android/GoogleMapsANE/build.gradle @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.40' - ext.frekotlin_version = '1.8.0' + ext.kotlin_version = '1.3.50' + ext.frekotlin_version = '1.9.1' ext.gson_version = '2.8.4' ext.play_maps_version = '16.1.0' ext.play_location_version = '16.0.0' diff --git a/native_library/ios/GoogleMapsANE/Cartfile b/native_library/ios/GoogleMapsANE/Cartfile index ff5cd47..b0ebe3a 100644 --- a/native_library/ios/GoogleMapsANE/Cartfile +++ b/native_library/ios/GoogleMapsANE/Cartfile @@ -1 +1 @@ -binary "https://github.com/tuarua/Swift-IOS-ANE/releases/download/3.1.0/FreSwift.json" ~> 3.1.0 \ No newline at end of file +binary "https://github.com/tuarua/Swift-IOS-ANE/releases/download/4.1.0/FreSwift.json" ~> 4.1.0 \ No newline at end of file diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE.xcodeproj/project.pbxproj b/native_library/ios/GoogleMapsANE/GoogleMapsANE.xcodeproj/project.pbxproj index 0b1e77c..be8c29b 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE.xcodeproj/project.pbxproj +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE.xcodeproj/project.pbxproj @@ -3,64 +3,63 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ 285FE1341741FC686F0BEB75 /* FreCLLocationCoordinate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FE4E5D8DD21768875CCFD /* FreCLLocationCoordinate.swift */; }; - 285FE3EB871F2DD420623AEE /* GoogleMapsANE_LIB.h in Headers */ = {isa = PBXBuildFile; fileRef = 285FEBB3CADF8D704FAB5E4D /* GoogleMapsANE_LIB.h */; }; + 285FE3EB871F2DD420623AEE /* GoogleMapsANE_LIB.h in Headers */ = {isa = PBXBuildFile; fileRef = 285FEBB3CADF8D704FAB5E4D /* GoogleMapsANE_LIB.h */; platformFilter = ios; }; 285FE43BB13A003DF0009958 /* FreMKCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FE3EB6401C4553D5DC713 /* FreMKCircle.swift */; }; 285FE645B808125071F7A08A /* CustomMKCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FE9BC1B43C00633CEE916 /* CustomMKCircle.swift */; }; 285FE6FF36D515256EAE7B63 /* FreGMSCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FE41C9FE2CEB9DCF6CB30 /* FreGMSCircle.swift */; }; - 285FECB67C2311471C2CD119 /* GoogleMapsANE_LIB.m in Sources */ = {isa = PBXBuildFile; fileRef = 285FE6D7F3D6356FA03A26C0 /* GoogleMapsANE_LIB.m */; }; - 9022967A2299736400495FDE /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 902296792299736300495FDE /* CoreImage.framework */; }; - 9022967C2299737B00495FDE /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9022967B2299737B00495FDE /* CoreTelephony.framework */; }; - 9022967E229973B300495FDE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9022967D229973B300495FDE /* UIKit.framework */; }; + 285FECB67C2311471C2CD119 /* GoogleMapsANE_LIB.m in Sources */ = {isa = PBXBuildFile; fileRef = 285FE6D7F3D6356FA03A26C0 /* GoogleMapsANE_LIB.m */; platformFilter = ios; }; + 9022967A2299736400495FDE /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 902296792299736300495FDE /* CoreImage.framework */; platformFilter = ios; }; + 9022967C2299737B00495FDE /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9022967B2299737B00495FDE /* CoreTelephony.framework */; platformFilter = ios; }; + 9022967E229973B300495FDE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9022967D229973B300495FDE /* UIKit.framework */; platformFilter = ios; }; 902296802299903900495FDE /* FreGMSCoordinateBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9022967F2299903900495FDE /* FreGMSCoordinateBounds.swift */; }; + 907FA0382396DF8A00A02384 /* SwiftyJSON in Frameworks */ = {isa = PBXBuildFile; productRef = 907FA0372396DF8A00A02384 /* SwiftyJSON */; }; 90942B0A229AB549006672D9 /* FreGMSVisibleRegion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90942B09229AB549006672D9 /* FreGMSVisibleRegion.swift */; }; 90C3B5D721F4D83B002F59AB /* FreGMSPolygon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C3B5D621F4D83B002F59AB /* FreGMSPolygon.swift */; }; 90C3B5D921F4E135002F59AB /* FreGMSMutablePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C3B5D821F4E135002F59AB /* FreGMSMutablePath.swift */; }; 90C940C2229A0AAB007AD291 /* FreGMSCameraPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C940C1229A0AAB007AD291 /* FreGMSCameraPosition.swift */; }; CE39808E1E58BAA90062485B /* GoogleMapsANE_FW.h in Headers */ = {isa = PBXBuildFile; fileRef = CE39808C1E58BAA90062485B /* GoogleMapsANE_FW.h */; settings = {ATTRIBUTES = (Public, ); }; }; CE3980981E58BB070062485B /* SwiftController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE3980971E58BB070062485B /* SwiftController.swift */; }; - CE3980AD1E58BF3F0062485B /* GoogleMapsANE_FW.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE39808A1E58BAA90062485B /* GoogleMapsANE_FW.framework */; }; + CE3980AD1E58BF3F0062485B /* GoogleMapsANE_FW.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE39808A1E58BAA90062485B /* GoogleMapsANE_FW.framework */; platformFilter = ios; }; CE5D4976202619540067B01C /* LocationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5D4975202619540067B01C /* LocationController.swift */; }; CE5D4978202619CD0067B01C /* MapProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5D4977202619CD0067B01C /* MapProvider.swift */; }; CE5E29881F6452CC00FDB81A /* MarkerOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5E29871F6452CC00FDB81A /* MarkerOptions.swift */; }; - CE60CCC41F63DA7F004B1BE7 /* FreSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE60CCC31F63DA7F004B1BE7 /* FreSwift.framework */; }; - CE60CCCB1F63E25C004B1BE7 /* FreSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE60CCC31F63DA7F004B1BE7 /* FreSwift.framework */; }; - CE60CCCC1F63E444004B1BE7 /* FreMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = CE60CCC11F63DA4D004B1BE7 /* FreMacros.h */; }; + CE60CCC41F63DA7F004B1BE7 /* FreSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE60CCC31F63DA7F004B1BE7 /* FreSwift.framework */; platformFilter = ios; }; + CE60CCCB1F63E25C004B1BE7 /* FreSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE60CCC31F63DA7F004B1BE7 /* FreSwift.framework */; platformFilter = ios; }; + CE60CCCC1F63E444004B1BE7 /* FreMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = CE60CCC11F63DA4D004B1BE7 /* FreMacros.h */; platformFilter = ios; }; CE6589F31F6EE39100656914 /* MKMapController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6589F21F6EE39100656914 /* MKMapController.swift */; }; CE6589F51F6F1A9900656914 /* MapViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6589F41F6F1A9900656914 /* MapViewExtension.swift */; }; - CE6589F71F6F1B6200656914 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE6589F61F6F1B6200656914 /* MapKit.framework */; }; + CE6589F71F6F1B6200656914 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE6589F61F6F1B6200656914 /* MapKit.framework */; platformFilter = ios; }; CE9397501F70772400A1428C /* CustomMKAnnotation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE93974F1F70772400A1428C /* CustomMKAnnotation.swift */; }; - CEA0DE161F5DF7330012EB4E /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE151F5DF7330012EB4E /* Accelerate.framework */; }; - CEA0DE181F5DF7490012EB4E /* CoreBluetooth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE171F5DF7490012EB4E /* CoreBluetooth.framework */; }; - CEA0DE1A1F5DF7650012EB4E /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE191F5DF7650012EB4E /* libz.tbd */; }; - CEA0DE1C1F5DF7710012EB4E /* libicucore.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE1B1F5DF7710012EB4E /* libicucore.tbd */; }; - CEA0DE1E1F5DF77D0012EB4E /* libc++.1.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE1D1F5DF77D0012EB4E /* libc++.1.tbd */; }; - CEA0DE201F5DF78A0012EB4E /* libc++abi.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE1F1F5DF78A0012EB4E /* libc++abi.tbd */; }; - CEA0DE221F5DF7940012EB4E /* libc.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE211F5DF7940012EB4E /* libc.tbd */; }; - CEA0DE241F5DF7A10012EB4E /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE231F5DF7A10012EB4E /* CoreGraphics.framework */; }; - CEA0DE261F5DF7AC0012EB4E /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE251F5DF7AC0012EB4E /* SystemConfiguration.framework */; }; - CEA0DE281F5DF7B80012EB4E /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE271F5DF7B80012EB4E /* QuartzCore.framework */; }; - CEA0DE2A1F5DF7C40012EB4E /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE291F5DF7C40012EB4E /* OpenGLES.framework */; }; - CEA0DE2C1F5DF7CE0012EB4E /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE2B1F5DF7CE0012EB4E /* ImageIO.framework */; }; - CEA0DE2E1F5DF7D90012EB4E /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE2D1F5DF7D90012EB4E /* GLKit.framework */; }; - CEA0DE301F5DF7E80012EB4E /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE2F1F5DF7E80012EB4E /* CoreText.framework */; }; - CEA0DE321F5DF7F30012EB4E /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE311F5DF7F30012EB4E /* CoreLocation.framework */; }; - CEA0DE341F5DF7FA0012EB4E /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE331F5DF7FA0012EB4E /* CoreData.framework */; }; - CEA0DE361F5DF8040012EB4E /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE351F5DF8040012EB4E /* AVFoundation.framework */; }; - CEA0DE3C1F5DF8820012EB4E /* GoogleMaps.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE391F5DF8820012EB4E /* GoogleMaps.framework */; }; - CEA0DE3D1F5DF8820012EB4E /* GoogleMapsBase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE3A1F5DF8820012EB4E /* GoogleMapsBase.framework */; }; - CEA0DE3E1F5DF8820012EB4E /* GoogleMapsCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE3B1F5DF8820012EB4E /* GoogleMapsCore.framework */; }; + CEA0DE161F5DF7330012EB4E /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE151F5DF7330012EB4E /* Accelerate.framework */; platformFilter = ios; }; + CEA0DE181F5DF7490012EB4E /* CoreBluetooth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE171F5DF7490012EB4E /* CoreBluetooth.framework */; platformFilter = ios; }; + CEA0DE1A1F5DF7650012EB4E /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE191F5DF7650012EB4E /* libz.tbd */; platformFilter = ios; }; + CEA0DE1C1F5DF7710012EB4E /* libicucore.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE1B1F5DF7710012EB4E /* libicucore.tbd */; platformFilter = ios; }; + CEA0DE1E1F5DF77D0012EB4E /* libc++.1.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE1D1F5DF77D0012EB4E /* libc++.1.tbd */; platformFilter = ios; }; + CEA0DE201F5DF78A0012EB4E /* libc++abi.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE1F1F5DF78A0012EB4E /* libc++abi.tbd */; platformFilter = ios; }; + CEA0DE221F5DF7940012EB4E /* libc.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE211F5DF7940012EB4E /* libc.tbd */; platformFilter = ios; }; + CEA0DE241F5DF7A10012EB4E /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE231F5DF7A10012EB4E /* CoreGraphics.framework */; platformFilter = ios; }; + CEA0DE261F5DF7AC0012EB4E /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE251F5DF7AC0012EB4E /* SystemConfiguration.framework */; platformFilter = ios; }; + CEA0DE281F5DF7B80012EB4E /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE271F5DF7B80012EB4E /* QuartzCore.framework */; platformFilter = ios; }; + CEA0DE2A1F5DF7C40012EB4E /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE291F5DF7C40012EB4E /* OpenGLES.framework */; platformFilter = ios; }; + CEA0DE2C1F5DF7CE0012EB4E /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE2B1F5DF7CE0012EB4E /* ImageIO.framework */; platformFilter = ios; }; + CEA0DE2E1F5DF7D90012EB4E /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE2D1F5DF7D90012EB4E /* GLKit.framework */; platformFilter = ios; }; + CEA0DE301F5DF7E80012EB4E /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE2F1F5DF7E80012EB4E /* CoreText.framework */; platformFilter = ios; }; + CEA0DE321F5DF7F30012EB4E /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE311F5DF7F30012EB4E /* CoreLocation.framework */; platformFilter = ios; }; + CEA0DE341F5DF7FA0012EB4E /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE331F5DF7FA0012EB4E /* CoreData.framework */; platformFilter = ios; }; + CEA0DE361F5DF8040012EB4E /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE351F5DF8040012EB4E /* AVFoundation.framework */; platformFilter = ios; }; + CEA0DE3C1F5DF8820012EB4E /* GoogleMaps.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE391F5DF8820012EB4E /* GoogleMaps.framework */; platformFilter = ios; }; + CEA0DE3D1F5DF8820012EB4E /* GoogleMapsBase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE3A1F5DF8820012EB4E /* GoogleMapsBase.framework */; platformFilter = ios; }; + CEA0DE3E1F5DF8820012EB4E /* GoogleMapsCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE3B1F5DF8820012EB4E /* GoogleMapsCore.framework */; platformFilter = ios; }; CEA0DE401F5DF9DD0012EB4E /* GMSMapController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA0DE3F1F5DF9DD0012EB4E /* GMSMapController.swift */; }; CEA0DE421F5DFA7A0012EB4E /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA0DE411F5DFA7A0012EB4E /* Settings.swift */; }; CEA653332027602C0034C691 /* GMSMapController+GMSMapViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA653322027602C0034C691 /* GMSMapController+GMSMapViewDelegate.swift */; }; CEA65335202761590034C691 /* MKMapController+MKMapViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA65334202761590034C691 /* MKMapController+MKMapViewDelegate.swift */; }; CEA65337202763570034C691 /* SwiftController+FreSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA65336202763570034C691 /* SwiftController+FreSwift.swift */; }; - CEB5ED121F5C4F7800AE8B16 /* SwiftyJSON.h in Headers */ = {isa = PBXBuildFile; fileRef = CEB5ED101F5C4F7800AE8B16 /* SwiftyJSON.h */; }; - CEB5ED131F5C4F7800AE8B16 /* SwiftyJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEB5ED111F5C4F7800AE8B16 /* SwiftyJSON.swift */; }; CEB5ED151F5C56F900AE8B16 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEB5ED141F5C56F900AE8B16 /* Constants.swift */; }; CEC1A0FD1FF7187600ED797A /* FreGMSMarker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC1A0FC1FF7187600ED797A /* FreGMSMarker.swift */; }; CEFB3BC11FF7C4460095DE62 /* FreGMSGroundOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFB3BC01FF7C4460095DE62 /* FreGMSGroundOverlay.swift */; }; @@ -99,7 +98,7 @@ CE39808A1E58BAA90062485B /* GoogleMapsANE_FW.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GoogleMapsANE_FW.framework; sourceTree = BUILT_PRODUCTS_DIR; }; CE39808C1E58BAA90062485B /* GoogleMapsANE_FW.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoogleMapsANE_FW.h; sourceTree = ""; }; CE39808D1E58BAA90062485B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - CE3980971E58BB070062485B /* SwiftController.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = SwiftController.swift; sourceTree = ""; tabWidth = 2; }; + CE3980971E58BB070062485B /* SwiftController.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = SwiftController.swift; sourceTree = ""; tabWidth = 4; }; CE39809F1E58BEE10062485B /* libGoogleMapsANE_LIB.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libGoogleMapsANE_LIB.a; sourceTree = BUILT_PRODUCTS_DIR; }; CE5D4975202619540067B01C /* LocationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationController.swift; sourceTree = ""; }; CE5D4977202619CD0067B01C /* MapProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapProvider.swift; sourceTree = ""; }; @@ -136,8 +135,6 @@ CEA653322027602C0034C691 /* GMSMapController+GMSMapViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GMSMapController+GMSMapViewDelegate.swift"; sourceTree = ""; }; CEA65334202761590034C691 /* MKMapController+MKMapViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MKMapController+MKMapViewDelegate.swift"; sourceTree = ""; }; CEA65336202763570034C691 /* SwiftController+FreSwift.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SwiftController+FreSwift.swift"; sourceTree = ""; }; - CEB5ED101F5C4F7800AE8B16 /* SwiftyJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SwiftyJSON.h; path = SwiftyJSON/SwiftyJSON.h; sourceTree = ""; }; - CEB5ED111F5C4F7800AE8B16 /* SwiftyJSON.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftyJSON.swift; path = SwiftyJSON/SwiftyJSON.swift; sourceTree = ""; }; CEB5ED141F5C56F900AE8B16 /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; CEC1A0FC1FF7187600ED797A /* FreGMSMarker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FreGMSMarker.swift; sourceTree = ""; }; CEFB3BC01FF7C4460095DE62 /* FreGMSGroundOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FreGMSGroundOverlay.swift; sourceTree = ""; }; @@ -153,6 +150,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 907FA0382396DF8A00A02384 /* SwiftyJSON in Frameworks */, CEA0DE3D1F5DF8820012EB4E /* GoogleMapsBase.framework in Frameworks */, CEA0DE3C1F5DF8820012EB4E /* GoogleMaps.framework in Frameworks */, CEA0DE3E1F5DF8820012EB4E /* GoogleMapsCore.framework in Frameworks */, @@ -196,8 +194,6 @@ CE3551E01E7F1C2E009375A7 /* Misc */ = { isa = PBXGroup; children = ( - CEB5ED101F5C4F7800AE8B16 /* SwiftyJSON.h */, - CEB5ED111F5C4F7800AE8B16 /* SwiftyJSON.swift */, CE39808D1E58BAA90062485B /* Info.plist */, ); name = Misc; @@ -342,7 +338,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - CEB5ED121F5C4F7800AE8B16 /* SwiftyJSON.h in Headers */, CE39808E1E58BAA90062485B /* GoogleMapsANE_FW.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -373,6 +368,9 @@ dependencies = ( ); name = GoogleMapsANE_FW; + packageProductDependencies = ( + 907FA0372396DF8A00A02384 /* SwiftyJSON */, + ); productName = SwiftIOSANE_FW; productReference = CE39808A1E58BAA90062485B /* GoogleMapsANE_FW.framework */; productType = "com.apple.product-type.framework"; @@ -402,13 +400,13 @@ CE3980631E58BA7F0062485B /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0930; + LastUpgradeCheck = 1100; ORGANIZATIONNAME = "Tua Rua Ltd"; TargetAttributes = { CE3980891E58BAA90062485B = { CreatedOnToolsVersion = 8.2; DevelopmentTeam = FWEQJ32FGC; - LastSwiftMigration = 0910; + LastSwiftMigration = 1100; ProvisioningStyle = Manual; }; CE39809E1E58BEE10062485B = { @@ -419,13 +417,16 @@ }; buildConfigurationList = CE3980661E58BA7F0062485B /* Build configuration list for PBXProject "GoogleMapsANE" */; compatibilityVersion = "Xcode 10.0"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = CE3980621E58BA7F0062485B; + packageReferences = ( + 907FA0362396DF8A00A02384 /* XCRemoteSwiftPackageReference "SwiftyJSON" */, + ); productRefGroup = CE39806C1E58BA7F0062485B /* Products */; projectDirPath = ""; projectRoot = ""; @@ -448,7 +449,7 @@ ); runOnlyForDeploymentPostprocessing = 1; shellPath = /bin/sh; - shellScript = "../../../native_extension/ane/build_mobile.sh\n"; + shellScript = "../../../native_extension/ane/build.sh\n"; }; CE7CFE0420229017007F9024 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; @@ -487,7 +488,6 @@ CE3980981E58BB070062485B /* SwiftController.swift in Sources */, 902296802299903900495FDE /* FreGMSCoordinateBounds.swift in Sources */, CE6589F51F6F1A9900656914 /* MapViewExtension.swift in Sources */, - CEB5ED131F5C4F7800AE8B16 /* SwiftyJSON.swift in Sources */, 90942B0A229AB549006672D9 /* FreGMSVisibleRegion.swift in Sources */, CE6589F31F6EE39100656914 /* MKMapController.swift in Sources */, CEA0DE421F5DFA7A0012EB4E /* Settings.swift in Sources */, @@ -516,6 +516,7 @@ /* Begin PBXTargetDependency section */ CE3980B11E58C08A0062485B /* PBXTargetDependency */ = { isa = PBXTargetDependency; + platformFilter = ios; target = CE3980891E58BAA90062485B /* GoogleMapsANE_FW */; targetProxy = CE3980B01E58C08A0062485B /* PBXContainerItemProxy */; }; @@ -526,6 +527,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; CLANG_CXX_LIBRARY = "compiler-default"; @@ -585,6 +587,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; CLANG_CXX_LIBRARY = "compiler-default"; @@ -669,11 +672,12 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OBJC_INTERFACE_HEADER_NAME = "GoogleMapsANE_FW-Swift.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -712,11 +716,12 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = NO; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OBJC_INTERFACE_HEADER_NAME = "GoogleMapsANE_FW-Swift.h"; SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -805,6 +810,25 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 907FA0362396DF8A00A02384 /* XCRemoteSwiftPackageReference "SwiftyJSON" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/SwiftyJSON/SwiftyJSON.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 5.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 907FA0372396DF8A00A02384 /* SwiftyJSON */ = { + isa = XCSwiftPackageProductDependency; + package = 907FA0362396DF8A00A02384 /* XCRemoteSwiftPackageReference "SwiftyJSON" */; + productName = SwiftyJSON; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = CE3980631E58BA7F0062485B /* Project object */; } diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/native_library/ios/GoogleMapsANE/GoogleMapsANE.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 6555830..919434a 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/native_library/ios/GoogleMapsANE/GoogleMapsANE.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..8a63c30 --- /dev/null +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,16 @@ +{ + "object": { + "pins": [ + { + "package": "SwiftyJSON", + "repositoryURL": "https://github.com/SwiftyJSON/SwiftyJSON.git", + "state": { + "branch": null, + "revision": "2b6054efa051565954e1d2b9da831680026cd768", + "version": "5.0.0" + } + } + ] + }, + "version": 1 +} diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreCLLocationCoordinate.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreCLLocationCoordinate.swift index ccc0896..cfe18b9 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreCLLocationCoordinate.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreCLLocationCoordinate.swift @@ -17,6 +17,7 @@ import Foundation import GoogleMaps import FreSwift +import SwiftyJSON public extension CLLocationCoordinate2D { init?(_ freObject: FREObject?) { @@ -40,15 +41,15 @@ public extension CLLocationCoordinate2D { } public extension FreObjectSwift { - public subscript(dynamicMember name: String) -> CLLocationCoordinate2D? { + subscript(dynamicMember name: String) -> CLLocationCoordinate2D? { get { return CLLocationCoordinate2D(rawValue?[name]) } set { rawValue?[name] = newValue?.toFREObject() } } - public subscript(dynamicMember name: String) -> CLLocationCoordinate2D { + subscript(dynamicMember name: String) -> CLLocationCoordinate2D { get { return CLLocationCoordinate2D(rawValue?[name]) ?? CLLocationCoordinate2D() } set { rawValue?[name] = newValue.toFREObject() } } - public subscript(dynamicMember name: String) -> [CLLocationCoordinate2D] { + subscript(dynamicMember name: String) -> [CLLocationCoordinate2D] { return [CLLocationCoordinate2D](rawValue?[name]) ?? [] } } diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSCameraPosition.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSCameraPosition.swift index ee6a4f0..919a60f 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSCameraPosition.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSCameraPosition.swift @@ -16,6 +16,7 @@ import Foundation import GoogleMaps +import SwiftyJSON public extension GMSCameraPosition { func toJSON() -> String { diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSCircle.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSCircle.swift index c54a23d..4e463fa 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSCircle.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSCircle.swift @@ -26,32 +26,32 @@ public extension GMSCircle { let fre = FreObjectSwift(rv) self.init(position: fre.center, radius: fre.radius) - self.strokeWidth = fre.strokeWidth - self.strokeColor = fre.strokeColor - self.fillColor = fre.fillColor - self.zIndex = Int32(fre.zIndex as Int) - self.isTappable = fre.isTappable - self.userData = UUID().uuidString + strokeWidth = fre.strokeWidth + strokeColor = fre.strokeColor + fillColor = fre.fillColor + zIndex = Int32(fre.zIndex as Int) + isTappable = fre.isTappable + userData = UUID().uuidString } func setProp(name: String, value: FREObject) { switch name { case "center": - self.position = CLLocationCoordinate2D(value) ?? self.position + position = CLLocationCoordinate2D(value) ?? position case "strokeWidth": - self.strokeWidth = CGFloat(value) ?? self.strokeWidth + strokeWidth = CGFloat(value) ?? strokeWidth case "radius": - self.radius = Double(value) ?? self.radius + radius = Double(value) ?? radius case "isTappable": - self.isTappable = Bool(value) ?? self.isTappable + isTappable = Bool(value) ?? isTappable case "zIndex": if let z = Int(value) { - self.zIndex = Int32(z) + zIndex = Int32(z) } case "strokeColor": - self.strokeColor = UIColor(value) ?? self.strokeColor + strokeColor = UIColor(value) ?? strokeColor case "fillColor": - self.fillColor = UIColor(value) ?? self.fillColor + fillColor = UIColor(value) ?? fillColor default: break } diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSCoordinateBounds.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSCoordinateBounds.swift index eacda02..beb9d04 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSCoordinateBounds.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSCoordinateBounds.swift @@ -35,11 +35,11 @@ public extension GMSCoordinateBounds { } public extension FreObjectSwift { - public subscript(dynamicMember name: String) -> GMSCoordinateBounds? { + subscript(dynamicMember name: String) -> GMSCoordinateBounds? { get { return GMSCoordinateBounds(rawValue?[name]) } set { rawValue?[name] = newValue?.toFREObject() } } - public subscript(dynamicMember name: String) -> GMSCoordinateBounds { + subscript(dynamicMember name: String) -> GMSCoordinateBounds { get { return GMSCoordinateBounds(rawValue?[name]) ?? GMSCoordinateBounds() } set { rawValue?[name] = newValue.toFREObject() } } diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSGroundOverlay.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSGroundOverlay.swift index c0de136..802e3a0 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSGroundOverlay.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSGroundOverlay.swift @@ -26,32 +26,32 @@ public extension GMSGroundOverlay { let fre = FreObjectSwift(rv) self.init(bounds: fre.bounds, icon: UIImage(freObject: fre.image, scale: UIScreen.main.scale, orientation: .up)) - self.bearing = fre.bearing - self.opacity = 1.0 - fre.transparency - self.isTappable = fre.isTappable - self.zIndex = Int32(fre.zIndex as Int) - self.userData = UUID().uuidString + bearing = fre.bearing + opacity = 1.0 - fre.transparency + isTappable = fre.isTappable + zIndex = Int32(fre.zIndex as Int) + userData = UUID().uuidString } func setProp(name: String, value: FREObject) { switch name { case "bounds": - self.bounds = GMSCoordinateBounds(value) ?? self.bounds + bounds = GMSCoordinateBounds(value) ?? bounds case "bearing": - self.bearing = CLLocationDirection(value) ?? self.bearing + bearing = CLLocationDirection(value) ?? bearing case "transparency": if let v = Float(value) { - self.opacity = 1.0 - v + opacity = 1.0 - v } case "isTappable": - self.isTappable = Bool(value) ?? self.isTappable + isTappable = Bool(value) ?? isTappable case "zIndex": if let z = Int(value) { - self.zIndex = Int32(z) + zIndex = Int32(z) } case "image": if let img = UIImage(freObject: value, scale: UIScreen.main.scale, orientation: .up) { - self.icon = img + icon = img } default: break diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSMarker.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSMarker.swift index 244057f..e7f9dd4 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSMarker.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSMarker.swift @@ -25,49 +25,49 @@ public extension GMSMarker { } let fre = FreObjectSwift(rv) self.init(position: fre.coordinate) - self.tracksInfoWindowChanges = true - self.title = fre.title - self.snippet = fre.snippet - self.isDraggable = fre.isDraggable - self.isFlat = fre.isFlat - self.isTappable = fre.isTappable - self.rotation = fre.rotation - self.opacity = fre.alpha - self.userData = UUID().uuidString + tracksInfoWindowChanges = true + title = fre.title + snippet = fre.snippet + isDraggable = fre.isDraggable + isFlat = fre.isFlat + isTappable = fre.isTappable + rotation = fre.rotation + opacity = fre.alpha + userData = UUID().uuidString if let img = UIImage(freObject: fre.icon, scale: UIScreen.main.scale, orientation: .up) { - self.icon = img + icon = img } else { - self.icon = GMSMarker.markerImage(with: fre.color) + icon = GMSMarker.markerImage(with: fre.color) } } func setProp(name: String, value: FREObject) { switch name { case "coordinate": - self.position = CLLocationCoordinate2D(value) ?? self.position + position = CLLocationCoordinate2D(value) ?? position case "title": - self.title = String(value) ?? self.title + title = String(value) ?? title case "snippet": - self.snippet = String(value) ?? self.snippet + snippet = String(value) ?? snippet case "isDraggable": - self.isDraggable = Bool(value) ?? self.isDraggable + isDraggable = Bool(value) ?? isDraggable case "isFlat": - self.isFlat = Bool(value) ?? self.isFlat + isFlat = Bool(value) ?? isFlat case "isTappable": - self.isTappable = Bool(value) ?? self.isTappable + isTappable = Bool(value) ?? isTappable case "rotation": - self.rotation = CLLocationDegrees(value) ?? self.rotation + rotation = CLLocationDegrees(value) ?? rotation case "color": if let color = UIColor(value) { - self.icon = GMSMarker.markerImage(with: color) + icon = GMSMarker.markerImage(with: color) } case "icon": if let img = UIImage(freObject: value, scale: UIScreen.main.scale, orientation: .up) { - self.icon = img + icon = img } case "alpha": - self.opacity = Float(value) ?? self.opacity + opacity = Float(value) ?? opacity default: break } diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSMutablePath.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSMutablePath.swift index dbae785..ffe9af5 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSMutablePath.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSMutablePath.swift @@ -18,10 +18,10 @@ import GoogleMaps import FreSwift public extension FreObjectSwift { - public subscript(dynamicMember name: String) -> GMSMutablePath { + subscript(dynamicMember name: String) -> GMSMutablePath { return GMSMutablePath(rawValue?[name]) ?? GMSMutablePath() } - public subscript(dynamicMember name: String) -> [GMSMutablePath] { + subscript(dynamicMember name: String) -> [GMSMutablePath] { return [GMSMutablePath](rawValue?[name]) ?? [] } } @@ -32,7 +32,7 @@ public extension GMSMutablePath { self.init() for frePoint in FREArray(rv) { if let point = CLLocationCoordinate2D(frePoint) { - self.add(point) + add(point) } } } diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSPolygon.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSPolygon.swift index e147312..477a141 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSPolygon.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSPolygon.swift @@ -25,37 +25,36 @@ public extension GMSPolygon { } let fre = FreObjectSwift(rv) self.init() - self.geodesic = fre.geodesic - self.strokeWidth = fre.strokeWidth - self.strokeColor = fre.strokeColor - self.fillColor = fre.fillColor - self.zIndex = Int32(fre.zIndex as Int) - self.userData = UUID().uuidString - self.isTappable = fre.isTappable - self.path = GMSMutablePath(rv["points"]) ?? GMSMutablePath() - self.holes = fre.holes - + geodesic = fre.geodesic + strokeWidth = fre.strokeWidth + strokeColor = fre.strokeColor + fillColor = fre.fillColor + zIndex = Int32(fre.zIndex as Int) + userData = UUID().uuidString + isTappable = fre.isTappable + path = GMSMutablePath(rv["points"]) ?? GMSMutablePath() + holes = fre.holes } func setProp(name: String, value: FREObject) { switch name { case "geodesic": - self.geodesic = Bool(value) ?? self.geodesic + geodesic = Bool(value) ?? geodesic case "strokeWidth": - self.strokeWidth = CGFloat(value) ?? self.strokeWidth + strokeWidth = CGFloat(value) ?? strokeWidth case "isTappable": - self.isTappable = Bool(value) ?? self.isTappable + isTappable = Bool(value) ?? isTappable case "zIndex": if let z = Int(value) { self.zIndex = Int32(z) } case "strokeColor": - self.strokeColor = UIColor(value) ?? self.strokeColor + strokeColor = UIColor(value) ?? strokeColor case "fillColor": - self.fillColor = UIColor(value) ?? self.fillColor + fillColor = UIColor(value) ?? fillColor case "points": if let points = GMSMutablePath(value) { - self.path = points + path = points } case "holes": if let holes = [GMSMutablePath](value) { diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSPolyline.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSPolyline.swift index 439827a..439a5ca 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSPolyline.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreGMSPolyline.swift @@ -25,34 +25,34 @@ public extension GMSPolyline { } let fre = FreObjectSwift(rv) self.init() - self.geodesic = fre.geodesic - self.strokeWidth = fre.width - self.strokeColor = fre.color - self.zIndex = Int32(fre.zIndex as Int) - self.isTappable = fre.isTappable - self.userData = UUID().uuidString + geodesic = fre.geodesic + strokeWidth = fre.width + strokeColor = fre.color + zIndex = Int32(fre.zIndex as Int) + isTappable = fre.isTappable + userData = UUID().uuidString if let points = GMSMutablePath(rv["points"]) { - self.path = points + path = points } } func setProp(name: String, value: FREObject) { switch name { case "geodesic": - self.geodesic = Bool(value) ?? self.geodesic + geodesic = Bool(value) ?? geodesic case "width": - self.strokeWidth = CGFloat(value) ?? self.strokeWidth + strokeWidth = CGFloat(value) ?? strokeWidth case "isTappable": - self.isTappable = Bool(value) ?? self.isTappable + isTappable = Bool(value) ?? isTappable case "zIndex": if let z = Int(value) { - self.zIndex = Int32(z) + zIndex = Int32(z) } case "color": - self.strokeColor = UIColor(value) ?? self.strokeColor + strokeColor = UIColor(value) ?? strokeColor case "points": if let points = GMSMutablePath(value) { - self.path = points + path = points } default: break diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreMKCircle.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreMKCircle.swift index c572e13..db4d3ef 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreMKCircle.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreMKCircle.swift @@ -27,19 +27,19 @@ extension CustomMKCircle { self.init(center: fre.center, radius: fre.radius, identifier: UUID().uuidString) - self.fillColor = fre.fillColor - self.strokeColor = fre.strokeColor - self.strokeWidth = fre.strokeWidth + fillColor = fre.fillColor + strokeColor = fre.strokeColor + strokeWidth = fre.strokeWidth } func setProp(name: String, value: FREObject) { switch name { case "strokeWidth": - self.strokeWidth = CGFloat(value) ?? self.strokeWidth + strokeWidth = CGFloat(value) ?? strokeWidth case "strokeColor": - self.strokeColor = UIColor(value) ?? self.strokeColor + strokeColor = UIColor(value) ?? strokeColor case "fillColor": - self.fillColor = UIColor(value) ?? self.fillColor + fillColor = UIColor(value) ?? fillColor default: break } diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreMKPolygon.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreMKPolygon.swift index 4054e95..556a037 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreMKPolygon.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreMKPolygon.swift @@ -36,9 +36,9 @@ extension CustomMKPolygon { } self.init(points: fre.points, holes: holes, identifier: UUID().uuidString) - self.fillColor = fre.fillColor - self.strokeColor = fre.strokeColor - self.strokeWidth = fre.strokeWidth + fillColor = fre.fillColor + strokeColor = fre.strokeColor + strokeWidth = fre.strokeWidth } convenience init?(_ freObject: FREObject?, polygon: CustomMKPolygon) { @@ -47,19 +47,19 @@ extension CustomMKPolygon { } let fre = FreObjectSwift(rv) self.init(points: fre.points, holePolygons: polygon.interiorPolygons, identifier: polygon.identifier) - self.fillColor = polygon.fillColor - self.strokeColor = polygon.strokeColor - self.strokeWidth = polygon.strokeWidth + fillColor = polygon.fillColor + strokeColor = polygon.strokeColor + strokeWidth = polygon.strokeWidth } func setProp(name: String, value: FREObject) { switch name { case "strokeWidth": - self.strokeWidth = CGFloat(value) ?? self.strokeWidth + strokeWidth = CGFloat(value) ?? strokeWidth case "strokeColor": - self.strokeColor = UIColor(value) ?? self.strokeColor + strokeColor = UIColor(value) ?? strokeColor case "fillColor": - self.fillColor = UIColor(value) ?? self.fillColor + fillColor = UIColor(value) ?? fillColor default: break } diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreMKPolyline.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreMKPolyline.swift index 692dc76..9bb8099 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreMKPolyline.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Extensions/FreMKPolyline.swift @@ -24,8 +24,8 @@ extension CustomMKPolyline { } let fre = FreObjectSwift(rv) self.init(points: fre.points, identifier: UUID().uuidString) - self.color = fre.color - self.width = fre.width + color = fre.color + width = fre.width } convenience init?(_ freObject: FREObject?, polyline: CustomMKPolyline) { @@ -34,16 +34,16 @@ extension CustomMKPolyline { } let fre = FreObjectSwift(rv) self.init(points: fre.points, identifier: polyline.identifier) - self.color = polyline.color - self.width = polyline.width + color = polyline.color + width = polyline.width } func setProp(name: String, value: FREObject) { switch name { case "width": - self.width = CGFloat(value) ?? self.width + width = CGFloat(value) ?? width case "color": - self.color = UIColor(value) ?? self.color + color = UIColor(value) ?? color default: break } diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/GMSMapController+GMSMapViewDelegate.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/GMSMapController+GMSMapViewDelegate.swift index d33f86a..f351cfe 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/GMSMapController+GMSMapViewDelegate.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/GMSMapController+GMSMapViewDelegate.swift @@ -16,6 +16,7 @@ import Foundation import GoogleMaps +import SwiftyJSON extension GMSMapController: GMSMapViewDelegate { func mapView(_ mapView: GMSMapView, didTapAt coordinate: CLLocationCoordinate2D) { diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/LocationController.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/LocationController.swift index c394e86..ce732bc 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/LocationController.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/LocationController.swift @@ -16,6 +16,7 @@ import GoogleMaps import FreSwift +import SwiftyJSON internal class LocationController: NSObject, FreSwiftController, CLLocationManagerDelegate { var context: FreContextSwift! @@ -128,6 +129,8 @@ internal class LocationController: NSObject, FreSwiftController, CLLocationManag case .authorizedWhenInUse: props["status"] = Constants.PERMISSION_WHEN_IN_USE permissionsGranted = true + @unknown default: + props["status"] = Constants.PERMISSION_DENIED } if permissionsGranted { diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/MKMapController+MKMapViewDelegate.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/MKMapController+MKMapViewDelegate.swift index a9176e9..2a66b33 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/MKMapController+MKMapViewDelegate.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/MKMapController+MKMapViewDelegate.swift @@ -16,6 +16,7 @@ import Foundation import MapKit +import SwiftyJSON extension MKMapController: MKMapViewDelegate { internal func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) { @@ -72,6 +73,8 @@ extension MKMapController: MKMapViewDelegate { view.setDragState(.none, animated: false) case .canceling: break + @unknown default: + break } } diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/MapKit/MapViewExtension.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/MapKit/MapViewExtension.swift index 2a8a1c2..7d7384a 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/MapKit/MapViewExtension.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/MapKit/MapViewExtension.swift @@ -20,7 +20,7 @@ public extension MKMapView { /// By setting this property, you can change map zoom level based on **current map center**. /// /// - Note: The level is between 0 and 18, level 0 means the highest camera height. - public var zoomLevel: UInt { + var zoomLevel: UInt { get { let centerPixelX = region.center.longitude.pixelSpaceXForLongitude let topLeftPixelX = (region.center.longitude - region.span.longitudeDelta / 2).pixelSpaceXForLongitude @@ -44,7 +44,7 @@ public extension MKMapView { /// - coordinate: the aim coordinate that you want set it to center /// - zoomLevel: a unsigned int which is between 0 and 18, level 0 means the highest camera height /// - animated: determine whether moving map animately - public func setCenter(coordinate: CLLocationCoordinate2D, zoomLevel: UInt, animated: Bool ) { + func setCenter(coordinate: CLLocationCoordinate2D, zoomLevel: UInt, animated: Bool ) { // clamp large numbers to 28 let zoomLevel = min(zoomLevel, 28) @@ -63,7 +63,7 @@ public extension MKMapView { /// - zoomLevel: a unsigned int which is between 0 and 18, level 0 means the highest camera height /// /// - Returns: corresponding region - public func getCoordinateRegion(_ centerCoordinate: CLLocationCoordinate2D, zoomLevel: UInt) -> MKCoordinateRegion { + func getCoordinateRegion(_ centerCoordinate: CLLocationCoordinate2D, zoomLevel: UInt) -> MKCoordinateRegion { // clamp lat/long values to appropriate ranges var centerCoordinate = centerCoordinate centerCoordinate.latitude = min(max(-90, centerCoordinate.latitude), 90) @@ -118,14 +118,14 @@ public extension MKMapView { /// Increase zoom level by 1 /// /// - Note: the max zoom level is 18. - public func zoomIn() { + func zoomIn() { zoomLevel += 1 } /// Decrease zoom level by 1 /// /// - Note: the min zoom level is 1. - public func zoomOut() { + func zoomOut() { zoomLevel -= 1 } @@ -136,7 +136,7 @@ public extension MKMapView { /// - Requires: iOS 9.0 and above /// - Note: if you want to use it below the iOS 9, please use `showsCompass` instead. @available(iOS, deprecated: 9.0, message: "showsCompassView is deprecated in iOS 9.0, please use \"showsCompass\" instead") - public var showsCompassView: Bool { + var showsCompassView: Bool { set(show) { if let compassView = MapComponent.sharedInstance.compassView { self.decideView(compassView, shouldShow: show) @@ -153,7 +153,7 @@ public extension MKMapView { } /// A Boolean indicating whether the map displays the lower left attributed label. - public var showsLegalLabel: Bool { + var showsLegalLabel: Bool { set(show) { if let legalLabel = MapComponent.sharedInstance.legalLabel { decideView(legalLabel, shouldShow: show) @@ -176,7 +176,7 @@ public extension MKMapView { /// there's no any UIImageViews added to MKMapView. If you really needs to add image view /// onto the mapView, you should set the mapView's tag to any value expect 0. /// Or this property may remove the wrong image. - public var showsMapInfoImageView: Bool { + var showsMapInfoImageView: Bool { set(show) { if let mapInfoImageView = MapComponent.sharedInstance.mapInfoImageView { decideView(mapInfoImageView, shouldShow: show) @@ -197,47 +197,47 @@ public extension MKMapView { public extension MKMapRect { /// The rect that contains every map point in the world. - public static var zero: MKMapRect { return MKMapRect(x: 0, y: 0, width: 0, height: 0) } - public static var infinite: MKMapRect { + static var zero: MKMapRect { return MKMapRect(x: 0, y: 0, width: 0, height: 0) } + static var infinite: MKMapRect { //let max = DBL_MAX let max = Double.greatestFiniteMagnitude let origin = -max / 2 return MKMapRect(x: origin, y: origin, width: max, height: max) } - public init(x: Double, y: Double, width: Double, height: Double) { + init(x: Double, y: Double, width: Double, height: Double) { self.init(origin: MKMapPoint(x: x, y: y), size: MKMapSize(width: width, height: height)) } - public init(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat) { + init(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat) { self.init(origin: MKMapPoint(x: Double(x), y: Double(y)), size: MKMapSize(width: Double(width), height: Double(height))) } - public init(x: Int, y: Int, width: Int, height: Int) { + init(x: Int, y: Int, width: Int, height: Int) { self.init(origin: MKMapPoint(x: Double(x), y: Double(y)), size: MKMapSize(width: Double(width), height: Double(height))) } - public var isInfinite: Bool { return self == MKMapRect.infinite } - public var standardized: MKMapRect { + var isInfinite: Bool { return self == MKMapRect.infinite } + var standardized: MKMapRect { let realWidth = abs(self.size.width) let realHeight = abs(self.size.height) let realX = self.size.width < 0 ? self.origin.x + self.size.width : self.origin.x let realY = self.size.height < 0 ? self.origin.y + self.size.height : self.origin.y return MKMapRect(x: realX, y: realY, width: realWidth, height: realHeight) } - public var integral: MKMapRect { return MKMapRect(x: floor(self.minX), y: floor(self.minY), width: ceil(self.width), height: ceil(self.height)) } + var integral: MKMapRect { return MKMapRect(x: floor(self.minX), y: floor(self.minY), width: ceil(self.width), height: ceil(self.height)) } - public mutating func standardizeInPlace() { self = standardized } - public mutating func makeIntegralInPlace() { self = integral } + mutating func standardizeInPlace() { self = standardized } + mutating func makeIntegralInPlace() { self = integral } - public mutating func insetInPlace(_ dx: Double, _ dy: Double) { self = insetBy(dx: dx, dy: dy) } + mutating func insetInPlace(_ dx: Double, _ dy: Double) { self = insetBy(dx: dx, dy: dy) } - public mutating func offsetInPlace(_ dx: Double, _ dy: Double) { self = offsetBy(dx: dx, dy: dy) } + mutating func offsetInPlace(_ dx: Double, _ dy: Double) { self = offsetBy(dx: dx, dy: dy) } - public mutating func unionInPlace(_ rect: MKMapRect) { self = union(rect.standardized) } + mutating func unionInPlace(_ rect: MKMapRect) { self = union(rect.standardized) } - public func intersect(_ rect: MKMapRect) -> MKMapRect { return self.standardized.intersection(rect.standardized) } + func intersect(_ rect: MKMapRect) -> MKMapRect { return self.standardized.intersection(rect.standardized) } - public mutating func intersectInPlace(_ rect: MKMapRect) { self = intersect(rect.standardized) } + mutating func intersectInPlace(_ rect: MKMapRect) { self = intersect(rect.standardized) } - public func divide(_ atDistance: Double, fromEdge: MKMapRectEdge) -> (slice: MKMapRect, remainder: MKMapRect) { + func divide(_ atDistance: Double, fromEdge: MKMapRectEdge) -> (slice: MKMapRect, remainder: MKMapRect) { var slice = MKMapRect.zero var remainder = MKMapRect.zero MKMapRectDivide(self.standardized, &slice, &remainder, atDistance, fromEdge) @@ -247,11 +247,11 @@ public extension MKMapRect { } public extension MKMapRect { - public var coordinateRegion: MKCoordinateRegion { + var coordinateRegion: MKCoordinateRegion { return MKCoordinateRegion(self) } - public var mapRectSpans180thMeridian: Bool { + var mapRectSpans180thMeridian: Bool { return self.spans180thMeridian } @@ -259,7 +259,7 @@ public extension MKMapRect { /// that lies outside of the world rect wrapped around to the other side of the /// world. The portion of the rect that lies inside the world rect can be /// determined with rect.intersect(MKMapRect.world). - public var mapRectRemainder: MKMapRect { + var mapRectRemainder: MKMapRect { return self.remainder } } @@ -279,12 +279,12 @@ extension MKMapRect: CustomStringConvertible { // MARK: Points public extension MKMapPoint { - public static var zero: MKMapPoint { return MKMapPoint(x: 0, y: 0) } + static var zero: MKMapPoint { return MKMapPoint(x: 0, y: 0) } - public init(x: Int, y: Int) { + init(x: Int, y: Int) { self.init(x: Double(x), y: Double(y)) } - public init(x: CGFloat, y: CGFloat) { + init(x: CGFloat, y: CGFloat) { self.init(x: Double(x), y: Double(y)) } } @@ -293,7 +293,7 @@ public extension MKMapPoint { /// Conversion between unprojected and projected coordinates // public var coordinate: CLLocationCoordinate2D { return self.coordinate } - public func getMeters(to mapPoint: MKMapPoint) -> CLLocationDistance { + func getMeters(to mapPoint: MKMapPoint) -> CLLocationDistance { return self.distance(to:mapPoint) } } @@ -313,14 +313,14 @@ extension MKMapPoint: CustomStringConvertible { // MARK: Sizes public extension MKMapSize { - public static var zero: MKMapSize { return MKMapSize(width: 0, height: 0) } + static var zero: MKMapSize { return MKMapSize(width: 0, height: 0) } /// The size that contains every map point in the world. // public static var world: MKMapSize { return MKMapSize.world } - public init(width: Int, height: Int) { + init(width: Int, height: Int) { self.init(width: Double(width), height: Double(height)) } - public init(width: CGFloat, height: CGFloat) { + init(width: CGFloat, height: CGFloat) { self.init(width: Double(width), height: Double(height)) } } @@ -341,16 +341,16 @@ extension MKMapSize: CustomStringConvertible { public extension CLLocationCoordinate2D { /// Conversion between unprojected and projected coordinates - public var mapPoint: MKMapPoint { return MKMapPoint(self) } + var mapPoint: MKMapPoint { return MKMapPoint(self) } } // MARK: Degrees public extension CLLocationDegrees { /// Conversion between distances and projected coordinates - public var metersPerMapPoint: CLLocationDistance { return MKMetersPerMapPointAtLatitude(self) } + var metersPerMapPoint: CLLocationDistance { return MKMetersPerMapPointAtLatitude(self) } /// Conversion between distances and projected coordinates - public var mapPointsPerMeter: Double { return MKMapPointsPerMeterAtLatitude(self) } + var mapPointsPerMeter: Double { return MKMapPointsPerMeterAtLatitude(self) } } public typealias MKMapRectEdge = CGRectEdge @@ -370,7 +370,7 @@ private struct MapComponent { fileprivate extension MKMapView { // MARK: Helper Methods - fileprivate func findView(_ name: String? = nil, className: AnyClass? = nil) -> UIView? { + func findView(_ name: String? = nil, className: AnyClass? = nil) -> UIView? { var cla: AnyClass? = className if let name = name, let className = NSClassFromString(name) { cla = className @@ -383,7 +383,7 @@ fileprivate extension MKMapView { return nil } - fileprivate func decideView(_ view: UIView, shouldShow show: Bool) { + func decideView(_ view: UIView, shouldShow show: Bool) { if show { self.addSubview(view) view.alpha = 0 @@ -399,7 +399,7 @@ fileprivate extension MKMapView { } } - fileprivate func coordinateSpanWithCenterCoordinate(_ center: CLLocationCoordinate2D, + func coordinateSpanWithCenterCoordinate(_ center: CLLocationCoordinate2D, zoomLevel: UInt) -> MKCoordinateSpan { // convert center coordinate to pixel space let centerPixelX = center.longitude.pixelSpaceXForLongitude @@ -437,23 +437,23 @@ fileprivate extension MKMapView { fileprivate extension Double { - fileprivate var pixelSpaceXForLongitude: Double { + var pixelSpaceXForLongitude: Double { let result: Double = mercatorOffset + mercatorRadius * self * Double.pi / 180 return result.rounded() } - fileprivate var pixelSpaceYForLatitude: Double { + var pixelSpaceYForLatitude: Double { if self == 90 { return 0 } else if self == -90 { return mercatorOffset * 2 } else { return (mercatorOffset - mercatorRadius * log((1 + sin(self * Double.pi / 180)) / (1 - sin(self * Double.pi / 180))) / 2).rounded() } } - fileprivate var longitudeForPixelSpaceX: Double { + var longitudeForPixelSpaceX: Double { return ((self.rounded() - mercatorOffset) / mercatorRadius) * 180 / Double.pi } - fileprivate var latitudeForPixelSpaceY: Double { + var latitudeForPixelSpaceY: Double { return (Double.pi / 2 - 2 * atan(exp((self.rounded() - mercatorOffset) / mercatorRadius))) * 180 / Double.pi } } diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Model/Constants.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Model/Constants.swift index 9b3dc42..04d7788 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Model/Constants.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Model/Constants.swift @@ -16,30 +16,30 @@ import Foundation -public struct Constants { - public static let ON_LOADED = "GoogleMaps.OnLoaded" - public static let ON_READY = "GoogleMaps.OnReady" - public static let DID_TAP_AT = "GoogleMaps.DidTapAt" - public static let DID_LONG_PRESS_AT = "GoogleMaps.DidLongPressAt" - public static let DID_TAP_MARKER = "GoogleMaps.DidTapMarker" - public static let DID_BEGIN_DRAGGING = "GoogleMaps.DidBeginDragging" - public static let DID_END_DRAGGING = "GoogleMaps.DidEndDragging" - public static let DID_DRAG = "GoogleMaps.DidDrag" - public static let DID_TAP_INFO_WINDOW = "GoogleMaps.DidTapInfoWindow" - public static let DID_CLOSE_INFO_WINDOW = "GoogleMaps.DidCloseInfoWindow" - public static let DID_LONG_PRESS_INFO_WINDOW = "GoogleMaps.DidLongPressInfoWindow" - public static let DID_TAP_GROUND_OVERLAY = "GoogleMaps.DidTapGroundOverlay" - public static let ON_CAMERA_MOVE = "GoogleMaps.OnCameraMove" - public static let ON_CAMERA_MOVE_STARTED = "GoogleMaps.OnCameraMoveStarted" - public static let ON_CAMERA_IDLE = "GoogleMaps.OnCameraIdle" - public static let LOCATION_UPDATED = "Location.LocationUpdated" - public static let ON_ADDRESS_LOOKUP = "Location.OnAddressLookup" - public static let ON_ADDRESS_LOOKUP_ERROR = "Location.OnAddressLookupError" - public static let ON_PERMISSION_STATUS = "Permission.OnStatus" - public static let ON_BITMAP_READY = "GoogleMaps.OnBitmapReady" - public static let PERMISSION_NOT_DETERMINED = 0 - public static let PERMISSION_RESTRICTED = 1 - public static let PERMISSION_DENIED = 2 - public static let PERMISSION_ALWAYS = 3 - public static let PERMISSION_WHEN_IN_USE = 4 +struct Constants { + static let ON_LOADED = "GoogleMaps.OnLoaded" + static let ON_READY = "GoogleMaps.OnReady" + static let DID_TAP_AT = "GoogleMaps.DidTapAt" + static let DID_LONG_PRESS_AT = "GoogleMaps.DidLongPressAt" + static let DID_TAP_MARKER = "GoogleMaps.DidTapMarker" + static let DID_BEGIN_DRAGGING = "GoogleMaps.DidBeginDragging" + static let DID_END_DRAGGING = "GoogleMaps.DidEndDragging" + static let DID_DRAG = "GoogleMaps.DidDrag" + static let DID_TAP_INFO_WINDOW = "GoogleMaps.DidTapInfoWindow" + static let DID_CLOSE_INFO_WINDOW = "GoogleMaps.DidCloseInfoWindow" + static let DID_LONG_PRESS_INFO_WINDOW = "GoogleMaps.DidLongPressInfoWindow" + static let DID_TAP_GROUND_OVERLAY = "GoogleMaps.DidTapGroundOverlay" + static let ON_CAMERA_MOVE = "GoogleMaps.OnCameraMove" + static let ON_CAMERA_MOVE_STARTED = "GoogleMaps.OnCameraMoveStarted" + static let ON_CAMERA_IDLE = "GoogleMaps.OnCameraIdle" + static let LOCATION_UPDATED = "Location.LocationUpdated" + static let ON_ADDRESS_LOOKUP = "Location.OnAddressLookup" + static let ON_ADDRESS_LOOKUP_ERROR = "Location.OnAddressLookupError" + static let ON_PERMISSION_STATUS = "Permission.OnStatus" + static let ON_BITMAP_READY = "GoogleMaps.OnBitmapReady" + static let PERMISSION_NOT_DETERMINED = 0 + static let PERMISSION_RESTRICTED = 1 + static let PERMISSION_DENIED = 2 + static let PERMISSION_ALWAYS = 3 + static let PERMISSION_WHEN_IN_USE = 4 } diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Model/Settings.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Model/Settings.swift index 5adef15..6b8c597 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Model/Settings.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Model/Settings.swift @@ -18,15 +18,15 @@ import Foundation import FreSwift public struct Settings { - public var scrollGestures = true - public var zoomGestures = true - public var tiltGestures = true - public var rotateGestures = true - public var consumesGesturesInView = true - public var compassButton = false - public var myLocationButtonEnabled = false - public var indoorPicker = true - public var allowScrollGesturesDuringRotateOrZoom = true + var scrollGestures = true + var zoomGestures = true + var tiltGestures = true + var rotateGestures = true + var consumesGesturesInView = true + var compassButton = false + var myLocationButtonEnabled = false + var indoorPicker = true + var allowScrollGesturesDuringRotateOrZoom = true init?(freObject: FREObject?) { guard let rv = freObject else { return nil } diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/SwiftController.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/SwiftController.swift index d9c8083..5525ae3 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/SwiftController.swift +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/SwiftController.swift @@ -34,8 +34,8 @@ public class SwiftController: NSObject { func addEventListener(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, - let type = String(argv[0]) else { - return FreArgError(message: "addEventListener").getError(#file, #line, #column) + let type = String(argv[0]) + else { return FreArgError().getError() } if mapControllerMK == nil && mapControllerGMS == nil { @@ -56,8 +56,8 @@ public class SwiftController: NSObject { func removeEventListener(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, - let type = String(argv[0]) else { - return FreArgError(message: "removeEventListener").getError(#file, #line, #column) + let type = String(argv[0]) + else { return FreArgError().getError() } if mapControllerMK == nil && mapControllerGMS == nil { asListeners = asListeners.filter({ $0 != type }) @@ -78,8 +78,8 @@ public class SwiftController: NSObject { let xFre = Int(argv[0]), let yFre = Int(argv[1]), let wFre = Int(argv[2]), - let hFre = Int(argv[3]) else { - return FreArgError(message: "capture").getError(#file, #line, #column) + let hFre = Int(argv[3]) + else { return FreArgError().getError() } let x = xFre * Int(UIScreen.main.scale) @@ -135,8 +135,7 @@ public class SwiftController: NSObject { func addCircle(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0 - else { - return FreArgError(message: "addCircle").getError(#file, #line, #column) + else { return FreArgError().getError() } if mapProvider == .apple, let mvc = mapControllerMK, @@ -157,8 +156,7 @@ public class SwiftController: NSObject { let id = String(argv[0]), let name = String(argv[1]), let freValue = argv[2] - else { - return FreArgError(message: "setCircleProp").getError(#file, #line, #column) + else { return FreArgError().getError() } mapControllerMK?.setCircleProp(id: id, name: name, value: freValue) mapControllerGMS?.setCircleProp(id: id, name: name, value: freValue) @@ -168,8 +166,7 @@ public class SwiftController: NSObject { func removeCircle(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, let id = String(argv[0]) - else { - return FreArgError(message: "removeCircle").getError(#file, #line, #column) + else { return FreArgError().getError() } mapControllerMK?.removeCircle(id: id) mapControllerGMS?.removeCircle(id: id) @@ -178,8 +175,7 @@ public class SwiftController: NSObject { func addGroundOverlay(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0 - else { - return FreArgError(message: "addCircle").getError(#file, #line, #column) + else { return FreArgError().getError() } if mapProvider == .apple { warning("Ground overlays are available on GoogleMaps only") @@ -196,8 +192,7 @@ public class SwiftController: NSObject { let id = String(argv[0]), let name = String(argv[1]), let freValue = argv[2] - else { - return FreArgError(message: "setGroundOverlayProp").getError(#file, #line, #column) + else { return FreArgError().getError() } mapControllerGMS?.setGroundOverlay(id: id, name: name, value: freValue) return nil @@ -205,8 +200,7 @@ public class SwiftController: NSObject { func removeGroundOverlay(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, let id = String(argv[0]) - else { - return FreArgError(message: "removeGroundOverlay").getError(#file, #line, #column) + else { return FreArgError().getError() } mapControllerGMS?.removeGroundOverlay(id: id) return nil @@ -214,8 +208,7 @@ public class SwiftController: NSObject { func addPolyline(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0 - else { - return FreArgError(message: "addPolyline").getError(#file, #line, #column) + else { return FreArgError().getError() } if mapProvider == .apple, let mvc = mapControllerMK, @@ -235,8 +228,7 @@ public class SwiftController: NSObject { let id = String(argv[0]), let name = String(argv[1]), let freValue = argv[2] - else { - return FreArgError(message: "setPolylineProp").getError(#file, #line, #column) + else { return FreArgError().getError() } mapControllerMK?.setPolylineProp(id: id, name: name, value: freValue) mapControllerGMS?.setPolylineProp(id: id, name: name, value: freValue) @@ -245,8 +237,7 @@ public class SwiftController: NSObject { func removePolyline(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, let id = String(argv[0]) - else { - return FreArgError(message: "removePolyline").getError(#file, #line, #column) + else { return FreArgError().getError() } mapControllerMK?.removePolyline(id: id) mapControllerGMS?.removePolyline(id: id) @@ -255,8 +246,7 @@ public class SwiftController: NSObject { func addPolygon(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0 - else { - return FreArgError(message: "addPolygon").getError(#file, #line, #column) + else { return FreArgError().getError() } if mapProvider == .apple, let mvc = mapControllerMK, @@ -276,8 +266,7 @@ public class SwiftController: NSObject { let id = String(argv[0]), let name = String(argv[1]), let freValue = argv[2] - else { - return FreArgError(message: "setPolygonProp").getError(#file, #line, #column) + else { return FreArgError().getError() } mapControllerMK?.setPolygonProp(id: id, name: name, value: freValue) mapControllerGMS?.setPolygonProp(id: id, name: name, value: freValue) @@ -286,8 +275,7 @@ public class SwiftController: NSObject { func removePolygon(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, let id = String(argv[0]) - else { - return FreArgError(message: "removePolygon").getError(#file, #line, #column) + else { return FreArgError().getError() } mapControllerMK?.removePolygon(id: id) mapControllerGMS?.removePolygon(id: id) @@ -297,8 +285,8 @@ public class SwiftController: NSObject { func setBounds(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 1, let bounds = GMSCoordinateBounds(argv[0]), - let animates = Bool(argv[1]) else { - return FreArgError(message: "setBounds").getError(#file, #line, #column) + let animates = Bool(argv[1]) + else { return FreArgError().getError() } mapControllerMK?.setBounds(bounds: bounds, animates: animates) mapControllerGMS?.setBounds(bounds: bounds, animates: animates) @@ -307,8 +295,8 @@ public class SwiftController: NSObject { func zoomIn(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, - let animates = Bool(argv[0]) else { - return FreArgError(message: "zoomIn").getError(#file, #line, #column) + let animates = Bool(argv[0]) + else { return FreArgError().getError() } mapControllerMK?.zoomIn(animates: animates) mapControllerGMS?.zoomIn(animates: animates) @@ -317,8 +305,8 @@ public class SwiftController: NSObject { func zoomOut(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, - let animates = Bool(argv[0]) else { - return FreArgError(message: "zoomOut").getError(#file, #line, #column) + let animates = Bool(argv[0]) + else { return FreArgError().getError() } mapControllerMK?.zoomOut(animates: animates) mapControllerGMS?.zoomOut(animates: animates) @@ -327,9 +315,9 @@ public class SwiftController: NSObject { func zoomTo(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 1, - let zoomLevel = CGFloat(argv[1]), - let animates = Bool(argv[0]) else { - return FreArgError(message: "zoomTo").getError(#file, #line, #column) + let zoomLevel = CGFloat(argv[1]), + let animates = Bool(argv[0]) + else { return FreArgError().getError() } mapControllerMK?.zoomTo(zoomLevel: zoomLevel, animates: animates) @@ -353,9 +341,9 @@ public class SwiftController: NSObject { func initController(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 1, - let key = String(argv[0]), - let mapProvider = Int(argv[1]) else { - return FreArgError(message: "initController").getError(#file, #line, #column) + let key = String(argv[0]), + let mapProvider = Int(argv[1]) + else { return FreArgError().getError() } self.mapProvider = mapProvider == 0 ? .google : .apple @@ -368,12 +356,11 @@ public class SwiftController: NSObject { func initMap(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 3, - let inFRE3 = argv[3], // settings:Settings - let viewPort = CGRect(argv[0]), - let zoomLevel = CGFloat(argv[2]), - let coordinate = CLLocationCoordinate2D(argv[1]) - else { - return FreArgError(message: "initMap").getError(#file, #line, #column) + let inFRE3 = argv[3], // settings:Settings + let viewPort = CGRect(argv[0]), + let zoomLevel = CGFloat(argv[2]), + let coordinate = CLLocationCoordinate2D(argv[1]) + else { return FreArgError().getError() } settings = Settings(freObject: inFRE3) @@ -391,9 +378,8 @@ public class SwiftController: NSObject { func addMarker(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, - let inFRE0 = argv[0] //marker:Marker - else { - return FreArgError(message: "addMarker").getError(#file, #line, #column) + let inFRE0 = argv[0] //marker:Marker + else { return FreArgError().getError() } if self.mapProvider == .google { if let marker = GMSMarker(inFRE0) { @@ -418,8 +404,7 @@ public class SwiftController: NSObject { let id = String(argv[0]), let name = String(argv[1]), let freValue = argv[2] - else { - return FreArgError(message: "updateMarker").getError(#file, #line, #column) + else { return FreArgError().getError() } mapControllerMK?.setMarkerProp(id: id, name: name, value: freValue) mapControllerGMS?.setMarkerProp(id: id, name: name, value: freValue) @@ -428,9 +413,8 @@ public class SwiftController: NSObject { func removeMarker(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, - let id = String(argv[0]) - else { - return FreArgError(message: "removeMarker").getError(#file, #line, #column) + let id = String(argv[0]) + else { return FreArgError().getError() } mapControllerMK?.removeMarker(id: id) mapControllerGMS?.removeMarker(id: id) @@ -445,9 +429,8 @@ public class SwiftController: NSObject { func setViewPort(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, - let viewPort = CGRect(argv[0]) - else { - return FreArgError(message: "setViewPort").getError(#file, #line, #column) + let viewPort = CGRect(argv[0]) + else { return FreArgError().getError() } mapControllerMK?.setViewPort(viewPort) mapControllerGMS?.setViewPort(viewPort) @@ -456,9 +439,8 @@ public class SwiftController: NSObject { func moveCamera(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 4, - let animates = Bool(argv[4]) - else { - return FreArgError(message: "moveCamera").getError(#file, #line, #column) + let animates = Bool(argv[4]) + else { return FreArgError().getError() } let centerAt: CLLocationCoordinate2D? = CLLocationCoordinate2D(argv[0]) @@ -472,9 +454,8 @@ public class SwiftController: NSObject { func setStyle(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, - let json = String(argv[0]) - else { - return FreArgError(message: "setStyle").getError(#file, #line, #column) + let json = String(argv[0]) + else { return FreArgError().getError() } mapControllerGMS?.setStyle(json) return nil @@ -482,9 +463,8 @@ public class SwiftController: NSObject { func setMapType(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, - let type = UInt(argv[0]) - else { - return FreArgError(message: "setMapType").getError(#file, #line, #column) + let type = UInt(argv[0]) + else { return FreArgError().getError() } mapControllerMK?.setMapType(type) mapControllerGMS?.setMapType(type) @@ -493,9 +473,9 @@ public class SwiftController: NSObject { func setVisible(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, - let visible = Bool(argv[0]) - else { - return FreArgError(message: "setVisible").getError(#file, #line, #column) } + let visible = Bool(argv[0]) + else { return FreArgError().getError() + } if mapControllerMK == nil && mapControllerGMS == nil { return nil } @@ -531,8 +511,7 @@ public class SwiftController: NSObject { func reverseGeocodeLocation(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, let coordinate = CLLocationCoordinate2D(argv[0]) - else { - return FreArgError(message: "reverseGeocodeLocation").getError(#file, #line, #column) + else { return FreArgError().getError() } locationController.reverseGeocodeLocation(coordinate) return nil @@ -541,8 +520,7 @@ public class SwiftController: NSObject { func forwardGeocodeLocation(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, let address = String(argv[0]) - else { - return FreArgError(message: "forwardGeocodeLocation").getError(#file, #line, #column) + else { return FreArgError().getError() } locationController.forwardGeocodeLocation(address) return nil @@ -551,8 +529,7 @@ public class SwiftController: NSObject { func setBuildingsEnabled(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, let value = Bool(argv[0]) - else { - return FreArgError(message: "setBuildingsEnabled").getError() + else { return FreArgError().getError() } mapControllerGMS?.mapView.isBuildingsEnabled = value return nil @@ -561,8 +538,7 @@ public class SwiftController: NSObject { func setTrafficEnabled(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, let value = Bool(argv[0]) - else { - return FreArgError(message: "setTrafficEnabled").getError() + else { return FreArgError().getError() } mapControllerGMS?.mapView.isTrafficEnabled = value return nil @@ -572,8 +548,7 @@ public class SwiftController: NSObject { guard argc > 0, let value = Float(argv[0]), let maxZoom = mapControllerGMS?.mapView.maxZoom - else { - return FreArgError(message: "setMinZoom").getError() + else { return FreArgError().getError() } mapControllerGMS?.mapView.setMinZoom(value, maxZoom: maxZoom) return nil @@ -583,8 +558,7 @@ public class SwiftController: NSObject { guard argc > 0, let value = Float(argv[0]), let minZoom = mapControllerGMS?.mapView.minZoom - else { - return FreArgError(message: "setMaxZoom").getError() + else { return FreArgError().getError() } mapControllerGMS?.mapView.setMinZoom(minZoom, maxZoom: value) return nil @@ -593,8 +567,7 @@ public class SwiftController: NSObject { func setIndoorEnabled(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, let value = Bool(argv[0]) - else { - return FreArgError(message: "setIndoorEnabled").getError() + else { return FreArgError().getError() } mapControllerGMS?.mapView.isIndoorEnabled = value return nil @@ -603,8 +576,7 @@ public class SwiftController: NSObject { func setMyLocationEnabled(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, let value = Bool(argv[0]) - else { - return FreArgError(message: "setMyLocationEnabled").getError() + else { return FreArgError().getError() } mapControllerMK?.showsUserLocation = value mapControllerGMS?.mapView.isMyLocationEnabled = value @@ -614,8 +586,7 @@ public class SwiftController: NSObject { func projection_pointForCoordinate(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, let value = CLLocationCoordinate2D(argv[0]) - else { - return FreArgError(message: "projection_pointForCoordinate").getError() + else { return FreArgError().getError() } return mapControllerGMS?.mapView.projection.point(for: value).toFREObject() } @@ -623,8 +594,7 @@ public class SwiftController: NSObject { func projection_coordinateForPoint(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, let value = CGPoint(argv[0]) - else { - return FreArgError(message: "projection_coordinateForPoint").getError() + else { return FreArgError().getError() } return mapControllerGMS?.mapView.projection.coordinate(for: value).toFREObject() } @@ -632,8 +602,7 @@ public class SwiftController: NSObject { func projection_containsCoordinate(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { guard argc > 0, let value = CLLocationCoordinate2D(argv[0]) - else { - return FreArgError(message: "projection_containsCoordinate").getError() + else { return FreArgError().getError() } return mapControllerGMS?.mapView.projection.contains(value).toFREObject() } @@ -646,8 +615,7 @@ public class SwiftController: NSObject { guard argc > 1, let forMeters = CLLocationDistance(argv[0]), let at = CLLocationCoordinate2D(argv[1]) - else { - return FreArgError(message: "projection_pointsForMeters").getError() + else { return FreArgError().getError() } return mapControllerGMS?.mapView.projection.points(forMeters: forMeters, at: at).toFREObject() } diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/SwiftyJSON/SwiftyJSON.h b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/SwiftyJSON/SwiftyJSON.h deleted file mode 100644 index d69a764..0000000 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/SwiftyJSON/SwiftyJSON.h +++ /dev/null @@ -1,31 +0,0 @@ -// SwiftyJSON.h -// -// Copyright (c) 2014 - 2017 Ruoyu Fu, Pinglin Tang -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -@import Foundation; - -//! Project version number for SwiftyJSON. -FOUNDATION_EXPORT double SwiftyJSONVersionNumber; - -//! Project version string for SwiftyJSON. -FOUNDATION_EXPORT const unsigned char SwiftyJSONVersionString[]; - - diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/SwiftyJSON/SwiftyJSON.swift b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/SwiftyJSON/SwiftyJSON.swift deleted file mode 100644 index 3412c8d..0000000 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/SwiftyJSON/SwiftyJSON.swift +++ /dev/null @@ -1,1485 +0,0 @@ -// SwiftyJSON.swift -// -// Copyright (c) 2014 - 2017 Ruoyu Fu, Pinglin Tang -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import Foundation - -// MARK: - Error - -///Error domain -public let ErrorDomain: String = "SwiftyJSONErrorDomain" - -///Error code -public let ErrorUnsupportedType: Int = 999 -public let ErrorIndexOutOfBounds: Int = 900 -public let ErrorWrongType: Int = 901 -public let ErrorNotExist: Int = 500 -public let ErrorInvalidJSON: Int = 490 - -// MARK: - JSON Type - -/** - JSON's type definitions. - - See http://www.json.org - */ -public enum Type :Int{ - - case number - case string - case bool - case array - case dictionary - case null - case unknown -} - -// MARK: - JSON Base -public struct JSON { - - /** - Creates a JSON using the data. - - - parameter data: The NSData used to convert to json.Top level object in data is an NSArray or NSDictionary - - parameter opt: The JSON serialization reading options. `.AllowFragments` by default. - - parameter error: The NSErrorPointer used to return the error. `nil` by default. - - - returns: The created JSON - */ - public init(data: Data, options opt: JSONSerialization.ReadingOptions = .allowFragments, error: NSErrorPointer = nil) { - do { - let object: Any = try JSONSerialization.jsonObject(with: data, options: opt) - self.init(jsonObject: object) - } catch let aError as NSError { - if error != nil { - error?.pointee = aError - } - self.init(jsonObject: NSNull()) - } - } - - /** - Creates a JSON object - - parameter object: the object - - note: this does not parse a `String` into JSON, instead use `init(parseJSON: String)` - - returns: the created JSON object - */ - public init(_ object: Any) { - switch object { - case let object as [JSON] where object.count > 0: - self.init(array: object) - case let object as [String: JSON] where object.count > 0: - self.init(dictionary: object) - case let object as Data: - self.init(data: object) - default: - self.init(jsonObject: object) - } - } - - /** - Parses the JSON string into a JSON object - - parameter json: the JSON string - - returns: the created JSON object - */ - public init(parseJSON jsonString: String) { - if let data = jsonString.data(using: .utf8) { - self.init(data) - } else { - self.init(NSNull()) - } - } - - /** - Creates a JSON from JSON string - - parameter string: Normal json string like '{"a":"b"}' - - - returns: The created JSON - */ - @available(*, deprecated: 3.2, message: "Use instead `init(parseJSON: )`") - public static func parse(_ json: String) -> JSON { - return json.data(using: String.Encoding.utf8) - .flatMap{ JSON(data: $0) } ?? JSON(NSNull()) - } - - /** - Creates a JSON using the object. - - - parameter object: The object must have the following properties: All objects are NSString/String, NSNumber/Int/Float/Double/Bool, NSArray/Array, NSDictionary/Dictionary, or NSNull; All dictionary keys are NSStrings/String; NSNumbers are not NaN or infinity. - - - returns: The created JSON - */ - fileprivate init(jsonObject: Any) { - self.object = jsonObject - } - - /** - Creates a JSON from a [JSON] - - - parameter jsonArray: A Swift array of JSON objects - - - returns: The created JSON - */ - fileprivate init(array: [JSON]) { - self.init(array.map { $0.object }) - } - - /** - Creates a JSON from a [String: JSON] - - - parameter jsonDictionary: A Swift dictionary of JSON objects - - - returns: The created JSON - */ - fileprivate init(dictionary: [String: JSON]) { - var newDictionary = [String: Any](minimumCapacity: dictionary.count) - for (key, json) in dictionary { - newDictionary[key] = json.object - } - - self.init(newDictionary) - } - - /** - Merges another JSON into this JSON, whereas primitive values which are not present in this JSON are getting added, - present values getting overwritten, array values getting appended and nested JSONs getting merged the same way. - - - parameter other: The JSON which gets merged into this JSON - - throws `ErrorWrongType` if the other JSONs differs in type on the top level. - */ - public mutating func merge(with other: JSON) throws { - try self.merge(with: other, typecheck: true) - } - - /** - Merges another JSON into this JSON and returns a new JSON, whereas primitive values which are not present in this JSON are getting added, - present values getting overwritten, array values getting appended and nested JSONS getting merged the same way. - - - parameter other: The JSON which gets merged into this JSON - - returns: New merged JSON - - throws `ErrorWrongType` if the other JSONs differs in type on the top level. - */ - public func merged(with other: JSON) throws -> JSON { - var merged = self - try merged.merge(with: other, typecheck: true) - return merged - } - - // Private woker function which does the actual merging - // Typecheck is set to true for the first recursion level to prevent total override of the source JSON - fileprivate mutating func merge(with other: JSON, typecheck: Bool) throws { - if self.type == other.type { - switch self.type { - case .dictionary: - for (key, _) in other { - try self[key].merge(with: other[key], typecheck: false) - } - case .array: - self = JSON(self.arrayValue + other.arrayValue) - default: - self = other - } - } else { - if typecheck { - throw NSError(domain: ErrorDomain, code: ErrorWrongType, userInfo: [NSLocalizedDescriptionKey: "Couldn't merge, because the JSONs differ in type on top level."]) - } else { - self = other - } - } - } - - /// Private object - fileprivate var rawArray: [Any] = [] - fileprivate var rawDictionary: [String : Any] = [:] - fileprivate var rawString: String = "" - fileprivate var rawNumber: NSNumber = 0 - fileprivate var rawNull: NSNull = NSNull() - fileprivate var rawBool: Bool = false - /// Private type - fileprivate var _type: Type = .null - /// prviate error - fileprivate var _error: NSError? = nil - - /// Object in JSON - public var object: Any { - get { - switch self.type { - case .array: - return self.rawArray - case .dictionary: - return self.rawDictionary - case .string: - return self.rawString - case .number: - return self.rawNumber - case .bool: - return self.rawBool - default: - return self.rawNull - } - } - set { - _error = nil - switch newValue { - case let number as NSNumber: - if number.isBool { - _type = .bool - self.rawBool = number.boolValue - } else { - _type = .number - self.rawNumber = number - } - case let string as String: - _type = .string - self.rawString = string - case _ as NSNull: - _type = .null - case _ as [JSON]: - _type = .array - case nil: - _type = .null - case let array as [Any]: - _type = .array - self.rawArray = array - case let dictionary as [String : Any]: - _type = .dictionary - self.rawDictionary = dictionary - default: - _type = .unknown - _error = NSError(domain: ErrorDomain, code: ErrorUnsupportedType, userInfo: [NSLocalizedDescriptionKey: "It is a unsupported type"]) - } - } - } - - /// JSON type - public var type: Type { get { return _type } } - - /// Error in JSON - public var error: NSError? { get { return self._error } } - - /// The static null JSON - @available(*, unavailable, renamed:"null") - public static var nullJSON: JSON { get { return null } } - public static var null: JSON { get { return JSON(NSNull()) } } -} - -public enum Index: Comparable -{ - case array(Int) - case dictionary(DictionaryIndex) - case null - - static public func ==(lhs: Index, rhs: Index) -> Bool { - switch (lhs, rhs) { - case (.array(let left), .array(let right)): - return left == right - case (.dictionary(let left), .dictionary(let right)): - return left == right - case (.null, .null): return true - default: - return false - } - } - - static public func <(lhs: Index, rhs: Index) -> Bool { - switch (lhs, rhs) { - case (.array(let left), .array(let right)): - return left < right - case (.dictionary(let left), .dictionary(let right)): - return left < right - default: - return false - } - } -} - -public typealias JSONIndex = Index -public typealias JSONRawIndex = Index - - -extension JSON: Collection -{ - - public typealias Index = JSONRawIndex - - public var startIndex: Index - { - switch type - { - case .array: - return .array(rawArray.startIndex) - case .dictionary: - return .dictionary(rawDictionary.startIndex) - default: - return .null - } - } - - public var endIndex: Index - { - switch type - { - case .array: - return .array(rawArray.endIndex) - case .dictionary: - return .dictionary(rawDictionary.endIndex) - default: - return .null - } - } - - public func index(after i: Index) -> Index - { - switch i - { - case .array(let idx): - return .array(rawArray.index(after: idx)) - case .dictionary(let idx): - return .dictionary(rawDictionary.index(after: idx)) - default: - return .null - } - - } - - public subscript (position: Index) -> (String, JSON) - { - switch position - { - case .array(let idx): - return (String(idx), JSON(self.rawArray[idx])) - case .dictionary(let idx): - let (key, value) = self.rawDictionary[idx] - return (key, JSON(value)) - default: - return ("", JSON.null) - } - } - - -} - -// MARK: - Subscript - -/** - * To mark both String and Int can be used in subscript. - */ -public enum JSONKey -{ - case index(Int) - case key(String) -} - -public protocol JSONSubscriptType { - var jsonKey:JSONKey { get } -} - -extension Int: JSONSubscriptType { - public var jsonKey:JSONKey { - return JSONKey.index(self) - } -} - -extension String: JSONSubscriptType { - public var jsonKey:JSONKey { - return JSONKey.key(self) - } -} - -extension JSON { - - /// If `type` is `.Array`, return json whose object is `array[index]`, otherwise return null json with error. - fileprivate subscript(index index: Int) -> JSON { - get { - if self.type != .array { - var r = JSON.null - r._error = self._error ?? NSError(domain: ErrorDomain, code: ErrorWrongType, userInfo: [NSLocalizedDescriptionKey: "Array[\(index)] failure, It is not an array"]) - return r - } else if index >= 0 && index < self.rawArray.count { - return JSON(self.rawArray[index]) - } else { - var r = JSON.null - r._error = NSError(domain: ErrorDomain, code:ErrorIndexOutOfBounds , userInfo: [NSLocalizedDescriptionKey: "Array[\(index)] is out of bounds"]) - return r - } - } - set { - if self.type == .array { - if self.rawArray.count > index && newValue.error == nil { - self.rawArray[index] = newValue.object - } - } - } - } - - /// If `type` is `.Dictionary`, return json whose object is `dictionary[key]` , otherwise return null json with error. - fileprivate subscript(key key: String) -> JSON { - get { - var r = JSON.null - if self.type == .dictionary { - if let o = self.rawDictionary[key] { - r = JSON(o) - } else { - r._error = NSError(domain: ErrorDomain, code: ErrorNotExist, userInfo: [NSLocalizedDescriptionKey: "Dictionary[\"\(key)\"] does not exist"]) - } - } else { - r._error = self._error ?? NSError(domain: ErrorDomain, code: ErrorWrongType, userInfo: [NSLocalizedDescriptionKey: "Dictionary[\"\(key)\"] failure, It is not an dictionary"]) - } - return r - } - set { - if self.type == .dictionary && newValue.error == nil { - self.rawDictionary[key] = newValue.object - } - } - } - - /// If `sub` is `Int`, return `subscript(index:)`; If `sub` is `String`, return `subscript(key:)`. - fileprivate subscript(sub sub: JSONSubscriptType) -> JSON { - get { - switch sub.jsonKey { - case .index(let index): return self[index: index] - case .key(let key): return self[key: key] - } - } - set { - switch sub.jsonKey { - case .index(let index): self[index: index] = newValue - case .key(let key): self[key: key] = newValue - } - } - } - - /** - Find a json in the complex data structures by using array of Int and/or String as path. - - - parameter path: The target json's path. Example: - - let json = JSON[data] - let path = [9,"list","person","name"] - let name = json[path] - - The same as: let name = json[9]["list"]["person"]["name"] - - - returns: Return a json found by the path or a null json with error - */ - public subscript(path: [JSONSubscriptType]) -> JSON { - get { - return path.reduce(self) { $0[sub: $1] } - } - set { - switch path.count { - case 0: - return - case 1: - self[sub:path[0]].object = newValue.object - default: - var aPath = path; aPath.remove(at: 0) - var nextJSON = self[sub: path[0]] - nextJSON[aPath] = newValue - self[sub: path[0]] = nextJSON - } - } - } - - /** - Find a json in the complex data structures by using array of Int and/or String as path. - - - parameter path: The target json's path. Example: - - let name = json[9,"list","person","name"] - - The same as: let name = json[9]["list"]["person"]["name"] - - - returns: Return a json found by the path or a null json with error - */ - public subscript(path: JSONSubscriptType...) -> JSON { - get { - return self[path] - } - set { - self[path] = newValue - } - } -} - -// MARK: - LiteralConvertible - -extension JSON: Swift.ExpressibleByStringLiteral { - - public init(stringLiteral value: StringLiteralType) { - self.init(value as Any) - } - - public init(extendedGraphemeClusterLiteral value: StringLiteralType) { - self.init(value as Any) - } - - public init(unicodeScalarLiteral value: StringLiteralType) { - self.init(value as Any) - } -} - -extension JSON: Swift.ExpressibleByIntegerLiteral { - - public init(integerLiteral value: IntegerLiteralType) { - self.init(value as Any) - } -} - -extension JSON: Swift.ExpressibleByBooleanLiteral { - - public init(booleanLiteral value: BooleanLiteralType) { - self.init(value as Any) - } -} - -extension JSON: Swift.ExpressibleByFloatLiteral { - - public init(floatLiteral value: FloatLiteralType) { - self.init(value as Any) - } -} - -extension JSON: Swift.ExpressibleByDictionaryLiteral { - public init(dictionaryLiteral elements: (String, Any)...) { - let array = elements - self.init(dictionaryLiteral: array) - } - - public init(dictionaryLiteral elements: [(String, Any)]) { - let jsonFromDictionaryLiteral: ([String : Any]) -> JSON = { dictionary in - let initializeElement = Array(dictionary.keys).compactMap { key -> (String, Any)? in - if let value = dictionary[key] { - return (key, value) - } - return nil - } - return JSON(dictionaryLiteral: initializeElement) - } - - var dict = [String : Any](minimumCapacity: elements.count) - - for element in elements { - let elementToSet: Any - if let json = element.1 as? JSON { - elementToSet = json.object - } else if let jsonArray = element.1 as? [JSON] { - elementToSet = JSON(jsonArray).object - } else if let dictionary = element.1 as? [String : Any] { - elementToSet = jsonFromDictionaryLiteral(dictionary).object - } else if let dictArray = element.1 as? [[String : Any]] { - let jsonArray = dictArray.map { jsonFromDictionaryLiteral($0) } - elementToSet = JSON(jsonArray).object - } else { - elementToSet = element.1 - } - dict[element.0] = elementToSet - } - - self.init(dict) - } -} - -extension JSON: Swift.ExpressibleByArrayLiteral { - - public init(arrayLiteral elements: Any...) { - self.init(elements as Any) - } -} - -extension JSON: Swift.ExpressibleByNilLiteral { - - @available(*, deprecated, message: "use JSON.null instead. Will be removed in future versions") - public init(nilLiteral: ()) { - self.init(NSNull() as Any) - } -} - -// MARK: - Raw - -extension JSON: Swift.RawRepresentable { - - public init?(rawValue: Any) { - if JSON(rawValue).type == .unknown { - return nil - } else { - self.init(rawValue) - } - } - - public var rawValue: Any { - return self.object - } - - public func rawData(options opt: JSONSerialization.WritingOptions = JSONSerialization.WritingOptions(rawValue: 0)) throws -> Data { - guard JSONSerialization.isValidJSONObject(self.object) else { - throw NSError(domain: ErrorDomain, code: ErrorInvalidJSON, userInfo: [NSLocalizedDescriptionKey: "JSON is invalid"]) - } - - return try JSONSerialization.data(withJSONObject: self.object, options: opt) - } - - public func rawString(_ encoding: String.Encoding = .utf8, options opt: JSONSerialization.WritingOptions = .prettyPrinted) -> String? { - do { - return try _rawString(encoding, options: [.jsonSerialization: opt]) - } catch { - print("Could not serialize object to JSON because:", error.localizedDescription) - return nil - } - } - - public func rawString(_ options: [writingOptionsKeys: Any]) -> String? { - let encoding = options[.encoding] as? String.Encoding ?? String.Encoding.utf8 - let maxObjectDepth = options[.maxObjextDepth] as? Int ?? 10 - do { - return try _rawString(encoding, options: options, maxObjectDepth: maxObjectDepth) - } catch { - print("Could not serialize object to JSON because:", error.localizedDescription) - return nil - } - } - - fileprivate func _rawString( - _ encoding: String.Encoding = .utf8, - options: [writingOptionsKeys: Any], - maxObjectDepth: Int = 10 - ) throws -> String? { - if (maxObjectDepth < 0) { - throw NSError(domain: ErrorDomain, code: ErrorInvalidJSON, userInfo: [NSLocalizedDescriptionKey: "Element too deep. Increase maxObjectDepth and make sure there is no reference loop"]) - } - switch self.type { - case .dictionary: - do { - if !(options[.castNilToNSNull] as? Bool ?? false) { - let jsonOption = options[.jsonSerialization] as? JSONSerialization.WritingOptions ?? JSONSerialization.WritingOptions.prettyPrinted - let data = try self.rawData(options: jsonOption) - return String(data: data, encoding: encoding) - } - - guard let dict = self.object as? [String: Any?] else { - return nil - } - let body = try dict.keys.map { key throws -> String in - guard let value = dict[key] else { - return "\"\(key)\": null" - } - guard let unwrappedValue = value else { - return "\"\(key)\": null" - } - - let nestedValue = JSON(unwrappedValue) - guard let nestedString = try nestedValue._rawString(encoding, options: options, maxObjectDepth: maxObjectDepth - 1) else { - throw NSError(domain: ErrorDomain, code: ErrorInvalidJSON, userInfo: [NSLocalizedDescriptionKey: "Could not serialize nested JSON"]) - } - if nestedValue.type == .string { - return "\"\(key)\": \"\(nestedString.replacingOccurrences(of: "\\", with: "\\\\").replacingOccurrences(of: "\"", with: "\\\""))\"" - } else { - return "\"\(key)\": \(nestedString)" - } - } - - return "{\(body.joined(separator: ","))}" - } catch _ { - return nil - } - case .array: - do { - if !(options[.castNilToNSNull] as? Bool ?? false) { - let jsonOption = options[.jsonSerialization] as? JSONSerialization.WritingOptions ?? JSONSerialization.WritingOptions.prettyPrinted - let data = try self.rawData(options: jsonOption) - return String(data: data, encoding: encoding) - } - - guard let array = self.object as? [Any?] else { - return nil - } - let body = try array.map { value throws -> String in - guard let unwrappedValue = value else { - return "null" - } - - let nestedValue = JSON(unwrappedValue) - guard let nestedString = try nestedValue._rawString(encoding, options: options, maxObjectDepth: maxObjectDepth - 1) else { - throw NSError(domain: ErrorDomain, code: ErrorInvalidJSON, userInfo: [NSLocalizedDescriptionKey: "Could not serialize nested JSON"]) - } - if nestedValue.type == .string { - return "\"\(nestedString.replacingOccurrences(of: "\\", with: "\\\\").replacingOccurrences(of: "\"", with: "\\\""))\"" - } else { - return nestedString - } - } - - return "[\(body.joined(separator: ","))]" - } catch _ { - return nil - } - case .string: - return self.rawString - case .number: - return self.rawNumber.stringValue - case .bool: - return self.rawBool.description - case .null: - return "null" - default: - return nil - } - } -} - -// MARK: - Printable, DebugPrintable - -extension JSON: Swift.CustomStringConvertible, Swift.CustomDebugStringConvertible { - - public var description: String { - if let string = self.rawString(options:.prettyPrinted) { - return string - } else { - return "unknown" - } - } - - public var debugDescription: String { - return description - } -} - -// MARK: - Array - -extension JSON { - - //Optional [JSON] - public var array: [JSON]? { - get { - if self.type == .array { - return self.rawArray.map{ JSON($0) } - } else { - return nil - } - } - } - - //Non-optional [JSON] - public var arrayValue: [JSON] { - get { - return self.array ?? [] - } - } - - //Optional [Any] - public var arrayObject: [Any]? { - get { - switch self.type { - case .array: - return self.rawArray - default: - return nil - } - } - set { - if let array = newValue { - self.object = array as Any - } else { - self.object = NSNull() - } - } - } -} - -// MARK: - Dictionary - -extension JSON { - - //Optional [String : JSON] - public var dictionary: [String : JSON]? { - if self.type == .dictionary { - var d = [String : JSON](minimumCapacity: rawDictionary.count) - for (key, value) in rawDictionary { - d[key] = JSON(value) - } - return d - } else { - return nil - } - } - - //Non-optional [String : JSON] - public var dictionaryValue: [String : JSON] { - return self.dictionary ?? [:] - } - - //Optional [String : Any] - - public var dictionaryObject: [String : Any]? { - get { - switch self.type { - case .dictionary: - return self.rawDictionary - default: - return nil - } - } - set { - if let v = newValue { - self.object = v as Any - } else { - self.object = NSNull() - } - } - } -} - -// MARK: - Bool - -extension JSON { // : Swift.Bool - - //Optional bool - public var bool: Bool? { - get { - switch self.type { - case .bool: - return self.rawBool - default: - return nil - } - } - set { - if let newValue = newValue { - self.object = newValue as Bool - } else { - self.object = NSNull() - } - } - } - - //Non-optional bool - public var boolValue: Bool { - get { - switch self.type { - case .bool: - return self.rawBool - case .number: - return self.rawNumber.boolValue - case .string: - return ["true", "y", "t"].contains() { (truthyString) in - return self.rawString.caseInsensitiveCompare(truthyString) == .orderedSame - } - default: - return false - } - } - set { - self.object = newValue - } - } -} - -// MARK: - String - -extension JSON { - - //Optional string - public var string: String? { - get { - switch self.type { - case .string: - return self.object as? String - default: - return nil - } - } - set { - if let newValue = newValue { - self.object = NSString(string:newValue) - } else { - self.object = NSNull() - } - } - } - - //Non-optional string - public var stringValue: String { - get { - switch self.type { - case .string: - return self.object as? String ?? "" - case .number: - return self.rawNumber.stringValue - case .bool: - return (self.object as? Bool).map { String($0) } ?? "" - default: - return "" - } - } - set { - self.object = NSString(string:newValue) - } - } -} - -// MARK: - Number -extension JSON { - - //Optional number - public var number: NSNumber? { - get { - switch self.type { - case .number: - return self.rawNumber - case .bool: - return NSNumber(value: self.rawBool ? 1 : 0) - default: - return nil - } - } - set { - self.object = newValue ?? NSNull() - } - } - - //Non-optional number - public var numberValue: NSNumber { - get { - switch self.type { - case .string: - let decimal = NSDecimalNumber(string: self.object as? String) - if decimal == NSDecimalNumber.notANumber { // indicates parse error - return NSDecimalNumber.zero - } - return decimal - case .number: - return self.object as? NSNumber ?? NSNumber(value: 0) - case .bool: - return NSNumber(value: self.rawBool ? 1 : 0) - default: - return NSNumber(value: 0.0) - } - } - set { - self.object = newValue - } - } -} - -//MARK: - Null -extension JSON { - - public var null: NSNull? { - get { - switch self.type { - case .null: - return self.rawNull - default: - return nil - } - } - set { - self.object = NSNull() - } - } - public func exists() -> Bool{ - if let errorValue = error, errorValue.code == ErrorNotExist || - errorValue.code == ErrorIndexOutOfBounds || - errorValue.code == ErrorWrongType { - return false - } - return true - } -} - -//MARK: - URL -extension JSON { - - //Optional URL - public var url: URL? { - get { - switch self.type { - case .string: - // Check for existing percent escapes first to prevent double-escaping of % character - if let _ = self.rawString.range(of: "%[0-9A-Fa-f]{2}", options: .regularExpression, range: nil, locale: nil) { - return Foundation.URL(string: self.rawString) - } else if let encodedString_ = self.rawString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) { - // We have to use `Foundation.URL` otherwise it conflicts with the variable name. - return Foundation.URL(string: encodedString_) - } else { - return nil - } - default: - return nil - } - } - set { - self.object = newValue?.absoluteString ?? NSNull() - } - } -} - -// MARK: - Int, Double, Float, Int8, Int16, Int32, Int64 - -extension JSON { - - public var double: Double? { - get { - return self.number?.doubleValue - } - set { - if let newValue = newValue { - self.object = NSNumber(value: newValue) - } else { - self.object = NSNull() - } - } - } - - public var doubleValue: Double { - get { - return self.numberValue.doubleValue - } - set { - self.object = NSNumber(value: newValue) - } - } - - public var float: Float? { - get { - return self.number?.floatValue - } - set { - if let newValue = newValue { - self.object = NSNumber(value: newValue) - } else { - self.object = NSNull() - } - } - } - - public var floatValue: Float { - get { - return self.numberValue.floatValue - } - set { - self.object = NSNumber(value: newValue) - } - } - - public var int: Int? - { - get - { - return self.number?.intValue - } - set - { - if let newValue = newValue - { - self.object = NSNumber(value: newValue) - } else - { - self.object = NSNull() - } - } - } - - public var intValue: Int { - get { - return self.numberValue.intValue - } - set { - self.object = NSNumber(value: newValue) - } - } - - public var uInt: UInt? { - get { - return self.number?.uintValue - } - set { - if let newValue = newValue { - self.object = NSNumber(value: newValue) - } else { - self.object = NSNull() - } - } - } - - public var uIntValue: UInt { - get { - return self.numberValue.uintValue - } - set { - self.object = NSNumber(value: newValue) - } - } - - public var int8: Int8? { - get { - return self.number?.int8Value - } - set { - if let newValue = newValue { - self.object = NSNumber(value: Int(newValue)) - } else { - self.object = NSNull() - } - } - } - - public var int8Value: Int8 { - get { - return self.numberValue.int8Value - } - set { - self.object = NSNumber(value: Int(newValue)) - } - } - - public var uInt8: UInt8? { - get { - return self.number?.uint8Value - } - set { - if let newValue = newValue { - self.object = NSNumber(value: newValue) - } else { - self.object = NSNull() - } - } - } - - public var uInt8Value: UInt8 { - get { - return self.numberValue.uint8Value - } - set { - self.object = NSNumber(value: newValue) - } - } - - public var int16: Int16? { - get { - return self.number?.int16Value - } - set { - if let newValue = newValue { - self.object = NSNumber(value: newValue) - } else { - self.object = NSNull() - } - } - } - - public var int16Value: Int16 { - get { - return self.numberValue.int16Value - } - set { - self.object = NSNumber(value: newValue) - } - } - - public var uInt16: UInt16? { - get { - return self.number?.uint16Value - } - set { - if let newValue = newValue { - self.object = NSNumber(value: newValue) - } else { - self.object = NSNull() - } - } - } - - public var uInt16Value: UInt16 { - get { - return self.numberValue.uint16Value - } - set { - self.object = NSNumber(value: newValue) - } - } - - public var int32: Int32? { - get { - return self.number?.int32Value - } - set { - if let newValue = newValue { - self.object = NSNumber(value: newValue) - } else { - self.object = NSNull() - } - } - } - - public var int32Value: Int32 { - get { - return self.numberValue.int32Value - } - set { - self.object = NSNumber(value: newValue) - } - } - - public var uInt32: UInt32? { - get { - return self.number?.uint32Value - } - set { - if let newValue = newValue { - self.object = NSNumber(value: newValue) - } else { - self.object = NSNull() - } - } - } - - public var uInt32Value: UInt32 { - get { - return self.numberValue.uint32Value - } - set { - self.object = NSNumber(value: newValue) - } - } - - public var int64: Int64? { - get { - return self.number?.int64Value - } - set { - if let newValue = newValue { - self.object = NSNumber(value: newValue) - } else { - self.object = NSNull() - } - } - } - - public var int64Value: Int64 { - get { - return self.numberValue.int64Value - } - set { - self.object = NSNumber(value: newValue) - } - } - - public var uInt64: UInt64? { - get { - return self.number?.uint64Value - } - set { - if let newValue = newValue { - self.object = NSNumber(value: newValue) - } else { - self.object = NSNull() - } - } - } - - public var uInt64Value: UInt64 { - get { - return self.numberValue.uint64Value - } - set { - self.object = NSNumber(value: newValue) - } - } -} - -//MARK: - Comparable -extension JSON : Swift.Comparable {} - -public func ==(lhs: JSON, rhs: JSON) -> Bool { - - switch (lhs.type, rhs.type) { - case (.number, .number): - return lhs.rawNumber == rhs.rawNumber - case (.string, .string): - return lhs.rawString == rhs.rawString - case (.bool, .bool): - return lhs.rawBool == rhs.rawBool - case (.array, .array): - return lhs.rawArray as NSArray == rhs.rawArray as NSArray - case (.dictionary, .dictionary): - return lhs.rawDictionary as NSDictionary == rhs.rawDictionary as NSDictionary - case (.null, .null): - return true - default: - return false - } -} - -public func <=(lhs: JSON, rhs: JSON) -> Bool { - - switch (lhs.type, rhs.type) { - case (.number, .number): - return lhs.rawNumber <= rhs.rawNumber - case (.string, .string): - return lhs.rawString <= rhs.rawString - case (.bool, .bool): - return lhs.rawBool == rhs.rawBool - case (.array, .array): - return lhs.rawArray as NSArray == rhs.rawArray as NSArray - case (.dictionary, .dictionary): - return lhs.rawDictionary as NSDictionary == rhs.rawDictionary as NSDictionary - case (.null, .null): - return true - default: - return false - } -} - -public func >=(lhs: JSON, rhs: JSON) -> Bool { - - switch (lhs.type, rhs.type) { - case (.number, .number): - return lhs.rawNumber >= rhs.rawNumber - case (.string, .string): - return lhs.rawString >= rhs.rawString - case (.bool, .bool): - return lhs.rawBool == rhs.rawBool - case (.array, .array): - return lhs.rawArray as NSArray == rhs.rawArray as NSArray - case (.dictionary, .dictionary): - return lhs.rawDictionary as NSDictionary == rhs.rawDictionary as NSDictionary - case (.null, .null): - return true - default: - return false - } -} - -public func >(lhs: JSON, rhs: JSON) -> Bool { - - switch (lhs.type, rhs.type) { - case (.number, .number): - return lhs.rawNumber > rhs.rawNumber - case (.string, .string): - return lhs.rawString > rhs.rawString - default: - return false - } -} - -public func <(lhs: JSON, rhs: JSON) -> Bool { - - switch (lhs.type, rhs.type) { - case (.number, .number): - return lhs.rawNumber < rhs.rawNumber - case (.string, .string): - return lhs.rawString < rhs.rawString - default: - return false - } -} - -private let trueNumber = NSNumber(value: true) -private let falseNumber = NSNumber(value: false) -private let trueObjCType = String(cString: trueNumber.objCType) -private let falseObjCType = String(cString: falseNumber.objCType) - -// MARK: - NSNumber: Comparable - -extension NSNumber { - var isBool:Bool { - get { - let objCType = String(cString: self.objCType) - if (self.compare(trueNumber) == .orderedSame && objCType == trueObjCType) || (self.compare(falseNumber) == .orderedSame && objCType == falseObjCType){ - return true - } else { - return false - } - } - } -} - -func ==(lhs: NSNumber, rhs: NSNumber) -> Bool { - switch (lhs.isBool, rhs.isBool) { - case (false, true): - return false - case (true, false): - return false - default: - return lhs.compare(rhs) == .orderedSame - } -} - -func !=(lhs: NSNumber, rhs: NSNumber) -> Bool { - return !(lhs == rhs) -} - -func <(lhs: NSNumber, rhs: NSNumber) -> Bool { - - switch (lhs.isBool, rhs.isBool) { - case (false, true): - return false - case (true, false): - return false - default: - return lhs.compare(rhs) == .orderedAscending - } -} - -func >(lhs: NSNumber, rhs: NSNumber) -> Bool { - - switch (lhs.isBool, rhs.isBool) { - case (false, true): - return false - case (true, false): - return false - default: - return lhs.compare(rhs) == ComparisonResult.orderedDescending - } -} - -func <=(lhs: NSNumber, rhs: NSNumber) -> Bool { - - switch (lhs.isBool, rhs.isBool) { - case (false, true): - return false - case (true, false): - return false - default: - return lhs.compare(rhs) != .orderedDescending - } -} - -func >=(lhs: NSNumber, rhs: NSNumber) -> Bool { - - switch (lhs.isBool, rhs.isBool) { - case (false, true): - return false - case (true, false): - return false - default: - return lhs.compare(rhs) != .orderedAscending - } -} - -public enum writingOptionsKeys { - case jsonSerialization - case castNilToNSNull - case maxObjextDepth - case encoding -} From 5ccc5a067232c4d4aa72861ea8b46e30dd3d77f3 Mon Sep 17 00:00:00 2001 From: Eoin Landy Date: Fri, 20 Dec 2019 18:12:17 +0000 Subject: [PATCH 02/12] 2.6.0 --- CHANGELOG.md | 2 + README.md | 4 +- example/.actionScriptProperties | 24 ++++---- example/.gitignore | 2 + ...ndroidx_legacy_legacy_support_v4_1_0_0.xml | 9 +++ .../com_android_support_support_v4_27_1_0.xml | 9 --- ...android_gms_play_services_base_17_0_0.xml} | 4 +- ...oid_gms_play_services_location_17_0_0.xml} | 4 +- ...android_gms_play_services_maps_17_0_0.xml} | 4 +- ...ml => com_google_code_gson_gson_2_8_6.xml} | 4 +- example/GoogleMapsANESample-mobile.iml | 17 +++--- example/get_android_dependencies.ps1 | 12 ++-- example/get_android_dependencies.sh | 12 ++-- example/src/Main-app-android.xml | 19 +----- .../android/GoogleMapsANE/app/app.iml | 58 ++++++++++++------- .../android/GoogleMapsANE/app/build.gradle | 2 +- .../tuarua/googlemapsane/KotlinController.kt | 2 +- .../com/tuarua/googlemapsane/MapController.kt | 2 +- .../googlemapsane/PermissionActivity.kt | 2 +- .../android/GoogleMapsANE/build.gradle | 8 +-- 20 files changed, 103 insertions(+), 97 deletions(-) create mode 100644 example/.idea/libraries/androidx_legacy_legacy_support_v4_1_0_0.xml delete mode 100644 example/.idea/libraries/com_android_support_support_v4_27_1_0.xml rename example/.idea/libraries/{com_google_android_gms_play_services_maps_16_1_0.xml => com_google_android_gms_play_services_base_17_0_0.xml} (62%) rename example/.idea/libraries/{com_google_android_gms_play_services_location_16_0_0.xml => com_google_android_gms_play_services_location_17_0_0.xml} (76%) rename example/.idea/libraries/{com_google_android_gms_play_services_base_16_0_1.xml => com_google_android_gms_play_services_maps_17_0_0.xml} (57%) rename example/.idea/libraries/{com_google_code_gson_gson_2_8_4.xml => com_google_code_gson_gson_2_8_6.xml} (64%) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee382e6..591b5f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ ### 2.6.0 - AND: Updated to FreKotlin 1.9.1 - iOS: Updated to FreSwift 4.1.0 +- AND: Updated to Android Play Services to 17.0.0 +- AND: Updated to Jetpack ### 2.5.0 - AND: Updated to FreKotlin 1.8.0 diff --git a/README.md b/README.md index 6b371b5..d14a6fb 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ The dependencies can be downloaded directly from this repo: com.google.android.gms.play-services-base com.google.android.gms.play-services-location com.google.android.gms.play-services-maps - com.android.support.support-v4 + androidx.legacy.legacy-support-v4 com.google.code.gson.gson ... @@ -125,7 +125,7 @@ You will need: - IntelliJ IDEA / Flash Builder - AIR 33 or greater -- Xcode 10.1 +- Xcode 11.2 - Android Studio 3 if you wish to edit the Android source - wget on macOS - Powershell on Windows diff --git a/example/.actionScriptProperties b/example/.actionScriptProperties index 9face18..1644a2e 100644 --- a/example/.actionScriptProperties +++ b/example/.actionScriptProperties @@ -40,12 +40,12 @@ - - - - - - + + + + + + @@ -65,12 +65,12 @@ - - - - - - + + + + + + diff --git a/example/.gitignore b/example/.gitignore index a22e9c4..1710480 100644 --- a/example/.gitignore +++ b/example/.gitignore @@ -8,6 +8,8 @@ bin-release/ bin-release-temp/ cache/ +.key + *.app # Other files and folders diff --git a/example/.idea/libraries/androidx_legacy_legacy_support_v4_1_0_0.xml b/example/.idea/libraries/androidx_legacy_legacy_support_v4_1_0_0.xml new file mode 100644 index 0000000..a767cb5 --- /dev/null +++ b/example/.idea/libraries/androidx_legacy_legacy_support_v4_1_0_0.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/example/.idea/libraries/com_android_support_support_v4_27_1_0.xml b/example/.idea/libraries/com_android_support_support_v4_27_1_0.xml deleted file mode 100644 index ceac3db..0000000 --- a/example/.idea/libraries/com_android_support_support_v4_27_1_0.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/example/.idea/libraries/com_google_android_gms_play_services_maps_16_1_0.xml b/example/.idea/libraries/com_google_android_gms_play_services_base_17_0_0.xml similarity index 62% rename from example/.idea/libraries/com_google_android_gms_play_services_maps_16_1_0.xml rename to example/.idea/libraries/com_google_android_gms_play_services_base_17_0_0.xml index 9dc4b69..93f4b47 100644 --- a/example/.idea/libraries/com_google_android_gms_play_services_maps_16_1_0.xml +++ b/example/.idea/libraries/com_google_android_gms_play_services_base_17_0_0.xml @@ -1,7 +1,7 @@ - + - + diff --git a/example/.idea/libraries/com_google_android_gms_play_services_location_16_0_0.xml b/example/.idea/libraries/com_google_android_gms_play_services_location_17_0_0.xml similarity index 76% rename from example/.idea/libraries/com_google_android_gms_play_services_location_16_0_0.xml rename to example/.idea/libraries/com_google_android_gms_play_services_location_17_0_0.xml index 911d26e..6654e8f 100644 --- a/example/.idea/libraries/com_google_android_gms_play_services_location_16_0_0.xml +++ b/example/.idea/libraries/com_google_android_gms_play_services_location_17_0_0.xml @@ -1,7 +1,7 @@ - + - + diff --git a/example/.idea/libraries/com_google_android_gms_play_services_base_16_0_1.xml b/example/.idea/libraries/com_google_android_gms_play_services_maps_17_0_0.xml similarity index 57% rename from example/.idea/libraries/com_google_android_gms_play_services_base_16_0_1.xml rename to example/.idea/libraries/com_google_android_gms_play_services_maps_17_0_0.xml index ad7dade..81bfb21 100644 --- a/example/.idea/libraries/com_google_android_gms_play_services_base_16_0_1.xml +++ b/example/.idea/libraries/com_google_android_gms_play_services_maps_17_0_0.xml @@ -1,7 +1,7 @@ - + - + diff --git a/example/.idea/libraries/com_google_code_gson_gson_2_8_4.xml b/example/.idea/libraries/com_google_code_gson_gson_2_8_6.xml similarity index 64% rename from example/.idea/libraries/com_google_code_gson_gson_2_8_4.xml rename to example/.idea/libraries/com_google_code_gson_gson_2_8_6.xml index 8694ba3..a64833f 100644 --- a/example/.idea/libraries/com_google_code_gson_gson_2_8_4.xml +++ b/example/.idea/libraries/com_google_code_gson_gson_2_8_6.xml @@ -1,7 +1,7 @@ - + - + diff --git a/example/GoogleMapsANESample-mobile.iml b/example/GoogleMapsANESample-mobile.iml index 4601e7d..c9b9227 100644 --- a/example/GoogleMapsANESample-mobile.iml +++ b/example/GoogleMapsANESample-mobile.iml @@ -37,7 +37,7 @@ - + @@ -55,22 +55,22 @@ - + - + - + - + - + - + @@ -133,7 +133,7 @@ - + @@ -178,5 +178,6 @@ + \ No newline at end of file diff --git a/example/get_android_dependencies.ps1 b/example/get_android_dependencies.ps1 index 659db8e..96d2cc2 100644 --- a/example/get_android_dependencies.ps1 +++ b/example/get_android_dependencies.ps1 @@ -1,10 +1,10 @@ $AneVersion = "2.6.0" $FreKotlinVersion = "1.9.1" -$PlayerServicesVersion = "16.0.1" -$MapsVersion = "16.1.0" -$LocationVersion = "16.0.0" -$SupportV4Version = "27.1.0" -$GsonVersion = "2.8.4" +$PlayerServicesVersion = "17.0.0" +$MapsVersion = "17.0.0" +$LocationVersion = "17.0.0" +$SupportV4Version = "1.0.0" +$GsonVersion = "2.8.6" $EventBusVersion = "3.0.0" $currentDir = (Get-Item -Path ".\" -Verbose).FullName @@ -13,7 +13,7 @@ Invoke-WebRequest -Uri https://github.com/tuarua/Google-Maps-ANE/releases/downlo Invoke-WebRequest -OutFile "$currentDir\android_dependencies\com.tuarua.frekotlin-$FreKotlinVersion.ane" -Uri https://github.com/tuarua/Android-ANE-Dependencies/blob/master/anes/kotlin/com.tuarua.frekotlin-$FreKotlinVersion.ane?raw=true Invoke-WebRequest -OutFile "$currentDir\android_dependencies\org.greenrobot.eventbus-$EventBusVersion.ane" -Uri https://github.com/tuarua/Android-ANE-Dependencies/blob/master/anes/misc/org.greenrobot.eventbus-$EventBusVersion.ane?raw=true Invoke-WebRequest -OutFile "$currentDir\android_dependencies\com.google.code.gson.gson-$GsonVersion.ane" -Uri https://github.com/tuarua/Android-ANE-Dependencies/blob/master/anes/misc/com.google.code.gson.gson-$GsonVersion.ane?raw=true -Invoke-WebRequest -OutFile "$currentDir\android_dependencies\com.android.support.support-v4-$SupportV4Version.ane" -Uri https://github.com/tuarua/Android-ANE-Dependencies/blob/master/anes/support/com.android.support.support-v4-$SupportV4Version.ane?raw=true +Invoke-WebRequest -OutFile "$currentDir\android_dependencies\androidx.legacy.legacy-support-v4-$SupportV4Version.ane" -Uri https://github.com/tuarua/Android-ANE-Dependencies/blob/master/anes/support/androidx.legacy.legacy-support-v4-$SupportV4Version.ane?raw=true Invoke-WebRequest -OutFile "$currentDir\android_dependencies\com.google.android.gms.play-services-base-$PlayerServicesVersion.ane" -Uri https://github.com/tuarua/Android-ANE-Dependencies/blob/master/anes/play-services/com.google.android.gms.play-services-base-$PlayerServicesVersion.ane?raw=true Invoke-WebRequest -OutFile "$currentDir\android_dependencies\com.google.android.gms.play-services-location-$LocationVersion.ane" -Uri https://github.com/tuarua/Android-ANE-Dependencies/blob/master/anes/play-services/com.google.android.gms.play-services-location-$LocationVersion.ane?raw=true Invoke-WebRequest -OutFile "$currentDir\android_dependencies\com.google.android.gms.play-services-maps-$MapsVersion.ane" -Uri https://github.com/tuarua/Android-ANE-Dependencies/blob/master/anes/play-services/com.google.android.gms.play-services-maps-$MapsVersion.ane?raw=true diff --git a/example/get_android_dependencies.sh b/example/get_android_dependencies.sh index 99dc7de..a960949 100755 --- a/example/get_android_dependencies.sh +++ b/example/get_android_dependencies.sh @@ -2,17 +2,17 @@ AneVersion="2.6.0" FreKotlinVersion="1.9.1" -PlayerServicesVersion="16.0.1" -MapsVersion="16.1.0" -LocationVersion="16.0.0" -SupportV4Version="27.1.0" -GsonVersion="2.8.4" +PlayerServicesVersion="17.0.0" +MapsVersion="17.0.0" +LocationVersion="17.0.0" +SupportV4Version="1.0.0" +GsonVersion="2.8.6" EventBusVersion="3.0.0" wget -O android_dependencies/com.tuarua.frekotlin-$FreKotlinVersion.ane https://github.com/tuarua/Android-ANE-Dependencies/blob/master/anes/kotlin/com.tuarua.frekotlin-$FreKotlinVersion.ane?raw=true wget -O android_dependencies/org.greenrobot.eventbus-$EventBusVersion.ane https://github.com/tuarua/Android-ANE-Dependencies/blob/master/anes/misc/org.greenrobot.eventbus-$EventBusVersion.ane?raw=true wget -O android_dependencies/com.google.code.gson.gson-$GsonVersion.ane https://github.com/tuarua/Android-ANE-Dependencies/blob/master/anes/misc/com.google.code.gson.gson-$GsonVersion.ane?raw=true -wget -O android_dependencies/com.android.support.support-v4-$SupportV4Version.ane https://github.com/tuarua/Android-ANE-Dependencies/blob/master/anes/support/com.android.support.support-v4-$SupportV4Version.ane?raw=true +wget -O android_dependencies/androidx.legacy.legacy-support-v4-$SupportV4Version.ane https://github.com/tuarua/Android-ANE-Dependencies/blob/master/anes/support/androidx.legacy.legacy-support-v4-$SupportV4Version.ane?raw=true wget -O android_dependencies/com.google.android.gms.play-services-base-$PlayerServicesVersion.ane https://github.com/tuarua/Android-ANE-Dependencies/blob/master/anes/play-services/com.google.android.gms.play-services-base-$PlayerServicesVersion.ane?raw=true wget -O android_dependencies/com.google.android.gms.play-services-location-$LocationVersion.ane https://github.com/tuarua/Android-ANE-Dependencies/blob/master/anes/play-services/com.google.android.gms.play-services-location-$LocationVersion.ane?raw=true wget -O android_dependencies/com.google.android.gms.play-services-maps-$MapsVersion.ane https://github.com/tuarua/Android-ANE-Dependencies/blob/master/anes/play-services/com.google.android.gms.play-services-maps-$MapsVersion.ane?raw=true diff --git a/example/src/Main-app-android.xml b/example/src/Main-app-android.xml index af62e30..c97583c 100644 --- a/example/src/Main-app-android.xml +++ b/example/src/Main-app-android.xml @@ -53,7 +53,7 @@ - + @@ -66,21 +66,6 @@ ]]> - - - - - - - - - - - - - - - @@ -89,7 +74,7 @@ com.google.android.gms.play-services-base com.google.android.gms.play-services-location com.google.android.gms.play-services-maps - com.android.support.support-v4 + androidx.legacy.legacy-support-v4 com.google.code.gson.gson com.tuarua.GoogleMapsANE diff --git a/native_library/android/GoogleMapsANE/app/app.iml b/native_library/android/GoogleMapsANE/app/app.iml index 145fc69..0f5cd7c 100644 --- a/native_library/android/GoogleMapsANE/app/app.iml +++ b/native_library/android/GoogleMapsANE/app/app.iml @@ -32,7 +32,7 @@ \ No newline at end of file diff --git a/native_library/android/GoogleMapsANE/app/build.gradle b/native_library/android/GoogleMapsANE/app/build.gradle index 750d758..3826c61 100644 --- a/native_library/android/GoogleMapsANE/app/build.gradle +++ b/native_library/android/GoogleMapsANE/app/build.gradle @@ -32,7 +32,7 @@ dependencies { implementation "com.google.android.gms:play-services-location:$play_location_version" implementation "com.google.android.gms:play-services-maps:$play_maps_version" implementation "com.google.code.gson:gson:$gson_version" - implementation "com.android.support:support-v4:$support_4_version" + implementation "androidx.legacy:legacy-support-v4:$legacy_support_4_version" implementation "com.tuarua:FreKotlin:$frekotlin_version" } repositories { diff --git a/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/googlemapsane/KotlinController.kt b/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/googlemapsane/KotlinController.kt index ac6fb90..82d95de 100644 --- a/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/googlemapsane/KotlinController.kt +++ b/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/googlemapsane/KotlinController.kt @@ -28,8 +28,8 @@ import android.content.res.Configuration import android.graphics.RectF import android.location.Address import android.location.Geocoder -import android.support.v4.content.ContextCompat import android.view.ViewGroup +import androidx.core.content.ContextCompat import com.adobe.air.AndroidActivityWrapper import com.adobe.air.FreKotlinActivityResultCallback import com.adobe.air.FreKotlinStateChangeCallback diff --git a/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/googlemapsane/MapController.kt b/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/googlemapsane/MapController.kt index 62c2f2d..888f7a1 100644 --- a/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/googlemapsane/MapController.kt +++ b/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/googlemapsane/MapController.kt @@ -24,8 +24,8 @@ import android.location.Location import android.view.View import android.view.ViewGroup import android.widget.FrameLayout +import androidx.core.content.ContextCompat.checkSelfPermission import com.adobe.fre.FREContext -import android.support.v4.content.ContextCompat.checkSelfPermission import com.adobe.fre.FREObject import com.google.android.gms.maps.model.* import com.google.android.gms.location.FusedLocationProviderClient diff --git a/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/googlemapsane/PermissionActivity.kt b/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/googlemapsane/PermissionActivity.kt index 9fb660a..2c5c0b7 100644 --- a/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/googlemapsane/PermissionActivity.kt +++ b/native_library/android/GoogleMapsANE/app/src/main/java/com/tuarua/googlemapsane/PermissionActivity.kt @@ -19,7 +19,7 @@ package com.tuarua.googlemapsane import android.app.Activity import android.content.pm.PackageManager import android.os.Bundle -import android.support.v4.app.ActivityCompat +import androidx.core.app.ActivityCompat import com.tuarua.googlemapsane.events.PermissionEvent import org.greenrobot.eventbus.EventBus diff --git a/native_library/android/GoogleMapsANE/build.gradle b/native_library/android/GoogleMapsANE/build.gradle index ff7d06f..81b7a18 100644 --- a/native_library/android/GoogleMapsANE/build.gradle +++ b/native_library/android/GoogleMapsANE/build.gradle @@ -3,10 +3,10 @@ buildscript { ext.kotlin_version = '1.3.50' ext.frekotlin_version = '1.9.1' - ext.gson_version = '2.8.4' - ext.play_maps_version = '16.1.0' - ext.play_location_version = '16.0.0' - ext.support_4_version = '27.1.0' + ext.gson_version = '2.8.6' + ext.play_maps_version = '17.0.0' + ext.play_location_version = '17.0.0' + ext.legacy_support_4_version = '1.0.0' repositories { google() From 0c95d3554425ad06ecd513fa76e2cd1784d50643 Mon Sep 17 00:00:00 2001 From: Eoin Landy Date: Sat, 21 Dec 2019 20:29:36 +0000 Subject: [PATCH 03/12] 2.6.0 --- CHANGELOG.md | 3 +- example/get_ios_dependencies.sh | 2 +- native_extension/ane/extension.xml | 2 +- .../ane/platforms/ios/platform.xml | 2 +- native_library/ios/GoogleMapsANE/Cartfile | 2 +- .../GoogleMapsANE.xcodeproj/project.pbxproj | 64 ++++++++++--------- .../GoogleMapsANE/GoogleMapsANE_FW/Info.plist | 2 +- 7 files changed, 40 insertions(+), 37 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 591b5f3..aecc669 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,9 @@ ### 2.6.0 - AND: Updated to FreKotlin 1.9.1 -- iOS: Updated to FreSwift 4.1.0 - AND: Updated to Android Play Services to 17.0.0 - AND: Updated to Jetpack +- iOS: Updated to Google Maps SDK 3.7.0 +- iOS: Updated to FreSwift 4.2.0 ### 2.5.0 - AND: Updated to FreKotlin 1.8.0 diff --git a/example/get_ios_dependencies.sh b/example/get_ios_dependencies.sh index 8aac601..057e97d 100755 --- a/example/get_ios_dependencies.sh +++ b/example/get_ios_dependencies.sh @@ -1,7 +1,7 @@ #!/bin/sh AneVersion="2.6.0" -FreSwiftVersion="4.1.0" +FreSwiftVersion="4.2.0" rm -r ios_dependencies/device rm -r ios_dependencies/simulator diff --git a/native_extension/ane/extension.xml b/native_extension/ane/extension.xml index 67b13e4..7d0c81a 100644 --- a/native_extension/ane/extension.xml +++ b/native_extension/ane/extension.xml @@ -3,7 +3,7 @@ com.tuarua.GoogleMapsANE Google Maps ANE This work is licensed under Apache License, Copyright (c) 2017 Tua Rua Ltd. - 2.5.0 + 2.6.0 diff --git a/native_extension/ane/platforms/ios/platform.xml b/native_extension/ane/platforms/ios/platform.xml index bc2bfec..26a3774 100644 --- a/native_extension/ane/platforms/ios/platform.xml +++ b/native_extension/ane/platforms/ios/platform.xml @@ -1,6 +1,6 @@ - 12.1 + 13.0 diff --git a/native_library/ios/GoogleMapsANE/Cartfile b/native_library/ios/GoogleMapsANE/Cartfile index b0ebe3a..9d624cb 100644 --- a/native_library/ios/GoogleMapsANE/Cartfile +++ b/native_library/ios/GoogleMapsANE/Cartfile @@ -1 +1 @@ -binary "https://github.com/tuarua/Swift-IOS-ANE/releases/download/4.1.0/FreSwift.json" ~> 4.1.0 \ No newline at end of file +binary "https://github.com/tuarua/Swift-IOS-ANE/releases/download/4.2.0/FreSwift.json" ~> 4.2.0 \ No newline at end of file diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE.xcodeproj/project.pbxproj b/native_library/ios/GoogleMapsANE/GoogleMapsANE.xcodeproj/project.pbxproj index be8c29b..7a26123 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE.xcodeproj/project.pbxproj +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE.xcodeproj/project.pbxproj @@ -7,34 +7,34 @@ objects = { /* Begin PBXBuildFile section */ - 285FE1341741FC686F0BEB75 /* FreCLLocationCoordinate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FE4E5D8DD21768875CCFD /* FreCLLocationCoordinate.swift */; }; + 285FE1341741FC686F0BEB75 /* FreCLLocationCoordinate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FE4E5D8DD21768875CCFD /* FreCLLocationCoordinate.swift */; platformFilter = ios; }; 285FE3EB871F2DD420623AEE /* GoogleMapsANE_LIB.h in Headers */ = {isa = PBXBuildFile; fileRef = 285FEBB3CADF8D704FAB5E4D /* GoogleMapsANE_LIB.h */; platformFilter = ios; }; - 285FE43BB13A003DF0009958 /* FreMKCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FE3EB6401C4553D5DC713 /* FreMKCircle.swift */; }; - 285FE645B808125071F7A08A /* CustomMKCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FE9BC1B43C00633CEE916 /* CustomMKCircle.swift */; }; - 285FE6FF36D515256EAE7B63 /* FreGMSCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FE41C9FE2CEB9DCF6CB30 /* FreGMSCircle.swift */; }; + 285FE43BB13A003DF0009958 /* FreMKCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FE3EB6401C4553D5DC713 /* FreMKCircle.swift */; platformFilter = ios; }; + 285FE645B808125071F7A08A /* CustomMKCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FE9BC1B43C00633CEE916 /* CustomMKCircle.swift */; platformFilter = ios; }; + 285FE6FF36D515256EAE7B63 /* FreGMSCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FE41C9FE2CEB9DCF6CB30 /* FreGMSCircle.swift */; platformFilter = ios; }; 285FECB67C2311471C2CD119 /* GoogleMapsANE_LIB.m in Sources */ = {isa = PBXBuildFile; fileRef = 285FE6D7F3D6356FA03A26C0 /* GoogleMapsANE_LIB.m */; platformFilter = ios; }; 9022967A2299736400495FDE /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 902296792299736300495FDE /* CoreImage.framework */; platformFilter = ios; }; 9022967C2299737B00495FDE /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9022967B2299737B00495FDE /* CoreTelephony.framework */; platformFilter = ios; }; 9022967E229973B300495FDE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9022967D229973B300495FDE /* UIKit.framework */; platformFilter = ios; }; - 902296802299903900495FDE /* FreGMSCoordinateBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9022967F2299903900495FDE /* FreGMSCoordinateBounds.swift */; }; - 907FA0382396DF8A00A02384 /* SwiftyJSON in Frameworks */ = {isa = PBXBuildFile; productRef = 907FA0372396DF8A00A02384 /* SwiftyJSON */; }; - 90942B0A229AB549006672D9 /* FreGMSVisibleRegion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90942B09229AB549006672D9 /* FreGMSVisibleRegion.swift */; }; - 90C3B5D721F4D83B002F59AB /* FreGMSPolygon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C3B5D621F4D83B002F59AB /* FreGMSPolygon.swift */; }; - 90C3B5D921F4E135002F59AB /* FreGMSMutablePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C3B5D821F4E135002F59AB /* FreGMSMutablePath.swift */; }; - 90C940C2229A0AAB007AD291 /* FreGMSCameraPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C940C1229A0AAB007AD291 /* FreGMSCameraPosition.swift */; }; - CE39808E1E58BAA90062485B /* GoogleMapsANE_FW.h in Headers */ = {isa = PBXBuildFile; fileRef = CE39808C1E58BAA90062485B /* GoogleMapsANE_FW.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CE3980981E58BB070062485B /* SwiftController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE3980971E58BB070062485B /* SwiftController.swift */; }; + 902296802299903900495FDE /* FreGMSCoordinateBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9022967F2299903900495FDE /* FreGMSCoordinateBounds.swift */; platformFilter = ios; }; + 907FA0382396DF8A00A02384 /* SwiftyJSON in Frameworks */ = {isa = PBXBuildFile; platformFilter = ios; productRef = 907FA0372396DF8A00A02384 /* SwiftyJSON */; }; + 90942B0A229AB549006672D9 /* FreGMSVisibleRegion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90942B09229AB549006672D9 /* FreGMSVisibleRegion.swift */; platformFilter = ios; }; + 90C3B5D721F4D83B002F59AB /* FreGMSPolygon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C3B5D621F4D83B002F59AB /* FreGMSPolygon.swift */; platformFilter = ios; }; + 90C3B5D921F4E135002F59AB /* FreGMSMutablePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C3B5D821F4E135002F59AB /* FreGMSMutablePath.swift */; platformFilter = ios; }; + 90C940C2229A0AAB007AD291 /* FreGMSCameraPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90C940C1229A0AAB007AD291 /* FreGMSCameraPosition.swift */; platformFilter = ios; }; + CE39808E1E58BAA90062485B /* GoogleMapsANE_FW.h in Headers */ = {isa = PBXBuildFile; fileRef = CE39808C1E58BAA90062485B /* GoogleMapsANE_FW.h */; platformFilter = ios; settings = {ATTRIBUTES = (Public, ); }; }; + CE3980981E58BB070062485B /* SwiftController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE3980971E58BB070062485B /* SwiftController.swift */; platformFilter = ios; }; CE3980AD1E58BF3F0062485B /* GoogleMapsANE_FW.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE39808A1E58BAA90062485B /* GoogleMapsANE_FW.framework */; platformFilter = ios; }; - CE5D4976202619540067B01C /* LocationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5D4975202619540067B01C /* LocationController.swift */; }; - CE5D4978202619CD0067B01C /* MapProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5D4977202619CD0067B01C /* MapProvider.swift */; }; - CE5E29881F6452CC00FDB81A /* MarkerOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5E29871F6452CC00FDB81A /* MarkerOptions.swift */; }; + CE5D4976202619540067B01C /* LocationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5D4975202619540067B01C /* LocationController.swift */; platformFilter = ios; }; + CE5D4978202619CD0067B01C /* MapProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5D4977202619CD0067B01C /* MapProvider.swift */; platformFilter = ios; }; + CE5E29881F6452CC00FDB81A /* MarkerOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5E29871F6452CC00FDB81A /* MarkerOptions.swift */; platformFilter = ios; }; CE60CCC41F63DA7F004B1BE7 /* FreSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE60CCC31F63DA7F004B1BE7 /* FreSwift.framework */; platformFilter = ios; }; CE60CCCB1F63E25C004B1BE7 /* FreSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE60CCC31F63DA7F004B1BE7 /* FreSwift.framework */; platformFilter = ios; }; CE60CCCC1F63E444004B1BE7 /* FreMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = CE60CCC11F63DA4D004B1BE7 /* FreMacros.h */; platformFilter = ios; }; - CE6589F31F6EE39100656914 /* MKMapController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6589F21F6EE39100656914 /* MKMapController.swift */; }; - CE6589F51F6F1A9900656914 /* MapViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6589F41F6F1A9900656914 /* MapViewExtension.swift */; }; + CE6589F31F6EE39100656914 /* MKMapController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6589F21F6EE39100656914 /* MKMapController.swift */; platformFilter = ios; }; + CE6589F51F6F1A9900656914 /* MapViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6589F41F6F1A9900656914 /* MapViewExtension.swift */; platformFilter = ios; }; CE6589F71F6F1B6200656914 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE6589F61F6F1B6200656914 /* MapKit.framework */; platformFilter = ios; }; - CE9397501F70772400A1428C /* CustomMKAnnotation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE93974F1F70772400A1428C /* CustomMKAnnotation.swift */; }; + CE9397501F70772400A1428C /* CustomMKAnnotation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE93974F1F70772400A1428C /* CustomMKAnnotation.swift */; platformFilter = ios; }; CEA0DE161F5DF7330012EB4E /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE151F5DF7330012EB4E /* Accelerate.framework */; platformFilter = ios; }; CEA0DE181F5DF7490012EB4E /* CoreBluetooth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE171F5DF7490012EB4E /* CoreBluetooth.framework */; platformFilter = ios; }; CEA0DE1A1F5DF7650012EB4E /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE191F5DF7650012EB4E /* libz.tbd */; platformFilter = ios; }; @@ -55,19 +55,19 @@ CEA0DE3C1F5DF8820012EB4E /* GoogleMaps.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE391F5DF8820012EB4E /* GoogleMaps.framework */; platformFilter = ios; }; CEA0DE3D1F5DF8820012EB4E /* GoogleMapsBase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE3A1F5DF8820012EB4E /* GoogleMapsBase.framework */; platformFilter = ios; }; CEA0DE3E1F5DF8820012EB4E /* GoogleMapsCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEA0DE3B1F5DF8820012EB4E /* GoogleMapsCore.framework */; platformFilter = ios; }; - CEA0DE401F5DF9DD0012EB4E /* GMSMapController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA0DE3F1F5DF9DD0012EB4E /* GMSMapController.swift */; }; - CEA0DE421F5DFA7A0012EB4E /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA0DE411F5DFA7A0012EB4E /* Settings.swift */; }; - CEA653332027602C0034C691 /* GMSMapController+GMSMapViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA653322027602C0034C691 /* GMSMapController+GMSMapViewDelegate.swift */; }; - CEA65335202761590034C691 /* MKMapController+MKMapViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA65334202761590034C691 /* MKMapController+MKMapViewDelegate.swift */; }; - CEA65337202763570034C691 /* SwiftController+FreSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA65336202763570034C691 /* SwiftController+FreSwift.swift */; }; - CEB5ED151F5C56F900AE8B16 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEB5ED141F5C56F900AE8B16 /* Constants.swift */; }; - CEC1A0FD1FF7187600ED797A /* FreGMSMarker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC1A0FC1FF7187600ED797A /* FreGMSMarker.swift */; }; - CEFB3BC11FF7C4460095DE62 /* FreGMSGroundOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFB3BC01FF7C4460095DE62 /* FreGMSGroundOverlay.swift */; }; - CEFB3BC31FF7CC3F0095DE62 /* FreGMSPolyline.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFB3BC21FF7CC3F0095DE62 /* FreGMSPolyline.swift */; }; - CEFB3BC71FF802360095DE62 /* CustomMKPolygon.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFB3BC61FF802360095DE62 /* CustomMKPolygon.swift */; }; - CEFB3BC91FF805D00095DE62 /* FreMKPolygon.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFB3BC81FF805D00095DE62 /* FreMKPolygon.swift */; }; - CEFB3BCB1FF82D240095DE62 /* CustomMKPolyline.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFB3BCA1FF82D240095DE62 /* CustomMKPolyline.swift */; }; - CEFB3BCD1FF82D8F0095DE62 /* FreMKPolyline.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFB3BCC1FF82D8F0095DE62 /* FreMKPolyline.swift */; }; + CEA0DE401F5DF9DD0012EB4E /* GMSMapController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA0DE3F1F5DF9DD0012EB4E /* GMSMapController.swift */; platformFilter = ios; }; + CEA0DE421F5DFA7A0012EB4E /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA0DE411F5DFA7A0012EB4E /* Settings.swift */; platformFilter = ios; }; + CEA653332027602C0034C691 /* GMSMapController+GMSMapViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA653322027602C0034C691 /* GMSMapController+GMSMapViewDelegate.swift */; platformFilter = ios; }; + CEA65335202761590034C691 /* MKMapController+MKMapViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA65334202761590034C691 /* MKMapController+MKMapViewDelegate.swift */; platformFilter = ios; }; + CEA65337202763570034C691 /* SwiftController+FreSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA65336202763570034C691 /* SwiftController+FreSwift.swift */; platformFilter = ios; }; + CEB5ED151F5C56F900AE8B16 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEB5ED141F5C56F900AE8B16 /* Constants.swift */; platformFilter = ios; }; + CEC1A0FD1FF7187600ED797A /* FreGMSMarker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC1A0FC1FF7187600ED797A /* FreGMSMarker.swift */; platformFilter = ios; }; + CEFB3BC11FF7C4460095DE62 /* FreGMSGroundOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFB3BC01FF7C4460095DE62 /* FreGMSGroundOverlay.swift */; platformFilter = ios; }; + CEFB3BC31FF7CC3F0095DE62 /* FreGMSPolyline.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFB3BC21FF7CC3F0095DE62 /* FreGMSPolyline.swift */; platformFilter = ios; }; + CEFB3BC71FF802360095DE62 /* CustomMKPolygon.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFB3BC61FF802360095DE62 /* CustomMKPolygon.swift */; platformFilter = ios; }; + CEFB3BC91FF805D00095DE62 /* FreMKPolygon.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFB3BC81FF805D00095DE62 /* FreMKPolygon.swift */; platformFilter = ios; }; + CEFB3BCB1FF82D240095DE62 /* CustomMKPolyline.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFB3BCA1FF82D240095DE62 /* CustomMKPolyline.swift */; platformFilter = ios; }; + CEFB3BCD1FF82D8F0095DE62 /* FreMKPolyline.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEFB3BCC1FF82D8F0095DE62 /* FreMKPolyline.swift */; platformFilter = ios; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -666,6 +666,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MARKETING_VERSION = 2.6.0; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = com.tuarua.GoogleMapsANE; @@ -710,6 +711,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MARKETING_VERSION = 2.6.0; ONLY_ACTIVE_ARCH = NO; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = com.tuarua.GoogleMapsANE; diff --git a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Info.plist b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Info.plist index f69838d..ec0cc7b 100644 --- a/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Info.plist +++ b/native_library/ios/GoogleMapsANE/GoogleMapsANE_FW/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.1.0 + $(MARKETING_VERSION) CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass From 6aa7443107760442d5b647966309b6be8ea7b853 Mon Sep 17 00:00:00 2001 From: Eoin Landy Date: Sat, 28 Dec 2019 12:31:04 +0000 Subject: [PATCH 04/12] 2.6.0 --- native_extension/bin/GoogleMapsANE.swc | Bin 34517 -> 35836 bytes .../src/avmplus/DescribeTypeJSON.as | 70 +++++++++++ .../src/com/tuarua/fre/ANEUtils.as | 119 +++++++++--------- 3 files changed, 131 insertions(+), 58 deletions(-) create mode 100644 native_extension/src/avmplus/DescribeTypeJSON.as diff --git a/native_extension/bin/GoogleMapsANE.swc b/native_extension/bin/GoogleMapsANE.swc index dde0b0c29a95281835579aa1bebf3d6af8be7e93..be4464297a1cd579c1c2d10193f5c7069339e437 100644 GIT binary patch delta 21148 zcmV)EK)}D%jRO3a0u4}00|XQR2nYxOL$;Zb4IO{cPcE=SS5qFSq5uGR0kyq(bR5}v zA6mDnx^M4jG=RnqG**H@6X<;b*TzPI0|Fd?%WNdN(dZ^I0|F2lAcvAIL9*qcmsqwW zOSU9Cs@%KoA_o zBanZ$>sHm>>aO4Zy(y{xrzClPL6TaSG*#a!Nzz9e?lMU_b@t6W>w&w4?b6!j#_8Vh zXs9=E_Kf4y_G)o_acU-jw;QE#+@0>dy|c45J~npm-o4R#(b3KATVvsLIz1MOj71_R zkm5w?{>D!3%@Z4?zTPvA0RBWNQ-xA~du@Mf2jv^3t>(*xZS8Kai=tNZV}R@|+{@i9oG7m6O1DpqRT7G3ip(f*90hN!trxZf8@W4$)4iEI6|f{)ADDkM z-t|^GD>53Q?poPhTVFlh8;!>zp>*$<@#$mKgH_*-J{6D9sb{1~`N@+f9lg=JINxxVEuIU$K0jrg`O0y{IC+m-Hk` zMpq5T<548WcCofms#Ktc(~+?I?pkSWWxcRixP|tpkw`k^sI>3MNvR}biKAy&GMWA^ z%&sZXJnGykkHPZOU9aYI>+3cYFulFK zx$UWBA1!VdETX3!VxfPG-YRU~sanJqQC4-~m8O|vBxJA#OI0~FBkI0ZJ-${fw>p1|zti6>)r&=EY*7X)G=Ytu0M8-a3>@8>Pug>V! z1}LMVsuD{YHOhaev5%_l7rBR#dtm?3j6?a>yQp_WWJl~R<=w1D3sQFVV7+>S!^nB8 zTyLbh-a0Kx87(q)uMwkOQCkXmj?XyQH}+9iT4X`&EoDFJ)y64{6}`x8lm#0Vb|31w zgPRlAHz%vuoF&9#43wMF);{w{r`$~YdyN;QthIxc&;?BjA1mz%lV%H?*hbaJ_y%L8_?2rWK| zc`d%Ze#zE^rO=GfiYIbAo=BY{iQ9t3h+s!>A$Sn#5gHI05&Q@(2yF-*2!S4E?PZ=i zJCnGRj#{TvKWiNh#?*6?MPjlQk8!K;a}pLV*8hJ5*15$#iFIyuOkkaJ=LFWd%|+|n z?w-U1cGzgOduX*gU3Nwj+Kvg`msPcP%y5|&g^wPHCAfc6)w)M=Dkig1Ny@c8T6mQQ zOglyks`9|9jnHyASeT-Xjfhhn`=P#&`t*fFjXJoH>hy)=5eq5cIBFqX-dw-GzP6#S zB?W&UvA6fPPwHq<;jjPPYu4rb=KAJ#*Wv5R%&qR?SeLBJ_tsW-ZW~L%zKmmMwNP5i zn+wmjyp`L*S-;^1She{^;j(^r_(XRszfQ2imHS%-1y}oWX(zY6Gnw1s%Y}_qan&IR z>oq_ro7>Li<;+rad3p41AzyXYRV}omAQgW=8R@h|e5x7=M`LOv8V{FOY$O>An@c$w zNhU4gJJo13omQi{$61&k3N=WQ)v4?8qg9$qHgV$Zuc12a0Mg9j08p+N{kUcxU;sQ5)xU5p)!jH zl(=QzGS*_2%}&e9vICfh)1|mQvOPpF6z$9wE(5CJT*ek{=ZX$b0f_-fRR^f5vks7zTF;dR zE;n+yg*Izh->iGN+|T7>fUmfGg3BQ;N4cEfEX9>HSH`(@lFQTFI>W8!xpjY*^NU=b z(!36)wL-bOwp_S{wH!B)J7Kxn*wx_wDqncH*hpji+iiV!gfC z3i~N_KkjVD5VIXa%rT6ZW0+zmD0YHkA&P~l6i*cQo+$3UiM>U+cT`I4U7c`B9@%PD zRjb3{u%#c^9S)oe3bWF$jDLSFSG48T_RjA9;S-@_)X0`5=5I!5MQB6lKLh>X#bsE<*XPN&T>kim0Qgat}aG9w9cvNNu zbchylNwP^eAaO!D@r%ZZUpIlS^^*jW`p|of`6dY@ZI~pGv~iL^(x!h2995R4Nr~fN z%;0e2%@dNH*_tO&n7w5}axzEDq~v1G)(OeYT&D(q&ntlo0Pn)u6;tPXWsTn z$;awDCZz`E>zI%lSwm+=YGRFOtRJH$v2GlMN|V326}>014jg=$$8189_HXuRv5{QQ zjV>)7Y}{Yyl5q^7srr9unaMIOjRQ_On2BkbksL#&iC~M7Nj;dRPn#df^&!ndu-!;w zIhdwjdu=4wk2E)eokkh~d(u&z$tqe7mGgs{6s>^M6`6{`ZX=V8(uDM{LYC}+_If?W z>3nujd!u+PcquzHb6f_vJFKl6;O_8SgmnWjFu&BIZ6T-QU}b+6?fyv4g33M^>^CZN zRx)wz!^q^KOoZW^eaf}B*hr2e*8>LVT<=vkWpjuRvui)Xkk4~4pI!S26-tTqnI02@Wn-av9YNPEL}S@~0| z32umcbV8ei{e1?T4+vlit{}WI6;}m&CRPp++kk(xBc}I{*rcovLporMjrCBf+5dP> zPu(eO=PqxS1cg;}nEdUpJ$X`x*=);$lwH`)>_}Ar>fs%5WS=HO5%q(cn|Dl{6KJTq z1NcHo#nODGkkje5k&tH+&_<;(Rh{}A=q?ls=ih(muC_Hq6~oY~lHG((1W>{RSyd)* z#29~I^c?;`i4i!U1J^PR=mQSOxD5lS5}N072{aE!AyBzA{3`(g@$Dz1b9sdjm?}62E7zxiLly0c=nM>1E1U&#N}1BdrGH=6w>$&^%EEzLtoN723irH>$?o8js>foz-)6{=N zGL{1FX0}vKhT_RXL3ngqH2s|UoQQ>QzCZK%3c{`__UVEn;Bu?U*& zIS_9HHOT`Tn>ztL%W44B(k=AZ{n0>RW_M?IyAU9XZz*tZZGAmZ%&o1DT7fg}?3TR1 z0!8=Dt(Cz0C~RAHwsZMH=GB_AZv=m+I;voOGY9I{dnlh3s;JgheNL1)OQ3UE3N&aH z){$i$57z4r)T`z}2T*BtS+;W9rNVP}zusB|sOBq-S^a!m3sZRO+FIdWT_wBdBR5U4 z+)n&Wi-FU%48Qex5FR0^SEAA9ljR$`Mx5I#J z7YaLSer@Nz^1-z&%<|oho$dQ|mkZl>)=I>c5+(Okm3*tr$Q#9Q8>vbSm1d7lt*wIQ znAvHqeKrS<-DPS^W~aIK4N~jh(_Z_00{oMWsqNe?TyFVl-_hd($x+PgMsf4{+Q#bU zy{_8icz3>fRUc>@UYmGp%Ts?D=?ylA&e|7~>)4Yj_4U-gEq`n!MfC?PY%CUXtM{vW zZDC_h%=7BLS=i7|q1n~-LUp?qHYV0~FkwU?2R>zbW7X`k!-~2D%1?FQm{rj8C8Ajs zR$I(jHEKq#ZmnWhsCu!mVN9dB&CNGr&)qX%AyeWRf=oA4f$U=M$A>K8G)T*j79 zi?bwXBY^`;GH`W+HUZ26+7w1dM;mmqhsbX3B6ZC;pDixG$KQmL`dpi<&1cEjCj7Jh zMgQxvO|jWQ6qTJR^8g1)!O2xOR|M5psTYLb25tc@!KD4_;e4YbMk$o8eowf!dJfn2hNZ^VC01@~!avsRYFi6cO0*x;M6|!h! z!I8jBlYCPJkr~fJfkqH|Z}_!vaP*>|DR>kOj%Di?nq@6^?51@jXVpf%;P5;Qy&?^N zb2v0|hh0+C9I^W>^ye!$N=(E9-`^EN*eB8UKNOpU+V_%ypw$F63 zo3@dh?M4@vW7Ea%tgRTh*d_0EeKXsm%@liY^z9eh9$kOzlNb7#Ht7YqNVGT)fJ|?4 zwpF`O9H2&fo2lHYKa}v2Q37h#%kcgMH3xOSR;e2`-zW}#Ja0kdX0dxWuOhNs4D9Bu zS;vY+%NCDihu+#7`qsNzu6TS!%?-b+tsr8}ji8FWQAO5fwDMJ>m25cgsA^@wXypgc z0MUXss#<^0qpcq-=5?bOc{uN?DrUndX4v?SQcWp4C?$v<6WzI6?oMszVo>zpwo#}u zocB}}de12I8%*z<@2M&Dd#elmaJkSMC(uoMtT>9xM_F+UmyfYx2$%0;#V{`4&x#RT zKF*3!?IRaYSherH7*uE+Kjdu_I%p%u_RZK*KO94g_fYf-3TQBSsT{ zjMcR9$0=>pG zMQkm&ir8-=_JLplvA;y@gTW$VnZJLc{V)sOLiArD`lBp(8__@g`zPnEmp{&a5VXrb zVPBPhMfSJ;sr(o6U*h^{b~l4{SnL8Ex%#Gsuzgxq_N9JKAoe04OoG2fbgAL2Rr`6O z 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 EFPXh@4FCWD diff --git a/native_extension/src/avmplus/DescribeTypeJSON.as b/native_extension/src/avmplus/DescribeTypeJSON.as new file mode 100644 index 0000000..fa67dd2 --- /dev/null +++ b/native_extension/src/avmplus/DescribeTypeJSON.as @@ -0,0 +1,70 @@ +// ================================================================================================= +// +// Modified by Rodrigo Lopez [roipekerâ„¢] on 20/01/2019. +// +// original class: +// https://github.com/tschneidereit/SwiftSuspenders/blob/master/src/avmplus/DescribeTypeJSON.as +// +// Check https://jacksondunstan.com/articles/2609 for reference. +// +// +// ================================================================================================= + +package avmplus { + +/** + * -- Basic Usage: + * + * var desc:Object = DescribeTypeJSON.run( AnyClassOrInstance ); + * trace( JSON.stringify( desc )) ; + * + */ + +/** + * Makes the hidden, unofficial function describeTypeJSON available outside of the avmplus + * package. + * + * As Adobe doen't officially support this method and it is only visible to client + * code by accident, it should only ever be used with runtime-detection and automatic fallback + * on describeType. + * + * @see http://www.tillschneidereit.de/2009/11/22/improved-reflection-support-in-flash-player-10-1/ + */ +public class DescribeTypeJSON { + //---------------------- Public Properties ----------------------// + public static var available:Boolean = describeTypeJSON != null; + + public static const INSTANCE_FLAGS:uint = INCLUDE_VARIABLES | USE_ITRAITS | HIDE_OBJECT; + public static const CLASS_FLAGS:uint = INCLUDE_VARIABLES | INCLUDE_TRAITS | HIDE_OBJECT; + + + private static var _instance:DescribeTypeJSON; + + public static function get():DescribeTypeJSON { + if (!_instance) _instance = new DescribeTypeJSON(); + return _instance; + } + + public static function run(obj:Object):Object { + // little hack to call Class from instance + if (!(obj is Class)) obj = Object(obj).constructor; + return get().describeType(obj, CLASS_FLAGS | INSTANCE_FLAGS); + } + + //---------------------- Public Methods ----------------------// + public function DescribeTypeJSON() { + } + + public function describeType(target:Object, flags:uint):Object { + return describeTypeJSON(target, flags); + } + + public function getInstanceDescription(type:Object):Object { + return describeTypeJSON(type, INSTANCE_FLAGS); + } + + public function getClassDescription(type:Class):Object { + return describeTypeJSON(type, CLASS_FLAGS); + } +} +} \ No newline at end of file diff --git a/native_extension/src/com/tuarua/fre/ANEUtils.as b/native_extension/src/com/tuarua/fre/ANEUtils.as index 5ccf7f2..5590a93 100644 --- a/native_extension/src/com/tuarua/fre/ANEUtils.as +++ b/native_extension/src/com/tuarua/fre/ANEUtils.as @@ -16,10 +16,13 @@ */ package com.tuarua.fre { +import avmplus.DescribeTypeJSON; + import flash.utils.describeType; import flash.utils.getDefinitionByName; import flash.utils.getQualifiedClassName; +/** @private */ public class ANEUtils { public function ANEUtils() { } @@ -32,72 +35,62 @@ public class ANEUtils { return Class(getDefinitionByName(getQualifiedClassName(obj))); } - public static function getClassProps(clz:*):Vector. { + private static function _getClassProps(clz:*):Vector. { var ret:Vector. = new []; - var xml:XML = describeType(clz); - if (xml.variable && xml.variable.length() > 0) { - for each (var prop:XML in xml.variable) { - var obj:Object = {}; - obj.name = prop.@name.toString(); - obj.type = prop.@type.toString(); - obj.cls = obj.type == "*" ? null : getClass(Class(getDefinitionByName(obj.type))); - ret.push(obj); + var isObject:Boolean = false; + for (var id:String in clz) { + var objc:Object = {}; + objc.name = id; + if (clz.hasOwnProperty(id)) { + objc.type = getClassType(clz[id]); + objc.cls = objc.type == "*" ? null : getClass(Class(getDefinitionByName(objc.type))); + ret.push(objc); + isObject = true; } - } else if (xml.factory && xml.factory.variable && xml.factory.variable.length() > 0) { - for each (var propb:XML in xml.factory.variable) { - var objb:Object = {}; - objb.name = propb.@name.toString(); - objb.type = propb.@type.toString(); - objb.cls = objb.type == "*" ? null : getClass(Class(getDefinitionByName(objb.type))); - ret.push(objb); + } + if (isObject) { + return ret; + } + if (DescribeTypeJSON.available) { + var json:Object = DescribeTypeJSON.run(clz); + if (json.traits.variables) { + for each (var propd:Object in json.traits.variables) { + var objd:Object = {}; + objd.name = propd.name; + objd.type = propd.type; + objd.cls = objd.type == "*" ? null : getClass(Class(getDefinitionByName(objd.type))); + ret.push(objd); + } } } else { - for (var id:String in clz) { - var objc:Object = {}; - objc.name = id; - if (clz.hasOwnProperty(id)) { - objc.type = getClassType(clz[id]); - objc.cls = objc.type == "*" ? null : getClass(Class(getDefinitionByName(objc.type))); - ret.push(objc); + var xml:XML = describeType(clz); + if (xml.variable && xml.variable.length() > 0) { + for each (var prop:XML in xml.variable) { + var obj:Object = {}; + obj.name = prop.@name.toString(); + obj.type = prop.@type.toString(); + obj.cls = obj.type == "*" ? null : getClass(Class(getDefinitionByName(obj.type))); + ret.push(obj); + } + } else if (xml.factory && xml.factory.variable && xml.factory.variable.length() > 0) { + for each (var propb:XML in xml.factory.variable) { + var objb:Object = {}; + objb.name = propb.@name.toString(); + objb.type = propb.@type.toString(); + objb.cls = objb.type == "*" ? null : getClass(Class(getDefinitionByName(objb.type))); + ret.push(objb); } - } } return ret; } - public function getClassProps(clz:*):Vector. { - var ret:Vector. = new []; - var xml:XML = describeType(clz); - if (xml.variable && xml.variable.length() > 0) { - for each (var prop:XML in xml.variable) { - var obj:Object = {}; - obj.name = prop.@name.toString(); - obj.type = prop.@type.toString(); - obj.cls = obj.type == "*" ? null : getClass(Class(getDefinitionByName(obj.type))); - ret.push(obj); - } - } else if (xml.factory && xml.factory.variable && xml.factory.variable.length() > 0) { - for each (var propb:XML in xml.factory.variable) { - var objb:Object = {}; - objb.name = propb.@name.toString(); - objb.type = propb.@type.toString(); - objb.cls = objb.type == "*" ? null : getClass(Class(getDefinitionByName(objb.type))); - ret.push(objb); - } - } else { - for (var id:String in clz) { - var objc:Object = {}; - objc.name = id; - if (clz.hasOwnProperty(id)) { - objc.type = getClassType(clz[id]); - objc.cls = objc.type == "*" ? null : getClass(Class(getDefinitionByName(objc.type))); - ret.push(objc); - } + public static function getClassProps(clz:*):Vector. { + return _getClassProps(clz); + } - } - } - return ret; + public function getClassProps(clz:*):Vector. { + return _getClassProps(clz); } private static function getPropClass(name:String, cls:Class):Class { @@ -110,13 +103,23 @@ public class ANEUtils { return null; } - //noinspection ReservedWordAsName public static function map(from:Object, to:Class):Object { var classInstance:Object; classInstance = new to(); for (var id:String in from) { var name:String = id; - var propCls:Class = getPropClass(name, to); + var propCls:Class; + if (from[name] is String) { + propCls = String; + } else if (from[name] is Boolean) { + propCls = Boolean; + } else if (from[name] is int) { + propCls = int; + } else if (from[name] is Number) { + propCls = Number; + } else { + propCls = getPropClass(name, to); + } switch (propCls) { case String: @@ -151,4 +154,4 @@ public class ANEUtils { } } -} +} \ No newline at end of file From 59f7c374bdaf7cc09886eb19888d824829472a38 Mon Sep 17 00:00:00 2001 From: Eoin Landy Date: Sat, 18 Jan 2020 15:37:20 +0000 Subject: [PATCH 05/12] FreKotlin 1.9.5 --- CHANGELOG.md | 2 +- example/get_android_dependencies.ps1 | 2 +- example/get_android_dependencies.sh | 2 +- example/src/Main-app-android.xml | 1 + native_extension/bin/GoogleMapsANE.swc | Bin 35836 -> 36048 bytes .../src/avmplus/DescribeTypeJSON.as | 1 + .../src/com/tuarua/fre/ANEUtils.as | 19 ++++++++++--- .../android/GoogleMapsANE/app/app.iml | 26 +++++++++--------- .../android/GoogleMapsANE/app/build.gradle | 2 +- .../android/GoogleMapsANE/build.gradle | 4 +-- 10 files changed, 36 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aecc669..b128c09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ ### 2.6.0 -- AND: Updated to FreKotlin 1.9.1 +- AND: Updated to FreKotlin 1.9.5 - AND: Updated to Android Play Services to 17.0.0 - AND: Updated to Jetpack - iOS: Updated to Google Maps SDK 3.7.0 diff --git a/example/get_android_dependencies.ps1 b/example/get_android_dependencies.ps1 index 96d2cc2..669b5dd 100644 --- a/example/get_android_dependencies.ps1 +++ b/example/get_android_dependencies.ps1 @@ -1,5 +1,5 @@ $AneVersion = "2.6.0" -$FreKotlinVersion = "1.9.1" +$FreKotlinVersion = "1.9.5" $PlayerServicesVersion = "17.0.0" $MapsVersion = "17.0.0" $LocationVersion = "17.0.0" diff --git a/example/get_android_dependencies.sh b/example/get_android_dependencies.sh index a960949..8892037 100755 --- a/example/get_android_dependencies.sh +++ b/example/get_android_dependencies.sh @@ -1,7 +1,7 @@ #!/bin/sh AneVersion="2.6.0" -FreKotlinVersion="1.9.1" +FreKotlinVersion="1.9.5" PlayerServicesVersion="17.0.0" MapsVersion="17.0.0" LocationVersion="17.0.0" diff --git a/example/src/Main-app-android.xml b/example/src/Main-app-android.xml index c97583c..f1c0c98 100644 --- a/example/src/Main-app-android.xml +++ b/example/src/Main-app-android.xml @@ -53,6 +53,7 @@ + diff --git a/native_extension/bin/GoogleMapsANE.swc b/native_extension/bin/GoogleMapsANE.swc index be4464297a1cd579c1c2d10193f5c7069339e437..81b8bc337fb2cccd439ece70d7f85abef3f6dfd5 100644 GIT binary patch delta 21050 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 F000)cJU9RV delta 20843 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 diff --git a/native_extension/src/avmplus/DescribeTypeJSON.as b/native_extension/src/avmplus/DescribeTypeJSON.as index fa67dd2..ac61e0a 100644 --- a/native_extension/src/avmplus/DescribeTypeJSON.as +++ b/native_extension/src/avmplus/DescribeTypeJSON.as @@ -29,6 +29,7 @@ package avmplus { * on describeType. * * @see http://www.tillschneidereit.de/2009/11/22/improved-reflection-support-in-flash-player-10-1/ + * @private */ public class DescribeTypeJSON { //---------------------- Public Properties ----------------------// diff --git a/native_extension/src/com/tuarua/fre/ANEUtils.as b/native_extension/src/com/tuarua/fre/ANEUtils.as index 5590a93..deb9d78 100644 --- a/native_extension/src/com/tuarua/fre/ANEUtils.as +++ b/native_extension/src/com/tuarua/fre/ANEUtils.as @@ -131,13 +131,24 @@ public class ANEUtils { case Vector.: case Vector.: case Vector.: - classInstance[name] = from[name]; + if (classInstance.hasOwnProperty(name)) classInstance[name] = from[name]; break; case Date: - classInstance[name] = new Date(Date.parse(from[name])); + if (classInstance.hasOwnProperty(name)) classInstance[name] = new Date(Date.parse(from[name])); break; - default: //Object or Class - classInstance[name] = (propCls == null) ? from[name] : map(from[name], getPropClass(name, to)); + default: //Object or Class or Vector. + // handle Vector. + if (propCls && propCls.toString().indexOf("Vector.") > -1) { + var vec:* = new propCls(); + var vecClsName:String = propCls.toString().replace("[class Vector.<","").replace(">]",""); + var vecCls:Class = getClass(Class(getDefinitionByName(vecClsName))); + for each(var o:* in from[name]) { + vec.push(map(o, vecCls)); + } + if (classInstance.hasOwnProperty(name)) classInstance[name] = vec; + } else { + if (classInstance.hasOwnProperty(name)) classInstance[name] = (propCls == null) ? from[name] : map(from[name], getPropClass(name, to)); + } break; } diff --git a/native_library/android/GoogleMapsANE/app/app.iml b/native_library/android/GoogleMapsANE/app/app.iml index 0f5cd7c..d104553 100644 --- a/native_library/android/GoogleMapsANE/app/app.iml +++ b/native_library/android/GoogleMapsANE/app/app.iml @@ -26,13 +26,13 @@ - + @@ -129,9 +129,9 @@ - - - + + + @@ -170,6 +170,6 @@ - + \ No newline at end of file diff --git a/native_library/android/GoogleMapsANE/app/build.gradle b/native_library/android/GoogleMapsANE/app/build.gradle index 3826c61..cff72dc 100644 --- a/native_library/android/GoogleMapsANE/app/build.gradle +++ b/native_library/android/GoogleMapsANE/app/build.gradle @@ -7,7 +7,7 @@ android { buildToolsVersion "28.0.3" defaultConfig { minSdkVersion 19 - targetSdkVersion compileSdkVersion + targetSdkVersion 28 versionCode 1 versionName "2.6.0" } diff --git a/native_library/android/GoogleMapsANE/build.gradle b/native_library/android/GoogleMapsANE/build.gradle index 81b7a18..05ac524 100644 --- a/native_library/android/GoogleMapsANE/build.gradle +++ b/native_library/android/GoogleMapsANE/build.gradle @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.50' - ext.frekotlin_version = '1.9.1' + ext.kotlin_version = '1.3.61' + ext.frekotlin_version = '1.9.5' ext.gson_version = '2.8.6' ext.play_maps_version = '17.0.0' ext.play_location_version = '17.0.0' From 25b454634c1234abcc1fcfc79b8e465cf25f1f93 Mon Sep 17 00:00:00 2001 From: Eoin Landy Date: Fri, 24 Jan 2020 22:16:00 +0000 Subject: [PATCH 06/12] FreKotlin 1.9.5 --- README.md | 6 +++--- example/.actionScriptProperties | 4 ++-- ..._frekotlin_1_9_1.xml => com_tuarua_frekotlin_1_9_5.xml} | 4 ++-- example/GoogleMapsANESample-mobile.iml | 7 ++++--- 4 files changed, 11 insertions(+), 10 deletions(-) rename example/.idea/libraries/{com_tuarua_frekotlin_1_9_1.xml => com_tuarua_frekotlin_1_9_5.xml} (67%) diff --git a/README.md b/README.md index d14a6fb..23e6cb1 100644 --- a/README.md +++ b/README.md @@ -124,10 +124,10 @@ You should use AIR 32 for iOS builds You will need: - IntelliJ IDEA / Flash Builder -- AIR 33 or greater -- Xcode 11.2 +- AIR 33.0.2.338+ +- Xcode 11.3 +- [wget](http://rudix.org/packages/wget.html) on macOS - Android Studio 3 if you wish to edit the Android source -- wget on macOS - Powershell on Windows ### References diff --git a/example/.actionScriptProperties b/example/.actionScriptProperties index 1644a2e..279ade6 100644 --- a/example/.actionScriptProperties +++ b/example/.actionScriptProperties @@ -45,7 +45,7 @@ - + @@ -70,7 +70,7 @@ - + diff --git a/example/.idea/libraries/com_tuarua_frekotlin_1_9_1.xml b/example/.idea/libraries/com_tuarua_frekotlin_1_9_5.xml similarity index 67% rename from example/.idea/libraries/com_tuarua_frekotlin_1_9_1.xml rename to example/.idea/libraries/com_tuarua_frekotlin_1_9_5.xml index a32adba..dc3fad8 100644 --- a/example/.idea/libraries/com_tuarua_frekotlin_1_9_1.xml +++ b/example/.idea/libraries/com_tuarua_frekotlin_1_9_5.xml @@ -1,7 +1,7 @@ - + - + diff --git a/example/GoogleMapsANESample-mobile.iml b/example/GoogleMapsANESample-mobile.iml index c9b9227..a26fc87 100644 --- a/example/GoogleMapsANESample-mobile.iml +++ b/example/GoogleMapsANESample-mobile.iml @@ -55,9 +55,6 @@ - - - @@ -73,6 +70,9 @@ + + + @@ -179,5 +179,6 @@ + \ No newline at end of file From c239196398db89ae9a2601e50e8103ab3e59b3da Mon Sep 17 00:00:00 2001 From: Eoin Landy Date: Sun, 9 Feb 2020 14:49:42 +0000 Subject: [PATCH 07/12] API refactor --- example/.actionScriptProperties | 109 --------------- example/.project | 26 ---- example/src/StarlingRoot.as | 17 +-- native_extension/.actionScriptProperties | 48 ------- native_extension/.flexLibProperties | 6 - native_extension/.project | 18 --- .../ane/platforms/default/library.swf | Bin 19797 -> 20056 bytes native_extension/bin/GoogleMapsANE.swc | Bin 36048 -> 35362 bytes .../{GoogleMapsANE.as => GoogleMaps.as} | 124 +++--------------- .../src/com/tuarua/GoogleMapsANEContext.as | 32 ++--- 10 files changed, 40 insertions(+), 340 deletions(-) delete mode 100644 example/.actionScriptProperties delete mode 100644 example/.project delete mode 100644 native_extension/.actionScriptProperties delete mode 100644 native_extension/.flexLibProperties delete mode 100644 native_extension/.project rename native_extension/src/com/tuarua/{GoogleMapsANE.as => GoogleMaps.as} (76%) diff --git a/example/.actionScriptProperties b/example/.actionScriptProperties deleted file mode 100644 index 279ade6..0000000 --- a/example/.actionScriptProperties +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/.project b/example/.project deleted file mode 100644 index 92c67da..0000000 --- a/example/.project +++ /dev/null @@ -1,26 +0,0 @@ - - - GoogleMapsANESample-mobile - - - GoogleMapsANE - - - - com.adobe.flexbuilder.project.flexbuilder - - - - - com.adobe.flexbuilder.project.apollobuilder - - - - - - com.adobe.flexide.project.multiplatform.multiplatformasnature - com.adobe.flexide.project.multiplatform.multiplatformnature - com.adobe.flexbuilder.project.apollonature - com.adobe.flexbuilder.project.actionscriptnature - - diff --git a/example/src/StarlingRoot.as b/example/src/StarlingRoot.as index f0c5921..a29ed41 100644 --- a/example/src/StarlingRoot.as +++ b/example/src/StarlingRoot.as @@ -1,5 +1,5 @@ package { -import com.tuarua.GoogleMapsANE; +import com.tuarua.GoogleMaps; import com.tuarua.fre.ANEError; import com.tuarua.googlemaps.CameraPosition; import com.tuarua.googlemaps.Circle; @@ -39,7 +39,7 @@ import starling.utils.AssetManager; import views.SimpleButton; public class StarlingRoot extends Sprite { - private var mapView:GoogleMapsANE; + private var mapView:GoogleMaps; [Embed(source="pin_b.png")] public static const pinImage:Class; @@ -88,11 +88,12 @@ public class StarlingRoot extends Sprite { NativeApplication.nativeApplication.addEventListener(Event.EXITING, onExiting); var _assets:AssetManager = assets; - GoogleMapsANE.key = "AIzaSyCkmGADGPLtu9WOiRzK_3r9XXw8-3DHvEc"; - GoogleMapsANE.mapProvider = MapProvider.GOOGLE; - mapView = GoogleMapsANE.mapView; - - if (!mapView.isInited) { + GoogleMaps.key = "AIzaSyCkmGADGPLtu9WOiRzK_3r9XXw8-3DHvEc"; + GoogleMaps.mapProvider = MapProvider.GOOGLE; + try { + mapView = GoogleMaps.mapView; + } catch(e:ANEError) { + trace(e.message); return; } @@ -520,7 +521,7 @@ public class StarlingRoot extends Sprite { * It's very important to call dispose(); on any ANEs when the app is exiting. */ private function onExiting(event:Event):void { - GoogleMapsANE.dispose(); + GoogleMaps.dispose(); } } } \ No newline at end of file diff --git a/native_extension/.actionScriptProperties b/native_extension/.actionScriptProperties deleted file mode 100644 index 1db4fc5..0000000 --- a/native_extension/.actionScriptProperties +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/native_extension/.flexLibProperties b/native_extension/.flexLibProperties deleted file mode 100644 index 1fbacb4..0000000 --- a/native_extension/.flexLibProperties +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/native_extension/.project b/native_extension/.project deleted file mode 100644 index 97465eb..0000000 --- a/native_extension/.project +++ /dev/null @@ -1,18 +0,0 @@ - - - GoogleMapsANE - - - - - - com.adobe.flexbuilder.project.flexbuilder - - - - - - com.adobe.flexbuilder.project.aslibnature - com.adobe.flexbuilder.project.actionscriptnature - - diff --git a/native_extension/ane/platforms/default/library.swf b/native_extension/ane/platforms/default/library.swf index e89dd40d1179f21e5a57b88a48fc64f030c587cd..f8768ffc1cccdb3e3228a21b0723628c952ec5cd 100644 GIT binary patch literal 20056 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 literal 19797 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 AWB>pF diff --git a/native_extension/bin/GoogleMapsANE.swc b/native_extension/bin/GoogleMapsANE.swc index 81b8bc337fb2cccd439ece70d7f85abef3f6dfd5..cfb16e5c83c0042c2810f9004226f93e8c631797 100644 GIT binary patch delta 20547 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 delta 21131 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 MCY_56p7mGtKZyKMEdT%j diff --git a/native_extension/src/com/tuarua/GoogleMapsANE.as b/native_extension/src/com/tuarua/GoogleMaps.as similarity index 76% rename from native_extension/src/com/tuarua/GoogleMapsANE.as rename to native_extension/src/com/tuarua/GoogleMaps.as index 9554cba..5d6c659 100644 --- a/native_extension/src/com/tuarua/GoogleMapsANE.as +++ b/native_extension/src/com/tuarua/GoogleMaps.as @@ -32,33 +32,30 @@ import flash.events.EventDispatcher; import flash.geom.Rectangle; import flash.utils.Dictionary; -public class GoogleMapsANE extends EventDispatcher { +public class GoogleMaps extends EventDispatcher { private var _viewPort:Rectangle; private var _visible:Boolean; - private var _isInited:Boolean; - private var _isMapInited:Boolean; - private static var _mapView:GoogleMapsANE; + private static var _mapView:GoogleMaps; private static var _key:String; private static var _mapProvider:int = MapProvider.GOOGLE; private var _projection:Projection = new Projection(); - public function GoogleMapsANE() { + public function GoogleMaps() { if (_mapView) { - throw new Error(GoogleMapsANEContext.NAME + "GoogleMapsANE is a singleton, use .mapView"); + throw new Error(GoogleMapsANEContext.NAME + " is a singleton, use .mapView"); } if (GoogleMapsANEContext.context) { var ret:* = GoogleMapsANEContext.context.call("init", _key, _mapProvider); if (ret is ANEError) throw ret as ANEError; - _isInited = ret; } _mapView = this; } - public static function get mapView():GoogleMapsANE { + public static function get mapView():GoogleMaps { if (_mapView == null) { - new GoogleMapsANE(); + new GoogleMaps(); } return _mapView; } @@ -86,14 +83,9 @@ public class GoogleMapsANE extends EventDispatcher { * @param useWeakReference * */ - override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, - useWeakReference:Boolean = false):void { + override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void { super.addEventListener(type, listener, useCapture, priority, useWeakReference); - if (_isInited) { - GoogleMapsANEContext.context.call("addEventListener", type); - } else { - trace("You need to init before adding EventListeners"); - } + GoogleMapsANEContext.context.call("addEventListener", type); } /** @@ -105,11 +97,7 @@ public class GoogleMapsANE extends EventDispatcher { */ override public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void { super.removeEventListener(type, listener, useCapture); - if (_isInited) { - GoogleMapsANEContext.context.call("removeEventListener", type); - } else { - trace("You need to init before removing EventListeners"); - } + GoogleMapsANEContext.context.call("removeEventListener", type); } /** @@ -121,16 +109,10 @@ public class GoogleMapsANE extends EventDispatcher { * @param scaleFactor * */ - public function initMap(viewPort:Rectangle, centerAt:Coordinate, zoomLevel:Number, settings:Settings, - scaleFactor:Number = 1.0):void { - if (_isInited) { - _viewPort = viewPort; - var ret:* = GoogleMapsANEContext.context.call("initMap", _viewPort, centerAt, zoomLevel, settings, scaleFactor); - if (ret is ANEError) throw ret as ANEError; - _isMapInited = true; - } else { - trace("initMap wasn't successful"); - } + public function initMap(viewPort:Rectangle, centerAt:Coordinate, zoomLevel:Number, settings:Settings, scaleFactor:Number = 1.0):void { + _viewPort = viewPort; + var ret:* = GoogleMapsANEContext.context.call("initMap", _viewPort, centerAt, zoomLevel, settings, scaleFactor); + if (ret is ANEError) throw ret as ANEError; } /** @@ -139,7 +121,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function addCircle(circle:Circle):void { - if (!safetyCheck()) return; var ret:* = GoogleMapsANEContext.context.call("addCircle", circle); if (ret is ANEError) throw ret as ANEError; var id:String = ret as String; @@ -149,7 +130,6 @@ public class GoogleMapsANE extends EventDispatcher { } public function addGroundOverlay(groundOverlay:GroundOverlay):void { - if (!safetyCheck()) return; var ret:* = GoogleMapsANEContext.context.call("addGroundOverlay", groundOverlay); if (ret is ANEError) throw ret as ANEError; var id:String = ret as String; @@ -164,7 +144,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function addPolyline(polyline:Polyline):void { - if (!safetyCheck()) return; var ret:* = GoogleMapsANEContext.context.call("addPolyline", polyline); if (ret is ANEError) throw ret as ANEError; var id:String = ret as String; @@ -179,7 +158,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function addPolygon(polygon:Polygon):void { - if (!safetyCheck()) return; var ret:* = GoogleMapsANEContext.context.call("addPolygon", polygon); if (ret is ANEError) throw ret as ANEError; var id:String = ret as String; @@ -195,7 +173,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function addMarker(marker:Marker):void { - if (!safetyCheck()) return; var ret:* = GoogleMapsANEContext.context.call("addMarker", marker); if (ret is ANEError) throw ret as ANEError; var id:String = ret as String; @@ -208,9 +185,7 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function clear():void { - if (safetyCheck()) { - GoogleMapsANEContext.context.call("clear"); - } + GoogleMapsANEContext.context.call("clear"); } /** @@ -221,7 +196,6 @@ public class GoogleMapsANE extends EventDispatcher { public function set visible(value:Boolean):void { if (_visible == value) return; _visible = value; - if (!safetyCheck()) return; GoogleMapsANEContext.context.call("setVisible", value); } @@ -231,7 +205,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function setBounds(bounds:CoordinateBounds, animates:Boolean = false):void { - if (!safetyCheck()) return; var ret:* = GoogleMapsANEContext.context.call("setBounds", bounds, animates); if (ret is ANEError) throw ret as ANEError; } @@ -243,7 +216,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function moveCamera(position:CameraPosition, animates:Boolean = false):void { - if (!safetyCheck()) return; var centerAt:Coordinate = position.centerAt ? position.centerAt : null; var zoom:* = position.zoom != -9999 ? position.zoom : null; var tilt:* = position.tilt != -9999 ? position.tilt : null; @@ -258,7 +230,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function zoomIn(animates:Boolean = false):void { - if (!safetyCheck()) return; GoogleMapsANEContext.context.call("zoomIn", animates); } @@ -268,7 +239,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function zoomOut(animates:Boolean = false):void { - if (!safetyCheck()) return; GoogleMapsANEContext.context.call("zoomOut", animates); } @@ -279,7 +249,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function zoomTo(zoomLevel:Number, animates:Boolean = false):void { - if (!safetyCheck()) return; GoogleMapsANEContext.context.call("zoomTo", zoomLevel, animates); } @@ -292,7 +261,6 @@ public class GoogleMapsANE extends EventDispatcher { *

Android Only.

*/ public function scrollBy(x:Number, y:Number, animates:Boolean = false):void { - if (!safetyCheck()) return; GoogleMapsANEContext.context.call("scrollBy", x, y, animates); } @@ -302,7 +270,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function set mapType(value:uint):void { - if (!safetyCheck()) return; GoogleMapsANEContext.context.call("setMapType", value); } @@ -311,7 +278,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function showUserLocation():void { - if (!safetyCheck()) return; GoogleMapsANEContext.context.call("showUserLocation"); } @@ -327,7 +293,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function capture(x:int = 0, y:int = 0, width:int = 0, height:int = 0):void { - if (!safetyCheck()) return; var ret:* = GoogleMapsANEContext.context.call("capture", x, y, width, height) as BitmapData; if (ret is ANEError) throw ret as ANEError; } @@ -336,7 +301,6 @@ public class GoogleMapsANE extends EventDispatcher { *

Returns the last bitmap capture of the mapView

*/ public function getCapture():BitmapData { - if (!safetyCheck()) return null; var ret:* = GoogleMapsANEContext.context.call("getCapture") as BitmapData; if (ret is ANEError) throw ret as ANEError; return ret; @@ -347,7 +311,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function requestPermissions():void { - if (!safetyCheck()) return; GoogleMapsANEContext.context.call("requestPermissions"); } @@ -378,7 +341,6 @@ public class GoogleMapsANE extends EventDispatcher { */ public function set viewPort(value:Rectangle):void { _viewPort = value; - if (!safetyCheck()) return; GoogleMapsANEContext.context.call("setViewPort", _viewPort); } @@ -388,7 +350,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function showInfoWindow(id:String):void { - if (!safetyCheck()) return; GoogleMapsANEContext.context.call("showInfoWindow", id); } @@ -398,7 +359,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function hideInfoWindow(id:String):void { - if (!safetyCheck()) return; GoogleMapsANEContext.context.call("hideInfoWindow", id); } @@ -409,7 +369,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function set style(json:String):void { - if (!safetyCheck()) return; GoogleMapsANEContext.context.call("setStyle", json); } @@ -419,7 +378,6 @@ public class GoogleMapsANE extends EventDispatcher { * Ignored on Apple Maps */ public function set buildingsEnabled(value:Boolean):void { - if (!safetyCheck()) return; GoogleMapsANEContext.context.call("setBuildingsEnabled", value); } @@ -428,8 +386,7 @@ public class GoogleMapsANE extends EventDispatcher { * * Ignored on Apple Maps */ - public function set trafficEnabled(value:Boolean):void { - if (!safetyCheck()) return; + public function set trafficEnabled(value:Boolean):void { GoogleMapsANEContext.context.call("setTrafficEnabled", value); } @@ -438,8 +395,7 @@ public class GoogleMapsANE extends EventDispatcher { * * Ignored on Apple Maps */ - public function set minZoom(value:Number):void { - if (!safetyCheck()) return; + public function set minZoom(value:Number):void { GoogleMapsANEContext.context.call("setMinZoom", value); } @@ -448,8 +404,7 @@ public class GoogleMapsANE extends EventDispatcher { * * Ignored on Apple Maps */ - public function set maxZoom(value:Number):void { - if (!safetyCheck()) return; + public function set maxZoom(value:Number):void { GoogleMapsANEContext.context.call("setMaxZoom", value); } @@ -458,16 +413,14 @@ public class GoogleMapsANE extends EventDispatcher { * * Ignored on Apple Maps */ - public function set indoorEnabled(value:Boolean):void { - if (!safetyCheck()) return; + public function set indoorEnabled(value:Boolean):void { GoogleMapsANEContext.context.call("setIndoorEnabled", value); } /** * Enables or disables the my-location layer. */ - public function set myLocationEnabled(value:Boolean):void { - if (!safetyCheck()) return; + public function set myLocationEnabled(value:Boolean):void { GoogleMapsANEContext.context.call("setMyLocationEnabled", value); } @@ -477,7 +430,6 @@ public class GoogleMapsANE extends EventDispatcher { * returns null on Apple Maps */ public function get projection():Projection { - if (!safetyCheck()) return null; return _projection; } @@ -487,7 +439,6 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function set animationDuration(value:int):void { - if (!safetyCheck()) return; GoogleMapsANEContext.context.call("setAnimationDuration", value); } @@ -497,9 +448,7 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function reverseGeocodeLocation(coordinate:Coordinate):void { - if (_isInited && !GoogleMapsANEContext.isDisposed) { - GoogleMapsANEContext.context.call("reverseGeocodeLocation", coordinate); - } + GoogleMapsANEContext.context.call("reverseGeocodeLocation", coordinate); } /** @@ -508,38 +457,7 @@ public class GoogleMapsANE extends EventDispatcher { * */ public function forwardGeocodeLocation(addressString:String):void { - if (_isInited && !GoogleMapsANEContext.isDisposed) { - GoogleMapsANEContext.context.call("forwardGeocodeLocation", addressString); - } - } - - /** - * - * @return whether we have inited the Google Maps API - * - */ - public function get isInited():Boolean { - return _isInited; - } - - /** - * - * @return whether we have inited the mapView - * - */ - public function get isMapInited():Boolean { - return _isMapInited; - } - - /** - * This method is omitted from the output. * * @private - */ - private function safetyCheck():Boolean { - if (!_isInited && _isMapInited || GoogleMapsANEContext.isDisposed) { - trace("You need to init first"); - return false; - } - return true; + GoogleMapsANEContext.context.call("forwardGeocodeLocation", addressString); } //noinspection JSMethodCanBeStatic diff --git a/native_extension/src/com/tuarua/GoogleMapsANEContext.as b/native_extension/src/com/tuarua/GoogleMapsANEContext.as index 40aad69..d1d11f6 100644 --- a/native_extension/src/com/tuarua/GoogleMapsANEContext.as +++ b/native_extension/src/com/tuarua/GoogleMapsANEContext.as @@ -30,7 +30,6 @@ public class GoogleMapsANEContext { internal static const NAME:String = "GoogleMapsANE"; internal static const TRACE:String = "TRACE"; private static var _context:ExtensionContext; - private static var _isDisposed:Boolean; private static var argsAsJSON:Object; public static var markers:Dictionary = new Dictionary(); public static var circles:Dictionary = new Dictionary(); @@ -45,13 +44,9 @@ public class GoogleMapsANEContext { if (_context == null) { try { _context = ExtensionContext.createExtensionContext("com.tuarua." + NAME, null); - if (_context == null) { - throw new Error("ANE " + NAME + " not created properly. Future calls will fail."); - } _context.addEventListener(StatusEvent.STATUS, gotEvent); - _isDisposed = false; } catch (e:Error) { - trace("[" + NAME + "] ANE not loaded properly. Future calls will fail."); + throw new Error("ANE " + NAME + " not created properly. Future calls will fail."); } } return _context; @@ -67,7 +62,7 @@ public class GoogleMapsANEContext { try { argsAsJSON = JSON.parse(event.code); var coordinate:Coordinate = new Coordinate(argsAsJSON.latitude, argsAsJSON.longitude); - GoogleMapsANE.mapView.dispatchEvent(new GoogleMapsEvent(event.level, coordinate)); + GoogleMaps.mapView.dispatchEvent(new GoogleMapsEvent(event.level, coordinate)); } catch (e:Error) { trace(e.message); } @@ -85,7 +80,7 @@ public class GoogleMapsANEContext { case GoogleMapsEvent.ON_LOADED: case GoogleMapsEvent.ON_CAMERA_IDLE: case GoogleMapsEvent.ON_BITMAP_READY: - GoogleMapsANE.mapView.dispatchEvent(new GoogleMapsEvent(event.level, event.code)); + GoogleMaps.mapView.dispatchEvent(new GoogleMapsEvent(event.level, event.code)); break; case GoogleMapsEvent.DID_END_DRAGGING: try { @@ -96,7 +91,7 @@ public class GoogleMapsANEContext { var marker:Marker = markers[id] as Marker; marker.coordinate.latitude = latitude; marker.coordinate.longitude = longitude; - GoogleMapsANE.mapView.dispatchEvent(new GoogleMapsEvent(event.level, argsAsJSON)); + GoogleMaps.mapView.dispatchEvent(new GoogleMapsEvent(event.level, argsAsJSON)); } catch (e:Error) { trace(e.message); } @@ -105,7 +100,7 @@ public class GoogleMapsANEContext { case GoogleMapsEvent.ON_CAMERA_MOVE_STARTED: try { argsAsJSON = JSON.parse(event.code); - GoogleMapsANE.mapView.dispatchEvent(new GoogleMapsEvent(event.level, argsAsJSON)); + GoogleMaps.mapView.dispatchEvent(new GoogleMapsEvent(event.level, argsAsJSON)); } catch (e:Error) { trace(e.message); } @@ -113,7 +108,7 @@ public class GoogleMapsANEContext { case LocationEvent.LOCATION_UPDATED: try { argsAsJSON = JSON.parse(event.code); - GoogleMapsANE.mapView.dispatchEvent(new LocationEvent(event.level, + GoogleMaps.mapView.dispatchEvent(new LocationEvent(event.level, new Coordinate(argsAsJSON.latitude, argsAsJSON.longitude))); } catch (e:Error) { trace(e.message); @@ -122,7 +117,7 @@ public class GoogleMapsANEContext { case LocationEvent.ON_ADDRESS_LOOKUP: try { argsAsJSON = JSON.parse(event.code); - GoogleMapsANE.mapView.dispatchEvent(new LocationEvent(event.level, + GoogleMaps.mapView.dispatchEvent(new LocationEvent(event.level, new Coordinate(argsAsJSON.latitude, argsAsJSON.longitude), new Address( argsAsJSON.formattedAddress, @@ -137,12 +132,12 @@ public class GoogleMapsANEContext { } break; case LocationEvent.ON_ADDRESS_LOOKUP_ERROR: - GoogleMapsANE.mapView.dispatchEvent(new LocationEvent(event.level, null, null, event.code)); + GoogleMaps.mapView.dispatchEvent(new LocationEvent(event.level, null, null, event.code)); break; case PermissionEvent.ON_PERMISSION_STATUS: try { argsAsJSON = JSON.parse(event.code); - GoogleMapsANE.mapView.dispatchEvent(new PermissionEvent(event.level, argsAsJSON)); + GoogleMaps.mapView.dispatchEvent(new PermissionEvent(event.level, argsAsJSON)); } catch (e:Error) { trace(e.message); } @@ -151,18 +146,11 @@ public class GoogleMapsANEContext { } public static function dispose():void { - if (!_context) { - return; - } - _isDisposed = true; + if (!_context) return; trace("[" + NAME + "] Unloading ANE..."); _context.removeEventListener(StatusEvent.STATUS, gotEvent); _context.dispose(); _context = null; } - - public static function get isDisposed():Boolean { - return _isDisposed; - } } } From e5a420aabdd84b5c6a5757c099c61d25b4d6b494 Mon Sep 17 00:00:00 2001 From: Tua Rua Date: Sun, 9 Feb 2020 16:48:03 +0000 Subject: [PATCH 08/12] Update StarlingRoot.as --- example/src/StarlingRoot.as | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/example/src/StarlingRoot.as b/example/src/StarlingRoot.as index a29ed41..2430a5d 100644 --- a/example/src/StarlingRoot.as +++ b/example/src/StarlingRoot.as @@ -88,7 +88,7 @@ public class StarlingRoot extends Sprite { NativeApplication.nativeApplication.addEventListener(Event.EXITING, onExiting); var _assets:AssetManager = assets; - GoogleMaps.key = "AIzaSyCkmGADGPLtu9WOiRzK_3r9XXw8-3DHvEc"; + GoogleMaps.key = "xxxx"; GoogleMaps.mapProvider = MapProvider.GOOGLE; try { mapView = GoogleMaps.mapView; @@ -524,4 +524,4 @@ public class StarlingRoot extends Sprite { GoogleMaps.dispose(); } } -} \ No newline at end of file +} From 0b6df2752f34f4277e8a64f6a6e3129aea48dc07 Mon Sep 17 00:00:00 2001 From: Eoin Landy Date: Sun, 9 Feb 2020 20:51:08 +0000 Subject: [PATCH 09/12] asdocs --- native_extension/ane/docs/com.tuarua.fre.xml | 2 +- native_extension/ane/docs/com.tuarua.xml | 84 +++++++++----------- 2 files changed, 39 insertions(+), 47 deletions(-) diff --git a/native_extension/ane/docs/com.tuarua.fre.xml b/native_extension/ane/docs/com.tuarua.fre.xml index cf666e6..36ca46e 100644 --- a/native_extension/ane/docs/com.tuarua.fre.xml +++ b/native_extension/ane/docs/com.tuarua.fre.xml @@ -1 +1 @@ -com.tuarua.freANEErrorErrorANEErrormessageerrorIDtypesourcestackTracegetStackTraceerrorIDsourcetypeANEUtilsObjectANEUtilsgetClassPropsclzgetClassPropsclzgetClassTypeclzgetClassTypeclzgetClassobjgetClassobjmapfromto \ No newline at end of file +com.tuarua.freANEErrorErrorANEErrormessageerrorIDtypesourcestackTracegetStackTraceerrorIDsourcetype \ No newline at end of file diff --git a/native_extension/ane/docs/com.tuarua.xml b/native_extension/ane/docs/com.tuarua.xml index 6d8d8f6..105c4ad 100644 --- a/native_extension/ane/docs/com.tuarua.xml +++ b/native_extension/ane/docs/com.tuarua.xml @@ -1,30 +1,30 @@ -com.tuaruaGoogleMapsANEContextObjectGoogleMapsANEContextdisposeNAMEGoogleMapsANETRACETRACEcirclesunknowngroundOverlaysunknownmarkersunknownpolygonsunknownpolylinesunknowncontextisDisposedGoogleMapsANEflash.events:EventDispatcherGoogleMapsANEaddCircle +com.tuaruaGoogleMapsANEContextObjectGoogleMapsANEContextdisposeNAMEGoogleMapsANETRACETRACEcirclesunknowngroundOverlaysunknownmarkersunknownpolygonsunknownpolylinesunknowncontextGoogleMapsflash.events:EventDispatcherGoogleMapsaddCircle circlecom.tuarua.googlemaps:Circle - addEventListener + addEventListener type listener useCapturefalse priority0 useWeakReferencefalse - addGroundOverlaygroundOverlaycom.tuarua.googlemaps:GroundOverlayaddMarker + addGroundOverlaygroundOverlaycom.tuarua.googlemaps:GroundOverlayaddMarker markercom.tuarua.googlemaps:Marker - addPolygon + addPolygon polygoncom.tuarua.googlemaps:Polygon - addPolyline + addPolyline polylinecom.tuarua.googlemaps:Polyline - capture + capture x0 y0 width0leaving as default of 0 captures the full width height0leaving as default of 0 captures the full height @@ -34,158 +34,150 @@ - clear + clear - disposeforwardGeocodeLocation + disposeforwardGeocodeLocation addressString - getCapture + getCapture Returns the last bitmap capture of the mapView

Returns the last bitmap capture of the mapView

-
hideInfoWindow + hideInfoWindow id - initMap + initMap viewPort centerAtcom.tuarua.googlemaps:Coordinate zoomLevel settingscom.tuarua.googlemaps:Settings scaleFactor1.0 - moveCamera + moveCamera positioncom.tuarua.googlemaps:CameraPosition animatesfalse - removeEventListener + removeEventListener type listener useCapturefalse - requestPermissions + requestPermissions - reverseGeocodeLocation + reverseGeocodeLocation coordinatecom.tuarua.googlemaps:Coordinate - scrollBy + scrollBy x y animatesfalse

Android Only.

-
setBounds + setBounds boundscom.tuarua.googlemaps:CoordinateBounds animatesfalse - showInfoWindow + showInfoWindow id - showUserLocation + showUserLocation - zoomIn + zoomIn animatesfalse - zoomOut + zoomOut animatesfalse - zoomTo + zoomTo zoomLevel animatesfalse - circles +
circles - groundOverlays + groundOverlays - isInited - - - - isMapInited - - - - mapViewcom.tuarua:GoogleMapsANEmarkers + mapViewcom.tuarua:GoogleMapsmarkers - polylines + polylines - projection + projection Returns a Projection object that you can use to convert between screen coordinates and latitude/longitude coordinates.com.tuarua.googlemaps:Projection Returns a Projection object that you can use to convert between screen coordinates and latitude/longitude coordinates. returns null on Apple Maps - viewPort + viewPort - visible + visible - animationDuration + animationDuration - buildingsEnabled + buildingsEnabled Sets whether 3D buildings layer is enabled. Sets whether 3D buildings layer is enabled. (default true). Ignored on Apple Maps - indoorEnabled + indoorEnabled Sets whether 3D buildings layer is enabled. Sets whether 3D buildings layer is enabled. (default true). Ignored on Apple Maps - keymapProvidermapType + keymapProvidermapType - maxZoom + maxZoom Maximum zoom (the closest the camera may be to the Earth). Maximum zoom (the closest the camera may be to the Earth). Ignored on Apple Maps - minZoom + minZoom Minimum zoom (the farthest the camera may be zoomed out). Minimum zoom (the farthest the camera may be zoomed out). Ignored on Apple Maps - myLocationEnabled + myLocationEnabled Enables or disables the my-location layer. Enables or disables the my-location layer. - style + style - trafficEnabled + trafficEnabled Controls whether the map is drawing traffic data, if available. Controls whether the map is drawing traffic data, if available. From 4c7ece479800f288bf32abf2b4771c4e8e4610b8 Mon Sep 17 00:00:00 2001 From: Eoin Landy Date: Sun, 23 Feb 2020 20:06:33 +0000 Subject: [PATCH 10/12] FreSwift 4.3.0 --- CHANGELOG.md | 2 +- README.md | 2 +- example/get_ios_dependencies.sh | 2 +- native_library/ios/GoogleMapsANE/Cartfile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b128c09..226be4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ - AND: Updated to Android Play Services to 17.0.0 - AND: Updated to Jetpack - iOS: Updated to Google Maps SDK 3.7.0 -- iOS: Updated to FreSwift 4.2.0 +- iOS: Updated to FreSwift 4.3.0 ### 2.5.0 - AND: Updated to FreKotlin 1.8.0 diff --git a/README.md b/README.md index 23e6cb1..7029ef6 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,7 @@ You will need: - IntelliJ IDEA / Flash Builder - AIR 33.0.2.338+ - Xcode 11.3 -- [wget](http://rudix.org/packages/wget.html) on macOS +- * wget on macOS via `brew install wget` - Android Studio 3 if you wish to edit the Android source - Powershell on Windows diff --git a/example/get_ios_dependencies.sh b/example/get_ios_dependencies.sh index 057e97d..5ab1f18 100755 --- a/example/get_ios_dependencies.sh +++ b/example/get_ios_dependencies.sh @@ -1,7 +1,7 @@ #!/bin/sh AneVersion="2.6.0" -FreSwiftVersion="4.2.0" +FreSwiftVersion="4.3.0" rm -r ios_dependencies/device rm -r ios_dependencies/simulator diff --git a/native_library/ios/GoogleMapsANE/Cartfile b/native_library/ios/GoogleMapsANE/Cartfile index 9d624cb..5ba3e0d 100644 --- a/native_library/ios/GoogleMapsANE/Cartfile +++ b/native_library/ios/GoogleMapsANE/Cartfile @@ -1 +1 @@ -binary "https://github.com/tuarua/Swift-IOS-ANE/releases/download/4.2.0/FreSwift.json" ~> 4.2.0 \ No newline at end of file +binary "https://github.com/tuarua/Swift-IOS-ANE/releases/download/4.3.0/FreSwift.json" ~> 4.3.0 \ No newline at end of file From 3f499b3a843c5a6c8243810febdbda62783c67a9 Mon Sep 17 00:00:00 2001 From: Eoin Landy Date: Wed, 4 Mar 2020 20:50:14 +0000 Subject: [PATCH 11/12] no message --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7029ef6..410216a 100644 --- a/README.md +++ b/README.md @@ -123,10 +123,10 @@ You should use AIR 32 for iOS builds You will need: -- IntelliJ IDEA / Flash Builder +- IntelliJ IDEA - AIR 33.0.2.338+ - Xcode 11.3 -- * wget on macOS via `brew install wget` +- wget on macOS via `brew install wget` - Android Studio 3 if you wish to edit the Android source - Powershell on Windows From db36437b4a615a1991f561f6a1dc1bc5f9ae0f0b Mon Sep 17 00:00:00 2001 From: Eoin Landy Date: Fri, 6 Mar 2020 22:17:01 +0000 Subject: [PATCH 12/12] no message --- README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README.md b/README.md index 410216a..69e1289 100644 --- a/README.md +++ b/README.md @@ -76,9 +76,6 @@ You will also need to include the following in your app manifest. Update accordi ``` -#### AIR 32 & 33 -This ANE is built against AIR 33 SDK. If you wish to use with AIR 32 you will need to replace dx.jar in lib/android/bin/ with [this one](https://github.com/tuarua/Android-ANE-Dependencies/blob/master/AIR32_patch/lib/android/bin/dx.jar?raw=true) - ------------- ## iOS @@ -116,9 +113,6 @@ You will also need to include the following in your app manifest. Update accordi You will need a Google API key [https://developers.google.com/maps/documentation/ios-sdk/get-api-key] -#### AIR 32 & 33 -You should use AIR 32 for iOS builds - ### Prerequisites You will need: