Updated libraries

This commit is contained in:
y20k 2021-06-24 21:56:48 +02:00
parent 18a1164578
commit 36b891152c
No known key found for this signature in database
GPG key ID: 824D4259F41FAFF6
8 changed files with 35 additions and 43 deletions

View file

@ -59,16 +59,16 @@ dependencies {
// AndroidX // AndroidX
def navigationVersion = "2.3.5" def navigationVersion = "2.3.5"
implementation "androidx.activity:activity-ktx:1.2.3" 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.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-fragment-ktx:$navigationVersion"
implementation "androidx.navigation:navigation-ui-ktx:$navigationVersion" implementation "androidx.navigation:navigation-ui-ktx:$navigationVersion"
implementation 'androidx.preference:preference-ktx:1.1.1' implementation 'androidx.preference:preference-ktx:1.1.1'
implementation 'com.google.android.material:material:1.3.0' implementation 'com.google.android.material:material:1.3.0'
// Gson // Gson
implementation 'com.google.code.gson:gson:2.8.6' implementation 'com.google.code.gson:gson:2.8.7'
// OpenStreetMap // OpenStreetMap
implementation 'org.osmdroid:osmdroid-android:6.1.10' implementation 'org.osmdroid:osmdroid-android:6.1.10'

View file

@ -33,8 +33,11 @@ import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.preference.PreferenceManager 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.launch
import kotlinx.coroutines.withContext
import org.y20k.trackbook.core.Track import org.y20k.trackbook.core.Track
import org.y20k.trackbook.core.TracklistElement import org.y20k.trackbook.core.TracklistElement
import org.y20k.trackbook.helpers.* import org.y20k.trackbook.helpers.*
@ -279,7 +282,7 @@ class MapFragment : Fragment(), YesNoDialog.YesNoDialogListener, MapOverlayHelpe
if (track.wayPoints.isEmpty()) { 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) 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 { } else {
GlobalScope.launch { CoroutineScope(IO).launch {
// step 1: create and store filenames for json and gpx files // step 1: create and store filenames for json and gpx files
track.trackUriString = FileHelper.getTrackFileUri(activity as Context, track).toString() track.trackUriString = FileHelper.getTrackFileUri(activity as Context, track).toString()
track.gpxUriString = FileHelper.getGpxFileUri(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 // step 3: clear track
trackerService.clearTrack() trackerService.clearTrack()
// step 4: open track in TrackFragement // step 4: open track in TrackFragement
openTrack(track.toTracklistElement(activity as Context)) withContext(Main) {
openTrack(track.toTracklistElement(activity as Context))
}
} }
} }
} }

View file

@ -29,6 +29,7 @@ import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.preference.* import androidx.preference.*
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.Dispatchers.IO
import org.y20k.trackbook.core.Tracklist import org.y20k.trackbook.core.Tracklist
import org.y20k.trackbook.helpers.* 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 */ /* Removes track and track files for given position - used by TracklistFragment */
fun deleteNonStarred(context: Context) { fun deleteNonStarred(context: Context) {
val backgroundJob = Job() CoroutineScope(IO).launch {
val uiScope = CoroutineScope(Dispatchers.Main + backgroundJob)
uiScope.launch {
var tracklist: Tracklist = FileHelper.readTracklist(context) var tracklist: Tracklist = FileHelper.readTracklist(context)
val deferred: Deferred<Tracklist> = async { FileHelper.deleteNonStarredSuspended(context, tracklist) } val deferred: Deferred<Tracklist> = async { FileHelper.deleteNonStarredSuspended(context, tracklist) }
// wait for result and store in tracklist // wait for result and store in tracklist
tracklist = deferred.await() tracklist = deferred.await()
backgroundJob.cancel()
} }
} }

View file

@ -34,7 +34,8 @@ import androidx.core.net.toFile
import androidx.core.os.bundleOf 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 kotlinx.coroutines.GlobalScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.y20k.trackbook.core.Track import org.y20k.trackbook.core.Track
import org.y20k.trackbook.dialogs.RenameTrackDialog import org.y20k.trackbook.dialogs.RenameTrackDialog
@ -122,7 +123,7 @@ class TrackFragment : Fragment(), RenameTrackDialog.RenameTrackListener, YesNoDi
val targetUri: Uri? = data.data val targetUri: Uri? = data.data
if (targetUri != null) { if (targetUri != null) {
// copy file async (= fire & forget - no return value needed) // 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() 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 */ /* Overrides onRenameTrackDialog from RenameTrackDialog */
override fun onRenameTrackDialog(textInput: String) { override fun onRenameTrackDialog(textInput: String) {
// rename track async (= fire & forget - no return value needed) // 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 // update name in layout
layout.track.name = textInput layout.track.name = textInput
layout.trackNameView.text = textInput layout.trackNameView.text = textInput
@ -168,9 +169,7 @@ class TrackFragment : Fragment(), RenameTrackDialog.RenameTrackListener, YesNoDi
track = TrackHelper.toggleStarred(activity as Context, track, latitude, longitude) track = TrackHelper.toggleStarred(activity as Context, track, latitude, longitude)
layout.updateTrackOverlay(track) layout.updateTrackOverlay(track)
// save track // save track
GlobalScope.launch { CoroutineScope(Dispatchers.IO).launch { FileHelper.saveTrackSuspended(track, true) }
FileHelper.saveTrackSuspended(track, true)
}
} }

View file

@ -39,16 +39,16 @@ import android.os.IBinder
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.Dispatchers.IO
import org.y20k.trackbook.core.Track import org.y20k.trackbook.core.Track
import org.y20k.trackbook.helpers.* import org.y20k.trackbook.helpers.*
import java.util.* import java.util.*
import kotlin.coroutines.CoroutineContext
/* /*
* TrackerService class * TrackerService class
*/ */
class TrackerService: Service(), CoroutineScope, SensorEventListener { class TrackerService: Service(), SensorEventListener {
/* Define log tag */ /* Define log tag */
private val TAG: String = LogHelper.makeLogTag(TrackerService::class.java) 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 notificationHelper: NotificationHelper
private lateinit var gpsLocationListener: LocationListener private lateinit var gpsLocationListener: LocationListener
private lateinit var networkLocationListener: 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 */ /* Overrides onCreate from Service */
@ -103,7 +98,6 @@ class TrackerService: Service(), CoroutineScope, SensorEventListener {
trackingState = PreferencesHelper.loadTrackingState(this) trackingState = PreferencesHelper.loadTrackingState(this)
currentBestLocation = LocationHelper.getLastKnownLocation(this) currentBestLocation = LocationHelper.getLastKnownLocation(this)
track = FileHelper.readTrack(this, FileHelper.getTempFileUri(this)) track = FileHelper.readTrack(this, FileHelper.getTempFileUri(this))
backgroundJob = Job()
altitudeValues.capacity = PreferencesHelper.loadAltitudeSmoothingValue(this) altitudeValues.capacity = PreferencesHelper.loadAltitudeSmoothingValue(this)
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener( PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(
sharedPreferenceChangeListener sharedPreferenceChangeListener
@ -187,8 +181,6 @@ class TrackerService: Service(), CoroutineScope, SensorEventListener {
// stop receiving location updates // stop receiving location updates
removeGpsLocationListener() removeGpsLocationListener()
removeNetworkLocationListener() removeNetworkLocationListener()
// cancel background job
backgroundJob.cancel()
} }
@ -260,7 +252,7 @@ class TrackerService: Service(), CoroutineScope, SensorEventListener {
fun stopTracking() { fun stopTracking() {
// save temp track // save temp track
track.recordingStop = GregorianCalendar.getInstance().time track.recordingStop = GregorianCalendar.getInstance().time
GlobalScope.launch { FileHelper.saveTempTrackSuspended(this@TrackerService, track) } CoroutineScope(IO).launch { FileHelper.saveTempTrackSuspended(this@TrackerService, track) }
// save state // save state
trackingState = Keys.STATE_TRACKING_STOPPED trackingState = Keys.STATE_TRACKING_STOPPED
PreferencesHelper.saveTrackingState(this, trackingState) PreferencesHelper.saveTrackingState(this, trackingState)
@ -551,10 +543,7 @@ class TrackerService: Service(), CoroutineScope, SensorEventListener {
val now: Date = GregorianCalendar.getInstance().time val now: Date = GregorianCalendar.getInstance().time
if (now.time - lastSave.time > Keys.SAVE_TEMP_TRACK_INTERVAL) { if (now.time - lastSave.time > Keys.SAVE_TEMP_TRACK_INTERVAL) {
lastSave = now lastSave = now
GlobalScope.launch { FileHelper.saveTempTrackSuspended( CoroutineScope(IO).launch { FileHelper.saveTempTrackSuspended(this@TrackerService, track) }
this@TrackerService,
track
) }
} }
} }
// update notification // update notification

View file

@ -30,6 +30,8 @@ import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Dispatchers.Main
import org.y20k.trackbook.R import org.y20k.trackbook.R
import org.y20k.trackbook.core.Tracklist import org.y20k.trackbook.core.Tracklist
import org.y20k.trackbook.core.TracklistElement import org.y20k.trackbook.core.TracklistElement
@ -113,14 +115,12 @@ class TracklistAdapter(private val fragment: Fragment) : RecyclerView.Adapter<Re
/* Removes track and track files for given position - used by TracklistFragment */ /* Removes track and track files for given position - used by TracklistFragment */
fun removeTrack(context: Context, position: Int) { fun removeTrack(context: Context, position: Int) {
val backgroundJob = Job() CoroutineScope(IO).launch {
val uiScope = CoroutineScope(Dispatchers.Main + backgroundJob)
uiScope.launch {
val deferred: Deferred<Tracklist> = async { FileHelper.deleteTrackSuspended(context, position, tracklist) } val deferred: Deferred<Tracklist> = async { FileHelper.deleteTrackSuspended(context, position, tracklist) }
// wait for result and store in tracklist // wait for result and store in tracklist
tracklist = deferred.await() withContext(Main) {
notifyItemRemoved(position) tracklist = deferred.await()
backgroundJob.cancel() notifyItemRemoved(position) }
} }
} }
@ -147,7 +147,7 @@ class TracklistAdapter(private val fragment: Fragment) : RecyclerView.Adapter<Re
tracklist.tracklistElements[position].starred = true tracklist.tracklistElements[position].starred = true
} }
} }
GlobalScope.launch { CoroutineScope(Dispatchers.IO).launch {
FileHelper.saveTracklistSuspended(context, tracklist, GregorianCalendar.getInstance().time) FileHelper.saveTracklistSuspended(context, tracklist, GregorianCalendar.getInstance().time)
} }
} }

View file

@ -30,7 +30,8 @@ import androidx.core.view.isVisible
import androidx.core.widget.NestedScrollView import androidx.core.widget.NestedScrollView
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.textview.MaterialTextView import com.google.android.material.textview.MaterialTextView
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.osmdroid.api.IGeoPoint import org.osmdroid.api.IGeoPoint
import org.osmdroid.api.IMapController import org.osmdroid.api.IMapController
@ -196,7 +197,7 @@ data class TrackFragmentLayoutHolder(private var context: Context, private var m
/* Saves zoom level and center of this map */ /* Saves zoom level and center of this map */
fun saveViewStateToTrack() { fun saveViewStateToTrack() {
if (track.latitude != 0.0 && track.longitude != 0.0) { if (track.latitude != 0.0 && track.longitude != 0.0) {
GlobalScope.launch { FileHelper.saveTrackSuspended(track, false) } CoroutineScope(Dispatchers.IO).launch { FileHelper.saveTrackSuspended(track, false) }
} }
} }

View file

@ -2,12 +2,12 @@
buildscript { buildscript {
ext { ext {
kotlin_version = '1.5.0' kotlin_version = '1.5.20'
navigation_version = '2.3.3' navigation_version = '2.3.3'
} }
repositories { repositories {
google() google()
jcenter() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:4.2.1' classpath 'com.android.tools.build:gradle:4.2.1'
@ -22,7 +22,7 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
google() google()
jcenter() mavenCentral()
} }
} }