From ae2055e3249296a038cc374813173cc8928f5815 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20Mu=CC=88ller?= Date: Fri, 18 Mar 2022 20:46:38 +0100 Subject: [PATCH] add detailed song information to Now Playing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Holger Müller --- .../ultrasonic/fragment/PlayerFragment.kt | 64 +++++++++---------- .../org/moire/ultrasonic/util/Constants.kt | 1 + .../org/moire/ultrasonic/util/Settings.kt | 4 ++ .../src/main/res/layout/player_media_info.xml | 13 +++- ultrasonic/src/main/res/values/strings.xml | 6 +- ultrasonic/src/main/res/xml/settings.xml | 6 ++ 6 files changed, 58 insertions(+), 36 deletions(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/PlayerFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/PlayerFragment.kt index 02cfb4be..f57c494f 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/PlayerFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/PlayerFragment.kt @@ -13,26 +13,13 @@ import android.graphics.Point import android.graphics.drawable.Drawable import android.os.Bundle import android.os.Handler -import android.view.ContextMenu +import android.text.TextUtils +import android.view.* import android.view.ContextMenu.ContextMenuInfo -import android.view.GestureDetector -import android.view.LayoutInflater -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem -import android.view.MotionEvent -import android.view.View -import android.view.ViewGroup -import android.view.WindowManager import android.view.animation.AnimationUtils +import android.widget.* import android.widget.AdapterView.AdapterContextMenuInfo -import android.widget.EditText -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.SeekBar import android.widget.SeekBar.OnSeekBarChangeListener -import android.widget.TextView -import android.widget.ViewFlipper import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.navigation.Navigation @@ -42,24 +29,12 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearSmoothScroller import androidx.recyclerview.widget.RecyclerView import io.reactivex.rxjava3.disposables.Disposable -import java.text.DateFormat -import java.text.SimpleDateFormat -import java.util.ArrayList -import java.util.Date -import java.util.Locale -import java.util.concurrent.CancellationException -import java.util.concurrent.Executors -import java.util.concurrent.ScheduledExecutorService -import java.util.concurrent.TimeUnit -import kotlin.math.abs -import kotlin.math.max import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.cancel import kotlinx.coroutines.launch import org.koin.android.ext.android.inject import org.koin.core.component.KoinComponent -import org.koin.core.component.get import org.moire.ultrasonic.R import org.moire.ultrasonic.adapters.BaseAdapter import org.moire.ultrasonic.adapters.TrackViewBinder @@ -79,14 +54,19 @@ import org.moire.ultrasonic.service.RxBus import org.moire.ultrasonic.subsonic.ImageLoaderProvider import org.moire.ultrasonic.subsonic.NetworkAndStorageChecker import org.moire.ultrasonic.subsonic.ShareHandler -import org.moire.ultrasonic.util.CancellationToken -import org.moire.ultrasonic.util.CommunicationError -import org.moire.ultrasonic.util.Constants -import org.moire.ultrasonic.util.Settings -import org.moire.ultrasonic.util.Util +import org.moire.ultrasonic.util.* import org.moire.ultrasonic.view.AutoRepeatButton import org.moire.ultrasonic.view.VisualizerView import timber.log.Timber +import java.text.DateFormat +import java.text.SimpleDateFormat +import java.util.* +import java.util.concurrent.CancellationException +import java.util.concurrent.Executors +import java.util.concurrent.ScheduledExecutorService +import java.util.concurrent.TimeUnit +import kotlin.math.abs +import kotlin.math.max /** * Contains the Music Player screen of Ultrasonic with playback controls and the playlist @@ -139,6 +119,7 @@ class PlayerFragment : private lateinit var songTitleTextView: TextView private lateinit var albumTextView: TextView private lateinit var artistTextView: TextView + private lateinit var detailsTextView: TextView private lateinit var albumArtImageView: ImageView private lateinit var playlistView: RecyclerView private lateinit var positionTextView: TextView @@ -176,6 +157,7 @@ class PlayerFragment : songTitleTextView = view.findViewById(R.id.current_playing_song) albumTextView = view.findViewById(R.id.current_playing_album) artistTextView = view.findViewById(R.id.current_playing_artist) + detailsTextView = view.findViewById(R.id.current_playing_details) albumArtImageView = view.findViewById(R.id.current_playing_album_art_image) positionTextView = view.findViewById(R.id.current_playing_position) downloadTrackTextView = view.findViewById(R.id.current_playing_track) @@ -981,6 +963,21 @@ class PlayerFragment : songTitleTextView.text = currentSong!!.title albumTextView.text = currentSong!!.album artistTextView.text = currentSong!!.artist + + val fileFormat: String? = + if (TextUtils.isEmpty(currentSong!!.transcodedSuffix) || + currentSong!!.transcodedSuffix == currentSong!!.suffix || + currentSong!!.isVideo) + currentSong!!.suffix + else + String.format(Locale.ROOT, "%s > %s", currentSong!!.suffix, currentSong!!.transcodedSuffix) + val details: String = + String.format( + Util.appContext().getString(R.string.song_details_nowplaying), + currentSong!!.genre, currentSong!!.year, currentSong!!.bitRate, fileFormat) + detailsTextView.text = details + detailsTextView.visibility = if (Settings.showNowPlayingDetails) View.VISIBLE else View.GONE + downloadTrackTextView.text = trackFormat downloadTotalDurationTextView.text = duration imageLoaderProvider.getImageLoader() @@ -991,6 +988,7 @@ class PlayerFragment : songTitleTextView.text = null albumTextView.text = null artistTextView.text = null + detailsTextView.text = null downloadTrackTextView.text = null downloadTotalDurationTextView.text = null imageLoaderProvider.getImageLoader() diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Constants.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Constants.kt index 5e9cb2db..dd5ee132 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Constants.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Constants.kt @@ -90,6 +90,7 @@ object Constants { const val PREFERENCES_KEY_CLEAR_SEARCH_HISTORY = "clearSearchHistory" const val PREFERENCES_KEY_DOWNLOAD_TRANSITION = "transitionToDownloadOnPlay" const val PREFERENCES_KEY_INCREMENT_TIME = "incrementTime" + const val PREFERENCES_KEY_SHOW_NOW_PLAYING_DETAILS = "showNowPlayingDetails" const val PREFERENCES_KEY_ID3_TAGS = "useId3Tags" const val PREFERENCES_KEY_SHOW_ARTIST_PICTURE = "showArtistPicture" const val PREFERENCES_KEY_TEMP_LOSS = "tempLoss" diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt index 814a926c..09e3b951 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt @@ -189,6 +189,10 @@ object Settings { true ) + @JvmStatic + var showNowPlayingDetails + by BooleanSetting(Constants.PREFERENCES_KEY_SHOW_NOW_PLAYING_DETAILS, false) + @JvmStatic var shouldUseId3Tags by BooleanSetting(Constants.PREFERENCES_KEY_ID3_TAGS, false) diff --git a/ultrasonic/src/main/res/layout/player_media_info.xml b/ultrasonic/src/main/res/layout/player_media_info.xml index fe23ebd9..0ecab08d 100644 --- a/ultrasonic/src/main/res/layout/player_media_info.xml +++ b/ultrasonic/src/main/res/layout/player_media_info.xml @@ -9,6 +9,7 @@ a:layout_marginEnd="12dp" > + \ No newline at end of file diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index 3e08db52..d9b77a1b 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -323,6 +323,8 @@ This forces the app to always send the password unencrypted. Useful if the Subsonic server does not support the new authentication API for the users. Use Folders For Artist Name Assume top-level folder is the name of the album artist + Show more song details in Now Playing (genre, year, bitrate) + Show details in Now Playing Browse Using ID3 Tags Use ID3 tag methods instead of file system based methods Show artist picture in artist list @@ -332,6 +334,7 @@ Download on Wi-Fi only %1$s%2$s %d kbps + %1$s  •  %2$d  •  %3$d kbps %4$s 0 B 0.00 GB 0 KB @@ -468,7 +471,6 @@ Features Use five star rating for songs - Use five star rating system for songs instead of simply starring/unstarring items. - + Use five star rating system for songs instead of simply starring/unstarring items. diff --git a/ultrasonic/src/main/res/xml/settings.xml b/ultrasonic/src/main/res/xml/settings.xml index 5f96a81b..519c09cb 100644 --- a/ultrasonic/src/main/res/xml/settings.xml +++ b/ultrasonic/src/main/res/xml/settings.xml @@ -53,6 +53,12 @@ a:title="@string/settings.playback_control_title" a:key="playbackControlSettings" app:iconSpaceReserved="false"> +