package org.osmdroid.samplefragments.location;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;
import org.osmdroid.R;
import org.osmdroid.samplefragments.BaseSampleFragment;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.overlay.mylocation.DirectedLocationOverlay;
import java.util.Timer;
import java.util.TimerTask;
/**
* https://github.com/osmdroid/osmdroid/issues/249
* @author alex
*/
public class SampleCustomIconDirectedLocationOverlay extends BaseSampleFragment implements LocationListener{
private boolean hasFix=false;
private DirectedLocationOverlay overlay;
@Override
public String getSampleTitle() {
return "Directed Location Overlay";
}
@Override
public void onResume(){
super.onResume();
LocationManager lm = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
try {
//on API15 AVDs,network provider fails. no idea why
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, (LocationListener) this);
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, (LocationListener) this);
}
catch (Exception ex){}
}
@Override
public void onPause(){
super.onPause();
LocationManager lm = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
lm.removeUpdates(this);
}
@Override
protected void addOverlays() {
super.addOverlays();
overlay = new DirectedLocationOverlay(getActivity());
overlay.setShowAccuracy(true);
Toast.makeText(getActivity(), "Requires location services turned on", Toast.LENGTH_LONG).show();
mMapView.getOverlays().add(overlay);
}
@Override
public void onLocationChanged(Location location) {
//after the first fix, schedule the task to change the icon
if (!hasFix){
Toast.makeText(getActivity(), "Location fixed, scheduling icon change", Toast.LENGTH_LONG).show();
TimerTask changeIcon = new TimerTask() {
@Override
public void run() {
Activity act = getActivity();
if (act!=null)
act.runOnUiThread(new Runnable() {
@Override
public void run() {
try {
BitmapDrawable drawable = (BitmapDrawable) getResources().getDrawable(R.drawable.sfgpuci);
overlay.setDirectionArrow(drawable.getBitmap());
}catch (Throwable t){
//insultates against crashing when the user rapidly switches fragments/activities
}
}
});
}
};
Timer timer = new Timer();
timer.schedule(changeIcon, 5000);
}
hasFix=true;
overlay.setBearing(location.getBearing());
overlay.setAccuracy((int)location.getAccuracy());
overlay.setLocation(new GeoPoint(location.getLatitude(), location.getLongitude()));
mMapView.invalidate();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}