package edu.fsu.cs.contextprovider.map; import java.util.List; import java.util.concurrent.atomic.AtomicReference; import android.R.bool; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.drawable.Drawable; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView; import com.google.android.maps.MyLocationOverlay; import com.google.android.maps.Overlay; import com.google.android.maps.OverlayItem; import edu.fsu.cs.contextprovider.R; import edu.fsu.cs.contextprovider.R.drawable; import edu.fsu.cs.contextprovider.R.id; import edu.fsu.cs.contextprovider.R.layout; import edu.fsu.cs.contextprovider.data.ContextConstants; import edu.fsu.cs.contextprovider.monitor.DerivedMonitor; public class AddPlaceMapActivity extends MapActivity { private MyLocationOverlay myLocationOverlay; protected MapView map; private MapController mapController; private Criteria criteria; private LocationManager locationManager; private PlaceItemizedOverlay overlay; private Location currentLocation; protected final AtomicReference<Place> destinationReference = new AtomicReference<Place>(); protected Drawable destinationDrawable; protected Drawable placeDrawable; private boolean DEBUG = true; private int REQUEST_ID = -1; SharedPreferences prefs; private double placeLat; private double placeLon; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.placemap); Intent intent = getIntent(); REQUEST_ID = intent.getIntExtra(ContextConstants.PLACE_REQUEST_ID, -1); getPrefs(); map = (MapView) findViewById(R.id.mapView); createOverlay(); // Mapcontroller set zoom and center mapController = map.getController(); // mapController.setCenter(point); mapController.setZoom(16); map.setBuiltInZoomControls(true); // Get the system location manager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // Set the criteria criteria = new Criteria(); // criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAccuracy(Criteria.ACCURACY_COARSE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); // other options Criteria.POWER_HIGH Criteria.POWER_MEDIUM criteria.setPowerRequirement(Criteria.POWER_LOW); } @Override public void onStart() { super.onStart(); // best provider for this criteria String provider = locationManager.getBestProvider(criteria, true); if (provider != null) { // Update with last know location Location location = locationManager.getLastKnownLocation(provider); update(location); // Start listening for location changes locationManager.requestLocationUpdates(provider, 60000, /* every 1min */ 1000, /* min 1km */locationListener); } } public void onStop() { // Stop listening for location changes locationManager.removeUpdates(locationListener); super.onStop(); } private final LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) { update(location); } public void onProviderDisabled(String provider) { update(null); } public void onProviderEnabled(String provider) { } public void onStatusChanged(String provider, int status, Bundle extras) { } }; public void createOverlay() { List<Overlay> mapOverlays = map.getOverlays(); switch (REQUEST_ID) { case ContextConstants.SET_HOME_REQUEST: if (DerivedMonitor.Home != null) { OverlayItem overlayitem = new OverlayItem(DerivedMonitor.Home.getGeoPoint(), "Home", "Home"); overlay = new PlaceItemizedOverlay(getResources().getDrawable(R.drawable.home)); overlay.addOverlay(overlayitem); mapOverlays.add(overlay); } break; case ContextConstants.SET_WORK_REQUEST: if (DerivedMonitor.Work != null) { OverlayItem overlayitem = new OverlayItem(DerivedMonitor.Work.getGeoPoint(), "Work", "Work"); overlay = new PlaceItemizedOverlay(getResources().getDrawable(R.drawable.work)); overlay.addOverlay(overlayitem); mapOverlays.add(overlay); } break; default: break; } mapOverlays.add(new PlaceOverlay(this)); // MyLocation manage your position and enable compass MyLocationOverlay myLocationOverlay = new MyLocationOverlay(this, map); mapOverlays.add(myLocationOverlay); myLocationOverlay.enableMyLocation(); } private void getPrefs() { prefs = getSharedPreferences(ContextConstants.CONTEXT_PREFS, MODE_PRIVATE); switch (REQUEST_ID) { case ContextConstants.SET_HOME_REQUEST: break; case ContextConstants.SET_WORK_REQUEST: if (DerivedMonitor.Work != null) { } else { } break; default: break; } } private void update(Location location) { if (location != null) { // Update your current location currentLocation = location; Double lat = location.getLatitude() * 1E6; Double lng = location.getLongitude() * 1E6; GeoPoint point = new GeoPoint(lat.intValue(), lng.intValue()); mapController.setCenter(point); mapController.setZoom(15); Toast.makeText(this, "My Location:" + location.getLatitude() + "," + location.getLongitude(), Toast.LENGTH_LONG); } } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } public void placeSelected(Place place) { destinationReference.set(place); final FloatingPointGeoPoint point = place.getLocation(); // List<Overlay> mapOverlays = map.getOverlays(); // mapOverlays.add(new PlaceOverlay(this)); // OverlayItem overlayitem = new OverlayItem(point.getGeoPoint(), "Home", "Home"); // overlay = new PlaceItemizedOverlay(getResources().getDrawable(R.drawable.home)); // overlay.addOverlay(overlayitem); new AlertDialog.Builder(this).setMessage("Add Place?").setIcon(R.drawable.location).setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { switch (REQUEST_ID) { case ContextConstants.SET_HOME_REQUEST: DerivedMonitor.Home = new FloatingPointGeoPoint(point.getLatitude(), point.getLongitude()); Toast.makeText(getApplicationContext(), "Home Updated\nLat:" + point.getLatitude() + "\nLon:" + point.getLongitude() + "\n Press Back to Exit", Toast.LENGTH_LONG).show(); break; case ContextConstants.SET_WORK_REQUEST: DerivedMonitor.Work = new FloatingPointGeoPoint(point.getLatitude(), point.getLongitude()); Toast.makeText(getApplicationContext(), "Work Updated\nLat:" + point.getLatitude() + "\nLon:" + point.getLongitude() + "\n Press Back to Exit", Toast.LENGTH_LONG).show(); break; default: break; } map.invalidate(); createOverlay(); } }).setNegativeButton("No", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // Do nothing, just let another destination be chosen. } }).show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { int base = Menu.FIRST; /* define the first */ MenuItem item1 = menu.add(base, base, base, "Map"); MenuItem item2 = menu.add(base, base + 1, base + 1, "Satellite"); MenuItem item3 = menu.add(base, base + 2, base + 2, "My Location"); MenuItem item4 = menu.add(base, base + 3, base + 3, "Return"); /* assign icons to the menu items */ item1.setIcon(android.R.drawable.ic_menu_gallery); item2.setIcon(android.R.drawable.ic_menu_mapmode); item3.setIcon(android.R.drawable.ic_menu_mylocation); item4.setIcon(android.R.drawable.ic_menu_close_clear_cancel); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { /* Satellite View */ case 1: map.setSatellite(false); break; /* street View */ case 2: map.setSatellite(true); break; /* go to users location */ case 3: if (currentLocation != null) { update(currentLocation); } break; /* List View */ case 4: finish(); break; } return true; } }