Commit 6626dbe9 authored by Chris Scott's avatar Chris Scott

Import speedAcquisition phase from ios, being more aggressive with geolocation...

Import speedAcquisition phase from ios, being more aggressive with geolocation after a pace-change to moving
parent 1d34f3b3
...@@ -50,8 +50,9 @@ public class LocationUpdateService extends Service implements LocationListener { ...@@ -50,8 +50,9 @@ public class LocationUpdateService extends Service implements LocationListener {
private static final String STATIONARY_REGION_ACTION = "com.tenforwardconsulting.cordova.bgloc.STATIONARY_REGION_ACTION"; private static final String STATIONARY_REGION_ACTION = "com.tenforwardconsulting.cordova.bgloc.STATIONARY_REGION_ACTION";
private static final String STATIONARY_ALARM_ACTION = "com.tenforwardconsulting.cordova.bgloc.STATIONARY_ALARM_ACTION"; private static final String STATIONARY_ALARM_ACTION = "com.tenforwardconsulting.cordova.bgloc.STATIONARY_ALARM_ACTION";
private static final String SINGLE_LOCATION_UPDATE_ACTION = "com.tenforwardconsulting.cordova.bgloc.SINGLE_LOCATION_UPDATE_ACTION"; private static final String SINGLE_LOCATION_UPDATE_ACTION = "com.tenforwardconsulting.cordova.bgloc.SINGLE_LOCATION_UPDATE_ACTION";
private static long STATIONARY_TIMEOUT = 60 * 1000 * 5; private static long STATIONARY_TIMEOUT = 60 * 1000 * 2;
private static final Integer MAX_STATIONARY_ACQUISITION_ATTEMPTS = 5; private static final Integer MAX_STATIONARY_ACQUISITION_ATTEMPTS = 3;
private static final Integer MAX_SPEED_ACQUISITION_ATTEMPTS = 3;
private PowerManager.WakeLock wakeLock; private PowerManager.WakeLock wakeLock;
private Location lastLocation; private Location lastLocation;
...@@ -66,6 +67,8 @@ public class LocationUpdateService extends Service implements LocationListener { ...@@ -66,6 +67,8 @@ public class LocationUpdateService extends Service implements LocationListener {
private PendingIntent singleUpdatePI; private PendingIntent singleUpdatePI;
private Integer stationaryLocationAttempts = 0; private Integer stationaryLocationAttempts = 0;
private Boolean isAcquiringStationaryLocation = false; private Boolean isAcquiringStationaryLocation = false;
private Boolean isAcquiringSpeed = false;
private Integer speedAcquisitionAttempts = 0;
private Integer desiredAccuracy; private Integer desiredAccuracy;
private Integer distanceFilter; private Integer distanceFilter;
...@@ -200,37 +203,35 @@ public class LocationUpdateService extends Service implements LocationListener { ...@@ -200,37 +203,35 @@ public class LocationUpdateService extends Service implements LocationListener {
private void setPace(Boolean value) { private void setPace(Boolean value) {
Log.i(TAG, "setPace: " + value); Log.i(TAG, "setPace: " + value);
Boolean wasMoving = isMoving;
isMoving = value; isMoving = value;
isAcquiringStationaryLocation = false; isAcquiringStationaryLocation = false;
isAcquiringSpeed = false;
stationaryLocation = null; stationaryLocation = null;
locationManager.removeUpdates(this); locationManager.removeUpdates(this);
if (isMoving) {
criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setHorizontalAccuracy(translateDesiredAccuracy(desiredAccuracy)); criteria.setHorizontalAccuracy(translateDesiredAccuracy(desiredAccuracy));
criteria.setPowerRequirement(Criteria.POWER_HIGH); criteria.setPowerRequirement(Criteria.POWER_HIGH);
locationManager.requestLocationUpdates(locationManager.getBestProvider(criteria, true), locationTimeout*1000, scaledDistanceFilter, this);
resetStationaryAlarm();
} else {
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
criteria.setHorizontalAccuracy(Criteria.ACCURACY_LOW);
criteria.setPowerRequirement(Criteria.POWER_LOW);
Location location = this.getLastBestLocation((int) stationaryRadius, locationTimeout * 1000); if (isMoving) {
if (location != null && (location.getAccuracy() <= stationaryRadius)) { // setPace can be called while moving, after distanceFilter has been recalculated. We don't want to re-acquire velocity in this case.
this.startMonitoringStationaryRegion(location); if (!wasMoving) {
isAcquiringSpeed = true;
speedAcquisitionAttempts = 0;
}
} else { } else {
isAcquiringStationaryLocation = true; isAcquiringStationaryLocation = true;
stationaryLocationAttempts = 0; stationaryLocationAttempts = 0;
criteria.setAccuracy(Criteria.ACCURACY_FINE); }
criteria.setHorizontalAccuracy(translateDesiredAccuracy(desiredAccuracy)); // Temporarily turn on super-aggressive geolocation on all providers when acquiring velocity or stationary location.
criteria.setPowerRequirement(Criteria.POWER_HIGH); if (isAcquiringSpeed || isAcquiringStationaryLocation) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
} } else {
locationManager.requestLocationUpdates(locationManager.getBestProvider(criteria, true), locationTimeout*1000, scaledDistanceFilter, this);
} }
} }
...@@ -297,11 +298,22 @@ public class LocationUpdateService extends Service implements LocationListener { ...@@ -297,11 +298,22 @@ public class LocationUpdateService extends Service implements LocationListener {
} else { } else {
return; return;
} }
} else if (isAcquiringSpeed) {
if (++speedAcquisitionAttempts == MAX_SPEED_ACQUISITION_ATTEMPTS) {
if (isDebugging) {
toneGenerator.startTone(ToneGenerator.TONE_CDMA_ALERT_NETWORK_LITE);
}
isAcquiringSpeed = false;
scaledDistanceFilter = calculateDistanceFilter(location.getSpeed());
setPace(true);
} else {
return;
}
} else if (isMoving) { } else if (isMoving) {
// Only reset stationaryAlarm when speed is detected, prevents spurious locations from resetting when stopped.
if (location.getSpeed() > 0) {
resetStationaryAlarm(); resetStationaryAlarm();
}
// Re-calculate distanceFilter.
Integer newDistanceFilter = calculateDistanceFilter(location.getSpeed()); Integer newDistanceFilter = calculateDistanceFilter(location.getSpeed());
if (newDistanceFilter != scaledDistanceFilter) { if (newDistanceFilter != scaledDistanceFilter) {
Log.i(TAG, "- updated distanceFilter, new: " + newDistanceFilter + ", old: " + scaledDistanceFilter); Log.i(TAG, "- updated distanceFilter, new: " + newDistanceFilter + ", old: " + scaledDistanceFilter);
...@@ -344,8 +356,7 @@ public class LocationUpdateService extends Service implements LocationListener { ...@@ -344,8 +356,7 @@ public class LocationUpdateService extends Service implements LocationListener {
float roundedDistanceFilter = (round(speed / 5) * 5); float roundedDistanceFilter = (round(speed / 5) * 5);
newDistanceFilter = pow(roundedDistanceFilter, 2) + (double) distanceFilter; newDistanceFilter = pow(roundedDistanceFilter, 2) + (double) distanceFilter;
} }
return distanceFilter; return (newDistanceFilter.intValue() < 1000) ? newDistanceFilter.intValue() : 1000;
//return (newDistanceFilter.intValue() < 1000) ? newDistanceFilter.intValue() : 1000;
} }
private void startMonitoringStationaryRegion(Location location) { private void startMonitoringStationaryRegion(Location location) {
...@@ -433,11 +444,16 @@ public class LocationUpdateService extends Service implements LocationListener { ...@@ -433,11 +444,16 @@ public class LocationUpdateService extends Service implements LocationListener {
locationManager.removeProximityAlert(proximityPI); locationManager.removeProximityAlert(proximityPI);
proximityPI = null; proximityPI = null;
} }
this.setPace(true);
Location location = getLastBestLocation((int) stationaryRadius, locationTimeout * 1000); Location location = getLastBestLocation((int) stationaryRadius, locationTimeout * 1000);
if (location != null) { if (location != null) {
onLocationChanged(location); // Filter-out spurious region-exits.
if (location.getSpeed() < 0.75) {
return;
} }
} else {
Log.i(TAG, "- exit stationary region receiver was triggered but could not fetch the last-best location!");
}
this.setPace(true);
} }
public void onProviderDisabled(String provider) { public void onProviderDisabled(String provider) {
......
E/Sensors ( 234): type : 0, deley : 66667000
E/Sensors ( 234): type : 0, deley : 66667000
E/Sensors ( 234): type : 0, deley : 20000000
E/Sensors ( 234): type : 0, deley : 66667000
E/Sensors ( 234): type : 0, deley : 66667000
E/Sensors ( 234): type : 0, deley : 20000000
E/Sensors ( 234): type : 0, deley : 66667000
E/Sensors ( 234): type : 0, deley : 66667000
E/Sensors ( 234): type : 0, deley : 20000000
E/Sensors ( 234): type : 0, deley : 66667000
E/Sensors ( 234): type : 0, deley : 66667000
E/Sensors ( 234): type : 0, deley : 20000000
E/Sensors ( 234): type : 0, deley : 66667000
E/AudioHardwareMSM7X30( 137): updateDeviceInfo: E rx_device 6 and tx_device 11
E/AudioHardwareMSM7X30( 137): updateDeviceInfo: X cur_rx 6 cur_tx 11
E/InputDispatcher( 234): channel '40e3da38 com.disastersolutions.virtualbadge/com.disastersolutions.virtualbadge.VirtualBadge (server)' ~ Channel is unrecoverably broken and will be disposed!
E/ ( 5380): Can't open file for reading
E/ ( 5380): Can't open file for reading
E/ (11174): Can't open file for reading
E/ (11174): Can't open file for reading
E/AudioHardwareMSM7X30( 137): updateDeviceInfo: E rx_device 6 and tx_device 11
E/AudioHardwareMSM7X30( 137): updateDeviceInfo: X cur_rx 6 cur_tx 11
I/LocationUpdateService(11209): OnCreate
I/LocationUpdateService(11209): Received start id 1: Intent { cmp=com.disastersolutions.virtualbadge/com.tenforwardconsulting.cordova.bgloc.LocationUpdateService (has extras) }
I/LocationUpdateService(11209): - url: http://dev.virtualbadge.com/users/current_location.json
I/LocationUpdateService(11209): - token: hsy86ZMjFqu4z41N2Lz5
I/LocationUpdateService(11209): - stationaryRadius: 25.0
I/LocationUpdateService(11209): - distanceFilter: 30
I/LocationUpdateService(11209): - desiredAccuracy: 100
I/LocationUpdateService(11209): - locationTimeout: 30
I/LocationUpdateService(11209): - isDebugging: true
I/LocationUpdateService(11209): setPace: false
I/LocationUpdateService(11209): - fetching last best location
I/LocationUpdateService(11209): - startMonitoringStationaryRegion (45.5193325,-73.6170416), accuracy:22.0
E/AudioHardwareMSM7X30( 137): updateDeviceInfo: E rx_device 6 and tx_device 11
E/AudioHardwareMSM7X30( 137): updateDeviceInfo: X cur_rx 6 cur_tx 11
E/NetdConnector( 234): Communications error
E/NetdConnector( 234): java.io.IOException: Connection refused
E/NetdConnector( 234): at android.net.LocalSocketImpl.connectLocal(Native Method)
E/NetdConnector( 234): at android.net.LocalSocketImpl.connect(LocalSocketImpl.java:238)
E/NetdConnector( 234): at android.net.LocalSocket.connect(LocalSocket.java:98)
E/NetdConnector( 234): at com.android.server.NativeDaemonConnector.listenToSocket(NativeDaemonConnector.java:119)
E/NetdConnector( 234): at com.android.server.NativeDaemonConnector.run(NativeDaemonConnector.java:88)
E/NetdConnector( 234): at java.lang.Thread.run(Thread.java:856)
E/NetdConnector( 234): Error in NativeDaemonConnector
E/NetdConnector( 234): java.io.IOException: Connection refused
E/NetdConnector( 234): at android.net.LocalSocketImpl.connectLocal(Native Method)
E/NetdConnector( 234): at android.net.LocalSocketImpl.connect(LocalSocketImpl.java:238)
E/NetdConnector( 234): at android.net.LocalSocket.connect(LocalSocket.java:98)
E/NetdConnector( 234): at com.android.server.NativeDaemonConnector.listenToSocket(NativeDaemonConnector.java:119)
E/NetdConnector( 234): at com.android.server.NativeDaemonConnector.run(NativeDaemonConnector.java:88)
E/NetdConnector( 234): at java.lang.Thread.run(Thread.java:856)
I/LocationUpdateService(11209): stationaryRegionReceiver
D/LocationUpdateService(11209): - ENTER
W/LocationUpdateService(11209): ------------------------------------------ Destroyed Location update Service
E/ActivityThread(11209): Service com.tenforwardconsulting.cordova.bgloc.LocationUpdateService has leaked IntentReceiver com.tenforwardconsulting.cordova.bgloc.LocationUpdateService$3@40d7fdc0 that was originally registered here. Are you missing a call to unregisterReceiver()?
E/ActivityThread(11209): android.app.IntentReceiverLeaked: Service com.tenforwardconsulting.cordova.bgloc.LocationUpdateService has leaked IntentReceiver com.tenforwardconsulting.cordova.bgloc.LocationUpdateService$3@40d7fdc0 that was originally registered here. Are you missing a call to unregisterReceiver()?
E/ActivityThread(11209): at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:763)
E/ActivityThread(11209): at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:567)
E/ActivityThread(11209): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1075)
E/ActivityThread(11209): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1062)
E/ActivityThread(11209): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1056)
E/ActivityThread(11209): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:341)
E/ActivityThread(11209): at com.tenforwardconsulting.cordova.bgloc.LocationUpdateService.onCreate(LocationUpdateService.java:111)
E/ActivityThread(11209): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2376)
E/ActivityThread(11209): at android.app.ActivityThread.access$1600(ActivityThread.java:132)
E/ActivityThread(11209): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1211)
E/ActivityThread(11209): at android.os.Handler.dispatchMessage(Handler.java:99)
E/ActivityThread(11209): at android.os.Looper.loop(Looper.java:137)
E/ActivityThread(11209): at android.app.ActivityThread.main(ActivityThread.java:4575)
E/ActivityThread(11209): at java.lang.reflect.Method.invokeNative(Native Method)
E/ActivityThread(11209): at java.lang.reflect.Method.invoke(Method.java:511)
E/ActivityThread(11209): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
E/ActivityThread(11209): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
E/ActivityThread(11209): at dalvik.system.NativeStart.main(Native Method)
E/ActivityThread(11209): Service com.tenforwardconsulting.cordova.bgloc.LocationUpdateService has leaked IntentReceiver com.tenforwardconsulting.cordova.bgloc.LocationUpdateService$2@40d7fab0 that was originally registered here. Are you missing a call to unregisterReceiver()?
E/ActivityThread(11209): android.app.IntentReceiverLeaked: Service com.tenforwardconsulting.cordova.bgloc.LocationUpdateService has leaked IntentReceiver com.tenforwardconsulting.cordova.bgloc.LocationUpdateService$2@40d7fab0 that was originally registered here. Are you missing a call to unregisterReceiver()?
E/ActivityThread(11209): at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:763)
E/ActivityThread(11209): at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:567)
E/ActivityThread(11209): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1075)
E/ActivityThread(11209): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1062)
E/ActivityThread(11209): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1056)
E/ActivityThread(11209): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:341)
E/ActivityThread(11209): at com.tenforwardconsulting.cordova.bgloc.LocationUpdateService.onCreate(LocationUpdateService.java:110)
E/ActivityThread(11209): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2376)
E/ActivityThread(11209): at android.app.ActivityThread.access$1600(ActivityThread.java:132)
E/ActivityThread(11209): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1211)
E/ActivityThread(11209): at android.os.Handler.dispatchMessage(Handler.java:99)
E/ActivityThread(11209): at android.os.Looper.loop(Looper.java:137)
E/ActivityThread(11209): at android.app.ActivityThread.main(ActivityThread.java:4575)
E/ActivityThread(11209): at java.lang.reflect.Method.invokeNative(Native Method)
E/ActivityThread(11209): at java.lang.reflect.Method.invoke(Method.java:511)
E/ActivityThread(11209): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
E/ActivityThread(11209): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
E/ActivityThread(11209): at dalvik.system.NativeStart.main(Native Method)
E/ActivityThread(11209): Service com.tenforwardconsulting.cordova.bgloc.LocationUpdateService has leaked IntentReceiver com.tenforwardconsulting.cordova.bgloc.LocationUpdateService$1@40d7f7a0 that was originally registered here. Are you missing a call to unregisterReceiver()?
E/ActivityThread(11209): android.app.IntentReceiverLeaked: Service com.tenforwardconsulting.cordova.bgloc.LocationUpdateService has leaked IntentReceiver com.tenforwardconsulting.cordova.bgloc.LocationUpdateService$1@40d7f7a0 that was originally registered here. Are you missing a call to unregisterReceiver()?
E/ActivityThread(11209): at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:763)
E/ActivityThread(11209): at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:567)
E/ActivityThread(11209): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1075)
E/ActivityThread(11209): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1062)
E/ActivityThread(11209): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1056)
E/ActivityThread(11209): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:341)
E/ActivityThread(11209): at com.tenforwardconsulting.cordova.bgloc.LocationUpdateService.onCreate(LocationUpdateService.java:116)
E/ActivityThread(11209): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2376)
E/ActivityThread(11209): at android.app.ActivityThread.access$1600(ActivityThread.java:132)
E/ActivityThread(11209): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1211)
E/ActivityThread(11209): at android.os.Handler.dispatchMessage(Handler.java:99)
E/ActivityThread(11209): at android.os.Looper.loop(Looper.java:137)
E/ActivityThread(11209): at android.app.ActivityThread.main(ActivityThread.java:4575)
E/ActivityThread(11209): at java.lang.reflect.Method.invokeNative(Native Method)
E/ActivityThread(11209): at java.lang.reflect.Method.invoke(Method.java:511)
E/ActivityThread(11209): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
E/ActivityThread(11209): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
E/ActivityThread(11209): at dalvik.system.NativeStart.main(Native Method)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment