diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt
index c15a66ed4..eb8a00786 100644
--- a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt
+++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt
@@ -15,14 +15,13 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-
+
package org.oxycblt.auxio.detail
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
-import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
@@ -43,7 +42,6 @@ import org.oxycblt.auxio.music.MusicRepository
import org.oxycblt.auxio.music.MusicType
import org.oxycblt.auxio.playback.PlaySong
import org.oxycblt.auxio.playback.PlaybackSettings
-import org.oxycblt.auxio.playback.formatDurationMs
import org.oxycblt.auxio.util.Event
import org.oxycblt.auxio.util.MutableEvent
import org.oxycblt.auxio.util.unlikelyToBeNull
@@ -225,23 +223,18 @@ constructor(
val album = detailGenerator.album(currentAlbum.value?.uid ?: return)
refreshDetail(album, _currentAlbum, _albumSongList, _albumSongInstructions, replace)
}
-
MusicType.ARTISTS -> {
val artist = detailGenerator.artist(currentArtist.value?.uid ?: return)
refreshDetail(
- artist, _currentArtist, _artistSongList, _artistSongInstructions, replace
- )
+ artist, _currentArtist, _artistSongList, _artistSongInstructions, replace)
}
-
MusicType.GENRES -> {
val genre = detailGenerator.genre(currentGenre.value?.uid ?: return)
refreshDetail(genre, _currentGenre, _genreSongList, _genreSongInstructions, replace)
}
-
MusicType.PLAYLISTS -> {
refreshPlaylist(currentPlaylist.value?.uid ?: return)
}
-
else -> error("Unexpected music type $type")
}
}
@@ -279,8 +272,7 @@ constructor(
Show.SongArtistDecision(song)
} else {
Show.ArtistDetails(song.artists.first())
- }
- )
+ })
/**
* Navigate to the details of one of the [Artist]s of an [Album] using the corresponding choice
@@ -294,8 +286,7 @@ constructor(
Show.AlbumArtistDecision(album)
} else {
Show.ArtistDetails(album.artists.first())
- }
- )
+ })
/**
* Navigate to the details of an [Artist].
@@ -527,103 +518,37 @@ constructor(
} else {
L.d("Playlist will be empty after removal, removing header")
UpdateInstructions.Remove(at - 1, 3)
- }
- )
+ })
}
private fun refreshAudioInfo(song: Song) {
- _currentSongProperties.value =
- buildList {
- add(SongProperty(R.string.lbl_name, SongProperty.Value.MusicName(song)))
- add(SongProperty(R.string.lbl_album, SongProperty.Value.MusicName(song.album)))
- add(
- SongProperty(
- R.string.lbl_artists,
- SongProperty.Value.MusicNames(song.artists)
- )
- )
- add(
- SongProperty(
- R.string.lbl_genres,
- SongProperty.Value.MusicNames(song.genres)
- )
- )
- song.date?.let {
- add(
- SongProperty(
- R.string.lbl_date,
- SongProperty.Value.ItemDate(it)
- )
- )
- }
- song.track?.let {
- add(
- SongProperty(
- R.string.lbl_track,
- SongProperty.Value.Number(it, null)
- )
- )
- }
- song.disc?.let {
- add(
- SongProperty(
- R.string.lbl_disc,
- SongProperty.Value.Number(it.number, it.name)
- )
- )
- }
- add(
- SongProperty(
- R.string.lbl_path,
- SongProperty.Value.ItemPath(song.path)
- )
- )
- add(
- SongProperty(
- R.string.lbl_size, SongProperty.Value.Size(song.size)
- )
- )
- add(
- SongProperty(
- R.string.lbl_duration,
- SongProperty.Value.Duration(song.durationMs)
- )
- )
- add(
- SongProperty(
- R.string.lbl_format,
- SongProperty.Value.ItemFormat(song.format)
- )
- )
- add(
- SongProperty(
- R.string.lbl_bitrate,
- SongProperty.Value.Bitrate(song.bitrateKbps)
- )
- )
- add(
- SongProperty(
- R.string.lbl_sample_rate,
- SongProperty.Value.SampleRate(song.sampleRateHz)
- )
- )
- song.replayGainAdjustment.track?.let {
- add(
- SongProperty(
- R.string.lbl_replaygain_track,
- SongProperty.Value.Decibels(it)
- )
- )
- }
- song.replayGainAdjustment.album?.let {
- add(
- SongProperty(
- R.string.lbl_replaygain_album,
- SongProperty.Value.Decibels(it)
- )
- )
- }
+ _currentSongProperties.value = buildList {
+ add(SongProperty(R.string.lbl_name, SongProperty.Value.MusicName(song)))
+ add(SongProperty(R.string.lbl_album, SongProperty.Value.MusicName(song.album)))
+ add(SongProperty(R.string.lbl_artists, SongProperty.Value.MusicNames(song.artists)))
+ add(SongProperty(R.string.lbl_genres, SongProperty.Value.MusicNames(song.genres)))
+ song.date?.let { add(SongProperty(R.string.lbl_date, SongProperty.Value.ItemDate(it))) }
+ song.track?.let {
+ add(SongProperty(R.string.lbl_track, SongProperty.Value.Number(it, null)))
}
+ song.disc?.let {
+ add(SongProperty(R.string.lbl_disc, SongProperty.Value.Number(it.number, it.name)))
+ }
+ add(SongProperty(R.string.lbl_path, SongProperty.Value.ItemPath(song.path)))
+ add(SongProperty(R.string.lbl_size, SongProperty.Value.Size(song.size)))
+ add(SongProperty(R.string.lbl_duration, SongProperty.Value.Duration(song.durationMs)))
+ add(SongProperty(R.string.lbl_format, SongProperty.Value.ItemFormat(song.format)))
+ add(SongProperty(R.string.lbl_bitrate, SongProperty.Value.Bitrate(song.bitrateKbps)))
+ add(
+ SongProperty(
+ R.string.lbl_sample_rate, SongProperty.Value.SampleRate(song.sampleRateHz)))
+ song.replayGainAdjustment.track?.let {
+ add(SongProperty(R.string.lbl_replaygain_track, SongProperty.Value.Decibels(it)))
+ }
+ song.replayGainAdjustment.album?.let {
+ add(SongProperty(R.string.lbl_replaygain_album, SongProperty.Value.Decibels(it)))
+ }
+ }
}
private inline fun refreshDetail(
@@ -653,7 +578,6 @@ constructor(
newList.add(header)
section.items
}
-
is DetailSection.Discs -> {
val header = SortHeader(section.stringRes)
if (newList.isNotEmpty()) {
@@ -694,10 +618,9 @@ constructor(
if (edited == null) {
val playlist = detailGenerator.playlist(uid)
refreshDetail(
- playlist, _currentPlaylist, _playlistSongList, _playlistSongInstructions, null
- ) {
- EditHeader(it)
- }
+ playlist, _currentPlaylist, _playlistSongList, _playlistSongInstructions, null) {
+ EditHeader(it)
+ }
return
}
val list = mutableListOf- ()
diff --git a/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt b/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt
index 286d2b242..f610667c0 100644
--- a/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt
+++ b/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt
@@ -18,7 +18,6 @@
package org.oxycblt.auxio.detail
-import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import androidx.appcompat.app.AlertDialog
@@ -31,13 +30,9 @@ import org.oxycblt.auxio.databinding.DialogSongDetailBinding
import org.oxycblt.auxio.detail.list.SongProperty
import org.oxycblt.auxio.detail.list.SongPropertyAdapter
import org.oxycblt.auxio.list.adapter.UpdateInstructions
-import org.oxycblt.auxio.music.resolve
import org.oxycblt.auxio.ui.ViewBindingMaterialDialogFragment
import org.oxycblt.auxio.util.collectImmediately
-import org.oxycblt.auxio.util.concatLocalized
-import org.oxycblt.musikr.Music
import org.oxycblt.musikr.Song
-import org.oxycblt.musikr.tag.Name
import timber.log.Timber as L
/**
diff --git a/app/src/main/java/org/oxycblt/auxio/detail/list/SongPropertyAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/list/SongPropertyAdapter.kt
index 469cc719e..eef657286 100644
--- a/app/src/main/java/org/oxycblt/auxio/detail/list/SongPropertyAdapter.kt
+++ b/app/src/main/java/org/oxycblt/auxio/detail/list/SongPropertyAdapter.kt
@@ -18,7 +18,6 @@
package org.oxycblt.auxio.detail.list
-import android.text.Editable
import android.text.format.Formatter
import android.view.View
import android.view.ViewGroup
@@ -39,7 +38,6 @@ import org.oxycblt.musikr.Music
import org.oxycblt.musikr.fs.Format
import org.oxycblt.musikr.fs.Path
import org.oxycblt.musikr.tag.Date
-import org.oxycblt.musikr.tag.Name
/**
* An adapter for [SongProperty] instances.
@@ -67,15 +65,25 @@ class SongPropertyAdapter :
data class SongProperty(@StringRes val name: Int, val value: Value) {
sealed interface Value {
data class MusicName(val music: Music) : Value
+
data class MusicNames(val name: List) : Value
+
data class Number(val value: Int, val subtitle: String?) : Value
+
data class ItemDate(val date: Date) : Value
+
data class ItemPath(val path: Path) : Value
+
data class Size(val sizeBytes: Long) : Value
+
data class Duration(val durationMs: Long) : Value
+
data class ItemFormat(val format: Format) : Value
+
data class Bitrate(val kbps: Int) : Value
+
data class SampleRate(val hz: Int) : Value
+
data class Decibels(val value: Float) : Value
}
}
@@ -102,11 +110,12 @@ class SongPropertyViewHolder private constructor(private val binding: ItemSongPr
is SongProperty.Value.Number -> {
val value = context.getString(R.string.fmt_number, property.value.value)
val subtitle = property.value.subtitle
- binding.propertyValue.setText(if (subtitle != null) {
- context.getString(R.string.fmt_zipped_names, value, subtitle)
- } else {
- value
- })
+ binding.propertyValue.setText(
+ if (subtitle != null) {
+ context.getString(R.string.fmt_zipped_names, value, subtitle)
+ } else {
+ value
+ })
}
is SongProperty.Value.ItemDate -> {
val date = property.value.date
diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicUtil.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicUtil.kt
index 217ae9ee9..fa3f25bb0 100644
--- a/app/src/main/java/org/oxycblt/auxio/music/MusicUtil.kt
+++ b/app/src/main/java/org/oxycblt/auxio/music/MusicUtil.kt
@@ -157,15 +157,17 @@ fun ReleaseType.resolve(context: Context) =
fun Format.resolve(context: Context): String =
when (this) {
is Format.MPEG3 -> context.getString(R.string.cdc_mp3)
- is Format.MPEG4 -> containing?.let { context.getString(R.string.cnt_mp4, it.resolve(context)) }
- ?: context.getString(R.string.cdc_mp4)
+ is Format.MPEG4 ->
+ containing?.let { context.getString(R.string.cnt_mp4, it.resolve(context)) }
+ ?: context.getString(R.string.cdc_mp4)
is Format.AAC -> context.getString(R.string.cdc_aac)
is Format.ALAC -> context.getString(R.string.cdc_alac)
- is Format.Ogg -> containing?.let { context.getString(R.string.cnt_ogg, it.resolve(context)) }
- ?: context.getString(R.string.cdc_ogg)
+ is Format.Ogg ->
+ containing?.let { context.getString(R.string.cnt_ogg, it.resolve(context)) }
+ ?: context.getString(R.string.cdc_ogg)
is Format.Opus -> context.getString(R.string.cdc_opus)
is Format.Vorbis -> context.getString(R.string.cdc_vorbis)
is Format.FLAC -> context.getString(R.string.cdc_flac)
is Format.Wav -> context.getString(R.string.cdc_wav)
is Format.Unknown -> extension ?: context.getString(R.string.cdc_unknown)
- }
\ No newline at end of file
+ }