package arida.ufc.br.moapgpstracker; import java.util.List; import org.achartengine.ChartFactory; import org.achartengine.model.XYMultipleSeriesDataset; import org.achartengine.renderer.XYMultipleSeriesRenderer; import org.apache.commons.io.IOUtils; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.json.JSONArray; import org.json.JSONObject; import org.moap.chart.SpeedOverTimeChart; import org.moap.overlays.GoogleMapsOverlay; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapActivity; import com.google.android.maps.MapView; import com.google.android.maps.Overlay; import com.google.android.maps.OverlayItem; import com.mendhak.gpslogger.common.Session; import com.mendhak.gpslogger.common.Utilities; import android.os.AsyncTask; import android.os.Bundle; import android.content.Intent; import android.graphics.Color; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ProgressBar; import android.widget.Toast; import arida.ufc.br.moap.core.beans.LatLonPoint; import arida.ufc.br.moap.core.beans.MovingObject; import arida.ufc.br.moap.core.beans.Trajectory; import arida.ufc.br.moap.datamodelapi.imp.TrajectoryModelImpl; public class HistoryActivity extends MapActivity { private enum ResponseType { INTERNET_ISSUE, OK, ERROR }; // List of points provided by the remote Server in response to a request private JSONArray list_of_points; private final DateTimeFormatter fmt = DateTimeFormat .forPattern("yyyy-M-d'+'H:m:s"); private final String TAG = "HistoryActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_history); DateTime today = new DateTime(); getHistory(today.minusDays(5), today); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_history, menu); return true; } @SuppressWarnings("unchecked") private void onChartMenu() { TrajectoryModelImpl<LatLonPoint, DateTime> model = getTrajectoryHistory(); if(model!=null){ Log.w(TAG, "onCharMenu"); SpeedOverTimeChart analysis = new SpeedOverTimeChart(model); XYMultipleSeriesDataset dataset = analysis.createDataset(); XYMultipleSeriesRenderer renderer = analysis.createRenderer(); if (dataset != null && renderer != null) { try { Intent intent = ChartFactory.getTimeChartIntent(this, dataset, renderer, "HH:mm"); // Intent intent = ChartFactory.getLineChartIntent(this, // dataset,renderer); startActivity(intent); } catch (Exception ex) { Utilities.LogError("ERROR CHART", ex); } } else { Utilities.LogDebug(String.format("Dataset - %s\nRenderer - ", dataset.toString(), renderer.toString())); } } else{ Log.w(TAG, "onCharMenu - model is null"); } } public boolean onOptionsItemSelected(MenuItem item) { int idx = item.getItemId(); switch (idx) { case R.id.history_chart: onChartMenu(); break; default: break; } return true; } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } private void getHistory(DateTime begin, DateTime end) { new AsyncTask<DateTime, Void, ResponseType>() { @Override protected ResponseType doInBackground(DateTime... params) { // TODO Auto-generated method stub String url = "http://sw4.us/ufc/"; // Parameters url += "?q=2&" + "id=1&" + "start=" + params[0].toString(fmt) + "&end=" + params[1].toString(fmt); Log.d(TAG, url); HttpGet httpGet = new HttpGet(url); // BasicHttpParams p = new BasicHttpParams(); // p.setParameter("q", Integer.toString(2)); // p.setParameter("id", "1"); // p.setParameter("start", params[0].toString(fmt)); // p.setParameter("end", params[1].toString(fmt)); // httpGet.setParams(p); Log.d("HistoryActivity", "URI: " + httpGet.getURI().toString()); HttpClient client = new DefaultHttpClient(); HttpResponse response = null; try { response = client.execute(httpGet); } catch (Exception e) { Log.w("HistoryActivity", "No internet connection", e); return ResponseType.INTERNET_ISSUE; } JSONObject jsonObject = null; try { jsonObject = new JSONObject(IOUtils.toString(response .getEntity().getContent())); } catch (Exception e) { Log.e("HistoryActivity", "Wrong JSON format", e); return ResponseType.ERROR; } try { if (jsonObject.has("meta")) { int code = jsonObject.getJSONObject("meta").getInt( "code"); if (code == 200) { Log.d("HistoryActivity", "code " + code); list_of_points = jsonObject.getJSONObject("result") .getJSONArray("point"); } else { Log.w("HistoryActivity", "Cannot connect to the server: " + code); return ResponseType.INTERNET_ISSUE; } } } catch (Exception e) { Log.e("HistoryActivity", "ERROR 2", e); } return ResponseType.OK; } @Override protected void onPreExecute() { super.onPreExecute(); ProgressBar pb = (ProgressBar) findViewById(R.id.history_progress_bar); pb.setEnabled(true); pb.setVisibility(View.VISIBLE); pb.setIndeterminate(true); Log.d("HistoryActivity", "onPreExecute"); } @Override protected void onPostExecute(ResponseType v) { ProgressBar pb = (ProgressBar) findViewById(R.id.history_progress_bar); pb.setEnabled(false); pb.setVisibility(View.INVISIBLE); pb.setIndeterminate(false); Log.d("HistoryActivity", "onPosExecute"); // Check the result of the process switch (v) { case OK: drawTrajectoryHistory(); break; case INTERNET_ISSUE: Toast.makeText(getApplicationContext(), "Cannot connect to the Server", Toast.LENGTH_SHORT) .show(); break; case ERROR: break; default: break; } } }.execute(begin, end); } @SuppressWarnings({ "unchecked"}) private TrajectoryModelImpl<LatLonPoint, DateTime> getTrajectoryHistory() { Log.d(TAG, "get trajectory history"); TrajectoryModelImpl<LatLonPoint, DateTime> model = null; if (this.list_of_points != null) { int size = this.list_of_points.length(); model = new TrajectoryModelImpl<LatLonPoint, DateTime>(); MovingObject mo = model.factory().newMovingObject( Session.getUserName()); Trajectory<LatLonPoint, DateTime> traj = model.factory() .newTrajectory(mo + "_0", mo); try { Log.d(TAG, "Loading trajectory model from JSON"); for (int i = 0; i < size; i++) { JSONObject object = this.list_of_points.getJSONObject(i); double lat = object.getDouble("lat"); double lon = object.getDouble("long"); LatLonPoint point = new LatLonPoint(lon, lat); String date = object.getString("time"); DateTime datetime = fmt.parseDateTime(date); traj.addPoint(point, datetime); } model.addTrajectory(traj); } catch (Exception e) { } } return model; } /* * Receive JSONArray with {time,lat,long} and draw on the map through * GoogleMapsOverlay */ private void drawTrajectoryHistory() { Log.d(TAG, "Draw trajectory history"); // Map settings MapView mapView = (MapView) findViewById(R.id.history_map_view); mapView.setBuiltInZoomControls(true); mapView.displayZoomControls(true); mapView.setClickable(true); // Overlay list List<Overlay> overlayList = mapView.getOverlays(); overlayList.clear(); // Google Maps overlay GoogleMapsOverlay overlay = new GoogleMapsOverlay(Color.BLUE); if (this.list_of_points != null) { int size = this.list_of_points.length(); try { Log.d(TAG, "Loading trajectory model from JSON"); for (int i = 0; i < size; i++) { JSONObject object = this.list_of_points.getJSONObject(i); double lat = object.getDouble("lat"); double lon = object.getDouble("long"); GeoPoint geoPoint = new GeoPoint( Utilities.convertCoordinates(lat), Utilities.convertCoordinates(lon)); OverlayItem oi = new OverlayItem(geoPoint, "", ""); overlay.addOverlayItem(oi); } overlayList.add(overlay); } catch (Exception e) { } // View the map mapView.invalidate(); } } }