package pl.edu.agh.service;
import java.util.LinkedList;
import java.util.List;
import pl.edu.agh.logic.LocationDataSender;
import pl.edu.agh.logic.PeriodicSendingStrategy;
import pl.edu.agh.logic.SendingStrategy;
import android.app.Service;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
public class LocationLogger extends Service implements LocationDataSource {
private static final int GPS_UPDATE_INTERVAL = 1000;
private static final int LOCATION_HISTORY_MAX_SIZE = 1000;
private static final long LOCATION_SENDING_INTERVAL = 60000;
public class ServiceAccess extends Binder {
public LocationLogger getService() {
return LocationLogger.this;
}
}
private final IBinder binder = new ServiceAccess();
private boolean logging = false;
private SendingStrategy sendingStrategy;
private LinkedList<Location> locationHistory = new LinkedList<Location>();
private LocationManager locationManager;
private LocationListener locationListener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onLocationChanged(Location location) {
addLocation(location);
}
};
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
startLogging();
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public void onCreate() {
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
sendingStrategy = new PeriodicSendingStrategy(new LocationDataSender(), this, LOCATION_SENDING_INTERVAL);
}
@Override
public void onDestroy() {
stopLogging();
}
public boolean isLogging() {
return logging;
}
public void startLogging() {
if (!logging) {
logging = true;
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_UPDATE_INTERVAL, 0, locationListener);
sendingStrategy.activate();
}
}
public void stopLogging() {
if (logging) {
logging = false;
locationManager.removeUpdates(locationListener);
sendingStrategy.deactivate();
}
}
private synchronized void addLocation(Location location) {
if (locationHistory.size() == LOCATION_HISTORY_MAX_SIZE) {
locationHistory.removeFirst();
}
locationHistory.addLast(location);
}
@Override
public synchronized List<Location> getAndRemoveAllData() {
List<Location> returnedLocations = locationHistory;
locationHistory = new LinkedList<Location>();
return returnedLocations;
}
}