store total distance, duration, etc.
This commit is contained in:
		
							parent
							
								
									cd621ad368
								
							
						
					
					
						commit
						18a1164578
					
				
					 4 changed files with 46 additions and 5 deletions
				
			
		| 
						 | 
					@ -33,7 +33,11 @@ import java.util.*
 | 
				
			||||||
@Parcelize
 | 
					@Parcelize
 | 
				
			||||||
data class Tracklist (@Expose val tracklistFormatVersion: Int = Keys.CURRENT_TRACKLIST_FORMAT_VERSION,
 | 
					data class Tracklist (@Expose val tracklistFormatVersion: Int = Keys.CURRENT_TRACKLIST_FORMAT_VERSION,
 | 
				
			||||||
                      @Expose val tracklistElements: MutableList<TracklistElement> = mutableListOf<TracklistElement>(),
 | 
					                      @Expose val tracklistElements: MutableList<TracklistElement> = mutableListOf<TracklistElement>(),
 | 
				
			||||||
                      @Expose var modificationDate: Date = Date()): Parcelable {
 | 
					                      @Expose var modificationDate: Date = Date(),
 | 
				
			||||||
 | 
					                      @Expose var totalDistanceAll: Float = 0f,
 | 
				
			||||||
 | 
					                      @Expose var totalDurationAll: Long = 0L,
 | 
				
			||||||
 | 
					                      @Expose var totalRecordingPausedAll: Long = 0L,
 | 
				
			||||||
 | 
					                      @Expose var totalStepCountAll: Float = 0f): Parcelable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Return trackelement for given track id */
 | 
					    /* Return trackelement for given track id */
 | 
				
			||||||
    fun getTrackElement(trackId: Long): TracklistElement? {
 | 
					    fun getTrackElement(trackId: Long): TracklistElement? {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -181,6 +181,10 @@ object FileHelper {
 | 
				
			||||||
        return suspendCoroutine { cont ->
 | 
					        return suspendCoroutine { cont ->
 | 
				
			||||||
            val tracklist: Tracklist = readTracklist(context)
 | 
					            val tracklist: Tracklist = readTracklist(context)
 | 
				
			||||||
            tracklist.tracklistElements.add(track.toTracklistElement(context))
 | 
					            tracklist.tracklistElements.add(track.toTracklistElement(context))
 | 
				
			||||||
 | 
					            tracklist.totalDistanceAll += track.length
 | 
				
			||||||
 | 
					            tracklist.totalDurationAll += track.duration
 | 
				
			||||||
 | 
					            tracklist.totalRecordingPausedAll += track.recordingPaused
 | 
				
			||||||
 | 
					            tracklist.totalStepCountAll += track.stepCount
 | 
				
			||||||
            cont.resume(saveTracklist(context, tracklist, modificationDate))
 | 
					            cont.resume(saveTracklist(context, tracklist, modificationDate))
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,9 +20,14 @@ package org.y20k.trackbook.helpers
 | 
				
			||||||
import android.content.Context
 | 
					import android.content.Context
 | 
				
			||||||
import android.location.Location
 | 
					import android.location.Location
 | 
				
			||||||
import android.widget.Toast
 | 
					import android.widget.Toast
 | 
				
			||||||
 | 
					import androidx.core.net.toUri
 | 
				
			||||||
 | 
					import kotlinx.coroutines.CoroutineScope
 | 
				
			||||||
 | 
					import kotlinx.coroutines.Dispatchers.IO
 | 
				
			||||||
 | 
					import kotlinx.coroutines.launch
 | 
				
			||||||
import org.y20k.trackbook.Keys
 | 
					import org.y20k.trackbook.Keys
 | 
				
			||||||
import org.y20k.trackbook.R
 | 
					import org.y20k.trackbook.R
 | 
				
			||||||
import org.y20k.trackbook.core.Track
 | 
					import org.y20k.trackbook.core.Track
 | 
				
			||||||
 | 
					import org.y20k.trackbook.core.Tracklist
 | 
				
			||||||
import org.y20k.trackbook.core.TracklistElement
 | 
					import org.y20k.trackbook.core.TracklistElement
 | 
				
			||||||
import org.y20k.trackbook.core.WayPoint
 | 
					import org.y20k.trackbook.core.WayPoint
 | 
				
			||||||
import java.text.SimpleDateFormat
 | 
					import java.text.SimpleDateFormat
 | 
				
			||||||
| 
						 | 
					@ -248,4 +253,27 @@ object TrackHelper {
 | 
				
			||||||
        return track
 | 
					        return track
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Calculates total distance, duration and pause */
 | 
				
			||||||
 | 
					    fun calculateAndSaveTrackTotals(context: Context, tracklist: Tracklist) {
 | 
				
			||||||
 | 
					        CoroutineScope(IO).launch {
 | 
				
			||||||
 | 
					            var totalDistanceAll: Float = 0f
 | 
				
			||||||
 | 
					            var totalDurationAll: Long = 0L
 | 
				
			||||||
 | 
					            var totalRecordingPausedAll: Long = 0L
 | 
				
			||||||
 | 
					            var totalStepCountAll: Float = 0f
 | 
				
			||||||
 | 
					            tracklist.tracklistElements.forEach { tracklistElement ->
 | 
				
			||||||
 | 
					                val track: Track = FileHelper.readTrack(context, tracklistElement.trackUriString.toUri())
 | 
				
			||||||
 | 
					                totalDistanceAll += track.length
 | 
				
			||||||
 | 
					                totalDurationAll += track.duration
 | 
				
			||||||
 | 
					                totalRecordingPausedAll += track.recordingPaused
 | 
				
			||||||
 | 
					                totalStepCountAll += track.stepCount
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            tracklist.totalDistanceAll = totalDistanceAll
 | 
				
			||||||
 | 
					            tracklist.totalDurationAll = totalDurationAll
 | 
				
			||||||
 | 
					            tracklist.totalRecordingPausedAll = totalRecordingPausedAll
 | 
				
			||||||
 | 
					            tracklist.totalStepCountAll = totalStepCountAll
 | 
				
			||||||
 | 
					            FileHelper.saveTracklistSuspended(context, tracklist, GregorianCalendar.getInstance().time)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,6 +25,7 @@ import android.view.ViewGroup
 | 
				
			||||||
import android.widget.ImageButton
 | 
					import android.widget.ImageButton
 | 
				
			||||||
import android.widget.TextView
 | 
					import android.widget.TextView
 | 
				
			||||||
import androidx.constraintlayout.widget.ConstraintLayout
 | 
					import androidx.constraintlayout.widget.ConstraintLayout
 | 
				
			||||||
 | 
					import androidx.core.content.ContextCompat
 | 
				
			||||||
import androidx.fragment.app.Fragment
 | 
					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
 | 
				
			||||||
| 
						 | 
					@ -66,6 +67,10 @@ class TracklistAdapter(private val fragment: Fragment) : RecyclerView.Adapter<Re
 | 
				
			||||||
        // load tracklist
 | 
					        // load tracklist
 | 
				
			||||||
        tracklist = FileHelper.readTracklist(context)
 | 
					        tracklist = FileHelper.readTracklist(context)
 | 
				
			||||||
        tracklist.tracklistElements.sortByDescending { tracklistElement -> tracklistElement.date  }
 | 
					        tracklist.tracklistElements.sortByDescending { tracklistElement -> tracklistElement.date  }
 | 
				
			||||||
 | 
					        // calculate total duration and distance, if necessary
 | 
				
			||||||
 | 
					        if (tracklist.tracklistElements.isNotEmpty() && tracklist.totalDurationAll == 0L) {
 | 
				
			||||||
 | 
					            TrackHelper.calculateAndSaveTrackTotals(context, tracklist)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -88,8 +93,8 @@ class TracklistAdapter(private val fragment: Fragment) : RecyclerView.Adapter<Re
 | 
				
			||||||
        trackElementViewHolder.trackNameView.text = tracklist.tracklistElements[position].name
 | 
					        trackElementViewHolder.trackNameView.text = tracklist.tracklistElements[position].name
 | 
				
			||||||
        trackElementViewHolder.trackDataView.text = createTrackDataString(position)
 | 
					        trackElementViewHolder.trackDataView.text = createTrackDataString(position)
 | 
				
			||||||
        when (tracklist.tracklistElements[position].starred) {
 | 
					        when (tracklist.tracklistElements[position].starred) {
 | 
				
			||||||
            true -> trackElementViewHolder.starButton.setImageDrawable(context.getDrawable(R.drawable.ic_star_filled_24dp))
 | 
					            true -> trackElementViewHolder.starButton.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_star_filled_24dp))
 | 
				
			||||||
            false -> trackElementViewHolder.starButton.setImageDrawable(context.getDrawable(R.drawable.ic_star_outline_24dp))
 | 
					            false -> trackElementViewHolder.starButton.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_star_outline_24dp))
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        trackElementViewHolder.trackElement.setOnClickListener {
 | 
					        trackElementViewHolder.trackElement.setOnClickListener {
 | 
				
			||||||
            tracklistListener.onTrackElementTapped(tracklist.tracklistElements[position])
 | 
					            tracklistListener.onTrackElementTapped(tracklist.tracklistElements[position])
 | 
				
			||||||
| 
						 | 
					@ -134,11 +139,11 @@ class TracklistAdapter(private val fragment: Fragment) : RecyclerView.Adapter<Re
 | 
				
			||||||
        val starButton: ImageButton = view as ImageButton
 | 
					        val starButton: ImageButton = view as ImageButton
 | 
				
			||||||
        when (tracklist.tracklistElements[position].starred) {
 | 
					        when (tracklist.tracklistElements[position].starred) {
 | 
				
			||||||
            true -> {
 | 
					            true -> {
 | 
				
			||||||
                starButton.setImageDrawable(context.getDrawable(R.drawable.ic_star_outline_24dp))
 | 
					                starButton.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_star_outline_24dp))
 | 
				
			||||||
                tracklist.tracklistElements[position].starred = false
 | 
					                tracklist.tracklistElements[position].starred = false
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            false -> {
 | 
					            false -> {
 | 
				
			||||||
                starButton.setImageDrawable(context.getDrawable(R.drawable.ic_star_filled_24dp))
 | 
					                starButton.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_star_filled_24dp))
 | 
				
			||||||
                tracklist.tracklistElements[position].starred = true
 | 
					                tracklist.tracklistElements[position].starred = true
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue