package hu.supercluster.overpasser.app.activity.container;
import android.content.Context;
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 org.androidannotations.annotations.Background;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.RootContext;
import org.androidannotations.annotations.UiThread;
import java.util.HashMap;
import java.util.Map;
import hu.supercluster.overpasser.R;
import hu.supercluster.overpasser.adapter.OverpassQueryResult;
import hu.supercluster.overpasser.adapter.OverpassQueryResult.Element;
import hu.supercluster.overpasser.app.view.PoiInfoWindowAdapter;
@EBean
public class MapPoiHandler {
private MapFragment fragment;
private Map<Long, Element> poiMap;
@RootContext
Context context;
@Bean
MapOverpassAdapter overApiAdapter;
@Bean
PoiInfoWindowAdapter poiInfoWindowAdapter;
public MapPoiHandler() {
poiMap = new HashMap<>();
}
public void setFragment(MapFragment fragment) {
this.fragment = fragment;
}
public void reset() {
poiMap.clear();
}
@Background
void fetchPois(LatLngBounds bounds) {
OverpassQueryResult result = overApiAdapter.search(bounds);
if (result != null) {
for (Element poi : result.elements) {
if (!alreadyStored(poi)) {
fixTitle(poi);
storePoi(poi);
showPoi(poi);
}
}
}
}
private boolean alreadyStored(Element poi) {
return poiMap.containsKey(poi.id);
}
private void fixTitle(Element poi) {
Element.Tags info = poi.tags;
if (info.name == null) {
info.name = context.getResources().getString(R.string.poi_category_public_parking);
}
}
private void storePoi(Element poi) {
poiMap.put(poi.id, poi);
}
@UiThread
void showPoi(Element poi) {
MarkerOptions options = new MarkerOptions()
.position(new LatLng(poi.lat, poi.lon))
;
Marker marker = fragment.getGoogleMap().addMarker(options);
poiInfoWindowAdapter.addMarkerInfo(marker, poi);
}
}