package com.papagiannis.tuberun;
import java.util.ArrayList;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.util.TypedValue;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
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 com.google.android.gms.maps.model.PolylineOptions;
import com.papagiannis.tuberun.fragments.MeMapFragment;
import com.papagiannis.tuberun.osref.OSRef;
public class PartialRouteMapActivity extends FragmentActivity {
final PartialRouteMapActivity self = this;
protected GoogleMap gMap;
protected MeMapFragment mapFragment;
AsyncTask<ArrayList<Integer>, Integer, ArrayList<LatLng>> task;
/** Called when the activity is first created. */
@SuppressWarnings({ "unchecked", "deprecation" })
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.full_screen_map_fragment);
gMap = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map)).getMap();
final GoogleMap gmap = gMap;
mapFragment = (MeMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map_fragment);
showDialog(0);
try {
task = new AsyncTask<ArrayList<Integer>, Integer, ArrayList<LatLng>>() {
protected ArrayList<LatLng> doInBackground(
ArrayList<Integer>... loc) {
ArrayList<LatLng> result = new ArrayList<LatLng>();
ArrayList<Integer> coordinates = loc[0];
clearBounds();
for (int i = 0; i < coordinates.size() - 1; i += 2) {
int x = coordinates.get(i);
int y = coordinates.get(i + 1);
OSRef or = new OSRef(x, 1000000 - y);
uk.me.jstott.jcoord.LatLng ll = or.toLatLng();
ll.toWGS84();
LatLng lln = new LatLng(ll.getLat(), ll.getLng());
result.add(lln);
addPointInBounds(lln);
if (RouteResultsActivity.coordinatesType.containsKey(i)) {
//this is a marker
//TODO find station codes for departures.
}
}
return result;
}
protected void onProgressUpdate(Integer... progress) {
}
protected void onPostExecute(ArrayList<LatLng> result) {
if (result.size() < 2) {
wait_dialog.cancel();
return;
}
int color = Color.BLUE;
int icon = 0;
// First the route
PolylineOptions line = new PolylineOptions().width(9);
for (int i = 0; i < result.size(); i++) {
if (RouteResultsActivity.coordinatesType.containsKey(i)) {
if (i != 0) {
gmap.addPolyline(line);
}
line = new PolylineOptions().width(9);
ArrayList<Object> array = RouteResultsActivity.coordinatesType
.get(i);
color = (Integer) array.get(0);
if (color == Color.WHITE)
color = Color.BLACK;
line.color(color);
}
line.add(result.get(i));
}
if (line.getPoints().size() > 1)
gmap.addPolyline(line);
// And then the pushpins
final ArrayList<Marker> markers = new ArrayList<Marker>();
for (int i = 1; i < result.size(); i++) {
if (RouteResultsActivity.coordinatesType
.containsKey(i - 1)) {
ArrayList<Object> array = RouteResultsActivity.coordinatesType
.get(i - 1);
icon = (Integer) array.get(1);
if (icon == R.drawable.walk)
icon = R.drawable.walk_black;
MarkerOptions opt = new MarkerOptions();
opt.position(result.get(i - 1));
Log.d("Point", result.get(i-1).toString());
opt.icon(BitmapDescriptorFactory.fromResource(icon));
opt.title("Change");
opt.snippet((String) array.get(2));
markers.add(gmap.addMarker(opt));
}
}
wait_dialog.cancel();
mapFragment.getView().post(new Runnable() {
@Override
public void run() {
Resources r = getResources();
float px = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 40,
r.getDisplayMetrics());
gMap.animateCamera(CameraUpdateFactory
.newLatLngBounds(getBounds(), (int) px));
}
});
}
};
task.execute(RouteResultsActivity.coordinates);
} catch (Exception e) {
}
}
private double minLat = Double.MAX_VALUE;
private double minLong = Double.MAX_VALUE;
private double maxLat = -Double.MAX_VALUE;
private double maxLong = -Double.MAX_VALUE;
private void clearBounds() {
minLat = Double.MAX_VALUE;
minLong = Double.MAX_VALUE;
maxLat = -Double.MAX_VALUE;
maxLong = -Double.MAX_VALUE;
}
private void addPointInBounds(LatLng ll) {
minLat = Math.min(minLat, ll.latitude);
minLong = Math.min(minLong, ll.longitude);
maxLat = Math.max(maxLat, ll.latitude);
maxLong = Math.max(maxLong, ll.longitude);
}
private LatLngBounds getBounds() {
return new LatLngBounds(new LatLng(minLat, minLong), new LatLng(maxLat,
maxLong));
}
private ProgressDialog wait_dialog;
@Override
protected Dialog onCreateDialog(int id) {
wait_dialog = new ProgressDialog(this);
wait_dialog.setTitle("Drawing travel path");
wait_dialog.setMessage("Please wait...");
wait_dialog.setIndeterminate(true);
wait_dialog.setCancelable(true);
wait_dialog.setOnCancelListener(new ProgressDialog.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
task.cancel(true);
}
});
return wait_dialog;
}
}