/**
* 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 android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.graphics.drawable.Drawable;
import org.osmdroid.DefaultResourceProxyImpl;
import org.osmdroid.ResourceProxy;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ItemizedOverlay;
import org.osmdroid.views.overlay.Overlay;
import org.osmdroid.views.overlay.OverlayItem;
import org.osmdroid.views.overlay.ItemizedIconOverlay;
import org.umit.icm.mobile.R;
import org.umit.icm.mobile.process.Globals;
import org.umit.icm.mobile.proto.MessageProtos.Event;
/**
* Implementation of OSM. This class extends AbstractMap.
*/
public class OSMMaps implements AbstractMap {
MapController mapController;
GeoPoint geoPoint;
ItemizedOverlay<OverlayItem> osmOverlay;
ResourceProxy resourceProxy;
Context context;
public OSMMaps() {
super();
}
public MapView getView(Context context, double lat, double lon){
final MapView osmMapView = new MapView(context, 256);
this.context = context;
this.geoPoint = OSMMaps.getGeoPoint(lat, lon);
this.resourceProxy = new DefaultResourceProxyImpl(context);
Drawable drawable = context.getResources().getDrawable(R.drawable.dot);
mapController = osmMapView.getController();
osmMapView.setBuiltInZoomControls(true);
osmMapView.setMultiTouchControls(true);
mapController.setZoom(14);
mapController.setCenter(this.geoPoint);
osmMapView.invalidate();
List<Overlay> overlayList = osmMapView.getOverlays();
this.osmOverlay = new ItemizedIconOverlay<OverlayItem>(getOSMOverlayList(context),
drawable, new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
@Override
public boolean onItemSingleTapUp(final int index,
final OverlayItem item) {
AlertDialog.Builder dialog
= new AlertDialog.Builder(OSMMaps.this.context);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.setPositiveButton("Okay", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialog.show();
return true;
}
@Override
public boolean onItemLongPress(final int index,
final OverlayItem item) {
AlertDialog.Builder dialog
= new AlertDialog.Builder(OSMMaps.this.context);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.setPositiveButton("Okay", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialog.show();
return true;
}
}, resourceProxy);
overlayList.add(osmOverlay);
osmMapView.invalidate();
return osmMapView;
}
public void updateView(MapView osmMapView, Context context, double lat, double lon){
this.context = context;
this.geoPoint = OSMMaps.getGeoPoint(lat, lon);
this.resourceProxy = new DefaultResourceProxyImpl(context);
Drawable drawable = context.getResources().getDrawable(R.drawable.dot);
mapController = osmMapView.getController();
osmMapView.setBuiltInZoomControls(true);
osmMapView.setMultiTouchControls(true);
mapController.setZoom(14);
//to ensure that the map is always centered on the current position
//mapController.setCenter(this.geoPoint);
osmMapView.invalidate();
List<Overlay> overlayList = osmMapView.getOverlays();
this.osmOverlay = new ItemizedIconOverlay<OverlayItem>(getOSMOverlayList(context),
drawable, new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
@Override
public boolean onItemSingleTapUp(final int index,
final OverlayItem item) {
AlertDialog.Builder dialog
= new AlertDialog.Builder(OSMMaps.this.context);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.setPositiveButton("Okay", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialog.show();
return true;
}
@Override
public boolean onItemLongPress(final int index,
final OverlayItem item) {
AlertDialog.Builder dialog
= new AlertDialog.Builder(OSMMaps.this.context);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.setPositiveButton("Okay", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialog.show();
return true;
}
}, resourceProxy);
overlayList.add(osmOverlay);
osmMapView.invalidate();
}
public List<OverlayItem> getOSMOverlayList(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(event.getTestType(), event.getEventType() + "\n" +
simpleDateFormat.format(event.getTimeUTC()) + "\n", gpt);
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);
}
@Override
public List<com.google.android.maps.OverlayItem> getOverlayList(Context context) {
// TODO Auto-generated method stub
return null;
}
}