From ad86a058d4ee66a8efca83e641d130a72443e0e6 Mon Sep 17 00:00:00 2001 From: timhagn Date: Wed, 11 Nov 2015 19:25:42 +0100 Subject: [PATCH 01/25] Added color as Marker property --- .../java/com/rota/rngmaps/RNGMapsModule.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index a9cba92..367a883 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -20,6 +20,7 @@ import com.google.android.gms.maps.model.LatLngBounds; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; +import com.google.android.gms.maps.model.BitmapDescriptorFactory; import java.util.ArrayList; import java.util.Map; @@ -64,7 +65,7 @@ protected MapView createViewInstance(ThemedReactContext context) { if (map == null) { sendMapError("Map is null", "map_null"); } else { - map.getUiSettings().setMyLocationButtonEnabled(false); + map.getUiSettings().setMyLocationButtonEnabled(true); map.setMyLocationEnabled(true); try { @@ -116,12 +117,14 @@ private Boolean updateCenter (CatalystStylesDiffMap props) { if(props.hasKey(PROP_ZOOM_LEVEL)) { int zoomLevel = props.getInt(PROP_ZOOM_LEVEL, 10); + Log.i("Maps", "Zoom: " + Integer.toString(props.getInt(PROP_ZOOM_LEVEL, 10))); cameraUpdate = CameraUpdateFactory .newLatLngZoom( new LatLng(lat, lng), - props.getInt(PROP_ZOOM_LEVEL, 10) + zoomLevel ); } else { + Log.i("Maps", "Default Zoom."); cameraUpdate = CameraUpdateFactory.newLatLng(new LatLng(lat, lng)); } @@ -135,6 +138,17 @@ private Boolean updateCenter (CatalystStylesDiffMap props) { } } + public void moveCamera(Double lat, Double lng) { + try { + CameraUpdate cameraUpdate; + cameraUpdate = CameraUpdateFactory.newLatLng(new LatLng(lat, lng)); + map.animateCamera(cameraUpdate); + } catch (Exception e) { + // ERROR! + e.printStackTrace(); + } + } + private Boolean updateMarkers (CatalystStylesDiffMap props) { try { @@ -159,6 +173,9 @@ private Boolean updateMarkers (CatalystStylesDiffMap props) { if(marker.hasKey("title")) { options.title(marker.getString("title")); } + if(marker.hasKey("color")) { + options.icon(BitmapDescriptorFactory.defaultMarker((float) marker.getDouble("color"))); + } mapMarkers.add(map.addMarker(options)); } else break; @@ -202,4 +219,7 @@ public void updateView(MapView view, CatalystStylesDiffMap props) { } } + + } + From 3bf24c0c5ab61e118b978d2463ac4111d9bf8c42 Mon Sep 17 00:00:00 2001 From: timhagn Date: Thu, 12 Nov 2015 14:03:10 +0100 Subject: [PATCH 02/25] Fixed Buf with updateCenter() - loosing zoom when .newLatLng alone was called --- .../java/com/rota/rngmaps/RNGMapsModule.java | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index 367a883..eff8cc3 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -49,6 +49,8 @@ public class RNGMapsModule extends SimpleViewManager { @UIProp(UIProp.Type.BOOLEAN) public static final String PROP_ZOOM_ON_MARKERS = "zoomOnMarkers"; + protected Integer mlastZoom; + @Override public String getName() { return REACT_CLASS; @@ -100,7 +102,7 @@ public void onCameraChange(CameraPosition position) { latLng.putDouble("lng", position.target.longitude); params.putMap("latLng", latLng); - params.putDouble("zoomLevel", position.zoom); + params.putInt("zoomLevel",(int) position.zoom); reactContext .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) @@ -117,6 +119,7 @@ private Boolean updateCenter (CatalystStylesDiffMap props) { if(props.hasKey(PROP_ZOOM_LEVEL)) { int zoomLevel = props.getInt(PROP_ZOOM_LEVEL, 10); + mlastZoom = zoomLevel; Log.i("Maps", "Zoom: " + Integer.toString(props.getInt(PROP_ZOOM_LEVEL, 10))); cameraUpdate = CameraUpdateFactory .newLatLngZoom( @@ -125,9 +128,15 @@ private Boolean updateCenter (CatalystStylesDiffMap props) { ); } else { Log.i("Maps", "Default Zoom."); - cameraUpdate = CameraUpdateFactory.newLatLng(new LatLng(lat, lng)); + //cameraUpdate = CameraUpdateFactory.newLatLng(new LatLng(lat, lng)); + cameraUpdate = CameraUpdateFactory + .newLatLngZoom( + new LatLng(lat, lng), + mlastZoom + ); } + map.animateCamera(cameraUpdate); return true; @@ -138,17 +147,6 @@ private Boolean updateCenter (CatalystStylesDiffMap props) { } } - public void moveCamera(Double lat, Double lng) { - try { - CameraUpdate cameraUpdate; - cameraUpdate = CameraUpdateFactory.newLatLng(new LatLng(lat, lng)); - map.animateCamera(cameraUpdate); - } catch (Exception e) { - // ERROR! - e.printStackTrace(); - } - } - private Boolean updateMarkers (CatalystStylesDiffMap props) { try { @@ -210,6 +208,7 @@ private Boolean zoomOnMarkers () { @Override public void updateView(MapView view, CatalystStylesDiffMap props) { + Log.i("GMaps", props.toString()); super.updateView(view, props); if (props.hasKey(PROP_CENTER)) updateCenter(props); if (props.hasKey(PROP_ZOOM_LEVEL)) updateCenter(props); From 468e467986e95b2aca57bc3eeea94047bb3acc7a Mon Sep 17 00:00:00 2001 From: timhagn Date: Thu, 12 Nov 2015 15:40:37 +0100 Subject: [PATCH 03/25] added default color constants to index.android.js --- index.android.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/index.android.js b/index.android.js index f6d449e..ac53720 100644 --- a/index.android.js +++ b/index.android.js @@ -27,6 +27,18 @@ var gmaps = { translateY: React.PropTypes.number, rotation: React.PropTypes.number, }, + colors: { + HUE_AZURE : 210.0, + HUE_BLUE : 240.0, + HUE_CYAN : 180.0, + HUE_GREEN : 120.0, + HUE_MAGENTA : 300.0, + HUE_ORANGE : 30.0, + HUE_RED : 0.0, + HUE_ROSE : 330.0, + HUE_VIOLET : 270.0, + HUE_YELLOW : 60.0, + }, }; let MapView = requireNativeComponent('RNGMaps', gmaps); From 789ac7d7b9a78e4b776fefadc798b2a1e7033f8a Mon Sep 17 00:00:00 2001 From: timhagn Date: Thu, 12 Nov 2015 17:56:47 +0100 Subject: [PATCH 04/25] added support for custom marker icons by resource --- .../java/com/rota/rngmaps/RNGMapsModule.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index eff8cc3..ad81137 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -174,6 +174,13 @@ private Boolean updateMarkers (CatalystStylesDiffMap props) { if(marker.hasKey("color")) { options.icon(BitmapDescriptorFactory.defaultMarker((float) marker.getDouble("color"))); } + if(marker.hasKey("res")) { + // Changing marker icon to use resource + String varName = marker.getString("res"); + int resourceValue = getValueOfResource(varName); + Log.i("GMaps", marker.toString()); //R.drawable.class. //getField("bock_green"). + options.icon(BitmapDescriptorFactory.fromResource(resourceValue)); + } mapMarkers.add(map.addMarker(options)); } else break; @@ -187,6 +194,19 @@ private Boolean updateMarkers (CatalystStylesDiffMap props) { } } + @SuppressWarnings("rawtypes") + public static int getValueOfResource(String lookingForValue) + throws Exception { + Object clazz = new R.drawable(); + Class clazzType = clazz.getClass().getField(lookingForValue).getType(); + int value = 0; + if (clazzType.toString().equals("int")) { + value = clazz.getClass().getField(lookingForValue).getInt(clazz); + } + clazz = null; + return value; + } + private Boolean zoomOnMarkers () { try { int padding = 150; From 24a34b1ff8b28c6b893424a94be3e5c98ba8dc40 Mon Sep 17 00:00:00 2001 From: timhagn Date: Fri, 13 Nov 2015 16:10:51 +0100 Subject: [PATCH 05/25] added changes from @kusamakura (icon/snippet) and combined them with my icon function to make icons 'react proof' - should work with all versions now --- .../java/com/rota/rngmaps/RNGMapsModule.java | 44 ++++++++++++++++--- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index ad81137..2411770 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -1,6 +1,8 @@ package com.rota.rngmaps; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.util.Log; import com.facebook.react.bridge.Arguments; @@ -8,6 +10,7 @@ import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.ReadableType; import com.facebook.react.bridge.WritableMap; import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.uimanager.CatalystStylesDiffMap; @@ -174,12 +177,33 @@ private Boolean updateMarkers (CatalystStylesDiffMap props) { if(marker.hasKey("color")) { options.icon(BitmapDescriptorFactory.defaultMarker((float) marker.getDouble("color"))); } - if(marker.hasKey("res")) { - // Changing marker icon to use resource - String varName = marker.getString("res"); - int resourceValue = getValueOfResource(varName); - Log.i("GMaps", marker.toString()); //R.drawable.class. //getField("bock_green"). - options.icon(BitmapDescriptorFactory.fromResource(resourceValue)); + if (marker.hasKey("snippet")) { + options.snippet(marker.getString("snippet")); + } + if(marker.hasKey("icon")) { + String varName = ""; + ReadableType iconType = marker.getType("icon"); + if (iconType.compareTo(ReadableType.Map) >= 0) { + ReadableMap icon = marker.getMap("icon"); + try { + int resId = getResourceDrawableId(icon.getString("uri")); + Bitmap image = BitmapFactory.decodeResource(reactContext.getResources(), resId); + + options.icon(BitmapDescriptorFactory.fromBitmap( + Bitmap.createScaledBitmap(image, icon.getInt("width"), icon.getInt("height"), true) + )); + } catch (Exception e) { + varName = icon.getString("uri"); + } + } else if (iconType.compareTo(ReadableType.String) >= 0) { + varName = marker.getString("icon"); + } + if (!varName.equals("")) { + // Changing marker icon to use resource + int resourceValue = getValueOfResource(varName); + Log.i("GMaps", varName + marker.toString()); + options.icon(BitmapDescriptorFactory.fromResource(resourceValue)); + } } mapMarkers.add(map.addMarker(options)); @@ -239,6 +263,14 @@ public void updateView(MapView view, CatalystStylesDiffMap props) { } + private int getResourceDrawableId(String name) { + return reactContext.getResources().getIdentifier( + name.toLowerCase().replace("-", "_"), + "drawable", + reactContext.getPackageName() + ); + } + } From 25b16f49eae2d36695d076971efe40ff3d29a301 Mon Sep 17 00:00:00 2001 From: timhagn Date: Fri, 13 Nov 2015 16:41:57 +0100 Subject: [PATCH 06/25] cleanup --- .../main/java/com/rota/rngmaps/RNGMapsModule.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index 2411770..97590ef 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -6,9 +6,7 @@ import android.util.Log; import com.facebook.react.bridge.Arguments; -import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.ReactContext; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableType; import com.facebook.react.bridge.WritableMap; @@ -18,12 +16,7 @@ import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.UIProp; import com.google.android.gms.maps.*; -import com.google.android.gms.maps.model.CameraPosition; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.LatLngBounds; -import com.google.android.gms.maps.model.Marker; -import com.google.android.gms.maps.model.MarkerOptions; -import com.google.android.gms.maps.model.BitmapDescriptorFactory; +import com.google.android.gms.maps.model.*; import java.util.ArrayList; import java.util.Map; @@ -131,7 +124,11 @@ private Boolean updateCenter (CatalystStylesDiffMap props) { ); } else { Log.i("Maps", "Default Zoom."); - //cameraUpdate = CameraUpdateFactory.newLatLng(new LatLng(lat, lng)); + /* + * Changed from cameraUpdate = CameraUpdateFactory.newLatLng(new LatLng(lat, lng)); + * as it gave me "zoom" Bugs (defaulted to zoom factor 2) as soon as I put in + * "real" LNG and LAT values... + */ cameraUpdate = CameraUpdateFactory .newLatLngZoom( new LatLng(lat, lng), From 3a6dc33ec40398850c4fd16d5d5153d7106d7d19 Mon Sep 17 00:00:00 2001 From: timhagn Date: Fri, 13 Nov 2015 16:51:54 +0100 Subject: [PATCH 07/25] removed colors from android.js - wasn't working --- index.android.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/index.android.js b/index.android.js index ac53720..016c3ed 100644 --- a/index.android.js +++ b/index.android.js @@ -27,7 +27,8 @@ var gmaps = { translateY: React.PropTypes.number, rotation: React.PropTypes.number, }, - colors: { +}; +var colors = { HUE_AZURE : 210.0, HUE_BLUE : 240.0, HUE_CYAN : 180.0, @@ -38,8 +39,7 @@ var gmaps = { HUE_ROSE : 330.0, HUE_VIOLET : 270.0, HUE_YELLOW : 60.0, - }, -}; + }; let MapView = requireNativeComponent('RNGMaps', gmaps); From 0ff0db207cb9ec2f4761d1f5addab8a70599d8cf Mon Sep 17 00:00:00 2001 From: timhagn Date: Fri, 13 Nov 2015 16:57:25 +0100 Subject: [PATCH 08/25] removed colors from android.js - wasn't working --- index.android.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/index.android.js b/index.android.js index 016c3ed..f6d449e 100644 --- a/index.android.js +++ b/index.android.js @@ -28,18 +28,6 @@ var gmaps = { rotation: React.PropTypes.number, }, }; -var colors = { - HUE_AZURE : 210.0, - HUE_BLUE : 240.0, - HUE_CYAN : 180.0, - HUE_GREEN : 120.0, - HUE_MAGENTA : 300.0, - HUE_ORANGE : 30.0, - HUE_RED : 0.0, - HUE_ROSE : 330.0, - HUE_VIOLET : 270.0, - HUE_YELLOW : 60.0, - }; let MapView = requireNativeComponent('RNGMaps', gmaps); From bc19542e91796543682382a82c36ea9e2e76f7a3 Mon Sep 17 00:00:00 2001 From: timhagn Date: Fri, 13 Nov 2015 17:09:32 +0100 Subject: [PATCH 09/25] updated README.md --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3771546..ee5f008 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,15 @@ let RNGMap = require('react-native-gmaps'); style={ { height: 500, width: 500 } } markers={ [ { coordinates: {lng: 0.1, lat: 51.0} }, - { coordinates: {lng: -0.1, lat: 51.0}, title: "Click marker to see this title!" } + { + coordinates: {lng: -0.1, lat: 51.0}, + title: "Click marker to see this title!" + snippet: "Subtitle" + /* + * Able to use "my_icon" or {uri: 'my_icon', width: 100, height: 100 } here as well + */ + icon = require('image!my_icon') + } ] } zoomLevel={10} onMapChange={(e) => console.log(e)} From 7d192dd97414ae35f713aad61c691560a365ee71 Mon Sep 17 00:00:00 2001 From: timhagn Date: Fri, 13 Nov 2015 17:11:23 +0100 Subject: [PATCH 10/25] updated README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index ee5f008..f0e58d1 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,10 @@ let RNGMap = require('react-native-gmaps'); * Able to use "my_icon" or {uri: 'my_icon', width: 100, height: 100 } here as well */ icon = require('image!my_icon') + /* + * color is only working with default icon + */ + color: 120, } ] } zoomLevel={10} From 357c5c5bf885a605fbabd4cda7fc8ec36f12189d Mon Sep 17 00:00:00 2001 From: timhagn Date: Wed, 18 Nov 2015 16:31:19 +0100 Subject: [PATCH 11/25] removed 'getValueOfResource' --- .../java/com/rota/rngmaps/RNGMapsModule.java | 69 +++++++++---------- 1 file changed, 31 insertions(+), 38 deletions(-) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index 97590ef..345c610 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -18,6 +18,7 @@ import com.google.android.gms.maps.*; import com.google.android.gms.maps.model.*; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Map; @@ -61,31 +62,31 @@ protected MapView createViewInstance(ThemedReactContext context) { map = mView.getMap(); if (map == null) { - sendMapError("Map is null", "map_null"); + sendMapError("Map is null", "map_null"); } else { - map.getUiSettings().setMyLocationButtonEnabled(true); - map.setMyLocationEnabled(true); - - try { - MapsInitializer.initialize(context.getApplicationContext()); - map.setOnCameraChangeListener(getCameraChangeListener()); - } catch (Exception e) { - e.printStackTrace(); - sendMapError("Map initialize error", "map_init_error"); - } + map.getUiSettings().setMyLocationButtonEnabled(true); + map.setMyLocationEnabled(true); + + try { + MapsInitializer.initialize(context.getApplicationContext()); + map.setOnCameraChangeListener(getCameraChangeListener()); + } catch (Exception e) { + e.printStackTrace(); + sendMapError("Map initialize error", "map_init_error"); + } } return mView; } private void sendMapError (String message, String type) { - WritableMap error = Arguments.createMap(); - error.putString("message", message); - error.putString("type", type); + WritableMap error = Arguments.createMap(); + error.putString("message", message); + error.putString("type", type); - reactContext - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit("mapError", error); + reactContext + .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) + .emit("mapError", error); } private GoogleMap.OnCameraChangeListener getCameraChangeListener() { @@ -174,7 +175,7 @@ private Boolean updateMarkers (CatalystStylesDiffMap props) { if(marker.hasKey("color")) { options.icon(BitmapDescriptorFactory.defaultMarker((float) marker.getDouble("color"))); } - if (marker.hasKey("snippet")) { + if (marker.hasKey("snippet")) { options.snippet(marker.getString("snippet")); } if(marker.hasKey("icon")) { @@ -197,7 +198,7 @@ private Boolean updateMarkers (CatalystStylesDiffMap props) { } if (!varName.equals("")) { // Changing marker icon to use resource - int resourceValue = getValueOfResource(varName); + int resourceValue = getResourceDrawableId(varName); Log.i("GMaps", varName + marker.toString()); options.icon(BitmapDescriptorFactory.fromResource(resourceValue)); } @@ -215,19 +216,6 @@ private Boolean updateMarkers (CatalystStylesDiffMap props) { } } - @SuppressWarnings("rawtypes") - public static int getValueOfResource(String lookingForValue) - throws Exception { - Object clazz = new R.drawable(); - Class clazzType = clazz.getClass().getField(lookingForValue).getType(); - int value = 0; - if (clazzType.toString().equals("int")) { - value = clazz.getClass().getField(lookingForValue).getInt(clazz); - } - clazz = null; - return value; - } - private Boolean zoomOnMarkers () { try { int padding = 150; @@ -255,17 +243,22 @@ public void updateView(MapView view, CatalystStylesDiffMap props) { if (props.hasKey(PROP_ZOOM_LEVEL)) updateCenter(props); if (props.hasKey(PROP_MARKERS)) updateMarkers(props); if (props.hasKey(PROP_ZOOM_ON_MARKERS)&&props.getBoolean(PROP_ZOOM_ON_MARKERS, false)) { - zoomOnMarkers(); + zoomOnMarkers(); } } private int getResourceDrawableId(String name) { - return reactContext.getResources().getIdentifier( - name.toLowerCase().replace("-", "_"), - "drawable", - reactContext.getPackageName() - ); + try { + return reactContext.getResources().getIdentifier( + name.toLowerCase().replace("-", "_"), + "drawable", + reactContext.getPackageName() + ); + } catch (Exception e) { + Log.e("RNGMaps", "Failure to get drawable id.", e); + return 0; + } } From f44a92c4438b49a6147de6146f08ed759a01db74 Mon Sep 17 00:00:00 2001 From: timhagn Date: Wed, 18 Nov 2015 16:31:24 +0100 Subject: [PATCH 12/25] removed 'getValueOfResource' --- .../main/java/com/rota/rngmaps/RNGMapsModule.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index 345c610..43043b9 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -28,6 +28,8 @@ public class RNGMapsModule extends SimpleViewManager { public static final String REACT_CLASS = "RNGMaps"; + // Unique Name for Log TAG + public static final String TAG = RNGMapsModule.class.getSimpleName(); private MapView mView; private GoogleMap map; @@ -117,14 +119,14 @@ private Boolean updateCenter (CatalystStylesDiffMap props) { if(props.hasKey(PROP_ZOOM_LEVEL)) { int zoomLevel = props.getInt(PROP_ZOOM_LEVEL, 10); mlastZoom = zoomLevel; - Log.i("Maps", "Zoom: " + Integer.toString(props.getInt(PROP_ZOOM_LEVEL, 10))); + Log.i(TAG, "Zoom: " + Integer.toString(props.getInt(PROP_ZOOM_LEVEL, 10))); cameraUpdate = CameraUpdateFactory .newLatLngZoom( new LatLng(lat, lng), zoomLevel ); } else { - Log.i("Maps", "Default Zoom."); + Log.i(TAG, "Default Zoom."); /* * Changed from cameraUpdate = CameraUpdateFactory.newLatLng(new LatLng(lat, lng)); * as it gave me "zoom" Bugs (defaulted to zoom factor 2) as soon as I put in @@ -199,7 +201,7 @@ private Boolean updateMarkers (CatalystStylesDiffMap props) { if (!varName.equals("")) { // Changing marker icon to use resource int resourceValue = getResourceDrawableId(varName); - Log.i("GMaps", varName + marker.toString()); + Log.i(TAG, varName + marker.toString()); options.icon(BitmapDescriptorFactory.fromResource(resourceValue)); } } @@ -237,7 +239,7 @@ private Boolean zoomOnMarkers () { @Override public void updateView(MapView view, CatalystStylesDiffMap props) { - Log.i("GMaps", props.toString()); + Log.i(TAG, props.toString()); super.updateView(view, props); if (props.hasKey(PROP_CENTER)) updateCenter(props); if (props.hasKey(PROP_ZOOM_LEVEL)) updateCenter(props); @@ -256,7 +258,7 @@ private int getResourceDrawableId(String name) { reactContext.getPackageName() ); } catch (Exception e) { - Log.e("RNGMaps", "Failure to get drawable id.", e); + Log.e(TAG, "Failure to get drawable id.", e); return 0; } } From ca37cefad051022928efa6206b2c82ee2d58c9ad Mon Sep 17 00:00:00 2001 From: timhagn Date: Tue, 24 Nov 2015 15:48:05 +0100 Subject: [PATCH 13/25] added merge from @kusamakura onMarkerClick --- .../java/com/rota/rngmaps/RNGMapsModule.java | 65 ++++++++++++++----- index.android.js | 39 ++++++++--- 2 files changed, 76 insertions(+), 28 deletions(-) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index 43043b9..50029ab 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -18,9 +18,8 @@ import com.google.android.gms.maps.*; import com.google.android.gms.maps.model.*; -import java.lang.reflect.Field; import java.util.ArrayList; -import java.util.Map; +import java.util.HashMap; /** * Created by Henry on 08/10/2015. @@ -35,6 +34,7 @@ public class RNGMapsModule extends SimpleViewManager { private GoogleMap map; private ReactContext reactContext; private ArrayList mapMarkers = new ArrayList(); + private HashMap markerLookup = new HashMap(); @UIProp(UIProp.Type.MAP) public static final String PROP_CENTER = "center"; @@ -72,6 +72,7 @@ protected MapView createViewInstance(ThemedReactContext context) { try { MapsInitializer.initialize(context.getApplicationContext()); map.setOnCameraChangeListener(getCameraChangeListener()); + map.setOnMarkerClickListener(getMarkerClickListener()); } catch (Exception e) { e.printStackTrace(); sendMapError("Map initialize error", "map_init_error"); @@ -110,6 +111,26 @@ public void onCameraChange(CameraPosition position) { }; } + private GoogleMap.OnMarkerClickListener getMarkerClickListener() { + return new GoogleMap.OnMarkerClickListener() { + @Override + public boolean onMarkerClick(Marker marker) { + String id = marker.getId(); + + if (markerLookup.containsKey(id)) { + WritableMap event = Arguments.createMap(); + event.putString("id", markerLookup.get(id)); + + reactContext + .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) + .emit("markerClick", event); + } + + return false; + } + }; + } + private Boolean updateCenter (CatalystStylesDiffMap props) { try { CameraUpdate cameraUpdate; @@ -158,33 +179,34 @@ private Boolean updateMarkers (CatalystStylesDiffMap props) { marker.remove(); } mapMarkers.clear(); + markerLookup.clear(); // All markers to map for (int i = 0; i < props.getArray(PROP_MARKERS).size(); i++) { MarkerOptions options = new MarkerOptions(); - ReadableMap marker = props.getArray(PROP_MARKERS).getMap(i); - if(marker.hasKey("coordinates")) { + ReadableMap markerJson = props.getArray(PROP_MARKERS).getMap(i); + if(markerJson.hasKey("coordinates")) { options.position(new LatLng( - marker.getMap("coordinates").getDouble("lat"), - marker.getMap("coordinates").getDouble("lng") + markerJson.getMap("coordinates").getDouble("lat"), + markerJson.getMap("coordinates").getDouble("lng") ) ); - if(marker.hasKey("title")) { - options.title(marker.getString("title")); + if(markerJson.hasKey("title")) { + options.title(markerJson.getString("title")); } - if(marker.hasKey("color")) { - options.icon(BitmapDescriptorFactory.defaultMarker((float) marker.getDouble("color"))); + if(markerJson.hasKey("color")) { + options.icon(BitmapDescriptorFactory.defaultMarker((float) markerJson.getDouble("color"))); } - if (marker.hasKey("snippet")) { - options.snippet(marker.getString("snippet")); + if (markerJson.hasKey("snippet")) { + options.snippet(markerJson.getString("snippet")); } - if(marker.hasKey("icon")) { + if(markerJson.hasKey("icon")) { String varName = ""; - ReadableType iconType = marker.getType("icon"); + ReadableType iconType = markerJson.getType("icon"); if (iconType.compareTo(ReadableType.Map) >= 0) { - ReadableMap icon = marker.getMap("icon"); + ReadableMap icon = markerJson.getMap("icon"); try { int resId = getResourceDrawableId(icon.getString("uri")); Bitmap image = BitmapFactory.decodeResource(reactContext.getResources(), resId); @@ -196,16 +218,23 @@ private Boolean updateMarkers (CatalystStylesDiffMap props) { varName = icon.getString("uri"); } } else if (iconType.compareTo(ReadableType.String) >= 0) { - varName = marker.getString("icon"); + varName = markerJson.getString("icon"); } if (!varName.equals("")) { // Changing marker icon to use resource int resourceValue = getResourceDrawableId(varName); - Log.i(TAG, varName + marker.toString()); + Log.i(TAG, varName + markerJson.toString()); options.icon(BitmapDescriptorFactory.fromResource(resourceValue)); } } - mapMarkers.add(map.addMarker(options)); + + Marker marker = map.addMarker(options); + + if (markerJson.hasKey("id")) { + markerLookup.put(marker.getId(), markerJson.getString("id")); + } + + mapMarkers.add(marker); } else break; } diff --git a/index.android.js b/index.android.js index f6d449e..4bab2e1 100644 --- a/index.android.js +++ b/index.android.js @@ -34,31 +34,46 @@ let MapView = requireNativeComponent('RNGMaps', gmaps); class RNGMaps extends Component { constructor (props) { super(props); - this._event = null; + + this._listeners = { + mapError: null, + mapChange: null, + markerClick: null, + }; + + // Look up markers by id + this._markersLookup = {}; this.state = { zoomOnMarkers: false, markers: [] } } - componentDidMount () { - this._event = DeviceEventEmitter.addListener('mapChange', (e: Event) => { - this.props.onMapChange&&this.props.onMapChange(e); +componentDidMount () { + this._listeners.mapError = DeviceEventEmitter.addListener('mapError', (e: Event) => { + console.log(`[GMAP_ERROR]: ${e.message}`); + this.props.onMapError && this.props.onMapError(e); }); - this._error = DeviceEventEmitter.addListener('mapError', (e: Event) => { - console.log(`[GMAP_ERROR]: ${e.message}`); - this.props.onMapError&&this.props.onMapError(e); + this._listeners.mapChange = DeviceEventEmitter.addListener('mapChange', (e: Event) => { + this.props.onMapChange && this.props.onMapChange(e); + }); + + this._listeners.markerClick = DeviceEventEmitter.addListener('markerClick', (e: Event) => { + let marker = this._markersLookup[e.id]; + marker && this.props.onMarkerClick && this.props.onMarkerClick(marker); }); this.updateMarkers(this.props.markers); } componentWillUnmount () { - this._event&&this._event.remove(); - this._error&&this._error.remove(); + this._listeners.mapError && this._listeners.mapError.remove(); + this._listeners.mapChange && this._listeners.mapChange.remove(); + this._listeners.markerClick && this._listeners.markerClick.remove(); } + zoomOnMarkers (bool) { // HACK: Bleurgh, forcing the change on zoomOnMarkers. this.setState({ zoomOnMarkers: null }, () => { @@ -68,7 +83,11 @@ class RNGMaps extends Component { updateMarkers (markers) { let newMarkers = []; - for (var i = 0; i < markers.length; i++) newMarkers.push(markers[i]); + for (var i = 0; i < markers.length; i++) { + let marker = markers[i]; + this._markersLookup[marker.id] = marker; + newMarkers.push(marker); + } this.setState({ markers: newMarkers }); } From 5482cd23fdc6fc8b70284bf0cf94199ad198e25c Mon Sep 17 00:00:00 2001 From: timhagn Date: Wed, 25 Nov 2015 16:13:14 +0100 Subject: [PATCH 14/25] changed build.gradle to prevent Dex Errors in React Native 0.15.+ --- android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 852bf0e..ea4d866 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -24,5 +24,5 @@ dependencies { testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.0' compile 'com.facebook.react:react-native:0.12.0' - compile 'com.google.android.gms:play-services:8.1.0' + compile 'com.google.android.gms:play-services-maps:8.1.0' } From 27a0705dce34c87cfe03e2a7fa3eb294ee99f668 Mon Sep 17 00:00:00 2001 From: timhagn Date: Wed, 2 Dec 2015 23:02:01 +0100 Subject: [PATCH 15/25] Updated to @ReactProp to make it compatible with RN 0.15.0 --- .../java/com/rota/rngmaps/RNGMapsModule.java | 94 ++++++++++++------- package.json | 2 +- 2 files changed, 63 insertions(+), 33 deletions(-) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index 50029ab..2743303 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -3,23 +3,29 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import javax.annotation.Nullable; import android.util.Log; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.ReactContext; +import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableType; +import com.facebook.react.bridge.WritableArray; +import com.facebook.react.bridge.WritableNativeArray; import com.facebook.react.bridge.WritableMap; import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.uimanager.CatalystStylesDiffMap; import com.facebook.react.uimanager.SimpleViewManager; import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.UIProp; +import com.facebook.react.uimanager.ReactProp; import com.google.android.gms.maps.*; import com.google.android.gms.maps.model.*; import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; /** * Created by Henry on 08/10/2015. @@ -35,20 +41,58 @@ public class RNGMapsModule extends SimpleViewManager { private ReactContext reactContext; private ArrayList mapMarkers = new ArrayList(); private HashMap markerLookup = new HashMap(); + private WritableMap properties = Arguments.createMap(); - @UIProp(UIProp.Type.MAP) - public static final String PROP_CENTER = "center"; + public static final String[] markerProps = { + "title", + "coordinates", + "color", + "snippet", + "icon", + "id" + }; - @UIProp(UIProp.Type.NUMBER) + public static final String PROP_CENTER = "center"; public static final String PROP_ZOOM_LEVEL = "zoomLevel"; - - @UIProp(UIProp.Type.ARRAY) public static final String PROP_MARKERS = "markers"; - - @UIProp(UIProp.Type.BOOLEAN) public static final String PROP_ZOOM_ON_MARKERS = "zoomOnMarkers"; - protected Integer mlastZoom; + @ReactProp(name = PROP_CENTER) + public void setPropCenter(MapView view, @Nullable ReadableMap center) { + if (center != null) { + WritableMap centerLatLng = Arguments.createMap(); + WritableMap centerMap = Arguments.createMap(); + centerLatLng.putDouble("lat", center.getDouble("lat")); + centerLatLng.putDouble("lng", center.getDouble("lng")); + + centerMap.putMap("center", centerLatLng); + properties.merge(centerMap); + updateCenter(); + } + } + + @ReactProp(name = PROP_ZOOM_LEVEL, defaultInt = 10) + public void setPropZoomLevel(MapView view, int zoomLevel) { + properties.putInt(PROP_ZOOM_LEVEL, zoomLevel); + updateCenter(); + } + + @ReactProp(name = PROP_MARKERS) + public void setPropMarkers(MapView view, @Nullable ReadableArray markersArray) { + if (markersArray != null) { + updateMarkers(markersArray); + } + } + + @ReactProp(name = PROP_ZOOM_ON_MARKERS, defaultBoolean = false) + public void setPropZoomOnMarkers(MapView view, Boolean shallZoomOnMarkers) { + properties.putBoolean(PROP_ZOOM_ON_MARKERS, shallZoomOnMarkers); + if (shallZoomOnMarkers) { + zoomOnMarkers(); + } + } + + protected int mlastZoom = 10; @Override public String getName() { @@ -56,7 +100,7 @@ public String getName() { } @Override - protected MapView createViewInstance(ThemedReactContext context) { + public MapView createViewInstance(ThemedReactContext context) { reactContext = context; mView = new MapView(context); mView.onCreate(null); @@ -131,16 +175,16 @@ public boolean onMarkerClick(Marker marker) { }; } - private Boolean updateCenter (CatalystStylesDiffMap props) { + private Boolean updateCenter () { try { CameraUpdate cameraUpdate; - Double lng = props.getMap(PROP_CENTER).getDouble("lng"); - Double lat = props.getMap(PROP_CENTER).getDouble("lat"); + Double lng = properties.getMap(PROP_CENTER).getDouble("lng"); + Double lat = properties.getMap(PROP_CENTER).getDouble("lat"); - if(props.hasKey(PROP_ZOOM_LEVEL)) { - int zoomLevel = props.getInt(PROP_ZOOM_LEVEL, 10); + if(properties.hasKey(PROP_ZOOM_LEVEL)) { + int zoomLevel = properties.getInt(PROP_ZOOM_LEVEL); mlastZoom = zoomLevel; - Log.i(TAG, "Zoom: " + Integer.toString(props.getInt(PROP_ZOOM_LEVEL, 10))); + Log.i(TAG, "Zoom: " + Integer.toString(properties.getInt(PROP_ZOOM_LEVEL))); cameraUpdate = CameraUpdateFactory .newLatLngZoom( new LatLng(lat, lng), @@ -171,7 +215,7 @@ private Boolean updateCenter (CatalystStylesDiffMap props) { } } - private Boolean updateMarkers (CatalystStylesDiffMap props) { + private Boolean updateMarkers (ReadableArray markerArray) { try { // First clear all markers from the map @@ -182,9 +226,9 @@ private Boolean updateMarkers (CatalystStylesDiffMap props) { markerLookup.clear(); // All markers to map - for (int i = 0; i < props.getArray(PROP_MARKERS).size(); i++) { + for (int i = 0; i < markerArray.size(); i++) { MarkerOptions options = new MarkerOptions(); - ReadableMap markerJson = props.getArray(PROP_MARKERS).getMap(i); + ReadableMap markerJson = markerArray.getMap(i); if(markerJson.hasKey("coordinates")) { options.position(new LatLng( @@ -266,19 +310,6 @@ private Boolean zoomOnMarkers () { } } - @Override - public void updateView(MapView view, CatalystStylesDiffMap props) { - Log.i(TAG, props.toString()); - super.updateView(view, props); - if (props.hasKey(PROP_CENTER)) updateCenter(props); - if (props.hasKey(PROP_ZOOM_LEVEL)) updateCenter(props); - if (props.hasKey(PROP_MARKERS)) updateMarkers(props); - if (props.hasKey(PROP_ZOOM_ON_MARKERS)&&props.getBoolean(PROP_ZOOM_ON_MARKERS, false)) { - zoomOnMarkers(); - } - - } - private int getResourceDrawableId(String name) { try { return reactContext.getResources().getIdentifier( @@ -294,4 +325,3 @@ private int getResourceDrawableId(String name) { } - diff --git a/package.json b/package.json index dd8ec20..9f2acc7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-gmaps", - "version": "1.0.4", + "version": "1.0.5", "description": "React Native Android Google Maps implementation.", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" From ca133b6e58dcfde24b04f505cac9af3de0d24fbd Mon Sep 17 00:00:00 2001 From: timhagn Date: Wed, 2 Dec 2015 23:06:55 +0100 Subject: [PATCH 16/25] some error checking --- .../java/com/rota/rngmaps/RNGMapsModule.java | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index 2743303..226498f 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -176,42 +176,45 @@ public boolean onMarkerClick(Marker marker) { } private Boolean updateCenter () { - try { - CameraUpdate cameraUpdate; - Double lng = properties.getMap(PROP_CENTER).getDouble("lng"); - Double lat = properties.getMap(PROP_CENTER).getDouble("lat"); - - if(properties.hasKey(PROP_ZOOM_LEVEL)) { - int zoomLevel = properties.getInt(PROP_ZOOM_LEVEL); - mlastZoom = zoomLevel; - Log.i(TAG, "Zoom: " + Integer.toString(properties.getInt(PROP_ZOOM_LEVEL))); - cameraUpdate = CameraUpdateFactory - .newLatLngZoom( - new LatLng(lat, lng), - zoomLevel - ); - } else { - Log.i(TAG, "Default Zoom."); + if (properties.hasKey(PROP_CENTER)) { + try { + CameraUpdate cameraUpdate; + + Double lng = properties.getMap(PROP_CENTER).getDouble("lng"); + Double lat = properties.getMap(PROP_CENTER).getDouble("lat"); + + if (properties.hasKey(PROP_ZOOM_LEVEL)) { + int zoomLevel = properties.getInt(PROP_ZOOM_LEVEL); + mlastZoom = zoomLevel; + Log.i(TAG, "Zoom: " + Integer.toString(properties.getInt(PROP_ZOOM_LEVEL))); + cameraUpdate = CameraUpdateFactory + .newLatLngZoom( + new LatLng(lat, lng), + zoomLevel + ); + } else { + Log.i(TAG, "Default Zoom."); /* * Changed from cameraUpdate = CameraUpdateFactory.newLatLng(new LatLng(lat, lng)); * as it gave me "zoom" Bugs (defaulted to zoom factor 2) as soon as I put in * "real" LNG and LAT values... */ - cameraUpdate = CameraUpdateFactory - .newLatLngZoom( - new LatLng(lat, lng), - mlastZoom - ); - } + cameraUpdate = CameraUpdateFactory + .newLatLngZoom( + new LatLng(lat, lng), + mlastZoom + ); + } - map.animateCamera(cameraUpdate); + map.animateCamera(cameraUpdate); - return true; - } catch (Exception e) { - // ERROR! - e.printStackTrace(); - return false; + return true; + } catch (Exception e) { + // ERROR! + e.printStackTrace(); + return false; + } } } From 918249277faf0f7c82e37379b776c622040d29fc Mon Sep 17 00:00:00 2001 From: timhagn Date: Wed, 2 Dec 2015 23:10:12 +0100 Subject: [PATCH 17/25] some error checking --- android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java | 1 + 1 file changed, 1 insertion(+) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index 226498f..47f03c0 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -147,6 +147,7 @@ public void onCameraChange(CameraPosition position) { params.putMap("latLng", latLng); params.putInt("zoomLevel",(int) position.zoom); + mlastZoom = (int) position.zoom; reactContext .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) From 9fec26c9ea265829b74e45ffc12ff889d617f126 Mon Sep 17 00:00:00 2001 From: timhagn Date: Wed, 2 Dec 2015 23:12:01 +0100 Subject: [PATCH 18/25] some error checking --- android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index 47f03c0..9f7f1e6 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -216,6 +216,8 @@ private Boolean updateCenter () { e.printStackTrace(); return false; } + } else { + return false; } } From 4f9930a73c85576789c98aa2f0d64ea7cde58891 Mon Sep 17 00:00:00 2001 From: timhagn Date: Wed, 2 Dec 2015 23:36:08 +0100 Subject: [PATCH 19/25] zoomLevel onMyLocationButtonClick --- .../src/main/java/com/rota/rngmaps/RNGMapsModule.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index 9f7f1e6..c29d61b 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -117,6 +117,15 @@ public MapView createViewInstance(ThemedReactContext context) { MapsInitializer.initialize(context.getApplicationContext()); map.setOnCameraChangeListener(getCameraChangeListener()); map.setOnMarkerClickListener(getMarkerClickListener()); + //add location button click listener + map.setOnMyLocationButtonClickListener(new GoogleMap.OnMyLocationButtonClickListener() { + @Override + public boolean onMyLocationButtonClick() { + CameraPosition position = map.getCameraPosition(); + mlastZoom = (int) position.zoom; + return true; + } + }); } catch (Exception e) { e.printStackTrace(); sendMapError("Map initialize error", "map_init_error"); @@ -147,7 +156,6 @@ public void onCameraChange(CameraPosition position) { params.putMap("latLng", latLng); params.putInt("zoomLevel",(int) position.zoom); - mlastZoom = (int) position.zoom; reactContext .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) From 8212174578ba5d80a8e56f96af12ecba5fce000b Mon Sep 17 00:00:00 2001 From: timhagn Date: Wed, 2 Dec 2015 23:39:02 +0100 Subject: [PATCH 20/25] zoomLevel onMyLocationButtonClick --- android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index c29d61b..119b2e9 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -123,7 +123,7 @@ public MapView createViewInstance(ThemedReactContext context) { public boolean onMyLocationButtonClick() { CameraPosition position = map.getCameraPosition(); mlastZoom = (int) position.zoom; - return true; + return false; } }); } catch (Exception e) { From 101c0565980d53323cbac9dc8b5effddcde62994 Mon Sep 17 00:00:00 2001 From: timhagn Date: Wed, 2 Dec 2015 23:42:12 +0100 Subject: [PATCH 21/25] zoomLevel onMyLocationButtonClick --- .../app/src/main/java/com/rota/rngmaps/RNGMapsModule.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index 119b2e9..b990ec2 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -209,9 +209,8 @@ private Boolean updateCenter () { * "real" LNG and LAT values... */ cameraUpdate = CameraUpdateFactory - .newLatLngZoom( - new LatLng(lat, lng), - mlastZoom + .newLatLng( + new LatLng(lat, lng) ); } From abbcc40641a3e8a4ce6999460df66b202d6d6a17 Mon Sep 17 00:00:00 2001 From: timhagn Date: Wed, 2 Dec 2015 23:44:43 +0100 Subject: [PATCH 22/25] zoomLevel onMyLocationButtonClick --- android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index b990ec2..2e739b0 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -192,7 +192,7 @@ private Boolean updateCenter () { Double lng = properties.getMap(PROP_CENTER).getDouble("lng"); Double lat = properties.getMap(PROP_CENTER).getDouble("lat"); - if (properties.hasKey(PROP_ZOOM_LEVEL)) { + if (properties.hasKey(PROP_ZOOM_LEVEL) && mlastZoom == 10) { int zoomLevel = properties.getInt(PROP_ZOOM_LEVEL); mlastZoom = zoomLevel; Log.i(TAG, "Zoom: " + Integer.toString(properties.getInt(PROP_ZOOM_LEVEL))); From 2f4d414a420a1602d1cdfd24c1f195976a1d8611 Mon Sep 17 00:00:00 2001 From: timhagn Date: Wed, 2 Dec 2015 23:47:05 +0100 Subject: [PATCH 23/25] zoomLevel onMyLocationButtonClick --- .../app/src/main/java/com/rota/rngmaps/RNGMapsModule.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index 2e739b0..ebe75b2 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -156,6 +156,7 @@ public void onCameraChange(CameraPosition position) { params.putMap("latLng", latLng); params.putInt("zoomLevel",(int) position.zoom); + mlastZoom = (int) position.zoom; reactContext .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) @@ -192,7 +193,7 @@ private Boolean updateCenter () { Double lng = properties.getMap(PROP_CENTER).getDouble("lng"); Double lat = properties.getMap(PROP_CENTER).getDouble("lat"); - if (properties.hasKey(PROP_ZOOM_LEVEL) && mlastZoom == 10) { + if (properties.hasKey(PROP_ZOOM_LEVEL)) { int zoomLevel = properties.getInt(PROP_ZOOM_LEVEL); mlastZoom = zoomLevel; Log.i(TAG, "Zoom: " + Integer.toString(properties.getInt(PROP_ZOOM_LEVEL))); @@ -209,8 +210,9 @@ private Boolean updateCenter () { * "real" LNG and LAT values... */ cameraUpdate = CameraUpdateFactory - .newLatLng( - new LatLng(lat, lng) + .newLatLngZoom( + new LatLng(lat, lng), + mlastZoom ); } From df8df29bfbc215dbadd41461421a10e7b670589e Mon Sep 17 00:00:00 2001 From: timhagn Date: Tue, 8 Dec 2015 01:20:09 +0100 Subject: [PATCH 24/25] updated RN to 0.16.0, added ...View.propTypes to module PropTypes --- .idea/misc.xml | 5 +- .idea/react-native-gmaps.iml | 3 +- .idea/workspace.xml | 220 ++++++++++++++--------------------- android/app/build.gradle | 10 +- index.android.js | 1 + 5 files changed, 103 insertions(+), 136 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 6ab96c3..5a3f2a5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,8 @@ + + - + \ No newline at end of file diff --git a/.idea/react-native-gmaps.iml b/.idea/react-native-gmaps.iml index d6ebd48..3a3afd8 100644 --- a/.idea/react-native-gmaps.iml +++ b/.idea/react-native-gmaps.iml @@ -1,7 +1,6 @@ - - + diff --git a/.idea/workspace.xml b/.idea/workspace.xml index ee96105..8f675e5 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,10 @@ - + + + + @@ -23,15 +26,23 @@ - - + + - - - - - + + + + + + + + + + + + + @@ -56,15 +67,20 @@ - - + + + + true + - @@ -87,10 +103,23 @@ + + - - + + + + + + + + + @@ -234,100 +263,18 @@ - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + @@ -403,24 +351,34 @@ + + + + + + + + - - - - - - - - - + + + + + + + + + + + diff --git a/android/app/build.gradle b/android/app/build.gradle index ea4d866..f913fe4 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -10,6 +10,12 @@ android { versionCode 1 versionName "1.0" } + buildTypes { + release { + minifyEnabled false // Set this to true to enable Proguard + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + } + } lintOptions { abortOnError false } @@ -22,7 +28,7 @@ repositories { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:23.1.0' - compile 'com.facebook.react:react-native:0.12.0' + compile 'com.android.support:appcompat-v7:23.1.1' + compile 'com.facebook.react:react-native:0.16.+' compile 'com.google.android.gms:play-services-maps:8.1.0' } diff --git a/index.android.js b/index.android.js index 4bab2e1..96abb3d 100644 --- a/index.android.js +++ b/index.android.js @@ -15,6 +15,7 @@ let { var gmaps = { name: 'RNGMaps', propTypes: { + ...View.propTypes, center: PropTypes.object, zoomLevel: PropTypes.number, markers: PropTypes.array, From eb05e3dd71d7b64f6d2fc440950b11f66e4132a8 Mon Sep 17 00:00:00 2001 From: timhagn Date: Thu, 7 Jan 2016 13:40:51 +0100 Subject: [PATCH 25/25] added 'clickMarker' to show or hide Info windows --- .idea/workspace.xml | 61 +++++++++++++++---- README.md | 14 +++-- .../java/com/rota/rngmaps/RNGMapsModule.java | 35 ++++++++--- index.android.js | 2 + 4 files changed, 88 insertions(+), 24 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 8f675e5..0f2597e 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,14 +2,11 @@ - - - - + @@ -309,15 +316,15 @@ - + - + - + - + @@ -351,6 +358,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -376,11 +407,19 @@ - + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index f0e58d1..7c16018 100644 --- a/README.md +++ b/README.md @@ -18,12 +18,13 @@ let RNGMap = require('react-native-gmaps'); { coordinates: {lng: 0.1, lat: 51.0} }, { coordinates: {lng: -0.1, lat: 51.0}, - title: "Click marker to see this title!" - snippet: "Subtitle" + title: "Click marker to see this title!", + snippet: "Subtitle", + id: 0, /* * Able to use "my_icon" or {uri: 'my_icon', width: 100, height: 100 } here as well */ - icon = require('image!my_icon') + icon: require('image!my_icon'), /* * color is only working with default icon */ @@ -33,7 +34,12 @@ let RNGMap = require('react-native-gmaps'); zoomLevel={10} onMapChange={(e) => console.log(e)} onMapError={(e) => console.log('Map error --> ', e)} - center={ { lng: 0.1, lat: 51.0 } } /> + center={ { lng: 0.1, lat: 51.0 } } + /* + * clickMarker shows Info Window of Marker with id: 0, + * hides Info Window if given null + */ + clickMarker={0}/> ``` ##### onMapChange diff --git a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java index ebe75b2..221e19f 100644 --- a/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java +++ b/android/app/src/main/java/com/rota/rngmaps/RNGMapsModule.java @@ -11,25 +11,17 @@ import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableType; -import com.facebook.react.bridge.WritableArray; -import com.facebook.react.bridge.WritableNativeArray; import com.facebook.react.bridge.WritableMap; import com.facebook.react.modules.core.DeviceEventManagerModule; -import com.facebook.react.uimanager.CatalystStylesDiffMap; import com.facebook.react.uimanager.SimpleViewManager; import com.facebook.react.uimanager.ThemedReactContext; -import com.facebook.react.uimanager.UIProp; import com.facebook.react.uimanager.ReactProp; import com.google.android.gms.maps.*; import com.google.android.gms.maps.model.*; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; -/** - * Created by Henry on 08/10/2015. - */ public class RNGMapsModule extends SimpleViewManager { public static final String REACT_CLASS = "RNGMaps"; @@ -56,6 +48,7 @@ public class RNGMapsModule extends SimpleViewManager { public static final String PROP_ZOOM_LEVEL = "zoomLevel"; public static final String PROP_MARKERS = "markers"; public static final String PROP_ZOOM_ON_MARKERS = "zoomOnMarkers"; + public static final String PROP_CLICK_MARKER = "clickMarker"; @ReactProp(name = PROP_CENTER) public void setPropCenter(MapView view, @Nullable ReadableMap center) { @@ -92,6 +85,28 @@ public void setPropZoomOnMarkers(MapView view, Boolean shallZoomOnMarkers) { } } + @ReactProp(name = PROP_CLICK_MARKER) + public void setPropClickMarker(MapView view, @Nullable Integer clickMarker) { + String key = String.valueOf(clickMarker); + Log.i(TAG, key); + if (clickMarker == null) { + if (properties.hasKey(PROP_CLICK_MARKER)) { + if (markerLookup.containsKey(String.valueOf(properties.getInt(PROP_CLICK_MARKER)))) { + Marker marker = mapMarkers.get(Integer.parseInt(markerLookup.get(String.valueOf(properties.getInt(PROP_CLICK_MARKER)))) ); + marker.hideInfoWindow(); + Log.i(TAG, "hideInfoWindow"); + } + } + } else { + properties.putInt(PROP_CLICK_MARKER, clickMarker); + if (markerLookup.containsKey(key)) { + Marker marker = mapMarkers.get( Integer.parseInt(markerLookup.get(key)) ); + marker.showInfoWindow(); + Log.i(TAG, "showInfoWindow" + String.valueOf(marker)); + } + } + } + protected int mlastZoom = 10; @Override @@ -170,7 +185,7 @@ private GoogleMap.OnMarkerClickListener getMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { String id = marker.getId(); - + Log.i(TAG, "onMarkerClick " + id); if (markerLookup.containsKey(id)) { WritableMap event = Arguments.createMap(); event.putString("id", markerLookup.get(id)); @@ -290,7 +305,9 @@ private Boolean updateMarkers (ReadableArray markerArray) { Marker marker = map.addMarker(options); if (markerJson.hasKey("id")) { + // As we have to lookup it either way, switch it around markerLookup.put(marker.getId(), markerJson.getString("id")); + markerLookup.put(markerJson.getString("id"), marker.getId().replace("m","")); } mapMarkers.add(marker); diff --git a/index.android.js b/index.android.js index 96abb3d..258d165 100644 --- a/index.android.js +++ b/index.android.js @@ -20,6 +20,7 @@ var gmaps = { zoomLevel: PropTypes.number, markers: PropTypes.array, zoomOnMarkers: PropTypes.bool, + clickMarker: PropTypes.number, /* Hackedy hack hack hack */ scaleX: React.PropTypes.number, @@ -108,6 +109,7 @@ componentDidMount () { if(this._diffMarkers(nextProps.markers, this.state.markers)) { this.updateMarkers(nextProps.markers); } + console.log('clickMarker:' + nextProps.clickMarker); } render () {