From 16038567ddefecee174ff8d7fd1afe3da03e2d41 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Mon, 31 Aug 2020 13:59:18 -0600 Subject: [PATCH] Add song durations Add song durations to the SongItem layout --- .../oxycblt/auxio/library/LibraryFragment.kt | 24 +++++++++++++++++-- .../oxycblt/auxio/loading/LoadingViewModel.kt | 2 +- .../org/oxycblt/auxio/music/models/Song.kt | 5 ++++ .../org/oxycblt/auxio/songs/SongsFragment.kt | 8 +++++++ app/src/main/res/layout/song_item.xml | 17 +++++++++++-- 5 files changed, 51 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt index b97601742..a10cc55d4 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt @@ -8,6 +8,10 @@ import android.view.ViewGroup import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.FragmentLibraryBinding import org.oxycblt.auxio.recycler.adapters.AlbumAdapter @@ -19,6 +23,11 @@ class LibraryFragment : Fragment() { ViewModelProvider(this).get(LibraryViewModel::class.java) } + private val inflateJob = Job() + private val mainScope = CoroutineScope( + inflateJob + Dispatchers.Main + ) + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -28,9 +37,14 @@ class LibraryFragment : Fragment() { inflater, R.layout.fragment_library, container, false ) - val adapter = AlbumAdapter(libraryModel.albums.value!!) + // Offload the initial layout creation to a coroutine so that it doesn't hold up + // the UI thread. Hacky but it results in a smoother experience. + mainScope.launch { + binding.libraryRecycler.adapter = AlbumAdapter(libraryModel.albums.value!!) + binding.libraryRecycler.visibility = View.VISIBLE + } - binding.libraryRecycler.adapter = adapter + // binding.libraryRecycler.adapter = adapter binding.libraryRecycler.applyDivider() binding.libraryRecycler.setHasFixedSize(true) @@ -38,4 +52,10 @@ class LibraryFragment : Fragment() { return binding.root } + + override fun onDestroy() { + super.onDestroy() + + inflateJob.cancel() + } } diff --git a/app/src/main/java/org/oxycblt/auxio/loading/LoadingViewModel.kt b/app/src/main/java/org/oxycblt/auxio/loading/LoadingViewModel.kt index 7e7181de4..b61352e68 100644 --- a/app/src/main/java/org/oxycblt/auxio/loading/LoadingViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/loading/LoadingViewModel.kt @@ -18,7 +18,7 @@ class LoadingViewModel(private val app: Application) : ViewModel() { private val loadingJob = Job() private val ioScope = CoroutineScope( - Dispatchers.IO + loadingJob + Dispatchers.IO ) private val mMusicRepoResponse = MutableLiveData() diff --git a/app/src/main/java/org/oxycblt/auxio/music/models/Song.kt b/app/src/main/java/org/oxycblt/auxio/music/models/Song.kt index 3f4013dd8..28c553ccb 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/models/Song.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/models/Song.kt @@ -1,5 +1,7 @@ package org.oxycblt.auxio.music.models +import android.text.format.DateUtils + // Class containing all relevant values for a song. data class Song( val id: Long, @@ -9,4 +11,7 @@ data class Song( val duration: Long ) { lateinit var album: Album + + val seconds = duration / 1000 + val formattedDuration = DateUtils.formatElapsedTime(seconds) } diff --git a/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt b/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt index 8dd85bfbe..42d582548 100644 --- a/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/songs/SongsFragment.kt @@ -8,6 +8,9 @@ import android.view.ViewGroup import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.FragmentSongsBinding import org.oxycblt.auxio.recycler.adapters.SongAdapter @@ -15,6 +18,11 @@ import org.oxycblt.auxio.recycler.applyDivider class SongsFragment : Fragment() { + private val inflateJob = Job() + private val mainScope = CoroutineScope( + inflateJob + Dispatchers.Main + ) + private val songsModel: SongsViewModel by lazy { ViewModelProvider(this).get(SongsViewModel::class.java) } diff --git a/app/src/main/res/layout/song_item.xml b/app/src/main/res/layout/song_item.xml index 74bb97cf7..16784022f 100644 --- a/app/src/main/res/layout/song_item.xml +++ b/app/src/main/res/layout/song_item.xml @@ -37,7 +37,7 @@ android:textAppearance="?android:attr/textAppearanceListItem" android:textColor="?android:attr/textColorPrimary" app:layout_constraintBottom_toTopOf="@+id/song_info" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toStartOf="@+id/duration" app:layout_constraintStart_toEndOf="@+id/cover" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_chainStyle="packed" @@ -54,10 +54,23 @@ android:textAppearance="?android:attr/textAppearanceListItemSecondary" android:textColor="?android:attr/textColorSecondary" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toStartOf="@+id/duration" app:layout_constraintStart_toEndOf="@+id/cover" app:layout_constraintTop_toBottomOf="@+id/song_name" tools:text="Artist / Album" /> + + \ No newline at end of file