/*******************************************************************************
* Copyright (c) 2011 Michel DAVID mimah35-at-gmail.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package fr.gotorennes;
import java.util.List;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import com.google.android.maps.GeoPoint;
import fr.gotorennes.domain.BikeStation;
import fr.gotorennes.domain.MetroStation;
import fr.gotorennes.domain.PointDeVente;
import fr.gotorennes.domain.RelayPark;
import fr.gotorennes.domain.Station;
import fr.gotorennes.util.BackgroundTask;
import fr.gotorennes.view.MapDrawable;
public class ProximityMapActivity extends AbstractMapActivity {
private boolean metroVisible;
private boolean busVisible;
private boolean veloVisible;
private boolean parcRelaisVisible;
private boolean pointDeVenteVisible;
private double latitude;
private double longitude;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
relayParkOverlay = new MapItemOverlay(new MapDrawable(this, R.drawable.relaypark)) {
@Override
protected boolean onTap(int index) {
MapLocationOverlay<RelayPark> overlayItem = items.get(index);
Intent intent = new Intent(getApplicationContext(), RelayParkActivity.class);
intent.putExtra("relayPark", overlayItem.getItem());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return false;
}
};
metroOverlay = new MapItemOverlay(new MapDrawable(this, R.drawable.metro)) {
@Override
protected boolean onTap(int index) {
MapLocationOverlay<MetroStation> overlayItem = items.get(index);
Intent intent = new Intent(getApplicationContext(), MetroStationActivity.class);
intent.putExtra("metroStation", overlayItem.getItem());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return false;
}
};
bikeOverlay = new MapItemOverlay(new MapDrawable(this, R.drawable.bike)) {
@Override
protected boolean onTap(int index) {
MapLocationOverlay<BikeStation> overlayItem = items.get(index);
Intent intent = new Intent(getApplicationContext(), BikeStationActivity.class);
intent.putExtra("bikeStation", overlayItem.getItem());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return false;
}
};
pointDeVenteOverlay = new MapItemOverlay(new MapDrawable(this, R.drawable.pointdevente)) {
@Override
protected boolean onTap(int index) {
MapLocationOverlay<Station> overlayItem = items.get(index);
Intent intent = new Intent(getApplicationContext(), PointDeVenteActivity.class);
intent.putExtra("pointDeVente", overlayItem.getItem());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return false;
}
};
busOverlay = new MapItemOverlay(new MapDrawable(this, R.drawable.bus)) {
@Override
protected boolean onTap(int index) {
MapLocationOverlay<Station> overlayItem = items.get(index);
Intent intent = new Intent(getApplicationContext(), BusStationActivity.class);
intent.putExtra("station", overlayItem.getItem());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return false;
}
};
}
@Override
protected String getTrackingName() {
return "carteGenerale";
}
@Override
protected void init() {
populate(getIntent());
}
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
populate(intent);
}
protected void centerMap(double latitude, double longitude) {
mapController.setZoom(18);
mapController.animateTo(new GeoPoint((int) (latitude * 1e6), (int) (longitude * 1e6)), new Runnable() {
@Override
public void run() {
loadProximityData();
}
});
}
public void showExternalMap(View view) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("geo:0,0?q=" + latitude + "," + longitude + "&z=18")));
}
boolean changePending = false;
@Override
protected synchronized void onMapChange() {
if (!changePending) {
changePending = true;
loadProximityData();
}
}
protected void populate(Intent intent) {
latitude = intent.getDoubleExtra("latitude", 48.110067);
longitude = intent.getDoubleExtra("longitude", -1.679149);
centerMap(latitude, longitude);
}
private double latitudeT;
private double latitudeB;
private double longitudeL;
private double longitudeR;
@Override
protected void loadProximityData() {
SharedPreferences prefs = getSharedPreferences("fr.gotorennes.Application", 0);
metroVisible = prefs.getBoolean("checkMetro", true);
busVisible = prefs.getBoolean("checkBus", true);
veloVisible = prefs.getBoolean("checkBike", true);
parcRelaisVisible = prefs.getBoolean("checkRelayPark", true);
pointDeVenteVisible = prefs.getBoolean("checkPointDeVente", true);
GeoPoint center = mapView.getMapCenter();
int latitudeCenter = center.getLatitudeE6();
int longitudeCenter = center.getLongitudeE6();
int latitudeSpan = mapView.getLatitudeSpan();
int longitudeSpan = mapView.getLongitudeSpan();
latitudeT = (latitudeCenter + (latitudeSpan / 2) + (latitudeSpan / 10)) / 1e6;
latitudeB = (latitudeCenter - (latitudeSpan / 2) - (latitudeSpan / 10)) / 1e6;
longitudeL = (longitudeCenter + (longitudeSpan / 2) + (longitudeSpan / 10)) / 1e6;
longitudeR = (longitudeCenter - (longitudeSpan / 2) - (longitudeSpan / 10)) / 1e6;
loadRelayParks();
}
private MapItemOverlay relayParkOverlay;
protected void loadRelayParks() {
if (!parcRelaisVisible) {
relayParkOverlay.removeAllItems();
loadMetroStations();
return;
}
BackgroundTask<List<RelayPark>> backgroundTask = new BackgroundTask<List<RelayPark>>(false) {
@Override
protected List<RelayPark> execute() {
return goToRennes.getRelayParkService().getRelayParks(latitudeB, latitudeT, longitudeL, longitudeR);
}
@Override
protected void callback(List<RelayPark> result) {
if (result != null) {
relayParkOverlay.removeAllItems();
for (RelayPark relay : result) {
relayParkOverlay.addItem(new MapLocationOverlay<RelayPark>(relay.name, relay.latitude, relay.longitude, relay));
}
addOverlay(relayParkOverlay);
}
loadMetroStations();
}
};
backgroundTask.start(this);
}
private MapItemOverlay metroOverlay;
protected void loadMetroStations() {
if (!metroVisible) {
metroOverlay.removeAllItems();
loadBikeStations();
return;
}
BackgroundTask<List<MetroStation>> backgroundTask = new BackgroundTask<List<MetroStation>>(false) {
@Override
protected List<MetroStation> execute() {
return goToRennes.getMetroStationService().getMetroStations(latitudeB, latitudeT, longitudeL, longitudeR);
}
@Override
protected void callback(List<MetroStation> result) {
if (result != null) {
metroOverlay.removeAllItems();
for (MetroStation metroStation : result) {
metroOverlay.addItem(new MapLocationOverlay<MetroStation>(metroStation.name, metroStation.latitude, metroStation.longitude, metroStation));
}
addOverlay(metroOverlay);
}
loadBikeStations();
}
};
backgroundTask.start(this);
}
private MapItemOverlay bikeOverlay;
protected void loadBikeStations() {
if (!veloVisible) {
bikeOverlay.removeAllItems();
loadPointsDeVente();
return;
}
BackgroundTask<List<BikeStation>> backgroundTask = new BackgroundTask<List<BikeStation>>(false) {
@Override
protected List<BikeStation> execute() {
return goToRennes.getBikeStationService().getBikeStations(latitudeB, latitudeT, longitudeL, longitudeR);
}
@Override
protected void callback(List<BikeStation> result) {
if (result != null) {
bikeOverlay.removeAllItems();
for (BikeStation bikeStation : result) {
bikeOverlay.addItem(new MapLocationOverlay<BikeStation>(bikeStation.name, bikeStation.latitude, bikeStation.longitude, bikeStation));
}
addOverlay(bikeOverlay);
}
loadPointsDeVente();
}
};
backgroundTask.start(this);
}
private MapItemOverlay pointDeVenteOverlay;
protected void loadPointsDeVente() {
if (!pointDeVenteVisible) {
pointDeVenteOverlay.removeAllItems();
loadBusStations();
return;
}
BackgroundTask<List<PointDeVente>> backgroundTask = new BackgroundTask<List<PointDeVente>>(false) {
@Override
protected List<PointDeVente> execute() {
return goToRennes.getPointDeVenteService().getPointsDeVente(latitudeB, latitudeT, longitudeL, longitudeR);
}
@Override
protected void callback(List<PointDeVente> result) {
if (result != null) {
pointDeVenteOverlay.removeAllItems();
for (PointDeVente pointDeVente : result) {
pointDeVenteOverlay.addItem(new MapLocationOverlay<PointDeVente>(pointDeVente.nom, pointDeVente.latitude, pointDeVente.longitude, pointDeVente));
}
addOverlay(pointDeVenteOverlay);
}
loadBusStations();
}
};
backgroundTask.start(this);
}
private MapItemOverlay busOverlay;
protected void loadBusStations() {
if (!busVisible) {
busOverlay.removeAllItems();
changePending = false;
mapView.invalidate();
return;
}
BackgroundTask<List<Station>> backgroundTask = new BackgroundTask<List<Station>>(false) {
@Override
protected List<Station> execute() {
return goToRennes.getBusDao().getStations(latitudeB, latitudeT, longitudeL, longitudeR);
}
@Override
protected void callback(List<Station> result) {
busOverlay.removeAllItems();
for (Station busStop : result) {
busOverlay.addItem(new MapLocationOverlay<Station>(busStop.nom, busStop.latitude, busStop.longitude, busStop));
}
addOverlay(busOverlay);
changePending = false;
mapView.invalidate();
}
};
backgroundTask.start(this);
}
}