Changeset View
Changeset View
Standalone View
Standalone View
src/it/reyboz/bustorino/ActivityMap.java
- This file was added.
package it.reyboz.bustorino; | |||||
import android.content.Context; | |||||
import android.content.Intent; | |||||
import android.os.Build; | |||||
import android.os.Bundle; | |||||
import android.support.annotation.RequiresApi; | |||||
import android.support.v7.app.AppCompatActivity; | |||||
import android.support.v7.preference.PreferenceManager; | |||||
import org.osmdroid.api.IMapController; | |||||
import org.osmdroid.config.Configuration; | |||||
import org.osmdroid.events.DelayedMapListener; | |||||
import org.osmdroid.events.MapListener; | |||||
import org.osmdroid.events.ScrollEvent; | |||||
import org.osmdroid.events.ZoomEvent; | |||||
import org.osmdroid.tileprovider.tilesource.TileSourceFactory; | |||||
import org.osmdroid.util.BoundingBox; | |||||
import org.osmdroid.util.GeoPoint; | |||||
import org.osmdroid.views.MapView; | |||||
import org.osmdroid.views.overlay.Marker; | |||||
import org.osmdroid.views.overlay.infowindow.InfoWindow; | |||||
import it.reyboz.bustorino.backend.Stop; | |||||
import it.reyboz.bustorino.map.CustomInfoWindow; | |||||
import it.reyboz.bustorino.middleware.StopsDB; | |||||
public class ActivityMap extends AppCompatActivity { | |||||
private static MapView map = null; | |||||
public Context ctx; | |||||
@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) | |||||
@Override public void onCreate(Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
//handle permissions first, before map is created. not depicted here | |||||
//load/initialize the osmdroid configuration, this can be done | |||||
ctx = getApplicationContext(); | |||||
Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx)); | |||||
//setting this before the layout is inflated is a good idea | |||||
//it 'should' ensure that the map has a writable location for the map cache, even without permissions | |||||
//if no tiles are displayed, you can try overriding the cache path using Configuration.getInstance().setCachePath | |||||
//see also StorageUtils | |||||
//note, the load method also sets the HTTP User Agent to your application's package name, abusing osm's tile servers will get you banned based on this string | |||||
//inflate and create the map | |||||
setContentView(R.layout.activity_map); | |||||
map = (MapView) findViewById(R.id.map); | |||||
map.setTileSource(TileSourceFactory.MAPNIK); | |||||
// add ability to zoom with 2 fingers | |||||
map.setMultiTouchControls(true); | |||||
// take the parameters if it's called from other Activities | |||||
Bundle b = getIntent().getExtras(); | |||||
GeoPoint marker = null; | |||||
String name = null; | |||||
String ID = null; | |||||
if(b != null) { | |||||
double lat = b.getDouble("lat"); | |||||
double lon = b.getDouble("lon"); | |||||
marker = new GeoPoint(lat, lon); | |||||
name = b.getString("name"); | |||||
ID = b.getString("ID"); | |||||
} | |||||
startMap(marker, name, ID); | |||||
// on drag and zoom reload the markers | |||||
map.addMapListener(new DelayedMapListener(new MapListener() { | |||||
@Override | |||||
public boolean onScroll(ScrollEvent paramScrollEvent) { | |||||
loadMarkers(); | |||||
return true; | |||||
} | |||||
@Override | |||||
public boolean onZoom(ZoomEvent event) { | |||||
loadMarkers(); | |||||
return true; | |||||
} | |||||
})); | |||||
} | |||||
public void startMap(GeoPoint marker, String name, String ID) { | |||||
// move the map on the marker position or on a default view point: Turin, Piazza Castello | |||||
// and set the start zoom | |||||
IMapController mapController = map.getController(); | |||||
GeoPoint startPoint; | |||||
if (marker != null) { | |||||
startPoint = marker; | |||||
mapController.setZoom(20.0); | |||||
} else { | |||||
startPoint = new GeoPoint(45.0708, 7.6858); | |||||
mapController.setZoom(18.0); | |||||
} | |||||
// set the minimum zoom level | |||||
map.setMinZoomLevel(15.5); | |||||
mapController.setCenter(startPoint); | |||||
loadMarkers(); | |||||
if (marker != null) { | |||||
// make a marker with the info window open for the searched marker | |||||
makeMarker(startPoint, name , ID, true); | |||||
} | |||||
} | |||||
public void makeMarker(GeoPoint geoPoint, String stopName, String ID, boolean isStartMarker) { | |||||
// add a marker | |||||
Marker marker = new Marker(map); | |||||
// set custom info window as info window | |||||
CustomInfoWindow popup = new CustomInfoWindow(map, ID, stopName); | |||||
marker.setInfoWindow(popup); | |||||
// make the marker clickable | |||||
marker.setOnMarkerClickListener((thisMarker, mapView) -> { | |||||
if (thisMarker.isInfoWindowOpen()) { | |||||
// on second click | |||||
// create an intent with these extras | |||||
Intent intent = new Intent(ActivityMap.this, ActivityMain.class); | |||||
Bundle b = new Bundle(); | |||||
b.putString("bus-stop-ID", ID); | |||||
b.putString("bus-stop-display-name", stopName); | |||||
intent.putExtras(b); | |||||
intent.setFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); | |||||
// start ActivityMain with the previous intent | |||||
startActivity(intent); | |||||
} else { | |||||
// on first click | |||||
// hide all opened info window | |||||
InfoWindow.closeAllInfoWindowsOn(map); | |||||
// show this particular info window | |||||
thisMarker.showInfoWindow(); | |||||
// move the map to its position | |||||
map.getController().animateTo(thisMarker.getPosition()); | |||||
} | |||||
return true; | |||||
}); | |||||
// set its position | |||||
marker.setPosition(geoPoint); | |||||
marker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM); | |||||
// display the marker | |||||
map.getOverlays().add(marker); | |||||
// add to it an icon | |||||
marker.setIcon(getResources().getDrawable(R.drawable.bus_marker)); | |||||
// add to it a title | |||||
marker.setTitle(stopName); | |||||
// show popup info window of the searched marker | |||||
if (isStartMarker) { | |||||
marker.showInfoWindow(); | |||||
} | |||||
} | |||||
public void loadMarkers() { | |||||
// get rid of the previous markers | |||||
map.getOverlays().clear(); | |||||
// get the top, bottom, left and right screen's coordinate | |||||
BoundingBox bb = map.getBoundingBox(); | |||||
double latFrom = bb.getLatSouth(); | |||||
double latTo = bb.getLatNorth(); | |||||
double lngFrom = bb.getLonWest(); | |||||
double lngTo = bb.getLonEast(); | |||||
// get the stops located in those coordinates | |||||
StopsDB stopsDB = new StopsDB(ctx); | |||||
stopsDB.openIfNeeded(); | |||||
Stop[] stops = stopsDB.queryAllInsideMapView(latFrom, latTo, lngFrom, lngTo); | |||||
stopsDB.closeIfNeeded(); | |||||
// add new markers of those stops | |||||
for (Stop stop : stops) { | |||||
GeoPoint marker = new GeoPoint(stop.getLatitude(), stop.getLongitude()); | |||||
makeMarker(marker, stop.getStopDefaultName(), stop.ID, false); | |||||
} | |||||
} | |||||
public void onResume(){ | |||||
super.onResume(); | |||||
//this will refresh the osmdroid configuration on resuming. | |||||
//if you make changes to the configuration, use | |||||
//SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); | |||||
//Configuration.getInstance().load(this, PreferenceManager.getDefaultSharedPreferences(this)); | |||||
map.onResume(); //needed for compass, my location overlays, v6.0.0 and up | |||||
} | |||||
public void onPause(){ | |||||
super.onPause(); | |||||
//this will refresh the osmdroid configuration on resuming. | |||||
//if you make changes to the configuration, use | |||||
//SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); | |||||
//Configuration.getInstance().save(this, prefs); | |||||
map.onPause(); //needed for compass, my location overlays, v6.0.0 and up | |||||
} | |||||
} | |||||
No newline at end of file |
Public contents are in Creative Commons Attribution-ShareAlike 4.0 (CC-BY-SA) or GNU Free Documentation License (at your option) unless otherwise noted. · Contact / Register