Skip to content

Commit 76d017f

Browse files
author
Eric Petzel
committed
Merge branch 'acq-markerFeatures'
2 parents d11af78 + 6e4e490 commit 76d017f

File tree

8 files changed

+222
-6
lines changed

8 files changed

+222
-6
lines changed

library/src/main/assets/google_map.html

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,16 @@
108108
}
109109

110110
function addMarkerWithId(lat, lng, id, title, snippet) {
111+
addMarkerWithId(lat, lng, id, title, snippet, false);
112+
}
113+
114+
function addMarkerWithId(lat, lng, id, title, snippet, draggable) {
111115
var position = new google.maps.LatLng(lat, lng);
112116
var marker = new google.maps.Marker({
113117
position: position,
114118
map: map,
115-
icon: getMarkerIcon('red-dot.png')
119+
icon: getMarkerIcon('red-dot.png'),
120+
draggable: draggable
116121
});
117122

118123
if(title != "null" || snippet != "null") {
@@ -132,10 +137,26 @@
132137
map.panTo(marker.position);
133138
AirMapView.markerClick(id);
134139
});
140+
google.maps.event.addListener(marker, 'dragstart', function() {
141+
AirMapView.markerDragStart(id, marker.position.lat(), marker.position.lng());
142+
});
143+
google.maps.event.addListener(marker, 'drag', function() {
144+
AirMapView.markerDrag(id, marker.position.lat(), marker.position.lng());
145+
});
146+
google.maps.event.addListener(marker, 'dragend', function() {
147+
AirMapView.markerDragEnd(id, marker.position.lat(), marker.position.lng());
148+
});
135149

136150
markers[id] = marker;
137151
}
138152

153+
function moveMarker(lat, long, id) {
154+
var marker = markers[id];
155+
if (marker != null) {
156+
marker.setPosition( new google.maps.LatLng(lat, long) );
157+
}
158+
}
159+
139160
function showDefaultInfoWindow(id){
140161
if(infoWindow){
141162
infoWindow.close();

library/src/main/assets/mapbox.html

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,15 @@
8282
}
8383

8484
function addMarkerWithId(lat, lng, id, title, snippet) {
85+
addMarkerWithId(lat, lng, id, title, snippet, false);
86+
}
87+
88+
function addMarkerWithId(lat, lng, id, title, snippet, draggable) {
8589
var marker = L.marker(new L.LatLng(lat, lng), {
8690
icon: L.mapbox.marker.icon({
8791
'marker-color': 'e55e5e'
88-
})
92+
}),
93+
draggable: draggable
8994
});
9095
marker.addTo(map);
9196

@@ -107,6 +112,22 @@
107112
marker.on("click", function(ev) {
108113
AirMapView.markerClick(id);
109114
});
115+
marker.on("dragstart", function(ev) {
116+
AirMapView.markerDragStart(id, ev.target.getLatLng().lat, ev.target.getLatLng().lng);
117+
});
118+
marker.on("drag", function(ev) {
119+
AirMapView.markerDrag(id, ev.target.getLatLng().lat, ev.target.getLatLng().lng);
120+
});
121+
marker.on("dragend", function(ev) {
122+
AirMapView.markerDragEnd(id, ev.target.getLatLng().lat, ev.target.getLatLng().lng);
123+
});
124+
}
125+
126+
function moveMarker(lat, long, id) {
127+
var marker = markers[id];
128+
if (marker != null) {
129+
marker.setLatLng( new L.LatLng(lat, long) );
130+
}
110131
}
111132

112133
function showDefaultInfoWindow(id){

library/src/main/java/com/airbnb/android/airmapview/AirMapInterface.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.airbnb.android.airmapview;
22

33
import com.airbnb.android.airmapview.listeners.OnLatLngScreenLocationCallback;
4+
import com.airbnb.android.airmapview.listeners.OnMapMarkerDragListener;
45
import com.google.android.gms.maps.GoogleMap;
56
import com.google.android.gms.maps.model.LatLng;
67
import com.google.android.gms.maps.model.LatLngBounds;
@@ -39,6 +40,14 @@ public interface AirMapInterface {
3940
*/
4041
void addMarker(AirMapMarker marker);
4142

43+
/**
44+
* Move the marker to the given coordinates
45+
*
46+
* @param marker {@link AirMapMarker} instance to move
47+
* @param to {@link LatLng} new destination of the marker
48+
*/
49+
void moveMarker(AirMapMarker marker, LatLng to);
50+
4251
/**
4352
* Remove the given marker from the map
4453
*
@@ -156,6 +165,14 @@ public interface AirMapInterface {
156165
void setOnMarkerClickListener(OnMapMarkerClickListener listener);
157166

158167
/**
168+
* Register a callback to be invoked when a map marker is dragged
169+
*
170+
* @param listener {@link com.airbnb.android.airmapview.listeners.OnMapMarkerDragListener}
171+
* callback
172+
*/
173+
void setOnMarkerDragListener(OnMapMarkerDragListener listener);
174+
175+
/**
159176
* Register a callback to be invoked when the map is clicked
160177
*
161178
* @param listener {@link com.airbnb.android.airmapview.listeners.OnMapClickListener} callback

library/src/main/java/com/airbnb/android/airmapview/AirMapMarker.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ public LatLng getLatLng() {
3636
return markerOptions.getPosition();
3737
}
3838

39+
void setLatLng(LatLng latLng) {
40+
markerOptions.position(latLng);
41+
}
42+
3943
public String getTitle() {
4044
return markerOptions.getTitle();
4145
}

library/src/main/java/com/airbnb/android/airmapview/AirMapView.java

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.airbnb.android.airmapview.listeners.OnMapInitializedListener;
1919
import com.airbnb.android.airmapview.listeners.OnMapLoadedListener;
2020
import com.airbnb.android.airmapview.listeners.OnMapMarkerClickListener;
21+
import com.airbnb.android.airmapview.listeners.OnMapMarkerDragListener;
2122
import com.google.android.gms.maps.GoogleMap;
2223
import com.google.android.gms.maps.model.LatLng;
2324
import com.google.android.gms.maps.model.LatLngBounds;
@@ -26,7 +27,7 @@
2627
import org.json.JSONException;
2728

2829
public class AirMapView extends FrameLayout
29-
implements OnCameraChangeListener, OnMapClickListener,
30+
implements OnCameraChangeListener, OnMapClickListener, OnMapMarkerDragListener,
3031
OnMapMarkerClickListener, OnMapLoadedListener, OnInfoWindowClickListener {
3132

3233
private static final int INVALID_ZOOM = -1;
@@ -36,8 +37,9 @@ public class AirMapView extends FrameLayout
3637
private OnCameraChangeListener onCameraChangeListener;
3738
private boolean mOnCameraMoveTriggered;
3839
private OnMapInitializedListener onMapInitializedListener;
39-
private OnMapClickListener onMapClickListener;
4040
private OnMapMarkerClickListener onMapMarkerClickListener;
41+
private OnMapMarkerDragListener onMapMarkerDragListener;
42+
private OnMapClickListener onMapClickListener;
4143
private OnInfoWindowClickListener onInfoWindowClickListener;
4244

4345
public AirMapView(Context context) {
@@ -241,6 +243,10 @@ public void setOnMarkerClickListener(OnMapMarkerClickListener listener) {
241243
onMapMarkerClickListener = listener;
242244
}
243245

246+
public void setOnMarkerDragListener(OnMapMarkerDragListener listener) {
247+
onMapMarkerDragListener = listener;
248+
}
249+
244250
public void setOnMapClickListener(OnMapClickListener listener) {
245251
onMapClickListener = listener;
246252
}
@@ -331,6 +337,14 @@ public boolean removeMarker(AirMapMarker marker) {
331337
return false;
332338
}
333339

340+
public boolean moveMarker(AirMapMarker marker, LatLng to) {
341+
if (isInitialized()) {
342+
mapInterface.moveMarker(marker, to);
343+
return true;
344+
}
345+
return false;
346+
}
347+
334348
public void setMyLocationEnabled(boolean trackUserLocation) {
335349
mapInterface.setMyLocationEnabled(trackUserLocation);
336350
}
@@ -360,11 +374,54 @@ public void onMapClick(LatLng latLng) {
360374
}
361375
}
362376

377+
@Override
378+
public void onMapMarkerDragStart(Marker marker) {
379+
if (onMapMarkerDragListener != null) {
380+
onMapMarkerDragListener.onMapMarkerDragStart(marker);
381+
}
382+
}
383+
384+
@Override
385+
public void onMapMarkerDrag(Marker marker) {
386+
if (onMapMarkerDragListener != null) {
387+
onMapMarkerDragListener.onMapMarkerDrag(marker);
388+
}
389+
}
390+
391+
@Override
392+
public void onMapMarkerDragEnd(Marker marker) {
393+
if (onMapMarkerDragListener != null) {
394+
onMapMarkerDragListener.onMapMarkerDragEnd(marker);
395+
}
396+
}
397+
398+
@Override
399+
public void onMapMarkerDragStart(long id, LatLng latLng) {
400+
if (onMapMarkerDragListener != null) {
401+
onMapMarkerDragListener.onMapMarkerDragStart(id, latLng);
402+
}
403+
}
404+
405+
@Override
406+
public void onMapMarkerDrag(long id, LatLng latLng) {
407+
if (onMapMarkerDragListener != null) {
408+
onMapMarkerDragListener.onMapMarkerDrag(id, latLng);
409+
}
410+
}
411+
412+
@Override
413+
public void onMapMarkerDragEnd(long id, LatLng latLng) {
414+
if (onMapMarkerDragListener != null) {
415+
onMapMarkerDragListener.onMapMarkerDragEnd(id, latLng);
416+
}
417+
}
418+
363419
@Override public void onMapLoaded() {
364420
if (isInitialized()) {
365421
mapInterface.setOnCameraChangeListener(this);
366422
mapInterface.setOnMapClickListener(this);
367423
mapInterface.setOnMarkerClickListener(this);
424+
mapInterface.setOnMarkerDragListener(this);
368425
mapInterface.setOnInfoWindowClickListener(this);
369426

370427
if (onMapInitializedListener != null) {

library/src/main/java/com/airbnb/android/airmapview/NativeGoogleMapFragment.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.airbnb.android.airmapview.listeners.OnMapClickListener;
1717
import com.airbnb.android.airmapview.listeners.OnMapLoadedListener;
1818
import com.airbnb.android.airmapview.listeners.OnMapMarkerClickListener;
19+
import com.airbnb.android.airmapview.listeners.OnMapMarkerDragListener;
1920
import com.google.android.gms.maps.CameraUpdateFactory;
2021
import com.google.android.gms.maps.GoogleMap;
2122
import com.google.android.gms.maps.OnMapReadyCallback;
@@ -93,6 +94,12 @@ public void onMapReady(GoogleMap googleMap) {
9394
airMarker.setGoogleMarker(marker);
9495
}
9596

97+
@Override
98+
public void moveMarker(AirMapMarker marker, LatLng to) {
99+
marker.setLatLng(to);
100+
marker.getMarker().setPosition(to);
101+
}
102+
96103
@Override public void removeMarker(AirMapMarker marker) {
97104
Marker nativeMarker = marker.getMarker();
98105
if (nativeMarker != null) {
@@ -216,6 +223,29 @@ public boolean onMarkerClick(Marker marker) {
216223
});
217224
}
218225

226+
@Override public void setOnMarkerDragListener(final OnMapMarkerDragListener listener) {
227+
if (listener == null) {
228+
googleMap.setOnMarkerDragListener(null);
229+
return;
230+
}
231+
googleMap.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() {
232+
@Override
233+
public void onMarkerDragStart(Marker marker) {
234+
listener.onMapMarkerDragStart(marker);
235+
}
236+
237+
@Override
238+
public void onMarkerDrag(Marker marker) {
239+
listener.onMapMarkerDrag(marker);
240+
}
241+
242+
@Override
243+
public void onMarkerDragEnd(Marker marker) {
244+
listener.onMapMarkerDragEnd(marker);
245+
}
246+
});
247+
}
248+
219249
@Override public void setOnMapClickListener(final OnMapClickListener listener) {
220250
googleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
221251
@Override

library/src/main/java/com/airbnb/android/airmapview/WebViewMapFragment.java

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.airbnb.android.airmapview.listeners.OnMapClickListener;
2626
import com.airbnb.android.airmapview.listeners.OnMapLoadedListener;
2727
import com.airbnb.android.airmapview.listeners.OnMapMarkerClickListener;
28+
import com.airbnb.android.airmapview.listeners.OnMapMarkerDragListener;
2829
import com.google.android.gms.maps.GoogleMap;
2930
import com.google.android.gms.maps.model.LatLng;
3031
import com.google.android.gms.maps.model.LatLngBounds;
@@ -44,6 +45,7 @@ public abstract class WebViewMapFragment extends Fragment implements AirMapInter
4445
private OnCameraChangeListener onCameraChangeListener;
4546
private OnMapLoadedListener onMapLoadedListener;
4647
private OnMapMarkerClickListener onMapMarkerClickListener;
48+
private OnMapMarkerDragListener onMapMarkerDragListener;
4749
private OnInfoWindowClickListener onInfoWindowClickListener;
4850
private InfoWindowCreator infoWindowCreator;
4951
private OnMapBoundsCallback onMapBoundsCallback;
@@ -156,9 +158,16 @@ public void unhighlightMarker(long markerId) {
156158
@Override public void addMarker(AirMapMarker marker) {
157159
LatLng latLng = marker.getLatLng();
158160
webView.loadUrl(
159-
String.format(Locale.US, "javascript:addMarkerWithId(%1$f, %2$f, %3$d, '%4$s', '%5$s');",
161+
String.format(Locale.US, "javascript:addMarkerWithId(%1$f, %2$f, %3$d, '%4$s', '%5$s', %6$b);",
160162
latLng.latitude, latLng.longitude, marker.getId(), marker.getTitle(),
161-
marker.getSnippet()));
163+
marker.getSnippet(), marker.getMarkerOptions().isDraggable()));
164+
}
165+
166+
@Override public void moveMarker(AirMapMarker marker, LatLng to) {
167+
marker.setLatLng(to);
168+
webView.loadUrl(
169+
String.format(Locale.US, "javascript:moveMarker(%1$f, %2$f, '%3$s');",
170+
to.latitude, to.longitude, marker.getId()));
162171
}
163172

164173
@Override public void removeMarker(AirMapMarker marker) {
@@ -193,6 +202,10 @@ public void setOnMarkerClickListener(OnMapMarkerClickListener listener) {
193202
onMapMarkerClickListener = listener;
194203
}
195204

205+
@Override public void setOnMarkerDragListener(OnMapMarkerDragListener listener) {
206+
onMapMarkerDragListener = listener;
207+
}
208+
196209
@Override public void setPadding(int left, int top, int right, int bottom) {
197210
// no-op
198211
}
@@ -421,6 +434,41 @@ public void onClick(@NonNull View v) {
421434
});
422435
}
423436

437+
@JavascriptInterface public void markerDragStart(final long markerId, final double lat, final double lng) {
438+
handler.post(new Runnable() {
439+
@Override
440+
public void run() {
441+
if (onMapMarkerDragListener != null) {
442+
onMapMarkerDragListener.onMapMarkerDragStart(markerId, new LatLng(lat, lng));
443+
}
444+
}
445+
});
446+
}
447+
448+
@JavascriptInterface public void markerDrag(final long markerId, final double lat, final double lng) {
449+
handler.post(new Runnable() {
450+
@Override
451+
public void run() {
452+
if (onMapMarkerDragListener != null) {
453+
onMapMarkerDragListener.onMapMarkerDrag(markerId, new LatLng(lat, lng));
454+
}
455+
}
456+
});
457+
}
458+
459+
@JavascriptInterface public void markerDragEnd(final long markerId, final double lat, final double lng) {
460+
handler.post(new Runnable() {
461+
@Override
462+
public void run() {
463+
if (onMapMarkerDragListener != null) {
464+
onMapMarkerDragListener.onMapMarkerDragEnd(markerId, new LatLng(lat, lng));
465+
}
466+
}
467+
});
468+
}
469+
470+
471+
424472
@JavascriptInterface public void defaultInfoWindowClick(final long markerId) {
425473
handler.post(new Runnable() {
426474
@Override

0 commit comments

Comments
 (0)