package com.papagiannis.tuberun.fetchers;
import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.atomic.AtomicBoolean;
import android.content.Context;
import android.location.Location;
import android.os.AsyncTask;
import android.util.Log;
import com.papagiannis.tuberun.Station;
public abstract class BasicLocationFetcher extends NearbyFetcher<Station> {
private static final long serialVersionUID = 1L;
private AtomicBoolean isFirst = new AtomicBoolean(true);
private Context context;
private transient AsyncTask<Location, Integer, ArrayList<Station>> task;
Location userLocation;
Location lastLocation;
ArrayList<Station> all_stations = new ArrayList<Station>();
ArrayList<Station> result = new ArrayList<Station>();
public BasicLocationFetcher(Context c) {
super();
context = c;
task = getTask(c);
}
@Override
public synchronized void update() {
boolean first = isFirst.compareAndSet(true, false);
if (!first)
return; // only one at a time
if (!task.isCancelled())
task.cancel(true);
task = getTask(context);
task.execute(userLocation);
}
@Override
public Date getUpdateTime() {
return new Date();
}
public void setLocation(Location l) {
lastLocation = userLocation;
this.userLocation = l;
}
public ArrayList<Station> getResult() {
try {
if (task!=null) return task.get();
} catch (Exception e) {
Log.w(getClass().toString(), e);
}
return new ArrayList<Station>();
}
public synchronized void abort() {
isFirst.set(true);
if (task != null)
task.cancel(true);
}
protected abstract AsyncTask<Location, Integer, ArrayList<Station>> getTask(Context c);
}