checkpoint
This commit is contained in:
parent
5dad3d6209
commit
1f695958e7
5 changed files with 183 additions and 134 deletions
|
@ -1,11 +1,14 @@
|
|||
package org.y20k.trackbook
|
||||
import android.content.ContentValues
|
||||
import android.database.sqlite.SQLiteDatabase
|
||||
import android.database.sqlite.SQLiteDatabase.openOrCreateDatabase
|
||||
import android.util.Log
|
||||
import java.io.File
|
||||
import java.util.*
|
||||
|
||||
class Database()
|
||||
class Database(trackbook: Trackbook)
|
||||
{
|
||||
val trackbook = trackbook
|
||||
var ready: Boolean = false
|
||||
lateinit var file: File
|
||||
lateinit var connection: SQLiteDatabase
|
||||
|
@ -14,6 +17,7 @@ class Database()
|
|||
{
|
||||
this.connection.close()
|
||||
this.ready = false
|
||||
this.trackbook.call_database_changed_listeners()
|
||||
}
|
||||
|
||||
fun connect(file: File)
|
||||
|
@ -23,6 +27,7 @@ class Database()
|
|||
this.connection = openOrCreateDatabase(file, null)
|
||||
this.initialize_tables()
|
||||
this.ready = true
|
||||
Log.i("VOUSSOIR", "Database.open: Calling all listeners")
|
||||
}
|
||||
|
||||
fun commit()
|
||||
|
@ -40,11 +45,29 @@ class Database()
|
|||
this.connection.endTransaction()
|
||||
}
|
||||
|
||||
fun insert_trkpt(device_id: String, trkpt: Trkpt)
|
||||
{
|
||||
val values = ContentValues().apply {
|
||||
put("device_id", device_id)
|
||||
put("lat", trkpt.latitude)
|
||||
put("lon", trkpt.longitude)
|
||||
put("time", GregorianCalendar.getInstance().time.time)
|
||||
put("accuracy", trkpt.accuracy)
|
||||
put("sat", trkpt.numberSatellites)
|
||||
put("ele", trkpt.altitude)
|
||||
}
|
||||
if (! connection.inTransaction())
|
||||
{
|
||||
connection.beginTransaction()
|
||||
}
|
||||
connection.insert("trkpt", null, values)
|
||||
}
|
||||
|
||||
private fun initialize_tables()
|
||||
{
|
||||
this.connection.beginTransaction()
|
||||
this.connection.execSQL("CREATE TABLE IF NOT EXISTS meta(name TEXT PRIMARY KEY, value TEXT)")
|
||||
this.connection.execSQL("CREATE TABLE IF NOT EXISTS trkpt(lat REAL NOT NULL, lon REAL NOT NULL, time INTEGER NOT NULL, accuracy REAL, device_id INTEGER NOT NULL, ele INTEGER, sat INTEGER, star INTEGER, PRIMARY KEY(lat, lon, time, device_id))")
|
||||
this.connection.execSQL("CREATE TABLE IF NOT EXISTS trkpt(lat REAL NOT NULL, lon REAL NOT NULL, time INTEGER NOT NULL, accuracy REAL, device_id INTEGER NOT NULL, ele INTEGER, sat INTEGER, PRIMARY KEY(lat, lon, time, device_id))")
|
||||
this.connection.execSQL("CREATE TABLE IF NOT EXISTS homepoints(lat REAL NOT NULL, lon REAL NOT NULL, radius REAL NOT NULL, name TEXT, PRIMARY KEY(lat, lon))")
|
||||
this.connection.setTransactionSuccessful()
|
||||
this.connection.endTransaction()
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
package org.y20k.trackbook
|
||||
|
||||
import android.Manifest
|
||||
import android.app.Activity
|
||||
import android.content.*
|
||||
import android.content.pm.PackageManager
|
||||
import android.content.res.Resources
|
||||
|
@ -41,8 +40,8 @@ import org.osmdroid.api.IMapController
|
|||
import org.osmdroid.tileprovider.tilesource.TileSourceFactory
|
||||
import org.osmdroid.util.GeoPoint
|
||||
import org.osmdroid.views.MapView
|
||||
import org.osmdroid.views.overlay.FolderOverlay
|
||||
import org.osmdroid.views.overlay.ItemizedIconOverlay
|
||||
import org.osmdroid.views.overlay.Overlay
|
||||
import org.osmdroid.views.overlay.OverlayItem
|
||||
import org.osmdroid.views.overlay.Polygon
|
||||
import org.osmdroid.views.overlay.TilesOverlay
|
||||
|
@ -69,30 +68,44 @@ class MapFragment : Fragment()
|
|||
private lateinit var currentBestLocation: Location
|
||||
private lateinit var trackerService: TrackerService
|
||||
|
||||
private lateinit var trackbook: Trackbook
|
||||
lateinit var rootView: View
|
||||
var userInteraction: Boolean = false
|
||||
lateinit var currentLocationButton: FloatingActionButton
|
||||
lateinit var mainButton: ExtendedFloatingActionButton
|
||||
private lateinit var mapView: MapView
|
||||
private lateinit var current_position_folder: FolderOverlay
|
||||
private var current_position_overlays = ArrayList<Overlay>()
|
||||
private var currentTrackOverlay: SimpleFastPointOverlay? = null
|
||||
private var currentTrackSpecialMarkerOverlay: ItemizedIconOverlay<OverlayItem>? = null
|
||||
private lateinit var locationErrorBar: Snackbar
|
||||
private lateinit var controller: IMapController
|
||||
private var zoomLevel: Double = Keys.DEFAULT_ZOOM_LEVEL
|
||||
private lateinit var homepoints_overlay_folder: FolderOverlay
|
||||
private var homepoints_overlays = ArrayList<Overlay>()
|
||||
private lateinit var database_changed_listener: DatabaseChangedListener
|
||||
|
||||
/* Overrides onCreate from Fragment */
|
||||
override fun onCreate(savedInstanceState: Bundle?)
|
||||
{
|
||||
Log.i("VOUSSOIR", "MapFragment.onCreate")
|
||||
super.onCreate(savedInstanceState)
|
||||
// TODO make only MapFragment's status bar transparent - see:
|
||||
// https://gist.github.com/Dvik/a3de88d39da9d1d6d175025a56c5e797#file-viewextension-kt and
|
||||
// https://proandroiddev.com/android-full-screen-ui-with-transparent-status-bar-ef52f3adde63
|
||||
// get current best location
|
||||
currentBestLocation = getLastKnownLocation(activity as Context)
|
||||
// get saved tracking state
|
||||
this.trackbook = (requireContext().applicationContext as Trackbook)
|
||||
database_changed_listener = object: DatabaseChangedListener
|
||||
{
|
||||
override fun database_changed()
|
||||
{
|
||||
Log.i("VOUSSOIR", "MapFragment database_ready_changed to ${trackbook.database.ready}")
|
||||
if (trackbook.database.ready)
|
||||
{
|
||||
create_homepoint_overlays(requireContext(), mapView, trackbook.homepoints)
|
||||
}
|
||||
else
|
||||
{
|
||||
clear_homepoint_overlays()
|
||||
}
|
||||
update_main_button()
|
||||
}
|
||||
}
|
||||
currentBestLocation = getLastKnownLocation(requireContext())
|
||||
trackingState = PreferencesHelper.loadTrackingState()
|
||||
}
|
||||
|
||||
|
@ -100,7 +113,6 @@ class MapFragment : Fragment()
|
|||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View
|
||||
{
|
||||
Log.i("VOUSSOIR", "MapFragment.onCreateView")
|
||||
val context = activity as Context
|
||||
// find views
|
||||
rootView = inflater.inflate(R.layout.fragment_map, container, false)
|
||||
mapView = rootView.findViewById(R.id.map)
|
||||
|
@ -124,26 +136,23 @@ class MapFragment : Fragment()
|
|||
}
|
||||
|
||||
// store Density Scaling Factor
|
||||
val densityScalingFactor: Float = UiHelper.getDensityScalingFactor(context)
|
||||
val densityScalingFactor: Float = UiHelper.getDensityScalingFactor(requireContext())
|
||||
|
||||
// add compass to map
|
||||
val compassOverlay = CompassOverlay(context, InternalCompassOrientationProvider(context), mapView)
|
||||
val compassOverlay = CompassOverlay(requireContext(), InternalCompassOrientationProvider(requireContext()), mapView)
|
||||
compassOverlay.enableCompass()
|
||||
// compassOverlay.setCompassCenter(36f, 36f + (statusBarHeight / densityScalingFactor)) // TODO uncomment when transparent status bar is re-implemented
|
||||
val screen_width = Resources.getSystem().displayMetrics.widthPixels;
|
||||
compassOverlay.setCompassCenter((screen_width / densityScalingFactor) - 36f, 36f)
|
||||
mapView.overlays.add(compassOverlay)
|
||||
|
||||
val app: Trackbook = (context.applicationContext as Trackbook)
|
||||
val app: Trackbook = (requireContext().applicationContext as Trackbook)
|
||||
app.load_homepoints()
|
||||
homepoints_overlay_folder = FolderOverlay()
|
||||
mapView.overlays.add(homepoints_overlay_folder)
|
||||
createHomepointOverlays(context, mapView, app.homepoints)
|
||||
|
||||
// add my location overlay
|
||||
current_position_folder = FolderOverlay()
|
||||
mapView.overlays.add(current_position_folder)
|
||||
|
||||
create_homepoint_overlays(requireContext(), mapView, app.homepoints)
|
||||
if (database_changed_listener !in trackbook.database_changed_listeners)
|
||||
{
|
||||
trackbook.database_changed_listeners.add(database_changed_listener)
|
||||
}
|
||||
|
||||
centerMap(currentBestLocation)
|
||||
|
||||
|
@ -152,7 +161,7 @@ class MapFragment : Fragment()
|
|||
currentTrackSpecialMarkerOverlay = null
|
||||
|
||||
// initialize main button state
|
||||
updateMainButton(trackingState)
|
||||
update_main_button()
|
||||
|
||||
// listen for user interaction
|
||||
addInteractionListener()
|
||||
|
@ -224,9 +233,13 @@ class MapFragment : Fragment()
|
|||
Log.i("VOUSSOIR", "MapFragment.onDestroy")
|
||||
super.onDestroy()
|
||||
requireActivity().window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
|
||||
|
||||
if (database_changed_listener in trackbook.database_changed_listeners)
|
||||
{
|
||||
trackbook.database_changed_listeners.remove(database_changed_listener)
|
||||
}
|
||||
}
|
||||
|
||||
/* Register the permission launcher for requesting location */
|
||||
private val requestLocationPermissionLauncher = registerForActivityResult(RequestPermission()) { isGranted: Boolean ->
|
||||
if (isGranted) {
|
||||
// permission was granted - re-bind service
|
||||
|
@ -301,9 +314,6 @@ class MapFragment : Fragment()
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Defines the listener for changes in shared preferences
|
||||
*/
|
||||
private val sharedPreferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key ->
|
||||
when (key)
|
||||
{
|
||||
|
@ -312,12 +322,14 @@ class MapFragment : Fragment()
|
|||
if (activity != null)
|
||||
{
|
||||
trackingState = PreferencesHelper.loadTrackingState()
|
||||
updateMainButton(trackingState)
|
||||
update_main_button()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
private fun addInteractionListener() {
|
||||
|
||||
private fun addInteractionListener()
|
||||
{
|
||||
mapView.setOnTouchListener { v, event ->
|
||||
userInteraction = true
|
||||
false
|
||||
|
@ -340,10 +352,25 @@ class MapFragment : Fragment()
|
|||
userInteraction = false
|
||||
}
|
||||
|
||||
fun clear_current_position_overlays()
|
||||
{
|
||||
for (ov in current_position_overlays)
|
||||
{
|
||||
if (ov in mapView.overlays)
|
||||
{
|
||||
mapView.overlays.remove(ov)
|
||||
}
|
||||
}
|
||||
current_position_overlays.clear();
|
||||
}
|
||||
|
||||
/* Mark current position on map */
|
||||
fun markCurrentPosition(location: Location, trackingState: Int = Keys.STATE_TRACKING_STOPPED)
|
||||
fun create_current_position_overlays(location: Location, trackingState: Int = Keys.STATE_TRACKING_STOPPED)
|
||||
{
|
||||
Log.i("VOUSSOIR", "MapFragmentLayoutHolder.markCurrentPosition")
|
||||
|
||||
clear_current_position_overlays()
|
||||
|
||||
val locationIsOld: Boolean = !(isRecentEnough(location))
|
||||
|
||||
// create marker
|
||||
|
@ -374,47 +401,68 @@ class MapFragment : Fragment()
|
|||
}
|
||||
}
|
||||
|
||||
current_position_folder.items.clear()
|
||||
|
||||
val current_location_radius = Polygon()
|
||||
current_location_radius.points = Polygon.pointsAsCircle(GeoPoint(location.latitude, location.longitude), location.accuracy.toDouble())
|
||||
current_location_radius.fillPaint.color = fillcolor
|
||||
current_location_radius.outlinePaint.color = Color.argb(0, 0, 0, 0)
|
||||
current_position_folder.add(current_location_radius)
|
||||
current_position_overlays.add(current_location_radius)
|
||||
|
||||
val overlayItems: java.util.ArrayList<OverlayItem> = java.util.ArrayList<OverlayItem>()
|
||||
val overlayItem: OverlayItem = createOverlayItem(requireContext(), location.latitude, location.longitude, location.accuracy, location.provider.toString(), location.time)
|
||||
overlayItem.setMarker(newMarker)
|
||||
overlayItems.add(overlayItem)
|
||||
current_position_folder.add(createOverlay(requireContext(), overlayItems))
|
||||
current_position_overlays.add(createOverlay(requireContext(), overlayItems))
|
||||
|
||||
for (ov in current_position_overlays)
|
||||
{
|
||||
mapView.overlays.add(ov)
|
||||
}
|
||||
}
|
||||
|
||||
fun createHomepointOverlays(context: Context, map_view: MapView, homepoints: List<Homepoint>)
|
||||
fun clear_homepoint_overlays()
|
||||
{
|
||||
for (ov in homepoints_overlays)
|
||||
{
|
||||
if (ov in mapView.overlays)
|
||||
{
|
||||
mapView.overlays.remove(ov)
|
||||
}
|
||||
}
|
||||
homepoints_overlays.clear();
|
||||
}
|
||||
|
||||
fun create_homepoint_overlays(context: Context, map_view: MapView, homepoints: List<Homepoint>)
|
||||
{
|
||||
Log.i("VOUSSOIR", "MapFragmentLayoutHolder.createHomepointOverlays")
|
||||
val overlayItems: java.util.ArrayList<OverlayItem> = java.util.ArrayList<OverlayItem>()
|
||||
|
||||
val newMarker: Drawable = ContextCompat.getDrawable(context, R.drawable.ic_homepoint_24dp)!!
|
||||
|
||||
homepoints_overlay_folder.items.clear()
|
||||
clear_homepoint_overlays()
|
||||
|
||||
for (homepoint in homepoints)
|
||||
{
|
||||
val overlayItem: OverlayItem = createOverlayItem(context, homepoint.location.latitude, homepoint.location.longitude, homepoint.location.accuracy, homepoint.location.provider.toString(), homepoint.location.time)
|
||||
overlayItem.setMarker(newMarker)
|
||||
overlayItems.add(overlayItem)
|
||||
homepoints_overlay_folder.add(createOverlay(context, overlayItems))
|
||||
|
||||
val p = Polygon()
|
||||
p.points = Polygon.pointsAsCircle(GeoPoint(homepoint.location.latitude, homepoint.location.longitude), homepoint.location.accuracy.toDouble())
|
||||
p.fillPaint.color = Color.argb(64, 255, 193, 7)
|
||||
p.outlinePaint.color = Color.argb(0, 0, 0, 0)
|
||||
homepoints_overlay_folder.add(p)
|
||||
homepoints_overlays.add(p)
|
||||
|
||||
val overlayItem: OverlayItem = createOverlayItem(context, homepoint.location.latitude, homepoint.location.longitude, homepoint.location.accuracy, homepoint.location.provider.toString(), homepoint.location.time)
|
||||
overlayItem.setMarker(newMarker)
|
||||
overlayItems.add(overlayItem)
|
||||
homepoints_overlays.add(createOverlay(context, overlayItems))
|
||||
}
|
||||
|
||||
for (ov in homepoints_overlays)
|
||||
{
|
||||
mapView.overlays.add(ov)
|
||||
}
|
||||
}
|
||||
|
||||
/* Overlay current track on map */
|
||||
fun overlayCurrentTrack(track: Track, trackingState: Int) {
|
||||
fun create_current_track_overlay(track: Track, trackingState: Int)
|
||||
{
|
||||
if (currentTrackOverlay != null) {
|
||||
mapView.overlays.remove(currentTrackOverlay)
|
||||
}
|
||||
|
@ -427,22 +475,26 @@ class MapFragment : Fragment()
|
|||
}
|
||||
}
|
||||
|
||||
/* Toggles state of main button and additional buttons (save & resume) */
|
||||
fun updateMainButton(trackingState: Int)
|
||||
fun update_main_button()
|
||||
{
|
||||
when (trackingState) {
|
||||
Keys.STATE_TRACKING_STOPPED -> {
|
||||
mainButton.setIconResource(R.drawable.ic_fiber_manual_record_inactive_24dp)
|
||||
mainButton.text = requireContext().getString(R.string.button_start)
|
||||
mainButton.contentDescription = requireContext().getString(R.string.descr_button_start)
|
||||
currentLocationButton.isVisible = true
|
||||
}
|
||||
Keys.STATE_TRACKING_ACTIVE -> {
|
||||
mainButton.setIconResource(R.drawable.ic_fiber_manual_stop_24dp)
|
||||
mainButton.text = requireContext().getString(R.string.button_pause)
|
||||
mainButton.contentDescription = requireContext().getString(R.string.descr_button_pause)
|
||||
currentLocationButton.isVisible = true
|
||||
}
|
||||
mainButton.isEnabled = trackbook.database.ready
|
||||
currentLocationButton.isVisible = true
|
||||
if (! trackbook.database.ready)
|
||||
{
|
||||
mainButton.text = "Database not ready"
|
||||
mainButton.icon = null
|
||||
}
|
||||
else if (trackingState == Keys.STATE_TRACKING_STOPPED)
|
||||
{
|
||||
mainButton.setIconResource(R.drawable.ic_fiber_manual_record_inactive_24dp)
|
||||
mainButton.text = requireContext().getString(R.string.button_start)
|
||||
mainButton.contentDescription = requireContext().getString(R.string.descr_button_start)
|
||||
}
|
||||
else if (trackingState == Keys.STATE_TRACKING_ACTIVE)
|
||||
{
|
||||
mainButton.setIconResource(R.drawable.ic_fiber_manual_stop_24dp)
|
||||
mainButton.text = requireContext().getString(R.string.button_pause)
|
||||
mainButton.contentDescription = requireContext().getString(R.string.descr_button_pause)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -459,13 +511,7 @@ class MapFragment : Fragment()
|
|||
if (locationErrorBar.isShown) locationErrorBar.dismiss()
|
||||
}
|
||||
}
|
||||
/*
|
||||
* End of declaration
|
||||
*/
|
||||
|
||||
/*
|
||||
* Defines callbacks for service binding, passed to bindService()
|
||||
*/
|
||||
private val connection = object : ServiceConnection {
|
||||
override fun onServiceConnected(className: ComponentName, service: IBinder) {
|
||||
bound = true
|
||||
|
@ -474,7 +520,7 @@ class MapFragment : Fragment()
|
|||
trackerService = binder.service
|
||||
// get state of tracking and update button if necessary
|
||||
trackingState = trackerService.trackingState
|
||||
updateMainButton(trackingState)
|
||||
update_main_button()
|
||||
// register listener for changes in shared preferences
|
||||
PreferencesHelper.registerPreferenceChangeListener(sharedPreferenceChangeListener)
|
||||
// start listening for location updates
|
||||
|
@ -486,13 +532,7 @@ class MapFragment : Fragment()
|
|||
handleServiceUnbind()
|
||||
}
|
||||
}
|
||||
/*
|
||||
* End of declaration
|
||||
*/
|
||||
|
||||
/*
|
||||
* Runnable: Periodically requests location
|
||||
*/
|
||||
private val periodicLocationRequestRunnable: Runnable = object : Runnable {
|
||||
override fun run() {
|
||||
// pull current state from service
|
||||
|
@ -502,20 +542,17 @@ class MapFragment : Fragment()
|
|||
networkProviderActive = trackerService.networkProviderActive
|
||||
trackingState = trackerService.trackingState
|
||||
// update location and track
|
||||
markCurrentPosition(currentBestLocation, trackingState)
|
||||
overlayCurrentTrack(track, trackingState)
|
||||
create_current_position_overlays(currentBestLocation, trackingState)
|
||||
create_current_track_overlay(track, trackingState)
|
||||
// center map, if it had not been dragged/zoomed before
|
||||
if (!userInteraction)
|
||||
{
|
||||
centerMap(currentBestLocation, true)
|
||||
}
|
||||
// show error snackbar if necessary
|
||||
toggleLocationErrorBar(gpsProviderActive, networkProviderActive)
|
||||
// toggleLocationErrorBar(gpsProviderActive, networkProviderActive)
|
||||
// use the handler to start runnable again after specified delay
|
||||
handler.postDelayed(this, Keys.REQUEST_CURRENT_LOCATION_INTERVAL)
|
||||
}
|
||||
}
|
||||
/*
|
||||
* End of declaration
|
||||
*/
|
||||
}
|
||||
|
|
|
@ -31,12 +31,24 @@ import org.y20k.trackbook.helpers.PreferencesHelper
|
|||
import org.y20k.trackbook.helpers.PreferencesHelper.initPreferences
|
||||
import java.io.File
|
||||
|
||||
/*
|
||||
* Trackbook.class
|
||||
*/
|
||||
|
||||
interface DatabaseChangedListener
|
||||
{
|
||||
fun database_changed()
|
||||
}
|
||||
|
||||
class Trackbook(): Application() {
|
||||
val database: Database = Database()
|
||||
val database: Database = Database(this)
|
||||
val homepoints: ArrayList<Homepoint> = ArrayList()
|
||||
val database_changed_listeners = ArrayList<DatabaseChangedListener>()
|
||||
|
||||
fun call_database_changed_listeners()
|
||||
{
|
||||
for (listener in this.database_changed_listeners)
|
||||
{
|
||||
listener.database_changed()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreate()
|
||||
{
|
||||
|
@ -63,6 +75,7 @@ class Trackbook(): Application() {
|
|||
{
|
||||
this.database.ready = false
|
||||
}
|
||||
this.call_database_changed_listeners()
|
||||
}
|
||||
fun load_homepoints()
|
||||
{
|
||||
|
|
|
@ -230,7 +230,8 @@ class TrackerService: Service(), SensorEventListener
|
|||
}
|
||||
|
||||
/* Overrides onDestroy from Service */
|
||||
override fun onDestroy() {
|
||||
override fun onDestroy()
|
||||
{
|
||||
LogHelper.i("VOUSSOIR", "TrackerService.onDestroy.")
|
||||
super.onDestroy()
|
||||
if (trackingState == Keys.STATE_TRACKING_ACTIVE)
|
||||
|
@ -255,8 +256,10 @@ class TrackerService: Service(), SensorEventListener
|
|||
/* Overrides onSensorChanged from SensorEventListener */
|
||||
override fun onSensorChanged(sensorEvent: SensorEvent?) {
|
||||
var steps = 0f
|
||||
if (sensorEvent != null) {
|
||||
if (stepCountOffset == 0f) {
|
||||
if (sensorEvent != null)
|
||||
{
|
||||
if (stepCountOffset == 0f)
|
||||
{
|
||||
// store steps previously recorded by the system
|
||||
stepCountOffset = (sensorEvent.values[0] - 1) - 0 // subtract any steps recorded during this session in case the app was killed
|
||||
}
|
||||
|
@ -307,22 +310,28 @@ class TrackerService: Service(), SensorEventListener
|
|||
/* Adds location listeners to location manager */
|
||||
fun removeGpsLocationListener()
|
||||
{
|
||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
|
||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
|
||||
{
|
||||
locationManager.removeUpdates(gpsLocationListener)
|
||||
gpsLocationListenerRegistered = false
|
||||
LogHelper.v(TAG, "Removed GPS location listener.")
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
LogHelper.w(TAG, "Unable to remove GPS location listener. Location permission is needed.")
|
||||
}
|
||||
}
|
||||
|
||||
fun removeNetworkLocationListener()
|
||||
{
|
||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
|
||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
|
||||
{
|
||||
locationManager.removeUpdates(networkLocationListener)
|
||||
networkLocationListenerRegistered = false
|
||||
LogHelper.v(TAG, "Removed Network location listener.")
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
LogHelper.w(TAG, "Unable to remove Network location listener. Location permission is needed.")
|
||||
}
|
||||
}
|
||||
|
@ -330,7 +339,8 @@ class TrackerService: Service(), SensorEventListener
|
|||
private fun startStepCounter()
|
||||
{
|
||||
val stepCounterAvailable = sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER), SensorManager.SENSOR_DELAY_UI)
|
||||
if (!stepCounterAvailable) {
|
||||
if (!stepCounterAvailable)
|
||||
{
|
||||
LogHelper.w(TAG, "Pedometer sensor not available.")
|
||||
}
|
||||
}
|
||||
|
@ -445,33 +455,18 @@ class TrackerService: Service(), SensorEventListener
|
|||
}
|
||||
return true
|
||||
}
|
||||
/*
|
||||
* Runnable: Periodically track updates (if recording active)
|
||||
*/
|
||||
|
||||
private val periodicTrackUpdate: Runnable = object : Runnable
|
||||
{
|
||||
override fun run() {
|
||||
val now: Date = GregorianCalendar.getInstance().time
|
||||
val trkpt: Trkpt = Trkpt(location=currentBestLocation)
|
||||
val trkpt = Trkpt(location=currentBestLocation)
|
||||
Log.i("VOUSSOIR", "Processing point ${currentBestLocation.latitude}, ${currentBestLocation.longitude} ${now.time}.")
|
||||
if (should_keep_point((currentBestLocation)))
|
||||
{
|
||||
val values = ContentValues().apply {
|
||||
put("device_id", device_id)
|
||||
put("lat", trkpt.latitude)
|
||||
put("lon", trkpt.longitude)
|
||||
put("time", now.time)
|
||||
put("accuracy", trkpt.accuracy)
|
||||
put("sat", trkpt.numberSatellites)
|
||||
put("ele", trkpt.altitude)
|
||||
put("star", 0)
|
||||
}
|
||||
if (! trackbook.database.connection.inTransaction())
|
||||
{
|
||||
trackbook.database.connection.beginTransaction()
|
||||
}
|
||||
trackbook.database.connection.insert("trkpt", null, values)
|
||||
trackbook.database.insert_trkpt(device_id, trkpt)
|
||||
track.trkpts.add(trkpt)
|
||||
|
||||
while (track.trkpts.size > 7200)
|
||||
{
|
||||
track.trkpts.removeFirst()
|
||||
|
@ -479,20 +474,12 @@ class TrackerService: Service(), SensorEventListener
|
|||
|
||||
if (now.time - lastCommit.time > Keys.SAVE_TEMP_TRACK_INTERVAL)
|
||||
{
|
||||
if (trackbook.database.connection.inTransaction())
|
||||
{
|
||||
trackbook.database.commit()
|
||||
}
|
||||
trackbook.database.commit()
|
||||
lastCommit = now
|
||||
}
|
||||
}
|
||||
// update notification
|
||||
displayNotification()
|
||||
// re-run this in set interval
|
||||
handler.postDelayed(this, Keys.TRACKING_INTERVAL)
|
||||
}
|
||||
}
|
||||
/*
|
||||
* End of declaration
|
||||
*/
|
||||
}
|
||||
|
|
|
@ -30,12 +30,10 @@ import org.osmdroid.util.GeoPoint
|
|||
import org.osmdroid.views.MapView
|
||||
import org.osmdroid.views.overlay.ItemizedIconOverlay
|
||||
import org.osmdroid.views.overlay.OverlayItem
|
||||
import org.osmdroid.views.overlay.Polygon
|
||||
import org.osmdroid.views.overlay.simplefastpoint.LabelledGeoPoint
|
||||
import org.osmdroid.views.overlay.simplefastpoint.SimpleFastPointOverlay
|
||||
import org.osmdroid.views.overlay.simplefastpoint.SimpleFastPointOverlayOptions
|
||||
import org.osmdroid.views.overlay.simplefastpoint.SimplePointTheme
|
||||
import org.y20k.trackbook.Homepoint
|
||||
import org.y20k.trackbook.Keys
|
||||
import org.y20k.trackbook.R
|
||||
import org.y20k.trackbook.Track
|
||||
|
@ -44,15 +42,6 @@ import java.text.DecimalFormat
|
|||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
//private var currentPositionOverlay: ItemizedIconOverlay<OverlayItem>
|
||||
|
||||
|
||||
/* Creates icon overlay for current position (used in MapFragment) */
|
||||
fun createMyLocationOverlay(context: Context, map_view: MapView, currentPositionOverlay: ItemizedIconOverlay<OverlayItem>, location: Location, trackingState: Int)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* Creates icon overlay for track */
|
||||
fun createTrackOverlay(context: Context, map_view: MapView, track: Track, trackingState: Int)
|
||||
|
@ -149,12 +138,12 @@ fun createOverlay(context: Context, overlayItems: ArrayList<OverlayItem>): Itemi
|
|||
{
|
||||
return ItemizedIconOverlay<OverlayItem>(context, overlayItems,
|
||||
object : ItemizedIconOverlay.OnItemGestureListener<OverlayItem> {
|
||||
override fun onItemSingleTapUp(index: Int, item: OverlayItem): Boolean {
|
||||
override fun onItemSingleTapUp(index: Int, item: OverlayItem): Boolean
|
||||
{
|
||||
return false
|
||||
}
|
||||
override fun onItemLongPress(index: Int, item: OverlayItem): Boolean {
|
||||
val v = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
|
||||
v.vibrate(50)
|
||||
override fun onItemLongPress(index: Int, item: OverlayItem): Boolean
|
||||
{
|
||||
Toast.makeText(context, item.snippet, Toast.LENGTH_LONG).show()
|
||||
return true
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue