Skip to content

File tree

2 files changed

+107
-0
lines changed

2 files changed

+107
-0
lines changed

lib/android/src/main/java/com/airbnb/android/react/maps/AirMapMarker.java

+32
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ public class AirMapMarker extends AirMapFeature {
7373
private float calloutAnchorY;
7474
private boolean calloutAnchorIsSet;
7575

76+
private boolean tracksViewChanges = true;
77+
private boolean tracksViewChangesActive = false;
78+
7679
private boolean hasCustomMarkerView = false;
7780

7881
private final DraweeHolder<?> logoHolder;
@@ -240,6 +243,32 @@ public void setCalloutAnchor(double x, double y) {
240243
update();
241244
}
242245

246+
public void setTracksViewChanges(boolean tracksViewChanges) {
247+
this.tracksViewChanges = tracksViewChanges;
248+
updateTracksViewChanges();
249+
}
250+
251+
private void updateTracksViewChanges() {
252+
boolean shouldTrack = tracksViewChanges && hasCustomMarkerView && marker != null;
253+
if (shouldTrack == tracksViewChangesActive) return;
254+
tracksViewChangesActive = shouldTrack;
255+
256+
if (shouldTrack) {
257+
ViewChangesTracker.getInstance().addMarker(this);
258+
} else {
259+
ViewChangesTracker.getInstance().removeMarker(this);
260+
}
261+
}
262+
263+
public boolean updateCustomMarkerIcon() {
264+
if (!tracksViewChangesActive)
265+
return false;
266+
267+
marker.setIcon(getIcon());
268+
269+
return true;
270+
}
271+
243272
public LatLng interpolate(float fraction, LatLng a, LatLng b) {
244273
double lat = (b.latitude - a.latitude) * fraction + a.latitude;
245274
double lng = (b.longitude - a.longitude) * fraction + a.longitude;
@@ -313,6 +342,7 @@ public void addView(View child, int index) {
313342
// if children are added, it means we are rendering a custom marker
314343
if (!(child instanceof AirMapCallout)) {
315344
hasCustomMarkerView = true;
345+
updateTracksViewChanges();
316346
}
317347
update();
318348
}
@@ -325,12 +355,14 @@ public Object getFeature() {
325355
@Override
326356
public void addToMap(GoogleMap map) {
327357
marker = map.addMarker(getMarkerOptions());
358+
updateTracksViewChanges();
328359
}
329360

330361
@Override
331362
public void removeFromMap(GoogleMap map) {
332363
marker.remove();
333364
marker = null;
365+
updateTracksViewChanges();
334366
}
335367

336368
private BitmapDescriptor getIcon() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.airbnb.android.react.maps;
2+
3+
import android.os.Handler;
4+
import android.os.Looper;
5+
6+
import java.util.LinkedList;
7+
8+
public class ViewChangesTracker {
9+
10+
private static ViewChangesTracker instance;
11+
private Handler handler;
12+
private LinkedList<AirMapMarker> markers = new LinkedList<>();
13+
private boolean hasScheduledFrame = false;
14+
private Runnable updateRunnable;
15+
private final long fps = 40;
16+
17+
private ViewChangesTracker() {
18+
handler = new Handler(Looper.myLooper());
19+
updateRunnable = new Runnable() {
20+
@Override
21+
public void run() {
22+
hasScheduledFrame = false;
23+
update();
24+
25+
if (markers.size() > 0) {
26+
handler.postDelayed(updateRunnable, fps);
27+
}
28+
}
29+
};
30+
}
31+
32+
static ViewChangesTracker getInstance() {
33+
if (instance == null) {
34+
synchronized (ViewChangesTracker.class) {
35+
instance = new ViewChangesTracker();
36+
}
37+
}
38+
39+
return instance;
40+
}
41+
42+
public void addMarker(AirMapMarker marker) {
43+
markers.add(marker);
44+
45+
if (!hasScheduledFrame) {
46+
hasScheduledFrame = true;
47+
handler.postDelayed(updateRunnable, fps);
48+
}
49+
}
50+
51+
public void removeMarker(AirMapMarker marker) {
52+
markers.remove(marker);
53+
}
54+
55+
public boolean containsMarker(AirMapMarker marker) {
56+
return markers.contains(marker);
57+
}
58+
59+
private LinkedList<AirMapMarker> markersToRemove = new LinkedList<>();
60+
61+
public void update() {
62+
for (AirMapMarker marker : markers) {
63+
if (!marker.updateCustomMarkerIcon()) {
64+
markersToRemove.add(marker);
65+
}
66+
}
67+
68+
// Remove markers that are not active anymore
69+
if (markersToRemove.size() > 0) {
70+
markers.removeAll(markersToRemove);
71+
markersToRemove.clear();;
72+
}
73+
}
74+
75+
}

0 commit comments

Comments
 (0)