package mobi.pharmaapp.view;
import android.app.ActionBar;
import android.app.ActionBar.OnNavigationListener;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Toast;
import com.google.analytics.tracking.android.EasyTracker;
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 mobi.pharmaapp.R;
import mobi.pharmaapp.models.DataModel;
import mobi.pharmaapp.util.Pharmacy;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import mobi.pharmaapp.models.UserModel;
import mobi.pharmaapp.util.LocalConstants;
/**
*
* @author see /AUTHORS
*/
public class LocateActivity extends MapActivity {
private MapView mapView;
private GeoPoint curLoc;
private MapOverlayItem previousLocOverlay;
private GeoPoint previousLoc;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nearby_layout);
DataModel.getInstance().setPharmacistsContainer(this);
DataModel.getInstance().setEmergencyPharmacistsContainer(this);
getActionBar().setDisplayShowTitleEnabled(false);
previousLoc = LocalConstants.INITIAL_USER_LOCATION;
mapView = (MapView) findViewById(R.id.mapView);
mapView.getController().setZoom(14);
mapView.setBuiltInZoomControls(true);
final List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.loc);
final MapOverlayItem itemizedoverlay = new MapOverlayItem(drawable, this);
Toast.makeText(getApplicationContext(), getString(R.string.get_cur_loc), Toast.LENGTH_LONG).show();
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new MapLocationListener());
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_spinner_dropdown_item, getResources().getStringArray(R.array.map_modes));
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
ActionBar.OnNavigationListener navigationListener = new OnNavigationListener() {
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
DataModel.getInstance().setMapMode(DataModel.MAP_MODE.values()[itemPosition]);
switch (DataModel.getInstance().getMapMode()) {
case ALL:
new LoadDataDialog(LocateActivity.this) {
@Override
protected void onPostExecute(Integer result) {
this.dialog.dismiss();
if (result.intValue() == 1) {
this.showErrorDialogAndExit();
} else {
addOverlays(itemizedoverlay, mapOverlays);
}
}
}.execute();
break;
case EMERGENCY_ONLY:
new LoadEmergencyDataDialog(LocateActivity.this) {
@Override
protected void onPostExecute(Integer result) {
this.dialog.dismiss();
if (result.intValue() == 1) {
this.showErrorDialogAndExit();
} else {
addOverlays(itemizedoverlay, mapOverlays);
}
}
}.execute();
break;
}
return false;
}
};
getActionBar().setListNavigationCallbacks(adapter, navigationListener);
getActionBar().setSelectedNavigationItem(DataModel.getInstance().getMapMode().ordinal());
}
private void addOverlays(MapOverlayItem itemizedoverlay, List<Overlay> mapOverlays) {
mapView.getOverlays().clear();
if(previousLocOverlay != null){
mapView.getOverlays().add(previousLocOverlay);
}
Collection<Pharmacy> c = null;
switch (DataModel.getInstance().getMapMode()) {
case ALL:
c = DataModel.getInstance().getPharmacies().values();
break;
case EMERGENCY_ONLY:
c = DataModel.getInstance().getEmergencyPharmacies(DataModel.LIST_TYPE.SORT_ON_DISTANCE);
break;
}
if (c == null) {
return; // Should not happen
}
List<Pharmacy> l = new ArrayList<Pharmacy>();
l.addAll(c);
for (int i = 0; i < l.size(); i++) {
GeoPoint point = new GeoPoint((int) (l.get(i).getLocation().getLat() * 1000000), (int) (l.get(i).getLocation().getLon() * 1000000));
if (i == 0) {
mapView.getController().setCenter(point);
}
itemizedoverlay.addOverlay(new OverlayItem(point, l.get(i).getName(), l.get(i).getAddress()));
}
mapOverlays.add(itemizedoverlay);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
@Override
public void onStart() {
super.onStart();
EasyTracker.getInstance().activityStart(this);
}
@Override
public void onStop() {
super.onStop();
EasyTracker.getInstance().activityStop(this);
}
private class MapLocationListener implements LocationListener {
public void onLocationChanged(Location location) {
if (location != null) {
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = LocateActivity.this.getResources().getDrawable(R.drawable.curloc);
MapOverlayItem itemizedoverlay = new MapOverlayItem(drawable, LocateActivity.this);
curLoc = new GeoPoint((int) (location.getLatitude() * 1E6), (int) (location.getLongitude() * 1E6));
UserModel.getInstance().setCurrentLocation(curLoc);
if (Math.abs(curLoc.getLatitudeE6() - previousLoc.getLatitudeE6()) > 1E4
&& Math.abs(curLoc.getLongitudeE6() - previousLoc.getLongitudeE6()) > 1E3) {
mapView.getController().animateTo(curLoc);
mapView.getController().setZoom(15);
}
OverlayItem overlayitem = new OverlayItem(curLoc, getString(R.string.me), getString(R.string.my_cur_loc));
itemizedoverlay.addOverlay(overlayitem);
if (previousLocOverlay != null) {
mapOverlays.remove(previousLocOverlay);
}
mapOverlays.add(itemizedoverlay);
previousLocOverlay = itemizedoverlay;
previousLoc = curLoc;
}
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
public void onProviderEnabled(String provider) {
}
public void onProviderDisabled(String provider) {
}
}
}