Add wakelock to prevent doze when not at home.

Recently I took a 90 minute drive, and trkpt missed about 15
minutes of it. It wasn't until now that I realized it probably
went into doze mode due to the low accelerometer movements.
If the device is plugged in it does not doze, but to achieve the
no-friction goal we should not be required to take it out of our
pocket and plug in all the time for fear of missing points.
This commit is contained in:
voussoir 2023-04-03 19:03:05 -07:00
parent f55d683fe7
commit 548dcf2c58
4 changed files with 41 additions and 14 deletions

View file

@ -14,6 +14,7 @@
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- DANGEROUS PERMISSIONS, must request --> <!-- DANGEROUS PERMISSIONS, must request -->
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" /> <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />

View file

@ -671,13 +671,14 @@ class MapFragment : Fragment()
if (show_debug) if (show_debug)
{ {
map_current_time.text = """ map_current_time.text = """
now: ${iso8601_local_noms(System.currentTimeMillis())} now: ${iso8601_local_noms(System.currentTimeMillis())}
location: ${iso8601_local_noms(tracker.currentBestLocation.time)} location: ${iso8601_local_noms(tracker.currentBestLocation.time)}
listeners: ${iso8601_local_noms(tracker.listeners_enabled_at)} listeners: ${iso8601_local_noms(tracker.listeners_enabled_at)}
motion: ${iso8601_local_noms(tracker.last_significant_motion)} motion: ${iso8601_local_noms(tracker.last_significant_motion)}
watchdog: ${iso8601_local_noms(tracker.last_watchdog)} watchdog: ${iso8601_local_noms(tracker.last_watchdog)}
died: ${iso8601_local_noms(tracker.gave_up_at)} died: ${iso8601_local_noms(tracker.gave_up_at)}
power: ${tracker.device_is_charging} power: ${tracker.device_is_charging}
wakelock: ${tracker.wakelock.isHeld}
""".trimIndent() """.trimIndent()
} }
else else

View file

@ -90,8 +90,11 @@ class TrackerService: Service()
var device_is_charging: Boolean = false var device_is_charging: Boolean = false
private var charging_broadcast_receiver: BroadcastReceiver? = null private var charging_broadcast_receiver: BroadcastReceiver? = null
lateinit var wakelock: PowerManager.WakeLock
private fun addGpsLocationListener(interval: Long): Boolean private fun addGpsLocationListener(interval: Long): Boolean
{ {
gpsLocationListenerRegistered = false
gpsProviderActive = isGpsEnabled(locationManager) gpsProviderActive = isGpsEnabled(locationManager)
if (! gpsProviderActive) if (! gpsProviderActive)
{ {
@ -119,6 +122,7 @@ class TrackerService: Service()
private fun addNetworkLocationListener(interval: Long): Boolean private fun addNetworkLocationListener(interval: Long): Boolean
{ {
networkLocationListenerRegistered = false
networkProviderActive = isNetworkEnabled(locationManager) networkProviderActive = isNetworkEnabled(locationManager)
if (!networkProviderActive) if (!networkProviderActive)
{ {
@ -176,11 +180,9 @@ class TrackerService: Service()
{ {
Log.i("VOUSSOIR", "TrackerService.reset_location_listeners") Log.i("VOUSSOIR", "TrackerService.reset_location_listeners")
location_interval = interval location_interval = interval
var gps_added = false
var network_added = false
if (use_gps_location && interval != Keys.LOCATION_INTERVAL_DEAD && interval != Keys.LOCATION_INTERVAL_STOP) if (use_gps_location && interval != Keys.LOCATION_INTERVAL_DEAD && interval != Keys.LOCATION_INTERVAL_STOP)
{ {
gps_added = addGpsLocationListener(interval) addGpsLocationListener(interval)
} }
else if (gpsLocationListenerRegistered) else if (gpsLocationListenerRegistered)
{ {
@ -188,14 +190,19 @@ class TrackerService: Service()
} }
if (use_network_location && interval != Keys.LOCATION_INTERVAL_DEAD && interval != Keys.LOCATION_INTERVAL_STOP) if (use_network_location && interval != Keys.LOCATION_INTERVAL_DEAD && interval != Keys.LOCATION_INTERVAL_STOP)
{ {
network_added = addNetworkLocationListener(interval) addNetworkLocationListener(interval)
} }
else if (networkLocationListenerRegistered) else if (networkLocationListenerRegistered)
{ {
removeNetworkLocationListener() removeNetworkLocationListener()
} }
if (gps_added || network_added) if (interval != Keys.LOCATION_INTERVAL_DEAD)
{
gave_up_at = 0
}
if (gpsLocationListenerRegistered || networkLocationListenerRegistered)
{ {
listeners_enabled_at = System.currentTimeMillis() listeners_enabled_at = System.currentTimeMillis()
if (interval != Keys.LOCATION_INTERVAL_SLEEP) if (interval != Keys.LOCATION_INTERVAL_SLEEP)
@ -212,6 +219,21 @@ class TrackerService: Service()
listeners_enabled_at = 0 listeners_enabled_at = 0
location_interval = Keys.LOCATION_INTERVAL_DEAD location_interval = Keys.LOCATION_INTERVAL_DEAD
} }
if (
(gpsLocationListenerRegistered || networkLocationListenerRegistered) &&
trackingState == Keys.STATE_TRACKING_ACTIVE &&
interval == Keys.LOCATION_INTERVAL_FULL_POWER &&
!wakelock.isHeld
)
{
wakelock.acquire()
}
else if (wakelock.isHeld)
{
wakelock.release()
}
displayNotification() displayNotification()
} }
@ -598,6 +620,9 @@ class TrackerService: Service()
charging_intent_filter.addAction(Intent.ACTION_POWER_DISCONNECTED) charging_intent_filter.addAction(Intent.ACTION_POWER_DISCONNECTED)
registerReceiver(charging_broadcast_receiver, charging_intent_filter) registerReceiver(charging_broadcast_receiver, charging_intent_filter)
val powermanager = getSystemService(Context.POWER_SERVICE) as PowerManager
wakelock = powermanager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "trkpt::wakelock")
handler.post(background_watchdog) handler.post(background_watchdog)
} }
@ -647,8 +672,8 @@ class TrackerService: Service()
fun startTracking() fun startTracking()
{ {
Log.i("VOUSSOIR", "TrackerService.startTracking") Log.i("VOUSSOIR", "TrackerService.startTracking")
reset_location_listeners(interval=Keys.LOCATION_INTERVAL_FULL_POWER)
trackingState = Keys.STATE_TRACKING_ACTIVE trackingState = Keys.STATE_TRACKING_ACTIVE
reset_location_listeners(interval=Keys.LOCATION_INTERVAL_FULL_POWER)
PreferencesHelper.saveTrackingState(trackingState) PreferencesHelper.saveTrackingState(trackingState)
recent_displacement_locations.clear() recent_displacement_locations.clear()
startForeground(Keys.TRACKER_SERVICE_NOTIFICATION_ID, displayNotification()) startForeground(Keys.TRACKER_SERVICE_NOTIFICATION_ID, displayNotification())
@ -658,8 +683,8 @@ class TrackerService: Service()
{ {
Log.i("VOUSSOIR", "TrackerService.stopTracking") Log.i("VOUSSOIR", "TrackerService.stopTracking")
trackbook.database.commit() trackbook.database.commit()
reset_location_listeners(interval=Keys.LOCATION_INTERVAL_FULL_POWER)
trackingState = Keys.STATE_TRACKING_STOPPED trackingState = Keys.STATE_TRACKING_STOPPED
reset_location_listeners(interval=Keys.LOCATION_INTERVAL_FULL_POWER)
PreferencesHelper.saveTrackingState(trackingState) PreferencesHelper.saveTrackingState(trackingState)
recent_displacement_locations.clear() recent_displacement_locations.clear()
displayNotification() displayNotification()

View file

@ -92,7 +92,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:gravity="right" android:gravity="left"
app:fontFamily="monospace" app:fontFamily="monospace"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"