package de.jkliemann.parkendd;
import android.location.Location;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import org.osmdroid.api.IMapController;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ItemizedIconOverlay;
import org.osmdroid.views.overlay.OverlayItem;
import java.util.ArrayList;
public class MapActivity extends ActionBarActivity {
private ItemizedIconOverlay<OverlayItem> popupOverlay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
City city = ((ParkenDD)getApplication()).currentCity();
Location self;
if(((ParkenDD)getApplication()).autoCity()){
self = ((ParkenDD)getApplication()).location();
}else{
self = city.location();
}
setTitle(city.name());
final MapView map = (MapView)findViewById(R.id.osmap);
map.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
map.setBuiltInZoomControls(true);
map.setMultiTouchControls(true);
final IMapController mapctl = map.getController();
mapctl.setZoom(15);
ItemizedIconOverlay<OverlayItem> spotOverlay = new ItemizedIconOverlay<>(this, createItemList(city.spots()),
new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
@Override
public boolean onItemSingleTapUp(int index, OverlayItem item) {
mapctl.setCenter(item.getPoint());
SpotIconBitmap icon = (SpotIconBitmap) item.getDrawable();
ParkingSpot spot = icon.getSpot();
setPopup(map, spot, (GeoPoint)item.getPoint());
return false;
}
@Override
public boolean onItemLongPress(int index, OverlayItem item) {
return false;
}
}
);
map.getOverlays().add(spotOverlay);
try {
GeoPoint selfLoc = new GeoPoint(self.getLatitude(), self.getLongitude());
mapctl.setCenter(selfLoc);
OverlayItem selfItem = new OverlayItem("Location", "", selfLoc);
ArrayList<OverlayItem> selfList = new ArrayList<>();
selfList.add(selfItem);
ItemizedIconOverlay<OverlayItem> selfOverlay = new ItemizedIconOverlay<>(this, selfList, new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
@Override
public boolean onItemSingleTapUp(int index, OverlayItem item) {
mapctl.setCenter(item.getPoint());
unsetPopup(map);
return false;
}
@Override
public boolean onItemLongPress(int index, OverlayItem item) {
return false;
}
});
map.getOverlays().add(selfOverlay);
}catch (NullPointerException e){
e.printStackTrace();
mapctl.setCenter(new GeoPoint(city.location().getLatitude(), city.location().getLongitude()));
}
map.invalidate();
}
private ArrayList<OverlayItem> createItemList(ArrayList<ParkingSpot> spotlist){
ArrayList<OverlayItem> itemList = new ArrayList<>();
for(ParkingSpot spot : spotlist){
String desc = "";
SpotIcon marker = new SpotIcon(spot, this);
switch (spot.state()){
case "closed":
desc = getString(R.string.closed);
break;
case "nodata":
desc = getString(R.string.nodata);
break;
default:
desc = String.valueOf(spot.free()) + " " + getString(R.string.of) + " " + String.valueOf(spot.count());
break;
}
try {
OverlayItem olItem = new OverlayItem(spot.name(), desc, new GeoPoint(spot.location().getLatitude(), spot.location().getLongitude()));
olItem.setMarker(marker.getBitmapDrawable());
olItem.setMarkerHotspot(OverlayItem.HotspotPlace.CENTER);
itemList.add(olItem);
}catch (NullPointerException e){
e.printStackTrace();
}
}
return itemList;
}
private void setPopup(MapView mapv, ParkingSpot spot, GeoPoint point){
final MapView map = mapv;
if(popupOverlay != null) {
map.getOverlays().remove(popupOverlay);
}
OverlayItem popup = new OverlayItem(spot.name(), spot.state(), point);
String val;
switch (spot.state()){
case "closed":
val = getString(R.string.closed);
break;
case "nodata":
val = getString(R.string.nodata);
break;
default:
val = String.valueOf(spot.free()) + " " + getString(R.string.of) + " " + String.valueOf(spot.count());
break;
}
SlotPopup marker = new SlotPopup(spot.name(), val, this);
popup.setMarker(marker.getBitmapDrawable());
ArrayList<OverlayItem> popupList = new ArrayList<>();
popupList.add(popup);
popupOverlay = new ItemizedIconOverlay<>(this, popupList, new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
@Override
public boolean onItemSingleTapUp(int index, OverlayItem item) {
map.getOverlays().remove(popupOverlay);
return false;
}
@Override
public boolean onItemLongPress(int index, OverlayItem item) {
return false;
}
});
map.getOverlays().add(popupOverlay);
}
private void unsetPopup(MapView map){
if(popupOverlay != null) {
map.getOverlays().remove(popupOverlay);
popupOverlay = null;
}
}
}