package com.airbnb.android.airmapview; import android.graphics.Bitmap; import com.google.android.gms.maps.model.BitmapDescriptor; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; /** * Wrapper around {@link MarkerOptions}. Keeps record of data needed to display map markers, as * well as an object T associated with the marker. */ public class AirMapMarker<T> { private final T object; private final long id; private final MarkerOptions markerOptions; private Marker marker; private AirMapMarker(T object, long id, MarkerOptions markerOptions) { this.object = object; this.id = id; this.markerOptions = markerOptions; } public T object() { return object; } public long getId() { return id; } public LatLng getLatLng() { return markerOptions.getPosition(); } void setLatLng(LatLng latLng) { markerOptions.position(latLng); } public String getTitle() { return markerOptions.getTitle(); } public String getSnippet() { return markerOptions.getSnippet(); } public MarkerOptions getMarkerOptions() { return markerOptions; } /** Sets a marker associated to this object */ void setGoogleMarker(Marker marker) { this.marker = marker; } public Builder<T> toBuilder() { return new Builder<T>() .id(id) .object(object) .position(markerOptions.getPosition()) .alpha(markerOptions.getAlpha()) .anchor(markerOptions.getAnchorU(), markerOptions.getAnchorV()) .bitmapDescriptor(markerOptions.getIcon()) .infoWindowAnchor(markerOptions.getInfoWindowAnchorU(), markerOptions.getInfoWindowAnchorV()) .snippet(markerOptions.getSnippet()) .title(markerOptions.getTitle()) .draggable(markerOptions.isDraggable()) .visible(markerOptions.isVisible()) .alpha(markerOptions.getAlpha()) .rotation(markerOptions.getRotation()) .flat(markerOptions.isFlat()); } public Marker getMarker() { return marker; } public static class Builder<T> { private T object; private long id; private final MarkerOptions markerOptions = new MarkerOptions(); public Builder() { } public Builder<T> object(T object) { this.object = object; return this; } public Builder<T> id(long id) { this.id = id; return this; } public Builder<T> position(LatLng position) { markerOptions.position(position); return this; } public Builder<T> anchor(float u, float v) { markerOptions.anchor(u, v); return this; } public Builder<T> infoWindowAnchor(float u, float v) { markerOptions.infoWindowAnchor(u, v); return this; } public Builder<T> title(String title) { markerOptions.title(title); return this; } public Builder<T> snippet(String snippet) { markerOptions.snippet(snippet); return this; } public Builder<T> iconId(int iconId) { try { markerOptions.icon(BitmapDescriptorFactory.fromResource(iconId)); } catch (NullPointerException ignored) { // google play services is not available } return this; } public Builder<T> bitmap(Bitmap bitmap) { try { bitmapDescriptor(BitmapDescriptorFactory.fromBitmap(bitmap)); } catch (NullPointerException ignored) { // google play services is not available } return this; } public Builder<T> bitmapDescriptor(BitmapDescriptor bitmap) { markerOptions.icon(bitmap); return this; } public Builder<T> draggable(boolean draggable) { markerOptions.draggable(draggable); return this; } public Builder<T> visible(boolean visible) { markerOptions.visible(visible); return this; } public Builder<T> flat(boolean flat) { markerOptions.flat(flat); return this; } public Builder<T> rotation(float rotation) { markerOptions.rotation(rotation); return this; } public Builder<T> alpha(float alpha) { markerOptions.alpha(alpha); return this; } public AirMapMarker<T> build() { return new AirMapMarker<>(object, id, markerOptions); } } }