diff --git a/app/src/main/java/org/y20k/trackbook/MapFragment.kt b/app/src/main/java/org/y20k/trackbook/MapFragment.kt index bccb22a..6533ed2 100644 --- a/app/src/main/java/org/y20k/trackbook/MapFragment.kt +++ b/app/src/main/java/org/y20k/trackbook/MapFragment.kt @@ -60,7 +60,6 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener { private lateinit var currentBestLocation: Location private lateinit var layout: MapFragmentLayoutHolder private lateinit var trackerService: TrackerService - private lateinit var sharedPreferenceChangeListener2:SharedPreferences.OnSharedPreferenceChangeListener /* Overrides onCreate from Fragment */ @@ -240,8 +239,10 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener { private val sharedPreferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key -> when (key) { Keys.PREF_TRACKING_STATE -> { - trackingState = PreferencesHelper.loadTrackingState(activity as Context) - layout.updateRecordingButton(trackingState) + if (activity != null) { + trackingState = PreferencesHelper.loadTrackingState(activity as Context) + layout.updateRecordingButton(trackingState) + } } } } @@ -250,21 +251,6 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener { */ - private fun createSharedPreferenceChangeListener(): SharedPreferences.OnSharedPreferenceChangeListener { - return SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key -> - when (key) { - Keys.PREF_TRACKING_STATE -> { - if (isAdded) { - trackingState = PreferencesHelper.loadTrackingState(activity as Context) - layout.updateRecordingButton(trackingState) - } - } - } - } - } - - - /* * Defines callbacks for service binding, passed to bindService() */ @@ -275,8 +261,7 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener { trackerService = binder.service bound = true // register listener for changes in shared preferences - sharedPreferenceChangeListener2 = createSharedPreferenceChangeListener() - PreferenceManager.getDefaultSharedPreferences(activity as Context).registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener2) + PreferenceManager.getDefaultSharedPreferences(activity as Context).registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener) // start listening for location updates handler.removeCallbacks(periodicLocationRequestRunnable) handler.postDelayed(periodicLocationRequestRunnable, 0) @@ -284,7 +269,7 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener { override fun onServiceDisconnected(arg0: ComponentName) { bound = false // unregister listener for changes in shared preferences - PreferenceManager.getDefaultSharedPreferences(activity as Context).unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener2) + PreferenceManager.getDefaultSharedPreferences(activity as Context).unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener) // stop receiving location updates handler.removeCallbacks(periodicLocationRequestRunnable) } diff --git a/app/src/main/java/org/y20k/trackbook/TrackerService.kt b/app/src/main/java/org/y20k/trackbook/TrackerService.kt index 0f1ee6e..764fece 100644 --- a/app/src/main/java/org/y20k/trackbook/TrackerService.kt +++ b/app/src/main/java/org/y20k/trackbook/TrackerService.kt @@ -186,6 +186,7 @@ class TrackerService(): Service(), CoroutineScope, SensorEventListener { /* Start tracking location */ fun startTracking(newTrack: Boolean = true) { if (newTrack) { + track = Track() track.recordingStart = GregorianCalendar.getInstance().time track.recordingStop = track.recordingStart track.name = DateTimeHelper.convertToReadableDate(track.recordingStart) diff --git a/app/src/main/java/org/y20k/trackbook/TrackingToggleTileService.kt b/app/src/main/java/org/y20k/trackbook/TrackingToggleTileService.kt index d63f1ae..ce26b9b 100644 --- a/app/src/main/java/org/y20k/trackbook/TrackingToggleTileService.kt +++ b/app/src/main/java/org/y20k/trackbook/TrackingToggleTileService.kt @@ -17,10 +17,10 @@ package org.y20k.trackbook -import android.content.* +import android.content.Intent +import android.content.SharedPreferences import android.graphics.drawable.Icon import android.os.Build -import android.os.IBinder import android.service.quicksettings.Tile import android.service.quicksettings.TileService import androidx.preference.PreferenceManager @@ -48,6 +48,8 @@ class TrackingToggleTileService(): TileService() { super.onTileAdded() // get saved tracking state trackingState = PreferencesHelper.loadTrackingState(this) + // set up tile + updateTile() } /* Overrides onTileRemoved from TileService */ @@ -59,8 +61,8 @@ class TrackingToggleTileService(): TileService() { /* Overrides onStartListening from TileService */ override fun onStartListening() { super.onStartListening() - // tile becomes visible - bind tracker service - bindService(Intent(this, TrackerService::class.java), connection, Context.BIND_AUTO_CREATE) + // tile becomes visible - register listener for changes in shared preferences + PreferenceManager.getDefaultSharedPreferences(this@TrackingToggleTileService).registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener) } @@ -68,21 +70,16 @@ class TrackingToggleTileService(): TileService() { override fun onClick() { super.onClick() when (trackingState) { - Keys.STATE_TRACKING_ACTIVE -> { - trackerService.stopTracking() - } - else -> { - // start service via intent so that it keeps running after unbind - startTrackerService() - trackerService.startTracking() - } + Keys.STATE_TRACKING_ACTIVE -> stopTracking() + else -> startTracking() } } - /* Start tracker service */ - private fun startTrackerService() { + /* Start tracking */ + private fun startTracking() { val intent = Intent(application, TrackerService::class.java) + intent.action = Keys.ACTION_START if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // ... start service in foreground to prevent it being killed on Oreo application.startForegroundService(intent) @@ -92,11 +89,19 @@ class TrackingToggleTileService(): TileService() { } + /* Stop tracking */ + private fun stopTracking() { + val intent = Intent(application, TrackerService::class.java) + intent.action = Keys.ACTION_STOP + application.startService(intent) + } + + /* Overrides onStopListening from TileService */ override fun onStopListening() { super.onStopListening() - // tile no longer visible - unbind tracker service - unbindService(connection) + // tile no longer visible - unregister listener for changes in shared preferences + PreferenceManager.getDefaultSharedPreferences(this@TrackingToggleTileService).unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener) } @@ -142,32 +147,6 @@ class TrackingToggleTileService(): TileService() { */ - /* - * Defines callbacks for service binding, passed to bindService() - */ - private val connection = object : ServiceConnection { - override fun onServiceConnected(className: ComponentName, service: IBinder) { - // We've bound to LocalService, cast the IBinder and get LocalService instance - val binder = service as TrackerService.LocalBinder - trackerService = binder.service - trackingState = trackerService.trackingState - bound = true - // update state of tile - updateTile() - // register listener for changes in shared preferences - PreferenceManager.getDefaultSharedPreferences(this@TrackingToggleTileService).registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener) - - } - override fun onServiceDisconnected(arg0: ComponentName) { - bound = false - // unregister listener for changes in shared preferences - PreferenceManager.getDefaultSharedPreferences(this@TrackingToggleTileService).unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener) - } - } - /* - * End of declaration - */ - } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_tracklist.xml b/app/src/main/res/layout/fragment_tracklist.xml index 5405f05..4b8fea5 100644 --- a/app/src/main/res/layout/fragment_tracklist.xml +++ b/app/src/main/res/layout/fragment_tracklist.xml @@ -11,8 +11,10 @@