package com.ushahidi.android.app.checkin;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;
import com.ushahidi.android.app.About;
import com.ushahidi.android.app.Dashboard;
import com.ushahidi.android.app.IncidentAdd;
import com.ushahidi.android.app.IncidentTab;
import com.ushahidi.android.app.MainApplication;
import com.ushahidi.android.app.MapUserLocation;
import com.ushahidi.android.app.Preferences;
import com.ushahidi.android.app.R;
import com.ushahidi.android.app.Settings;
import com.ushahidi.android.app.data.Database;
import com.ushahidi.android.app.util.ApiUtils;
import com.ushahidi.android.app.util.Util;
/**
* Created by IntelliJ IDEA. User: Ahmed Date: 2/17/11 Time: 2:21 PM To change
* this template use File | Settings | File Templates.
*/
public class CheckinMap extends MapUserLocation {
private List<Checkin> checkinsList = null;
private List<Checkin> checkins = null;
private Cursor cursor;
protected String locationName = "";
protected String name = "";
private Bundle extras = new Bundle();
private Bundle checkinsBundle = new Bundle();
private static final int HOME = Menu.FIRST + 1;
private static final int ADD_CHECKIN = Menu.FIRST + 2;
private static final int CHECKIN_MAP = Menu.FIRST + 3;
private static final int CHECKIN_REFRESH = Menu.FIRST + 4;
private static final int SETTINGS = Menu.FIRST + 5;
private static final int ABOUT = Menu.FIRST + 6;
private static final int GOTOHOME = 0;
private static final int POST_CHECKIN = 1;
private static final int CHECKINS_MAP = 2;
private static final int REQUEST_CODE_SETTINGS = 4;
private static final int REQUEST_CODE_ABOUT = 5;
protected void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
Preferences.loadSettings(CheckinMap.this);
setContentView(R.layout.checkin_map);
mapView = (MapView)findViewById(R.id.checkin_mapview);
mapView.setBuiltInZoomControls(true);
mapController = mapView.getController();
name = Preferences.firstname + " " + Preferences.lastname;
checkins = new ArrayList<Checkin>();
// checkinsList = showCheckins();
CheckinsTask checkinTask = new CheckinsTask();
checkinTask.appContext = this;
checkinTask.execute();
}
/**
* add marker to the map
*/
private void populateMap() {
Drawable marker = getResources().getDrawable(R.drawable.map_marker_red);
marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight());
mapView.getOverlays().add(new CheckinsOverlay(marker, mapView));
}
// put this stuff in a seperate thread
final Runnable mMarkersOnMap = new Runnable() {
public void run() {
populateMap();
}
};
// menu stuff
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
populateMenu(menu);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
populateMenu(menu);
return (super.onCreateOptionsMenu(menu));
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// applyMenuChoice(item);
return (applyMenuChoice(item) || super.onOptionsItemSelected(item));
}
@Override
public boolean onContextItemSelected(MenuItem item) {
return (applyMenuChoice(item) || super.onContextItemSelected(item));
}
public void onAddReport(View v) {
Preferences.loadSettings(CheckinMap.this);
if (Preferences.isCheckinEnabled == 1) {
Intent checkinActivityIntent = new Intent().setClass(CheckinMap.this,
CheckinActivity.class);
startActivity(checkinActivityIntent);
setResult(RESULT_OK);
} else {
Intent intent = new Intent(CheckinMap.this, IncidentAdd.class);
startActivityForResult(intent, 0);
setResult(RESULT_OK);
}
}
private void populateMenu(Menu menu) {
MenuItem i;
i = menu.add(Menu.NONE, HOME, Menu.NONE, R.string.menu_home);
i.setIcon(R.drawable.menu_home);
i = menu.add(Menu.NONE, ADD_CHECKIN, Menu.NONE, R.string.checkin_btn);
i.setIcon(R.drawable.menu_add);
i = menu.add(Menu.NONE, CHECKIN_MAP, Menu.NONE, R.string.checkin_list);
i.setIcon(R.drawable.menu_map);
i = menu.add(Menu.NONE, CHECKIN_REFRESH, Menu.NONE, R.string.menu_sync);
i.setIcon(R.drawable.menu_refresh);
i = menu.add(Menu.NONE, SETTINGS, Menu.NONE, R.string.menu_settings);
i.setIcon(R.drawable.menu_settings);
i = menu.add(Menu.NONE, ABOUT, Menu.NONE, R.string.menu_about);
i.setIcon(R.drawable.menu_about);
}
private void refreshForNewCheckins() {
CheckinsTask checkinsTask = new CheckinsTask();
checkinsTask.appContext = this;
checkinsTask.execute();
}
private boolean applyMenuChoice(MenuItem item) {
Intent intent;
switch (item.getItemId()) {
case HOME:
intent = new Intent(CheckinMap.this, Dashboard.class);
startActivityForResult(intent, GOTOHOME);
return true;
case CHECKIN_REFRESH:
refreshForNewCheckins();
return (true);
case CHECKIN_MAP:
checkinsBundle.putInt("tab_index", 0);
intent = new Intent(CheckinMap.this, IncidentTab.class);
intent.putExtra("tab", checkinsBundle);
startActivityForResult(intent, CHECKINS_MAP);
return (true);
case ADD_CHECKIN:
intent = new Intent(CheckinMap.this, CheckinActivity.class);
startActivityForResult(intent, POST_CHECKIN);
return (true);
case ABOUT:
intent = new Intent(CheckinMap.this, About.class);
startActivityForResult(intent, REQUEST_CODE_ABOUT);
setResult(RESULT_OK);
return true;
case SETTINGS:
intent = new Intent(CheckinMap.this, Settings.class);
// Make it a subactivity so we know when it returns
startActivityForResult(intent, REQUEST_CODE_SETTINGS);
return (true);
}
return (false);
}
/**
* Implementation of MapUserLocation methods
* @param latitude Latitude
* @param longitude Longitude
*/
protected void locationChanged(double latitude, double longitude, boolean doReverseGeocode) {
Log.i(getClass().getSimpleName(), String.format("locationChanged: %f, %f", latitude, longitude));
}
@Override
protected UpdatableMarker createUpdatableMarker(Drawable marker, GeoPoint point){
return new DeviceLocationOverlay(marker, point);
}
private class CheckinsOverlay extends CheckinItemizedOverlay<OverlayItem> {
private ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
public CheckinsOverlay(Drawable marker, MapView mapView) {
super(boundCenterBottom(marker), mapView, CheckinMap.this, checkins, extras);
mapView.getContext();
for (Checkin checkin : checkinsList) {
items.add(new OverlayItem(getPoint(Double.valueOf(checkin.getLat()),
Double.valueOf(checkin.getLon())),checkin.getName(), Util.limitString(checkin.getMsg(), 30)
+ "\n" + checkin.getDate()));
}
populate();
}
@Override
protected OverlayItem createItem(int i) {
return items.get(i);
}
@Override
protected boolean onBalloonTap(int i) {
return true;
}
@Override
public int size() {
return (items.size());
}
}
private class DeviceLocationOverlay extends CheckinItemizedOverlay<OverlayItem>
implements UpdatableMarker {
private OverlayItem device;
public DeviceLocationOverlay(Drawable marker, GeoPoint point) {
super(boundCenterBottom(marker), mapView, CheckinMap.this, checkins, extras);
update(point);
}
public void update(GeoPoint point){
String dispname = name.trim();
if( TextUtils.isEmpty(dispname))
dispname = getString(R.string.no_name);
device = new OverlayItem(point, dispname, getString(R.string.curr_location));
populate();
}
@Override
protected OverlayItem createItem(int i) {
return device;
}
@Override
protected boolean onBalloonTap(int i) {
return true;
}
@Override
public int size() {
return 1;
}
}
// get checkins from the db
public List<Checkin> showCheckins() {
cursor = MainApplication.mDb.fetchAllCheckins();
String name;
String date;
String mesg;
String location;
if (cursor.moveToFirst()) {
int idIndex = cursor.getColumnIndexOrThrow(Database.CHECKIN_ID);
int userIdIndex = cursor.getColumnIndexOrThrow(Database.CHECKIN_USER_ID);
int dateIndex = cursor.getColumnIndexOrThrow(Database.CHECKIN_DATE);
int locationIndex = cursor.getColumnIndexOrThrow(Database.CHECKIN_LOC_NAME);
int mesgIndex = cursor.getColumnIndexOrThrow(Database.CHECKIN_MESG);
int latitudeIndex = cursor.getColumnIndexOrThrow(Database.CHECKIN_LOC_LATITUDE);
int longitudeIndex = cursor
.getColumnIndexOrThrow(Database.CHECKIN_LOC_LONGITUDE);
do {
Checkin checkinsData = new Checkin();
checkins.add(checkinsData);
int id = Util.toInt(cursor.getString(idIndex));
checkinsData.setId(String.valueOf(id));
checkinsData.setLat(cursor.getString(latitudeIndex));
checkinsData.setLon(cursor.getString(longitudeIndex));
name = cursor.getString(userIdIndex);
checkinsData.setName(name);
mesg = cursor.getString(mesgIndex);
checkinsData.setMsg(mesg);
location = cursor.getString(locationIndex);
checkinsData.setLoc(location);
date = Util.formatDate("yyyy-MM-dd HH:mm:ss", cursor.getString(dateIndex),
"MMMM dd, yyyy 'at' hh:mm:ss a");
checkinsData.setDate(date);
checkinsData.setImage(String.valueOf(id));
} while (cursor.moveToNext());
}
cursor.close();
return checkins;
}
private class CheckinsTask extends AsyncTask<Void, Void, Integer> {
protected Integer status;
protected Context appContext;
@Override
protected void onPreExecute() {
setProgressBarIndeterminateVisibility(true);
}
@Override
protected Integer doInBackground(Void... params) {
status = ApiUtils.processCheckins(appContext);
return status;
}
@Override
protected void onPostExecute(Integer result) {
if (result == 2) {
Util.showToast(appContext, R.string.internet_connection);
} else if (result == 1) {
Util.showToast(appContext, R.string.could_not_fetch_reports);
}
checkinsList = showCheckins();
if (checkinsList.size() == 0) {
Util.showToast(appContext, R.string.no_reports);
} else {
populateMap();
}
setProgressBarIndeterminateVisibility(false);
}
}
}