package de.guerda.matekarte.map; import android.content.Context; 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.octo.android.robospice.persistence.exception.SpiceException; import com.octo.android.robospice.request.listener.RequestListener; import org.osmdroid.DefaultResourceProxyImpl; import org.osmdroid.ResourceProxy; import org.osmdroid.api.IMapController; import org.osmdroid.tileprovider.tilesource.ITileSource; import org.osmdroid.tileprovider.tilesource.XYTileSource; import org.osmdroid.util.GeoPoint; import org.osmdroid.views.MapView; import org.osmdroid.views.overlay.ItemizedIconOverlay; import org.osmdroid.views.overlay.OverlayItem; import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay; import java.util.ArrayList; import java.util.List; import de.guerda.matekarte.BuildConfig; import de.guerda.matekarte.R; import de.guerda.matekarte.common.SpicedActivity; import de.guerda.matekarte.common.request.DealersDownloadRequest; import de.guerda.matekarte.dealers.Dealer; import de.guerda.matekarte.dealers.DealersList; import de.guerda.matekarte.dealers.Radius; public class MapActivity extends SpicedActivity implements LocationListener, RequestListener<DealersList> { private static final String LOGTAG = MapActivity.class.getSimpleName(); private LocationManager mLocationManager; private MapView mMap; private MyLocationNewOverlay mMyLocationOverlay; // private ItemizedOverlay dealersOverlay; private int backButtonCount; private ResourceProxy resourceProxy; private DealersDownloadRequest dealersDownloadRequest; private String bestProvider; private XYTileSource lyrkTileSource; private LocationManager getLocationManager() { if (this.mLocationManager == null) this.mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); return this.mLocationManager; } private void initLocation() { getLocationManager().requestLocationUpdates(bestProvider, 2000, 20, this); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Initialize location requests Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); bestProvider = getLocationManager().getBestProvider(criteria, true); // Create map setContentView(R.layout.activity_map); backButtonCount = 0; mMap = (MapView) this.findViewById(R.id.map); mMap.setTileSource(getTileSource()); mMap.setBuiltInZoomControls(true); mMap.setMultiTouchControls(true); mMap.getController().setZoom(3); initLocation(); // Add your own location mMyLocationOverlay = new MyLocationNewOverlay(getApplicationContext(), mMap); mMyLocationOverlay.enableMyLocation(); mMyLocationOverlay.setDrawAccuracyEnabled(true); mMap.getOverlays().add(mMyLocationOverlay); resourceProxy = new DefaultResourceProxyImpl(getApplicationContext()); } @Override protected void onStart() { super.onStart(); // Download dealers loadDealersInBackground(); } private void loadDealersInBackground() { Location pLoc = mMyLocationOverlay.getLastFix(); if (pLoc == null) { pLoc = new Location("fake"); pLoc.setLatitude(0.0); pLoc.setLongitude(0.0); } dealersDownloadRequest = new DealersDownloadRequest(pLoc, Radius.ONE_KILOMETER); getSpiceManager().execute(dealersDownloadRequest, this); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem anItem) { switch (anItem.getItemId()) { case R.id.action_refresh_dealers: loadDealersInBackground(); return true; default: return super.onOptionsItemSelected(anItem); } } private void showDealersOnMap(DealersList aDealersList) { Log.i(LOGTAG, "Showing dealers on map"); if (aDealersList == null) { return; } List<Dealer> tmpDealers = aDealersList.getDealers(); if (tmpDealers == null) { return; } ArrayList<OverlayItem> tmpMarkers = new ArrayList<OverlayItem>(); for (Dealer tmpDealer : tmpDealers) { tmpMarkers.add(new OverlayItem(tmpDealer.getName(), "Test", new GeoPoint(tmpDealer.getLatitude(), tmpDealer.getLongitude()))); } // TODO insert tap action ItemizedIconOverlay<OverlayItem> tmpDealerOverlay = new ItemizedIconOverlay<OverlayItem>(tmpMarkers, null, resourceProxy); mMap.getOverlays().add(tmpDealerOverlay); } private ITileSource getTileSource() { if (lyrkTileSource == null) { lyrkTileSource = new XYTileSource("Lyrk", ResourceProxy.string.unknown, 1, 18, 256, ".png?apikey=" + BuildConfig.LYRK_API_KEY, new String[]{"http://tiles.lyrk.org/ls/"}); } return lyrkTileSource; } @Override protected void onResume() { // register location listener initLocation(); super.onResume(); } public void onLocationLost() { } public void onLocationChanged(final Location pLoc) { } public void zoomToMyLocation() { Location pLoc = mMyLocationOverlay.getLastFix(); if (pLoc != null) { double tmpLatitude = pLoc.getLatitude(); double tmpLongitude = pLoc.getLongitude(); float tmpAccuracy = pLoc.getAccuracy(); IMapController tmpController = mMap.getController(); tmpController.animateTo(new GeoPoint(tmpLatitude, tmpLongitude)); tmpController.setZoom(getZoomLevelToAccuracy(tmpAccuracy)); Log.i(LOGTAG, "lat=" + tmpLatitude + ";lon=" + tmpLongitude + ";acc=" + tmpAccuracy); } } private int getZoomLevelToAccuracy(float anAccuracy) { Log.i(LOGTAG, "Zoom level to accuracy: " + anAccuracy); if (anAccuracy < 100) { return 16; } else if (anAccuracy < 1000) { return 5; } return 0; } @Override protected void onPause() { getLocationManager().removeUpdates(this); super.onPause(); } /** * Back button listener. Will close the application if the back button pressed * twice. */ public void onBackPressed() { if (backButtonCount >= 1) { // Intent intent = new Intent(Intent.ACTION_MAIN); // intent.addCategory(Intent.CATEGORY_HOME); // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // startActivity(intent); finish(); } else { Toast.makeText(this, "Press the back button once again to close the application.", Toast.LENGTH_LONG).show(); backButtonCount++; } } public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } @Override public void onRequestFailure(SpiceException spiceException) { //TODO handle error } @Override public void onRequestSuccess(DealersList dealersList) { showDealersOnMap(dealersList); } }