From 36b891152c95d92de4f9c7ff2d74e5060abe2ce7 Mon Sep 17 00:00:00 2001 From: y20k Date: Thu, 24 Jun 2021 21:56:48 +0200 Subject: [PATCH] Updated libraries --- app/build.gradle | 6 +++--- .../java/org/y20k/trackbook/MapFragment.kt | 11 ++++++++--- .../org/y20k/trackbook/SettingsFragment.kt | 6 ++---- .../java/org/y20k/trackbook/TrackFragment.kt | 11 +++++------ .../java/org/y20k/trackbook/TrackerService.kt | 19 ++++--------------- .../trackbook/tracklist/TracklistAdapter.kt | 14 +++++++------- .../trackbook/ui/TrackFragmentLayoutHolder.kt | 5 +++-- build.gradle | 6 +++--- 8 files changed, 35 insertions(+), 43 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8cdcc06..451447c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,16 +59,16 @@ dependencies { // AndroidX def navigationVersion = "2.3.5" implementation "androidx.activity:activity-ktx:1.2.3" - implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - implementation 'androidx.core:core-ktx:1.3.2' + implementation 'androidx.core:core-ktx:1.5.0' implementation "androidx.navigation:navigation-fragment-ktx:$navigationVersion" implementation "androidx.navigation:navigation-ui-ktx:$navigationVersion" implementation 'androidx.preference:preference-ktx:1.1.1' implementation 'com.google.android.material:material:1.3.0' // Gson - implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.google.code.gson:gson:2.8.7' // OpenStreetMap implementation 'org.osmdroid:osmdroid-android:6.1.10' diff --git a/app/src/main/java/org/y20k/trackbook/MapFragment.kt b/app/src/main/java/org/y20k/trackbook/MapFragment.kt index 1869f4f..a41a05a 100644 --- a/app/src/main/java/org/y20k/trackbook/MapFragment.kt +++ b/app/src/main/java/org/y20k/trackbook/MapFragment.kt @@ -33,8 +33,11 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import androidx.preference.PreferenceManager -import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.y20k.trackbook.core.Track import org.y20k.trackbook.core.TracklistElement import org.y20k.trackbook.helpers.* @@ -279,7 +282,7 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener, MapOverlayHelpe if (track.wayPoints.isEmpty()) { YesNoDialog(this as YesNoDialog.YesNoDialogListener).show(activity as Context, type = Keys.DIALOG_EMPTY_RECORDING, title = R.string.dialog_error_empty_recording_title, message = R.string.dialog_error_empty_recording_message, yesButton = R.string.dialog_error_empty_recording_action_resume) } else { - GlobalScope.launch { + CoroutineScope(IO).launch { // step 1: create and store filenames for json and gpx files track.trackUriString = FileHelper.getTrackFileUri(activity as Context, track).toString() track.gpxUriString = FileHelper.getGpxFileUri(activity as Context, track).toString() @@ -290,7 +293,9 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener, MapOverlayHelpe // step 3: clear track trackerService.clearTrack() // step 4: open track in TrackFragement - openTrack(track.toTracklistElement(activity as Context)) + withContext(Main) { + openTrack(track.toTracklistElement(activity as Context)) + } } } } diff --git a/app/src/main/java/org/y20k/trackbook/SettingsFragment.kt b/app/src/main/java/org/y20k/trackbook/SettingsFragment.kt index 518725b..da30fd1 100644 --- a/app/src/main/java/org/y20k/trackbook/SettingsFragment.kt +++ b/app/src/main/java/org/y20k/trackbook/SettingsFragment.kt @@ -29,6 +29,7 @@ import android.view.View import android.widget.Toast import androidx.preference.* import kotlinx.coroutines.* +import kotlinx.coroutines.Dispatchers.IO import org.y20k.trackbook.core.Tracklist import org.y20k.trackbook.helpers.* @@ -226,14 +227,11 @@ class SettingsFragment : PreferenceFragmentCompat(), YesNoDialog.YesNoDialogList /* Removes track and track files for given position - used by TracklistFragment */ fun deleteNonStarred(context: Context) { - val backgroundJob = Job() - val uiScope = CoroutineScope(Dispatchers.Main + backgroundJob) - uiScope.launch { + CoroutineScope(IO).launch { var tracklist: Tracklist = FileHelper.readTracklist(context) val deferred: Deferred = async { FileHelper.deleteNonStarredSuspended(context, tracklist) } // wait for result and store in tracklist tracklist = deferred.await() - backgroundJob.cancel() } } diff --git a/app/src/main/java/org/y20k/trackbook/TrackFragment.kt b/app/src/main/java/org/y20k/trackbook/TrackFragment.kt index 230ee28..e1c6b2c 100644 --- a/app/src/main/java/org/y20k/trackbook/TrackFragment.kt +++ b/app/src/main/java/org/y20k/trackbook/TrackFragment.kt @@ -34,7 +34,8 @@ import androidx.core.net.toFile import androidx.core.os.bundleOf import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController -import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.y20k.trackbook.core.Track import org.y20k.trackbook.dialogs.RenameTrackDialog @@ -122,7 +123,7 @@ class TrackFragment : Fragment(), RenameTrackDialog.RenameTrackListener, YesNoDi val targetUri: Uri? = data.data if (targetUri != null) { // copy file async (= fire & forget - no return value needed) - GlobalScope.launch { FileHelper.saveCopyOfFileSuspended( activity as Context, originalFileUri = sourceUri, targetFileUri = targetUri) } + CoroutineScope(Dispatchers.IO).launch { FileHelper.saveCopyOfFileSuspended( activity as Context, originalFileUri = sourceUri, targetFileUri = targetUri) } Toast.makeText(activity as Context, R.string.toast_message_save_gpx, Toast.LENGTH_LONG).show() } } @@ -136,7 +137,7 @@ class TrackFragment : Fragment(), RenameTrackDialog.RenameTrackListener, YesNoDi /* Overrides onRenameTrackDialog from RenameTrackDialog */ override fun onRenameTrackDialog(textInput: String) { // rename track async (= fire & forget - no return value needed) - GlobalScope.launch { FileHelper.renameTrackSuspended(activity as Context, layout.track, textInput) } + CoroutineScope(Dispatchers.IO).launch { FileHelper.renameTrackSuspended(activity as Context, layout.track, textInput) } // update name in layout layout.track.name = textInput layout.trackNameView.text = textInput @@ -168,9 +169,7 @@ class TrackFragment : Fragment(), RenameTrackDialog.RenameTrackListener, YesNoDi track = TrackHelper.toggleStarred(activity as Context, track, latitude, longitude) layout.updateTrackOverlay(track) // save track - GlobalScope.launch { - FileHelper.saveTrackSuspended(track, true) - } + CoroutineScope(Dispatchers.IO).launch { FileHelper.saveTrackSuspended(track, true) } } diff --git a/app/src/main/java/org/y20k/trackbook/TrackerService.kt b/app/src/main/java/org/y20k/trackbook/TrackerService.kt index 873de9d..5ba3fbd 100644 --- a/app/src/main/java/org/y20k/trackbook/TrackerService.kt +++ b/app/src/main/java/org/y20k/trackbook/TrackerService.kt @@ -39,16 +39,16 @@ import android.os.IBinder import androidx.core.content.ContextCompat import androidx.preference.PreferenceManager import kotlinx.coroutines.* +import kotlinx.coroutines.Dispatchers.IO import org.y20k.trackbook.core.Track import org.y20k.trackbook.helpers.* import java.util.* -import kotlin.coroutines.CoroutineContext /* * TrackerService class */ -class TrackerService: Service(), CoroutineScope, SensorEventListener { +class TrackerService: Service(), SensorEventListener { /* Define log tag */ private val TAG: String = LogHelper.makeLogTag(TrackerService::class.java) @@ -78,11 +78,6 @@ class TrackerService: Service(), CoroutineScope, SensorEventListener { private lateinit var notificationHelper: NotificationHelper private lateinit var gpsLocationListener: LocationListener private lateinit var networkLocationListener: LocationListener - private lateinit var backgroundJob: Job - - - /* Overrides coroutineContext variable */ - override val coroutineContext: CoroutineContext get() = backgroundJob + Dispatchers.Main /* Overrides onCreate from Service */ @@ -103,7 +98,6 @@ class TrackerService: Service(), CoroutineScope, SensorEventListener { trackingState = PreferencesHelper.loadTrackingState(this) currentBestLocation = LocationHelper.getLastKnownLocation(this) track = FileHelper.readTrack(this, FileHelper.getTempFileUri(this)) - backgroundJob = Job() altitudeValues.capacity = PreferencesHelper.loadAltitudeSmoothingValue(this) PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener( sharedPreferenceChangeListener @@ -187,8 +181,6 @@ class TrackerService: Service(), CoroutineScope, SensorEventListener { // stop receiving location updates removeGpsLocationListener() removeNetworkLocationListener() - // cancel background job - backgroundJob.cancel() } @@ -260,7 +252,7 @@ class TrackerService: Service(), CoroutineScope, SensorEventListener { fun stopTracking() { // save temp track track.recordingStop = GregorianCalendar.getInstance().time - GlobalScope.launch { FileHelper.saveTempTrackSuspended(this@TrackerService, track) } + CoroutineScope(IO).launch { FileHelper.saveTempTrackSuspended(this@TrackerService, track) } // save state trackingState = Keys.STATE_TRACKING_STOPPED PreferencesHelper.saveTrackingState(this, trackingState) @@ -551,10 +543,7 @@ class TrackerService: Service(), CoroutineScope, SensorEventListener { val now: Date = GregorianCalendar.getInstance().time if (now.time - lastSave.time > Keys.SAVE_TEMP_TRACK_INTERVAL) { lastSave = now - GlobalScope.launch { FileHelper.saveTempTrackSuspended( - this@TrackerService, - track - ) } + CoroutineScope(IO).launch { FileHelper.saveTempTrackSuspended(this@TrackerService, track) } } } // update notification diff --git a/app/src/main/java/org/y20k/trackbook/tracklist/TracklistAdapter.kt b/app/src/main/java/org/y20k/trackbook/tracklist/TracklistAdapter.kt index 8e9bb3a..a0ef9ea 100644 --- a/app/src/main/java/org/y20k/trackbook/tracklist/TracklistAdapter.kt +++ b/app/src/main/java/org/y20k/trackbook/tracklist/TracklistAdapter.kt @@ -30,6 +30,8 @@ import androidx.fragment.app.Fragment import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import kotlinx.coroutines.* +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.Dispatchers.Main import org.y20k.trackbook.R import org.y20k.trackbook.core.Tracklist import org.y20k.trackbook.core.TracklistElement @@ -113,14 +115,12 @@ class TracklistAdapter(private val fragment: Fragment) : RecyclerView.Adapter = async { FileHelper.deleteTrackSuspended(context, position, tracklist) } // wait for result and store in tracklist - tracklist = deferred.await() - notifyItemRemoved(position) - backgroundJob.cancel() + withContext(Main) { + tracklist = deferred.await() + notifyItemRemoved(position) } } } @@ -147,7 +147,7 @@ class TracklistAdapter(private val fragment: Fragment) : RecyclerView.Adapter