/*******************************************************************************
* Copyright (c) 2011 Michel DAVID mimah35-at-gmail.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package fr.gotorennes.util;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
public class LocationUtils implements LocationListener {
private static LocationUtils instance;
private LocationManager locationManager;
private Location lastLocation = null;
private boolean active;
private Timer timer = new Timer();
private class DisableTask extends TimerTask {
@Override
public void run() {
removeListener(LocationUtils.this);
active = false;
lastLocation = null;
}
};
private LocationUtils(Context context) {
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
}
private static synchronized LocationUtils getInstance(Context context) {
if (instance == null) {
instance = new LocationUtils(context);
}
return instance;
}
public static void activeLocation(Context context) {
getInstance(context).activeLocation();
}
private synchronized void activeLocation() {
timer.cancel();
if (!active) {
addListener(this);
active = true;
}
}
public static void desactiveLocation(Context context) {
getInstance(context).desactiveLocation();
}
private synchronized void desactiveLocation() {
if (active) {
timer = new Timer();
timer.schedule(new DisableTask(), 2000);
}
}
public static Location getLocation(Context context) {
return getInstance(context).lastLocation;
}
public static void addListener(Context context, LocationListener listener) {
getInstance(context).addListener(listener);
}
private void addListener(LocationListener listener) {
List<String> providers = locationManager.getAllProviders();
if (providers.contains(LocationManager.GPS_PROVIDER) && locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000L, 0L, listener);
}
if (providers.contains(LocationManager.NETWORK_PROVIDER) && locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000L, 0L, listener);
}
}
public static void removeListener(Context context, LocationListener listener) {
getInstance(context).removeListener(listener);
}
private void removeListener(LocationListener listener) {
locationManager.removeUpdates(listener);
}
@Override
public void onLocationChanged(Location location) {
if(LocationManager.NETWORK_PROVIDER.equals(location.getProvider())) {
if(lastLocation == null || LocationManager.NETWORK_PROVIDER.equals(lastLocation.getProvider()) || !locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
lastLocation = location;
//Log.d("GoToRennes", location.toString());
}
}
else {
lastLocation = location;
//Log.d("GoToRennes", location.toString());
}
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}