package org.greengin.sciencetoolkit.logic.location; import java.util.Timer; import java.util.TimerTask; import org.greengin.sciencetoolkit.common.logic.appstatus.ApplicationStatusListener; import org.greengin.sciencetoolkit.common.logic.appstatus.ApplicationStatusManager; import org.greengin.sciencetoolkit.common.logic.location.LocationTracker; import org.greengin.sciencetoolkit.common.model.events.ModelNotificationListener; import org.greengin.sciencetoolkit.logic.datalogging.DataLogger; import org.greengin.sciencetoolkit.logic.datalogging.DataLoggerStatusListener; import org.greengin.sciencetoolkit.model.ProfileManager; import org.json.JSONException; import org.json.JSONObject; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.os.Bundle; public class CurrentLocation extends LocationTracker implements LocationListener, DataLoggerStatusListener, ApplicationStatusListener, ModelNotificationListener { private static CurrentLocation instance; public static CurrentLocation get() { return instance; } public static void init(Context applicationContext) { CurrentLocation.instance = new CurrentLocation(applicationContext); } boolean locationRequested; Timer timer; private CurrentLocation(Context applicationContext) { super(applicationContext); DataLogger.get().registerStatusListener(this); ApplicationStatusManager.get().registerStatusListener(this); ProfileManager.get().registerDirectListener(this); checkLocationRequest(); timer = null; } private void checkLocationRequest() { boolean geolocated = ProfileManager.get().getActiveProfile().getBool("requires_location"); if (geolocated && (DataLogger.get().isRunning() || ApplicationStatusManager.get().isAwake())) { if (timer != null) { timer.cancel(); timer = null; } setListening(true); } else { if (timer == null) { timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { setListening(false); timer = null; } }, 3000); } } } private void updateLocation(Location location) { if (location != null) { this.best = location; } } public String locationString() { if (best != null) { try { JSONObject obj = new JSONObject(); obj.put("lat", best.getLatitude()); obj.put("lon", best.getLongitude()); obj.put("alt", best.getAltitude()); obj.put("acc", best.getAccuracy()); return obj.toString(); } catch (JSONException e) { e.printStackTrace(); } } return ""; } @Override public void onLocationChanged(Location location) { this.updateLocation(location); } @Override public void onProviderDisabled(String provider) { } @Override public void onProviderEnabled(String provider) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void applicationStatusEvent(boolean awake) { checkLocationRequest(); } @Override public void dataLoggerStatusModified(String msg) { checkLocationRequest(); } @Override public void modelNotificationReceived(String msg) { if ("switch".equals(msg)) { checkLocationRequest(); } } }