From 159685bcc15ede9af1153f2651d41f7e3c9bcdba Mon Sep 17 00:00:00 2001 From: Antoine POPINEAU Date: Sat, 30 May 2020 15:49:06 +0200 Subject: [PATCH] Added track details from Now Playing view. Should fix #30. --- app/build.gradle.kts | 4 +- .../apognu/otter/activities/MainActivity.kt | 5 +- .../fragments/TrackInfoDetailsFragment.kt | 81 +++++++++++++++++++ .../com/github/apognu/otter/utils/Util.kt | 16 ++-- .../layout/fragment_track_info_details.xml | 22 +++++ app/src/main/res/menu/track_info.xml | 12 ++- app/src/main/res/values-fr/strings.xml | 14 +++- app/src/main/res/values/strings.xml | 14 +++- app/src/main/res/values/styles.xml | 8 ++ 9 files changed, 157 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/com/github/apognu/otter/fragments/TrackInfoDetailsFragment.kt create mode 100644 app/src/main/res/layout/fragment_track_info_details.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 615c209..5647f20 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -96,7 +96,7 @@ play { dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) - implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.60") + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.61") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2") @@ -111,7 +111,7 @@ dependencies { implementation("com.google.android.exoplayer:exoplayer:2.10.5") implementation("com.google.android.exoplayer:extension-mediasession:2.10.6") - implementation("com.google.android.exoplayer:extension-cast:2.10.6") + // implementation("com.google.android.exoplayer:extension-cast:2.10.6") implementation("com.github.PaulWoitaschek.ExoPlayer-Extensions:extension-flac:2.10.5") { isTransitive = false } diff --git a/app/src/main/java/com/github/apognu/otter/activities/MainActivity.kt b/app/src/main/java/com/github/apognu/otter/activities/MainActivity.kt index 111db49..2a2ecac 100644 --- a/app/src/main/java/com/github/apognu/otter/activities/MainActivity.kt +++ b/app/src/main/java/com/github/apognu/otter/activities/MainActivity.kt @@ -319,8 +319,9 @@ class MainActivity : AppCompatActivity() { setOnMenuItemClickListener { when (it.itemId) { - R.id.go_to_artist -> ArtistsFragment.openAlbums(this@MainActivity, track.artist, art = track.album.cover.original) - R.id.go_to_album -> AlbumsFragment.openTracks(this@MainActivity, track.album) + R.id.track_info_artist -> ArtistsFragment.openAlbums(this@MainActivity, track.artist, art = track.album.cover.original) + R.id.track_info_album -> AlbumsFragment.openTracks(this@MainActivity, track.album) + R.id.track_info_details -> TrackInfoDetailsFragment.new(track).show(supportFragmentManager, "dialog") } now_playing.close() diff --git a/app/src/main/java/com/github/apognu/otter/fragments/TrackInfoDetailsFragment.kt b/app/src/main/java/com/github/apognu/otter/fragments/TrackInfoDetailsFragment.kt new file mode 100644 index 0000000..e098f4d --- /dev/null +++ b/app/src/main/java/com/github/apognu/otter/fragments/TrackInfoDetailsFragment.kt @@ -0,0 +1,81 @@ +package com.github.apognu.otter.fragments + +import android.net.Uri +import android.os.Bundle +import android.util.TypedValue +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams +import android.widget.TextView +import androidx.core.os.bundleOf +import androidx.fragment.app.DialogFragment +import com.github.apognu.otter.R +import com.github.apognu.otter.utils.Track +import com.github.apognu.otter.utils.mustNormalizeUrl +import com.github.apognu.otter.utils.toDurationString +import kotlinx.android.synthetic.main.fragment_track_info_details.* + +class TrackInfoDetailsFragment : DialogFragment() { + companion object { + fun new(track: Track): TrackInfoDetailsFragment { + return TrackInfoDetailsFragment().apply { + arguments = bundleOf( + "artistName" to track.artist.name, + "albumTitle" to track.album.title, + "trackTitle" to track.title, + "trackPosition" to track.position, + "trackDuration" to track.bestUpload()?.duration?.toLong()?.let { toDurationString(it, showSeconds = true) }, + "trackBitrate" to track.bestUpload()?.bitrate?.let { "${it / 1000} Kbps" }, + "trackInstance" to track.bestUpload()?.listen_url?.let { Uri.parse(mustNormalizeUrl(it)).authority } + ) + } + } + } + + var properties: MutableList> = mutableListOf() + + override fun onStart() { + super.onStart() + + dialog?.window?.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + arguments?.apply { + properties.add(Pair(R.string.track_info_details_artist, getString("artistName"))) + properties.add(Pair(R.string.track_info_details_album, getString("albumTitle"))) + properties.add(Pair(R.string.track_info_details_track_title, getString("trackTitle"))) + properties.add(Pair(R.string.track_info_details_track_duration, getString("trackDuration"))) + properties.add(Pair(R.string.track_info_details_track_position, getString("trackPosition"))) + properties.add(Pair(R.string.track_info_details_track_bitrate, getString("trackBitrate"))) + properties.add(Pair(R.string.track_info_details_track_instance, getString("trackInstance"))) + } + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_track_info_details, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + properties.forEach { (label, value) -> + val labelTextView = TextView(context).apply { + text = getString(label) + setTextAppearance(R.style.AppTheme_TrackDetailsLabel) + } + + val valueTextView = TextView(context).apply { + text = value ?: "N/A" + setTextAppearance(R.style.AppTheme_TrackDetailsValue) + setPadding(0, 0, 0, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16f, resources.displayMetrics).toInt()) + } + + infos.addView(labelTextView) + infos.addView(valueTextView) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/apognu/otter/utils/Util.kt b/app/src/main/java/com/github/apognu/otter/utils/Util.kt index 0cd411b..fa95fe5 100644 --- a/app/src/main/java/com/github/apognu/otter/utils/Util.kt +++ b/app/src/main/java/com/github/apognu/otter/utils/Util.kt @@ -36,16 +36,18 @@ fun mustNormalizeUrl(url: String): String { }.toString() } -fun toDurationString(seconds: Long): String { - val days = (seconds / 86400) - val hours = (seconds % 86400) / 3600 - val minutes = (seconds % 86400 % 3600) / 60 +fun toDurationString(duration: Long, showSeconds: Boolean = false): String { + val days = (duration / 86400) + val hours = (duration % 86400) / 3600 + val minutes = (duration % 86400 % 3600) / 60 + val seconds = duration % 86400 % 3600 % 60 val ret = StringBuilder() - if (days > 0) ret.append("${days}d") - if (hours > 0) ret.append(" ${hours}h") - if (minutes > 0) ret.append(" ${minutes}m") + if (days > 0) ret.append("${days}d ") + if (hours > 0) ret.append("${hours}h ") + if (minutes > 0) ret.append("${minutes}m ") + if (showSeconds && seconds > 0) ret.append("${seconds}s") return ret.toString() } diff --git a/app/src/main/res/layout/fragment_track_info_details.xml b/app/src/main/res/layout/fragment_track_info_details.xml new file mode 100644 index 0000000..0f22c6e --- /dev/null +++ b/app/src/main/res/layout/fragment_track_info_details.xml @@ -0,0 +1,22 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/track_info.xml b/app/src/main/res/menu/track_info.xml index 2744d44..59af477 100644 --- a/app/src/main/res/menu/track_info.xml +++ b/app/src/main/res/menu/track_info.xml @@ -2,11 +2,15 @@ + android:id="@+id/track_info_artist" + android:title="@string/track_info_artist" /> + android:id="@+id/track_info_album" + android:title="@string/track_info_album" /> + + \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b5d0838..17089c0 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -86,8 +86,18 @@ Plus d\'options Informations sur cette piste - Voir l\'artist - Voir l\'album + Voir l\'artist + Voir l\'album + Informations + + Détails de la piste + Artiste + Album + Nom de piste + Durée + Position dans l\'album + Bitrate + Instance Funkwhale Déconnexion Etes-vous certains de vouloir vous déconnecter de votre instance Funkwhale ? diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f5b443e..33ec42a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -86,8 +86,18 @@ More options Information about track - Go to artist - Go to album + Go to artist + Go to album + Information + + Track details + Artist + Album + Track title + Duration + Album position + Bitrate + Funkwhale instance Sign out Are you sure you want to sign out of your Funkwhale instance? diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index ae07b65..959a76d 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -78,4 +78,12 @@ @android:color/transparent + + + +