/** * Copyright (C) 2011 Adriano Monteiro Marques * * Author: Zubair Nabi <zn.zubairnabi@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 2 of the License, or * (at your option) any later version. * * 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.umit.icm.mobile.maps; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.umit.icm.mobile.R; import org.umit.icm.mobile.process.Globals; import org.umit.icm.mobile.proto.MessageProtos.Event; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.graphics.drawable.Drawable; import com.google.android.maps.GeoPoint; import com.google.android.maps.ItemizedOverlay; import com.google.android.maps.MapController; import com.google.android.maps.MapView; import com.google.android.maps.Overlay; import com.google.android.maps.OverlayItem; /** * Implementation of GoogleMaps. This class extends AbstractMap. */ public class GoogleMaps implements AbstractMap { MapController mapController; GeoPoint geoPoint; public GoogleMaps() { super(); } public MapView getView(final Context context, double lat, double lon){ final MapView googleMapView = new MapView(context, context.getString(R.string.google_maps_api_key)); googleMapView.setClickable(true); googleMapView.setEnabled(true); this.geoPoint = GoogleMaps.getGeoPoint(lat, lon); class GoogleMapMarker extends ItemizedOverlay<OverlayItem> { private List<OverlayItem> overlayList; private Context context; public GoogleMapMarker(Drawable defaultMarker) { super(boundCenterBottom(defaultMarker)); } public GoogleMapMarker(Drawable drawable, Context context, List<OverlayItem> overlayList) { super(drawable); this.context = context; this.overlayList = overlayList; this. populate(); } @Override protected OverlayItem createItem(int i) { return overlayList.get(i); } @Override public int size() { return overlayList.size(); } @Override protected boolean onTap(int index) { OverlayItem overlayItem = overlayList.get(index); AlertDialog.Builder dialog = new AlertDialog.Builder(context); dialog.setTitle(overlayItem.getTitle()); dialog.setMessage(overlayItem.getSnippet()); dialog.setPositiveButton("Okay", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); dialog.show(); return true; } } mapController = googleMapView.getController(); googleMapView.setBuiltInZoomControls(true); mapController.setCenter(geoPoint); mapController.setZoom(15); googleMapView.invalidate(); List<Overlay> overlayList = googleMapView.getOverlays(); Drawable drawable = context.getResources().getDrawable(R.drawable.dot); GoogleMapMarker googleMapOverlay = new GoogleMapMarker(drawable, context, getOverlayList(context)); overlayList.add(googleMapOverlay); googleMapView.invalidate(); return googleMapView; } public void updateView(MapView googleMapView, final Context context, double lat, double lon){ this.geoPoint = GoogleMaps.getGeoPoint(lat, lon); class GoogleMapMarker extends ItemizedOverlay<OverlayItem> { private List<OverlayItem> overlayList; private Context context; public GoogleMapMarker(Drawable defaultMarker) { super(boundCenterBottom(defaultMarker)); } public GoogleMapMarker(Drawable drawable, Context context, List<OverlayItem> overlayList) { super(drawable); this.context = context; this.overlayList = overlayList; this. populate(); } @Override protected OverlayItem createItem(int i) { return overlayList.get(i); } @Override public int size() { return overlayList.size(); } @Override protected boolean onTap(int index) { OverlayItem overlayItem = overlayList.get(index); AlertDialog.Builder dialog = new AlertDialog.Builder(context); dialog.setTitle(overlayItem.getTitle()); dialog.setMessage(overlayItem.getSnippet()); dialog.setPositiveButton("Okay", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); dialog.show(); return true; } } mapController = googleMapView.getController(); googleMapView.setBuiltInZoomControls(true); //to ensure that the map is always centered on the current position //mapController.setCenter(geoPoint); mapController.setZoom(15); googleMapView.invalidate(); List<Overlay> overlayList = googleMapView.getOverlays(); Drawable drawable = context.getResources().getDrawable(R.drawable.dot); GoogleMapMarker googleMapOverlay = new GoogleMapMarker(drawable, context, getOverlayList(context)); overlayList.add(googleMapOverlay); googleMapView.invalidate(); } public List<OverlayItem> getOverlayList(Context context) { List<OverlayItem> overlayList = new ArrayList<OverlayItem>(); Iterator<Event> iterator = Globals.runtimeList.getEventsList().iterator(); while(iterator.hasNext()){ Event event = iterator.next(); Drawable drawable = context.getResources().getDrawable(R.drawable.greendot); double lat = getLat(geoPoint); double lon = getLon(geoPoint); GeoPoint gpt = getGeoPoint(lat+0.01,lon); if(event.getEventType().equals("CENSOR") ||event.getEventType().equals("THROTTLING") || event.getEventType().equals("OFF_LINE")) { drawable = context.getResources().getDrawable(R.drawable.reddot); } SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss"); OverlayItem overlayItem = new OverlayItem(gpt, event.getTestType(), event.getEventType() + "\n" + simpleDateFormat.format(event.getTimeUTC()) + "\n"); drawable.setBounds(0,0, 10, 10); overlayItem.setMarker(drawable); overlayList.add(overlayItem); } return overlayList; } public static GeoPoint getGeoPoint(double lat, double lon) { GeoPoint geoPoint = new GeoPoint( (int) (lat * 1E6), (int) (lon * 1E6)); return geoPoint; } public static double getLat(GeoPoint geoPoint) { return (geoPoint.getLatitudeE6()/1E6); } public static double getLon(GeoPoint geoPoint) { return (geoPoint.getLongitudeE6()/1E6); } }