checkpoint

master
voussoir 2023-03-23 22:48:25 -07:00
parent e96bfac4a9
commit c434d3b840
31 changed files with 189 additions and 159 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.y20k.trackbook"> package="net.voussoir.trkpt">
@ -19,11 +19,10 @@
<!-- DANGEROUS PERMISSIONS, must request --> <!-- DANGEROUS PERMISSIONS, must request -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application <application
android:name="org.y20k.trackbook.Trackbook" android:name="net.voussoir.trkpt.Trackbook"
android:allowBackup="true" android:allowBackup="true"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
@ -33,7 +32,7 @@
<!-- MAIN ACTIVITY --> <!-- MAIN ACTIVITY -->
<activity <activity
android:name=".MainActivity" android:name="net.voussoir.trkpt.MainActivity"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@ -43,19 +42,19 @@
<!-- TRACKER SERVICE --> <!-- TRACKER SERVICE -->
<service <service
android:name=".TrackerService" android:name="net.voussoir.trkpt.TrackerService"
android:foregroundServiceType="location" android:foregroundServiceType="location"
android:exported="false"> android:exported="false">
<intent-filter> <intent-filter>
<action android:name="org.y20k.trackbook.action.START" /> <action android:name="net.voussoir.trkpt.action.START" />
<action android:name="org.y20k.trackbook.action.STOP" /> <action android:name="net.voussoir.trkpt.action.STOP" />
<action android:name="org.y20k.trackbook.action.DISMISS" /> <action android:name="net.voussoir.trkpt.action.DISMISS" />
</intent-filter> </intent-filter>
</service> </service>
<!-- TRACKING TOGGLE SERVICE SYSTEM QUICK SETTINGS --> <!-- TRACKING TOGGLE SERVICE SYSTEM QUICK SETTINGS -->
<service <service
android:name=".TrackingToggleTileService" android:name="net.voussoir.trkpt.TrackingToggleTileService"
android:label="@string/quick_settings_tile_title_default" android:label="@string/quick_settings_tile_title_default"
android:icon="@drawable/ic_notification_icon_small_24dp" android:icon="@drawable/ic_notification_icon_small_24dp"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE" android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"

View File

@ -1,13 +1,12 @@
package org.y20k.trackbook package net.voussoir.trkpt
import android.content.ContentValues import android.content.ContentValues
import android.database.Cursor import android.database.Cursor
import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteDatabase.openOrCreateDatabase import android.database.sqlite.SQLiteDatabase.openOrCreateDatabase
import android.util.Log import android.util.Log
import java.io.File import java.io.File
import java.util.*
class Database(val trackbook: Trackbook) class Database(val trackbook: net.voussoir.trkpt.Trackbook)
{ {
var ready: Boolean = false var ready: Boolean = false
lateinit var file: File lateinit var file: File
@ -61,7 +60,7 @@ class Database(val trackbook: Trackbook)
commit() commit()
} }
fun insert_trkpt(trkpt: Trkpt) fun insert_trkpt(trkpt: net.voussoir.trkpt.Trkpt)
{ {
Log.i("VOUSSOIR", "Database.insert_trkpt") Log.i("VOUSSOIR", "Database.insert_trkpt")
val values = ContentValues().apply { val values = ContentValues().apply {
@ -124,7 +123,7 @@ class Database(val trackbook: Trackbook)
cursor = this.connection.rawQuery("PRAGMA journal_mode = DELETE", null) cursor = this.connection.rawQuery("PRAGMA journal_mode = DELETE", null)
cursor.moveToNext() cursor.moveToNext()
cursor.close() cursor.close()
cursor = this.connection.rawQuery("PRAGMA user_version = ${Keys.DATABASE_VERSION}", null) cursor = this.connection.rawQuery("PRAGMA user_version = ${net.voussoir.trkpt.Keys.DATABASE_VERSION}", null)
cursor.moveToNext() cursor.moveToNext()
cursor.close() cursor.close()
// Not using this.commit because this.ready is not true yet. // Not using this.commit because this.ready is not true yet.

View File

@ -1,4 +1,4 @@
package org.y20k.trackbook package net.voussoir.trkpt
import android.location.Location import android.location.Location
import java.util.* import java.util.*

View File

@ -14,9 +14,8 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook package net.voussoir.trkpt
import android.graphics.Color
import java.util.* import java.util.*
/* /*
@ -32,8 +31,8 @@ object Keys {
const val DATABASE_VERSION: Int = 1 const val DATABASE_VERSION: Int = 1
// intent actions // intent actions
const val ACTION_START: String = "org.y20k.trackbook.action.START" const val ACTION_START: String = "net.voussoir.trkpt.action.START"
const val ACTION_STOP: String = "org.y20k.trackbook.action.STOP" const val ACTION_STOP: String = "net.voussoir.trkpt.action.STOP"
// args // args
const val ARG_TRACK_TITLE: String = "ArgTrackTitle" const val ARG_TRACK_TITLE: String = "ArgTrackTitle"
@ -112,5 +111,4 @@ object Keys {
const val NOTIFICATION_CHANNEL_RECORDING: String = "notificationChannelIdRecordingChannel" const val NOTIFICATION_CHANNEL_RECORDING: String = "notificationChannelIdRecordingChannel"
const val POLYLINE_THICKNESS = 4F const val POLYLINE_THICKNESS = 4F
val POLYLINE_COLOR = Color.argb(255, 255, 0, 255)
} }

View File

@ -14,20 +14,20 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook /*
* Modified by voussoir for trkpt, forked from Trackbook.
*/
package net.voussoir.trkpt
import android.Manifest import android.Manifest
import android.app.Activity import android.app.Activity
import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.PowerManager
import android.os.StrictMode import android.os.StrictMode
import android.os.StrictMode.VmPolicy import android.os.StrictMode.VmPolicy
import android.provider.Settings
import android.util.Log import android.util.Log
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
@ -35,8 +35,8 @@ import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.setupWithNavController import androidx.navigation.ui.setupWithNavController
import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.bottomnavigation.BottomNavigationView
import org.osmdroid.config.Configuration import org.osmdroid.config.Configuration
import org.y20k.trackbook.helpers.AppThemeHelper import net.voussoir.trkpt.helpers.AppThemeHelper
import org.y20k.trackbook.helpers.PreferencesHelper import net.voussoir.trkpt.helpers.PreferencesHelper
class MainActivity: AppCompatActivity() class MainActivity: AppCompatActivity()
{ {
@ -51,7 +51,7 @@ class MainActivity: AppCompatActivity()
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
request_permissions(this) request_permissions(this)
// todo: remove after testing finished // todo: remove after testing finished
if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) if (net.voussoir.trkpt.BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
{ {
StrictMode.setVmPolicy( StrictMode.setVmPolicy(
VmPolicy.Builder() VmPolicy.Builder()
@ -62,7 +62,7 @@ class MainActivity: AppCompatActivity()
} }
// set user agent to prevent getting banned from the osm servers // set user agent to prevent getting banned from the osm servers
Configuration.getInstance().userAgentValue = BuildConfig.APPLICATION_ID Configuration.getInstance().userAgentValue = net.voussoir.trkpt.BuildConfig.APPLICATION_ID
// set the path for osmdroid's files (e.g. tile cache) // set the path for osmdroid's files (e.g. tile cache)
Configuration.getInstance().osmdroidBasePath = this.getExternalFilesDir(null) Configuration.getInstance().osmdroidBasePath = this.getExternalFilesDir(null)

View File

@ -14,7 +14,7 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook package net.voussoir.trkpt
import android.Manifest import android.Manifest
import android.app.Dialog import android.app.Dialog
@ -53,7 +53,8 @@ import org.osmdroid.views.overlay.Polyline
import org.osmdroid.views.overlay.TilesOverlay import org.osmdroid.views.overlay.TilesOverlay
import org.osmdroid.views.overlay.compass.CompassOverlay import org.osmdroid.views.overlay.compass.CompassOverlay
import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider
import org.y20k.trackbook.helpers.* import net.voussoir.trkpt.helpers.*
import net.voussoir.trkpt.R
class MapFragment : Fragment() class MapFragment : Fragment()
{ {
@ -219,7 +220,7 @@ class MapFragment : Fragment()
{ {
startTracking() startTracking()
} }
handler.post(location_update_redraw) handler.postDelayed(location_update_redraw, 0)
} }
currentLocationButton.setOnClickListener { currentLocationButton.setOnClickListener {
centerMap(currentBestLocation, animated=true) centerMap(currentBestLocation, animated=true)
@ -452,7 +453,7 @@ class MapFragment : Fragment()
clear_track_overlay() clear_track_overlay()
val pl = Polyline(mapView) val pl = Polyline(mapView)
pl.outlinePaint.strokeWidth = Keys.POLYLINE_THICKNESS pl.outlinePaint.strokeWidth = Keys.POLYLINE_THICKNESS
pl.outlinePaint.color = Keys.POLYLINE_COLOR pl.outlinePaint.color = requireContext().getColor(R.color.fuchsia)
mapView.overlays.add(pl) mapView.overlays.add(pl)
current_track_overlay = pl current_track_overlay = pl
} }
@ -601,6 +602,7 @@ class MapFragment : Fragment()
// get state of tracking and update button if necessary // get state of tracking and update button if necessary
trackingState = trackerService.trackingState trackingState = trackerService.trackingState
update_main_button() update_main_button()
handler.postDelayed(location_update_redraw, 0)
// register listener for changes in shared preferences // register listener for changes in shared preferences
PreferencesHelper.registerPreferenceChangeListener(sharedPreferenceChangeListener) PreferencesHelper.registerPreferenceChangeListener(sharedPreferenceChangeListener)
// start listening for location updates // start listening for location updates

View File

@ -14,7 +14,11 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook /*
* Modified by voussoir for trkpt, forked from Trackbook.
*/
package net.voussoir.trkpt
import YesNoDialog import YesNoDialog
import android.app.Activity import android.app.Activity
@ -40,10 +44,10 @@ import androidx.preference.PreferenceFragmentCompat
import androidx.preference.SwitchPreferenceCompat import androidx.preference.SwitchPreferenceCompat
import androidx.preference.contains import androidx.preference.contains
import get_path_from_uri import get_path_from_uri
import org.y20k.trackbook.helpers.AppThemeHelper import net.voussoir.trkpt.helpers.AppThemeHelper
import org.y20k.trackbook.helpers.LengthUnitHelper import net.voussoir.trkpt.helpers.LengthUnitHelper
import org.y20k.trackbook.helpers.PreferencesHelper import net.voussoir.trkpt.helpers.PreferencesHelper
import org.y20k.trackbook.helpers.random_device_id import net.voussoir.trkpt.helpers.random_device_id
class SettingsFragment : PreferenceFragmentCompat(), YesNoDialog.YesNoDialogListener class SettingsFragment : PreferenceFragmentCompat(), YesNoDialog.YesNoDialogListener
{ {

View File

@ -14,22 +14,25 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook /*
* Modified by voussoir for trkpt, forked from Trackbook.
*/
package net.voussoir.trkpt
import android.content.Context import android.content.Context
import android.database.Cursor import android.database.Cursor
import android.database.DatabaseUtils.dumpCursorToString
import android.net.Uri import android.net.Uri
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import org.y20k.trackbook.helpers.iso8601 import net.voussoir.trkpt.helpers.iso8601
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
data class Track ( data class Track (
val database: Database, val database: net.voussoir.trkpt.Database,
val device_id: String, val device_id: String,
var start_time: Date, var start_time: Date,
var end_time: Date, var end_time: Date,

View File

@ -14,7 +14,11 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook /*
* Modified by voussoir for trkpt, forked from Trackbook.
*/
package net.voussoir.trkpt
import YesNoDialog import YesNoDialog
import android.app.Activity import android.app.Activity
@ -54,14 +58,14 @@ import org.osmdroid.views.overlay.TilesOverlay
import org.osmdroid.views.overlay.simplefastpoint.SimpleFastPointOverlay import org.osmdroid.views.overlay.simplefastpoint.SimpleFastPointOverlay
import org.osmdroid.views.overlay.simplefastpoint.SimpleFastPointOverlayOptions import org.osmdroid.views.overlay.simplefastpoint.SimpleFastPointOverlayOptions
import org.osmdroid.views.overlay.simplefastpoint.SimplePointTheme import org.osmdroid.views.overlay.simplefastpoint.SimplePointTheme
import org.y20k.trackbook.helpers.AppThemeHelper import net.voussoir.trkpt.helpers.AppThemeHelper
import org.y20k.trackbook.helpers.DateTimeHelper import net.voussoir.trkpt.helpers.DateTimeHelper
import org.y20k.trackbook.helpers.LengthUnitHelper import net.voussoir.trkpt.helpers.LengthUnitHelper
import org.y20k.trackbook.helpers.PreferencesHelper import net.voussoir.trkpt.helpers.PreferencesHelper
import org.y20k.trackbook.helpers.UiHelper import net.voussoir.trkpt.helpers.UiHelper
import org.y20k.trackbook.helpers.create_start_end_markers import net.voussoir.trkpt.helpers.create_start_end_markers
import org.y20k.trackbook.helpers.iso8601 import net.voussoir.trkpt.helpers.iso8601
import org.y20k.trackbook.helpers.iso8601_parse import net.voussoir.trkpt.helpers.iso8601_parse
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
@ -114,7 +118,7 @@ class TrackFragment : Fragment(), MapListener, YesNoDialog.YesNoDialogListener
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View
{ {
this.trackbook = (requireContext().applicationContext as Trackbook) this.trackbook = (requireContext().applicationContext as Trackbook)
val database: Database = (requireActivity().applicationContext as Trackbook).database val database: net.voussoir.trkpt.Database = (requireActivity().applicationContext as Trackbook).database
track = Track( track = Track(
database=database, database=database,
name=this.requireArguments().getString(Keys.ARG_TRACK_TITLE, ""), name=this.requireArguments().getString(Keys.ARG_TRACK_TITLE, ""),
@ -337,7 +341,7 @@ class TrackFragment : Fragment(), MapListener, YesNoDialog.YesNoDialogListener
val pointTheme = SimplePointTheme(track_geopoints, false) val pointTheme = SimplePointTheme(track_geopoints, false)
val style = Paint() val style = Paint()
style.style = Paint.Style.FILL style.style = Paint.Style.FILL
style.color = Keys.POLYLINE_COLOR style.color = requireContext().getColor(R.color.fuchsia)
style.flags = Paint.ANTI_ALIAS_FLAG style.flags = Paint.ANTI_ALIAS_FLAG
val overlayOptions: SimpleFastPointOverlayOptions = SimpleFastPointOverlayOptions.getDefaultStyle() val overlayOptions: SimpleFastPointOverlayOptions = SimpleFastPointOverlayOptions.getDefaultStyle()
.setAlgorithm(SimpleFastPointOverlayOptions.RenderingAlgorithm.MEDIUM_OPTIMIZATION) .setAlgorithm(SimpleFastPointOverlayOptions.RenderingAlgorithm.MEDIUM_OPTIMIZATION)
@ -369,7 +373,7 @@ class TrackFragment : Fragment(), MapListener, YesNoDialog.YesNoDialogListener
{ {
var pl = Polyline(mapView) var pl = Polyline(mapView)
pl.outlinePaint.strokeWidth = Keys.POLYLINE_THICKNESS pl.outlinePaint.strokeWidth = Keys.POLYLINE_THICKNESS
pl.outlinePaint.color = Keys.POLYLINE_COLOR pl.outlinePaint.color = requireContext().getColor(R.color.fuchsia)
pl.infoWindow = null pl.infoWindow = null
track_segment_overlays.add(pl) track_segment_overlays.add(pl)
mapView.overlays.add(pl) mapView.overlays.add(pl)

View File

@ -14,7 +14,11 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook /*
* Modified by voussoir for trkpt, forked from Trackbook.
*/
package net.voussoir.trkpt
import android.Manifest import android.Manifest
import android.app.Application import android.app.Application
@ -22,9 +26,9 @@ import android.content.pm.PackageManager
import android.database.Cursor import android.database.Cursor
import android.util.Log import android.util.Log
import com.google.android.material.color.DynamicColors import com.google.android.material.color.DynamicColors
import org.y20k.trackbook.helpers.AppThemeHelper import net.voussoir.trkpt.helpers.AppThemeHelper
import org.y20k.trackbook.helpers.PreferencesHelper import net.voussoir.trkpt.helpers.PreferencesHelper
import org.y20k.trackbook.helpers.PreferencesHelper.initPreferences import net.voussoir.trkpt.helpers.PreferencesHelper.initPreferences
import java.io.File import java.io.File
@ -35,7 +39,7 @@ interface DatabaseChangedListener
class Trackbook : Application() class Trackbook : Application()
{ {
val database: Database = Database(this) val database: net.voussoir.trkpt.Database = net.voussoir.trkpt.Database(this)
val homepoints: ArrayList<Homepoint> = ArrayList() val homepoints: ArrayList<Homepoint> = ArrayList()
val database_changed_listeners = ArrayList<DatabaseChangedListener>() val database_changed_listeners = ArrayList<DatabaseChangedListener>()

View File

@ -14,7 +14,11 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook /*
* Modified by voussoir for trkpt, forked from Trackbook.
*/
package net.voussoir.trkpt
import android.app.Notification import android.app.Notification
import android.app.NotificationManager import android.app.NotificationManager
@ -32,52 +36,56 @@ import android.util.Log
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import org.osmdroid.util.GeoPoint import org.osmdroid.util.GeoPoint
import java.util.* import java.util.*
import org.y20k.trackbook.helpers.* import net.voussoir.trkpt.helpers.*
/* /*
* TrackerService class * TrackerService class
*/ */
class TrackerService: Service() class TrackerService: Service()
{ {
/* Main class variables */ lateinit var trackbook: Trackbook
var trackingState: Int = Keys.STATE_TRACKING_STOPPED var trackingState: Int = Keys.STATE_TRACKING_STOPPED
var gpsProviderActive: Boolean = false
var networkProviderActive: Boolean = false
var useImperial: Boolean = false var useImperial: Boolean = false
var use_gps_location: Boolean = false
var use_network_location: Boolean = false
var omitRests: Boolean = true var omitRests: Boolean = true
var device_id: String = random_device_id() var device_id: String = random_device_id()
var currentBestLocation: Location = getDefaultLocation() var currentBestLocation: Location = getDefaultLocation()
var last_location_time: Long = 0
var lastCommit: Long = 0 var lastCommit: Long = 0
var location_min_time_ms: Long = 0 var location_min_time_ms: Long = 0
private val RECENT_TRKPT_COUNT = 7200 private val RECENT_TRKPT_COUNT = 7200
lateinit var recent_trkpts: Deque<Trkpt> lateinit var recent_trkpts: Deque<Trkpt>
lateinit var recent_displacement_locations: Deque<Location> lateinit var recent_displacement_locations: Deque<Location>
var recent_trackpoints_for_mapview: MutableList<GeoPoint> = mutableListOf() lateinit var recent_trackpoints_for_mapview: MutableList<GeoPoint>
var gpsLocationListenerRegistered: Boolean = false
var networkLocationListenerRegistered: Boolean = false
var bound: Boolean = false var bound: Boolean = false
private val binder = LocalBinder() private val binder = LocalBinder()
lateinit var trackbook: Trackbook
private lateinit var locationManager: LocationManager
private lateinit var notificationManager: NotificationManager private lateinit var notificationManager: NotificationManager
private lateinit var notificationHelper: NotificationHelper private lateinit var notificationHelper: NotificationHelper
private lateinit var locationManager: LocationManager
private lateinit var gpsLocationListener: LocationListener private lateinit var gpsLocationListener: LocationListener
private lateinit var networkLocationListener: LocationListener private lateinit var networkLocationListener: LocationListener
var use_gps_location: Boolean = false
var use_network_location: Boolean = false
var gpsProviderActive: Boolean = false
var networkProviderActive: Boolean = false
var gpsLocationListenerRegistered: Boolean = false
var networkLocationListenerRegistered: Boolean = false
var mapfragment: MapFragment? = null var mapfragment: MapFragment? = null
private fun addGpsLocationListener() private fun addGpsLocationListener()
{ {
if (! use_gps_location) if (! use_gps_location)
{ {
Log.v("VOUSSOIR", "Skipping GPS listener.") Log.i("VOUSSOIR", "Skipping GPS listener.")
return return
} }
if (gpsLocationListenerRegistered) if (gpsLocationListenerRegistered)
{ {
Log.v("VOUSSOIR", "GPS location listener has already been added.") Log.i("VOUSSOIR", "GPS location listener has already been added.")
return return
} }
@ -102,20 +110,20 @@ class TrackerService: Service()
gpsLocationListener, gpsLocationListener,
) )
gpsLocationListenerRegistered = true gpsLocationListenerRegistered = true
Log.v("VOUSSOIR", "Added GPS location listener.") Log.i("VOUSSOIR", "Added GPS location listener.")
} }
private fun addNetworkLocationListener() private fun addNetworkLocationListener()
{ {
if (! use_network_location) if (! use_network_location)
{ {
Log.v("VOUSSOIR", "Skipping Network listener.") Log.i("VOUSSOIR", "Skipping Network listener.")
return return
} }
if (networkLocationListenerRegistered) if (networkLocationListenerRegistered)
{ {
Log.v("VOUSSOIR", "Network location listener has already been added.") Log.i("VOUSSOIR", "Network location listener has already been added.")
return return
} }
@ -140,7 +148,7 @@ class TrackerService: Service()
networkLocationListener, networkLocationListener,
) )
networkLocationListenerRegistered = true networkLocationListenerRegistered = true
Log.v("VOUSSOIR", "Added Network location listener.") Log.i("VOUSSOIR", "Added Network location listener.")
} }
private fun createLocationListener(): LocationListener private fun createLocationListener(): LocationListener
@ -149,20 +157,23 @@ class TrackerService: Service()
{ {
override fun onLocationChanged(location: Location) override fun onLocationChanged(location: Location)
{ {
Log.i("VOUSSOIR", "Processing point ${location.latitude}, ${location.longitude} ${location.time}.") Log.i("VOUSSOIR", "Processing point ${location.time} ${location.latitude}, ${location.longitude}.")
if (! isBetterLocation(location, currentBestLocation)) if (location.time == currentBestLocation.time)
{ {
Log.i("VOUSSOIR", "Not better than previous.")
return return
} }
// if (! isBetterLocation(location, currentBestLocation))
// {
// Log.i("VOUSSOIR", "Not better than previous.")
// return
// }
currentBestLocation = location currentBestLocation = location
if (mapfragment != null) val mf = mapfragment
{ mf?.handler?.postDelayed(mf.location_update_redraw, 0)
mapfragment!!.handler.postDelayed(mapfragment!!.location_update_redraw, 0)
}
if (trackingState != Keys.STATE_TRACKING_ACTIVE) if (trackingState != Keys.STATE_TRACKING_ACTIVE)
{ {
@ -199,7 +210,11 @@ class TrackerService: Service()
return return
} }
} }
if (! (recent_displacement_locations.isEmpty() || isDifferentEnough(recent_displacement_locations.first(), location, omitRests))) if (recent_displacement_locations.isEmpty())
{
// pass
}
else if (! isDifferentEnough(recent_displacement_locations.first(), location, omitRests))
{ {
Log.i("VOUSSOIR", "Omitting due to too close to previous.") Log.i("VOUSSOIR", "Omitting due to too close to previous.")
return return
@ -207,6 +222,7 @@ class TrackerService: Service()
val trkpt = Trkpt(device_id=device_id, location=location) val trkpt = Trkpt(device_id=device_id, location=location)
trackbook.database.insert_trkpt(trkpt) trackbook.database.insert_trkpt(trkpt)
recent_trkpts.add(trkpt) recent_trkpts.add(trkpt)
while (recent_trkpts.size > RECENT_TRKPT_COUNT) while (recent_trkpts.size > RECENT_TRKPT_COUNT)
{ {
@ -264,6 +280,7 @@ class TrackerService: Service()
/* Overrides onBind from Service */ /* Overrides onBind from Service */
override fun onBind(p0: Intent?): IBinder override fun onBind(p0: Intent?): IBinder
{ {
Log.i("VOUSSOIR", "TrackerService.onBind")
bound = true bound = true
// start receiving location updates // start receiving location updates
addGpsLocationListener() addGpsLocationListener()
@ -276,6 +293,7 @@ class TrackerService: Service()
override fun onCreate() override fun onCreate()
{ {
super.onCreate() super.onCreate()
Log.i("VOUSSOIR", "TrackerService.onCreate")
trackbook = (applicationContext as Trackbook) trackbook = (applicationContext as Trackbook)
trackbook.load_homepoints() trackbook.load_homepoints()
recent_trkpts = ArrayDeque<Trkpt>(RECENT_TRKPT_COUNT) recent_trkpts = ArrayDeque<Trkpt>(RECENT_TRKPT_COUNT)
@ -317,6 +335,7 @@ class TrackerService: Service()
/* Overrides onRebind from Service */ /* Overrides onRebind from Service */
override fun onRebind(intent: Intent?) override fun onRebind(intent: Intent?)
{ {
Log.i("VOUSSOIR", "TrackerService.onRebind")
bound = true bound = true
addGpsLocationListener() addGpsLocationListener()
addNetworkLocationListener() addNetworkLocationListener()
@ -325,6 +344,7 @@ class TrackerService: Service()
/* Overrides onStartCommand from Service */ /* Overrides onStartCommand from Service */
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int
{ {
Log.i("VOUSSOIR", "TrackerService.onStartCommand")
// SERVICE RESTART (via START_STICKY) // SERVICE RESTART (via START_STICKY)
if (intent == null) if (intent == null)
{ {
@ -350,6 +370,8 @@ class TrackerService: Service()
/* Overrides onUnbind from Service */ /* Overrides onUnbind from Service */
override fun onUnbind(intent: Intent?): Boolean override fun onUnbind(intent: Intent?): Boolean
{ {
super.onUnbind(intent)
Log.i("VOUSSOIR", "TrackerService.onUnbind")
bound = false bound = false
// stop receiving location updates - if not tracking // stop receiving location updates - if not tracking
if (trackingState != Keys.STATE_TRACKING_ACTIVE) if (trackingState != Keys.STATE_TRACKING_ACTIVE)
@ -368,7 +390,7 @@ class TrackerService: Service()
{ {
locationManager.removeUpdates(gpsLocationListener) locationManager.removeUpdates(gpsLocationListener)
gpsLocationListenerRegistered = false gpsLocationListenerRegistered = false
Log.v("VOUSSOIR", "Removed GPS location listener.") Log.i("VOUSSOIR", "Removed GPS location listener.")
} }
else else
{ {
@ -382,7 +404,7 @@ class TrackerService: Service()
{ {
locationManager.removeUpdates(networkLocationListener) locationManager.removeUpdates(networkLocationListener)
networkLocationListenerRegistered = false networkLocationListenerRegistered = false
Log.v("VOUSSOIR", "Removed Network location listener.") Log.i("VOUSSOIR", "Removed Network location listener.")
} }
else else
{ {
@ -392,6 +414,7 @@ class TrackerService: Service()
fun startTracking() fun startTracking()
{ {
Log.i("VOUSSOIR", "TrackerService.startTracking")
addGpsLocationListener() addGpsLocationListener()
addNetworkLocationListener() addNetworkLocationListener()
trackingState = Keys.STATE_TRACKING_ACTIVE trackingState = Keys.STATE_TRACKING_ACTIVE
@ -402,6 +425,7 @@ class TrackerService: Service()
fun stopTracking() fun stopTracking()
{ {
Log.i("VOUSSOIR", "TrackerService.stopTracking")
trackbook.database.commit() trackbook.database.commit()
trackingState = Keys.STATE_TRACKING_STOPPED trackingState = Keys.STATE_TRACKING_STOPPED

View File

@ -14,7 +14,11 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook /*
* Modified by voussoir for trkpt, forked from Trackbook.
*/
package net.voussoir.trkpt
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
@ -22,7 +26,7 @@ import android.graphics.drawable.Icon
import android.os.Build import android.os.Build
import android.service.quicksettings.Tile import android.service.quicksettings.Tile
import android.service.quicksettings.TileService import android.service.quicksettings.TileService
import org.y20k.trackbook.helpers.PreferencesHelper import net.voussoir.trkpt.helpers.PreferencesHelper
/* /*
* TrackingToggleTileService class * TrackingToggleTileService class

View File

@ -14,7 +14,11 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook /*
* Modified by voussoir for trkpt, forked from Trackbook.
*/
package net.voussoir.trkpt
import YesNoDialog import YesNoDialog
import android.content.Context import android.content.Context
@ -27,14 +31,12 @@ import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.Dispatchers.Main
import org.y20k.trackbook.helpers.UiHelper import net.voussoir.trkpt.helpers.iso8601
import org.y20k.trackbook.helpers.iso8601 import net.voussoir.trkpt.tracklist.TracklistAdapter
import org.y20k.trackbook.tracklist.TracklistAdapter
/* /*
* TracklistFragment class * TracklistFragment class

View File

@ -14,13 +14,12 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook package net.voussoir.trkpt
import android.location.Location import android.location.Location
import org.osmdroid.api.IGeoPoint
import org.osmdroid.util.GeoPoint import org.osmdroid.util.GeoPoint
import org.osmdroid.views.overlay.Polyline import org.osmdroid.views.overlay.Polyline
import org.y20k.trackbook.helpers.getNumberOfSatellites import net.voussoir.trkpt.helpers.getNumberOfSatellites
class Trkpt( class Trkpt(
val device_id: String, val device_id: String,

View File

@ -14,7 +14,7 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook.dialogs package net.voussoir.trkpt.dialogs
import android.content.Context import android.content.Context
import android.content.DialogInterface import android.content.DialogInterface
@ -25,7 +25,7 @@ import android.widget.TextView
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isVisible import androidx.core.view.isVisible
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.y20k.trackbook.R import net.voussoir.trkpt.R
/* /*
* ErrorDialog object * ErrorDialog object

View File

@ -1,7 +1,7 @@
/* /*
* YesNoDialog * YesNoDialog
* Implements the YesNoDialog class * Implements the YesNoDialog class
* A YesNoDialog asks the user if he/she wants to do something or notpackage org.y20k.trackbook.dialogs * A YesNoDialog asks the user if he/she wants to do something or not
* *
* This file is part of * This file is part of
* TRACKBOOK - Movement Recorder for Android * TRACKBOOK - Movement Recorder for Android
@ -16,8 +16,8 @@
import android.content.Context import android.content.Context
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.y20k.trackbook.Keys import net.voussoir.trkpt.Keys
import org.y20k.trackbook.R import net.voussoir.trkpt.R
/* /*
* YesNoDialog class * YesNoDialog class

View File

@ -14,7 +14,7 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook.extensions package net.voussoir.trkpt.extensions
import android.content.SharedPreferences import android.content.SharedPreferences

View File

@ -1,19 +1,9 @@
package org.y20k.trackbook.helpers package net.voussoir.trkpt.helpers
import android.annotation.TargetApi
import android.content.ContentUris
import android.content.Context
import android.database.Cursor
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.DocumentsContract
import android.provider.MediaStore
import java.lang.Math.abs import java.lang.Math.abs
import java.security.SecureRandom import java.security.SecureRandom
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
import kotlin.random.Random.Default.nextBits
private val RNG = SecureRandom() private val RNG = SecureRandom()

View File

@ -14,14 +14,14 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook.helpers package net.voussoir.trkpt.helpers
import android.content.Context import android.content.Context
import android.content.res.Configuration import android.content.res.Configuration
import android.util.Log import android.util.Log
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
import org.y20k.trackbook.Keys import net.voussoir.trkpt.Keys
import org.y20k.trackbook.R import net.voussoir.trkpt.R
/* /*
* AppThemeHelper object * AppThemeHelper object

View File

@ -14,14 +14,12 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook.helpers package net.voussoir.trkpt.helpers
import android.content.Context import android.content.Context
import android.location.Location import net.voussoir.trkpt.Keys
import org.y20k.trackbook.Keys import net.voussoir.trkpt.R
import org.y20k.trackbook.R
import java.text.DateFormat import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util.* import java.util.*
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit

View File

@ -14,7 +14,7 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook.helpers package net.voussoir.trkpt.helpers
import java.math.BigDecimal import java.math.BigDecimal
import java.math.RoundingMode import java.math.RoundingMode

View File

@ -14,7 +14,7 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook.helpers package net.voussoir.trkpt.helpers
import android.Manifest import android.Manifest
import android.content.Context import android.content.Context
@ -24,7 +24,7 @@ import android.location.LocationManager
import android.os.Bundle import android.os.Bundle
import android.os.SystemClock import android.os.SystemClock
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import org.y20k.trackbook.Keys import net.voussoir.trkpt.Keys
import kotlin.math.pow import kotlin.math.pow
/* Get default location */ /* Get default location */

View File

@ -14,7 +14,7 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook.helpers package net.voussoir.trkpt.helpers
import android.content.Context import android.content.Context
import android.util.Log import android.util.Log
@ -24,8 +24,8 @@ import org.osmdroid.util.GeoPoint
import org.osmdroid.views.MapView import org.osmdroid.views.MapView
import org.osmdroid.views.overlay.ItemizedIconOverlay import org.osmdroid.views.overlay.ItemizedIconOverlay
import org.osmdroid.views.overlay.OverlayItem import org.osmdroid.views.overlay.OverlayItem
import org.y20k.trackbook.R import net.voussoir.trkpt.R
import org.y20k.trackbook.Trkpt import net.voussoir.trkpt.Trkpt
import java.text.DecimalFormat import java.text.DecimalFormat
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*

View File

@ -14,7 +14,7 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook.helpers package net.voussoir.trkpt.helpers
import android.app.* import android.app.*
import android.content.Context import android.content.Context
@ -24,10 +24,10 @@ import androidx.annotation.RequiresApi
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.drawable.toBitmap
import org.y20k.trackbook.Keys import net.voussoir.trkpt.Keys
import org.y20k.trackbook.MainActivity import net.voussoir.trkpt.MainActivity
import org.y20k.trackbook.R import net.voussoir.trkpt.R
import org.y20k.trackbook.TrackerService import net.voussoir.trkpt.TrackerService
/* /*
* NotificationHelper class * NotificationHelper class
@ -40,8 +40,8 @@ class NotificationHelper(private val trackerService: TrackerService)
/* Creates notification */ /* Creates notification */
fun createNotification(trackingState: Int, timestamp: String): Notification { fun createNotification(trackingState: Int, timestamp: String): Notification {
// create notification channel if necessary if (shouldCreateNotificationChannel())
if (shouldCreateNotificationChannel()) { {
createNotificationChannel() createNotificationChannel()
} }
@ -67,7 +67,6 @@ class NotificationHelper(private val trackerService: TrackerService)
} }
return builder.build() return builder.build()
} }
/* Checks if notification channel should be created */ /* Checks if notification channel should be created */

View File

@ -14,7 +14,7 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook.helpers package net.voussoir.trkpt.helpers
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
@ -23,9 +23,9 @@ import android.location.LocationManager
import android.util.Log import android.util.Log
import androidx.core.content.edit import androidx.core.content.edit
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import org.y20k.trackbook.Keys import net.voussoir.trkpt.Keys
import org.y20k.trackbook.extensions.getDouble import net.voussoir.trkpt.extensions.getDouble
import org.y20k.trackbook.extensions.putDouble import net.voussoir.trkpt.extensions.putDouble
/* /*
* PreferencesHelper object * PreferencesHelper object
@ -75,10 +75,13 @@ object PreferencesHelper
} }
fun loadTrackingState(): Int { fun loadTrackingState(): Int {
return sharedPreferences.getInt(Keys.PREF_TRACKING_STATE, Keys.STATE_TRACKING_STOPPED) val state = sharedPreferences.getInt(Keys.PREF_TRACKING_STATE, Keys.STATE_TRACKING_STOPPED)
Log.i("VOUSSOIR", "PreferencesHelper.loadTrackingState ${state}")
return state
} }
fun saveTrackingState(trackingState: Int) { fun saveTrackingState(trackingState: Int) {
Log.i("VOUSSOIR", "PreferencesHelper.saveTrackingState ${trackingState}")
sharedPreferences.edit { putInt(Keys.PREF_TRACKING_STATE, trackingState) } sharedPreferences.edit { putInt(Keys.PREF_TRACKING_STATE, trackingState) }
} }

View File

@ -14,7 +14,7 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook.helpers package net.voussoir.trkpt.helpers
import android.content.Context import android.content.Context
import android.graphics.Canvas import android.graphics.Canvas
@ -22,13 +22,10 @@ import android.graphics.Paint
import android.graphics.PorterDuff import android.graphics.PorterDuff
import android.graphics.PorterDuffXfermode import android.graphics.PorterDuffXfermode
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import org.y20k.trackbook.R import net.voussoir.trkpt.R
import org.y20k.trackbook.tracklist.TracklistAdapter
/* /*
* UiHelper object * UiHelper object

View File

@ -14,7 +14,7 @@
* https://github.com/osmdroid/osmdroid * https://github.com/osmdroid/osmdroid
*/ */
package org.y20k.trackbook.tracklist package net.voussoir.trkpt.tracklist
import android.content.Context import android.content.Context
import android.database.Cursor import android.database.Cursor
@ -26,15 +26,15 @@ import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import org.y20k.trackbook.Keys import net.voussoir.trkpt.Keys
import org.y20k.trackbook.R import net.voussoir.trkpt.R
import org.y20k.trackbook.Database import net.voussoir.trkpt.Database
import org.y20k.trackbook.Track import net.voussoir.trkpt.Track
import java.text.DateFormat import java.text.DateFormat
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
class TracklistAdapter(val fragment: Fragment, val database: Database) : RecyclerView.Adapter<RecyclerView.ViewHolder>() class TracklistAdapter(val fragment: Fragment, val database: net.voussoir.trkpt.Database) : RecyclerView.Adapter<RecyclerView.ViewHolder>()
{ {
private lateinit var tracklistListener: TracklistAdapterListener private lateinit var tracklistListener: TracklistAdapterListener
val tracks: ArrayList<Track> = ArrayList<Track>() val tracks: ArrayList<Track> = ArrayList<Track>()

View File

@ -8,7 +8,7 @@
<!-- MAP --> <!-- MAP -->
<fragment <fragment
android:id="@+id/map_fragment" android:id="@+id/map_fragment"
android:name="org.y20k.trackbook.MapFragment" android:name="net.voussoir.trkpt.MapFragment"
android:label="Map" android:label="Map"
tools:layout="@layout/fragment_map"> tools:layout="@layout/fragment_map">
<action <action
@ -22,13 +22,13 @@
<!-- SETTINGS --> <!-- SETTINGS -->
<fragment <fragment
android:id="@+id/settings_fragment" android:id="@+id/settings_fragment"
android:name="org.y20k.trackbook.SettingsFragment" android:name="net.voussoir.trkpt.SettingsFragment"
android:label="Settings"/> android:label="Settings"/>
<!-- TRACKS (LIST OF TRACKS) --> <!-- TRACKS (LIST OF TRACKS) -->
<fragment <fragment
android:id="@+id/tracklist_fragment" android:id="@+id/tracklist_fragment"
android:name="org.y20k.trackbook.TracklistFragment" android:name="net.voussoir.trkpt.TracklistFragment"
android:label="Tracks" android:label="Tracks"
tools:layout="@layout/fragment_tracklist"> tools:layout="@layout/fragment_tracklist">
<action <action
@ -40,7 +40,7 @@
<!-- TRACK --> <!-- TRACK -->
<fragment <fragment
android:id="@+id/fragment_track" android:id="@+id/fragment_track"
android:name="org.y20k.trackbook.TrackFragment" android:name="net.voussoir.trkpt.TrackFragment"
android:label="Track" android:label="Track"
tools:layout="@layout/fragment_track" > tools:layout="@layout/fragment_track" >
<argument <argument

View File

@ -49,5 +49,6 @@
<color name="default_blue">#FF3C98DB</color> <color name="default_blue">#FF3C98DB</color>
<color name="homepoint">#FFFFC107</color> <color name="homepoint">#FFFFC107</color>
<color name="default_green">#FF4CAF50</color> <color name="default_green">#FF4CAF50</color>
<color name="fuchsia">#FFFF00FF</color>
</resources> </resources>

View File

@ -8,8 +8,8 @@
<string name="tab_tracks">History</string> <string name="tab_tracks">History</string>
<string name="tab_settings">Settings</string> <string name="tab_settings">Settings</string>
<!-- Notification --> <!-- Notification -->
<string name="notification_title_trackbook_running">Trackbook running</string> <string name="notification_title_trackbook_running">Recording</string>
<string name="notification_title_trackbook_not_running">Trackbook stopped</string> <string name="notification_title_trackbook_not_running">Stopped</string>
<string name="notification_pause">Stop</string> <string name="notification_pause">Stop</string>
<string name="notification_resume">Record</string> <string name="notification_resume">Record</string>
<string name="notification_show">Show</string> <string name="notification_show">Show</string>