package com.nutiteq.location.providers; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import com.nutiteq.components.WgsPoint; import com.nutiteq.location.LocationListener; import com.nutiteq.location.LocationMarker; import com.nutiteq.location.LocationSource; import com.nutiteq.log.Log; /** * Location provider wrapped around Android GPS implementation. At the moment * supports only WGS coordinates retrieval. */ public class AndroidGPSProvider implements LocationSource, android.location.LocationListener { private LocationMarker marker; private LocationListener[] listeners = new LocationListener[0]; private WgsPoint wgsLocation; private final LocationManager locationManager; private int status = STATUS_CONNECTING; private final long updateInterval; private final String provider; /** * Create new location provider using GPS positioning. * * @param locationManager * android location manager * @param updateInterval * update interval */ public AndroidGPSProvider(final LocationManager locationManager, final long updateInterval) { this.locationManager = locationManager; this.updateInterval = updateInterval; provider = LocationManager.GPS_PROVIDER; } /** * Create new location provider using defined Android positioning option. * * @param locationManager * android location manager * @param provider * used provider (either LocationManager.GPS_PROVIDER or * LocationManager.NETWORK_PROVIDER) * @param updateInterval * update interval */ public AndroidGPSProvider(final LocationManager locationManager, final String provider, final long updateInterval) { this.locationManager = locationManager; this.provider = provider; this.updateInterval = updateInterval; } public void addLocationListener(final LocationListener listener) { final LocationListener[] newListeners = new LocationListener[listeners.length + 1]; System.arraycopy(listeners, 0, newListeners, 0, listeners.length); newListeners[listeners.length] = listener; listeners = newListeners; } public WgsPoint getLocation() { return wgsLocation; } public LocationMarker getLocationMarker() { return marker; } public int getStatus() { return status; } public void quit() { locationManager.removeUpdates(this); if (marker != null) { marker.quit(); } } public void setLocationMarker(final LocationMarker marker) { this.marker = marker; marker.setLocationSource(this); addLocationListener(marker); } public void start() { locationManager.requestLocationUpdates(provider, updateInterval, 1L, this); } public void onLocationChanged(final Location location) { status = STATUS_CONNECTED; Log.info("onLocationChanged : " + location); if (location == null) { return; } wgsLocation = new WgsPoint(location.getLongitude(), location.getLatitude()); for (int i = 0; i < listeners.length; i++) { listeners[i].setLocation(wgsLocation); } } public void onProviderDisabled(final String provider) { Log.info("onProviderDisabled : " + provider); status = STATUS_CONNECTION_LOST; } public void onProviderEnabled(final String provider) { Log.info("onProviderEnabled : " + provider); status = STATUS_CONNECTING; } public void onStatusChanged(final String provider, final int status, final Bundle extras) { Log.info("onStatusChanged : " + provider); if (status == android.location.LocationProvider.AVAILABLE) { this.status = STATUS_CONNECTED; } else { this.status = STATUS_CONNECTION_LOST; } } }