From a1a6b67b69b8087508bce1eb1719394a3d3dced6 Mon Sep 17 00:00:00 2001 From: Nicolas Pomepuy <nicolas@videolabs.io> Date: Wed, 8 Jan 2025 10:34:13 +0100 Subject: [PATCH] Add a show tracks to the audio control settings Fixes #3124 --- .../main/java/org/videolan/tools/Settings.kt | 3 ++ .../vlc-android/res/layout/playlist_item.xml | 22 ++++++++++++++- .../res/xml/preferences_audio_controls.xml | 28 +++++++++++++++---- .../org/videolan/vlc/gui/audio/AudioPlayer.kt | 7 ++++- .../videolan/vlc/gui/audio/PlaylistAdapter.kt | 2 ++ .../org/videolan/vlc/gui/helpers/UiTools.kt | 6 ++++ .../preferences/PreferencesAudioControls.kt | 4 +++ .../src/org/videolan/vlc/util/Kextensions.kt | 1 + 8 files changed, 65 insertions(+), 8 deletions(-) diff --git a/application/tools/src/main/java/org/videolan/tools/Settings.kt b/application/tools/src/main/java/org/videolan/tools/Settings.kt index 2950063ef3..32c199dede 100644 --- a/application/tools/src/main/java/org/videolan/tools/Settings.kt +++ b/application/tools/src/main/java/org/videolan/tools/Settings.kt @@ -28,6 +28,7 @@ object Settings : SingletonHolder<SharedPreferences, Context>({ init(it.applicat var videoDoubleTapJumpDelay = 10 var audioJumpDelay = 10 var audioLongJumpDelay = 20 + var audioShowTrackNumbers = MutableLiveData(false) var showHiddenFiles = false var showTrackNumber = true var tvFoldersFirst = true @@ -54,6 +55,7 @@ object Settings : SingletonHolder<SharedPreferences, Context>({ init(it.applicat videoDoubleTapJumpDelay = prefs.getInt(KEY_VIDEO_DOUBLE_TAP_JUMP_DELAY, 10) audioJumpDelay = prefs.getInt(KEY_AUDIO_JUMP_DELAY, 10) audioLongJumpDelay = prefs.getInt(KEY_AUDIO_LONG_JUMP_DELAY, 20) + audioShowTrackNumbers.postValue(prefs.getBoolean(KEY_AUDIO_SHOW_TRACK_NUMBERS, false)) showHiddenFiles = prefs.getBoolean(BROWSER_SHOW_HIDDEN_FILES, !tvUI) showTrackNumber = prefs.getBoolean(ALBUMS_SHOW_TRACK_NUMBER, true) tvFoldersFirst = prefs.getBoolean(TV_FOLDERS_FIRST, true) @@ -115,6 +117,7 @@ const val KEY_VIDEO_DOUBLE_TAP_JUMP_DELAY = "video_double_tap_jump_delay" const val KEY_AUDIO_JUMP_DELAY = "audio_jump_delay" const val KEY_AUDIO_LONG_JUMP_DELAY = "audio_long_jump_delay" const val KEY_AUDIO_FORCE_SHUFFLE = "audio_force_shuffle" +const val KEY_AUDIO_SHOW_TRACK_NUMBERS = "audio_show_track_numbers" // AudioPlayer diff --git a/application/vlc-android/res/layout/playlist_item.xml b/application/vlc-android/res/layout/playlist_item.xml index 968b8af2ca..4ce37114e2 100644 --- a/application/vlc-android/res/layout/playlist_item.xml +++ b/application/vlc-android/res/layout/playlist_item.xml @@ -35,6 +35,10 @@ name="stopAfterThis" type="java.lang.Boolean" /> + <variable + name="showTrackNumbers" + type="java.lang.Boolean" /> + <variable name="masked" type="java.lang.Boolean" /> @@ -98,6 +102,22 @@ app:layout_constraintStart_toStartOf="@+id/coverImage" app:layout_constraintTop_toTopOf="@+id/coverImage" /> + <TextView + android:id="@+id/track_number" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + app:trackNumber="@{media}" + android:minWidth="20dp" + android:gravity="end" + android:textColor="?attr/font_default" + android:textSize="14sp" + android:visibility="@{!showTrackNumbers ? View.GONE : View.VISIBLE}" + app:layout_constraintEnd_toStartOf="@+id/audio_item_title" + app:layout_constraintStart_toEndOf="@+id/coverImage" + app:layout_constraintBaseline_toBaselineOf="@+id/audio_item_title" + tools:text="1." /> + <TextView android:id="@+id/audio_item_title" android:layout_width="0dp" @@ -119,7 +139,7 @@ app:layout_constraintBottom_toTopOf="@+id/audio_item_subtitle" app:layout_constraintEnd_toEndOf="@+id/selector" app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toEndOf="@+id/coverImage" + app:layout_constraintStart_toEndOf="@+id/track_number" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_chainStyle="packed" tools:text="Symphonie n°1" /> diff --git a/application/vlc-android/res/xml/preferences_audio_controls.xml b/application/vlc-android/res/xml/preferences_audio_controls.xml index 83602c22d4..4b559ca060 100644 --- a/application/vlc-android/res/xml/preferences_audio_controls.xml +++ b/application/vlc-android/res/xml/preferences_audio_controls.xml @@ -5,12 +5,8 @@ android:key="video_category" android:title="@string/video_prefs_category"> - <CheckBoxPreference - app:singleLineTitle="false" - android:defaultValue="true" - android:key="blurred_cover_background" - android:summary="@string/blurred_cover_background_summary" - android:title="@string/blurred_cover_background_title"/> + <PreferenceCategory android:title="@string/controls_prefs_category" + app:iconSpaceReserved="false"> <org.videolan.vlc.gui.view.NumberPickerPreference app:key="audio_jump_delay" @@ -31,6 +27,26 @@ android:summary="@string/force_shuffle_summary" android:title="@string/force_shuffle_title"/> + </PreferenceCategory> + + + <PreferenceCategory android:title="@string/interface_prefs_screen" + app:iconSpaceReserved="false"> + + <CheckBoxPreference + app:singleLineTitle="false" + android:defaultValue="true" + android:key="blurred_cover_background" + android:summary="@string/blurred_cover_background_summary" + android:title="@string/blurred_cover_background_title"/> + + <CheckBoxPreference + app:singleLineTitle="false" + android:defaultValue="false" + android:key="audio_show_track_numbers" + android:title="@string/albums_show_track_numbers"/> + </PreferenceCategory> + </androidx.preference.PreferenceScreen> diff --git a/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt b/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt index 4fc55bb942..678ca0aa9b 100644 --- a/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt +++ b/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt @@ -31,7 +31,6 @@ import android.support.v4.media.session.PlaybackStateCompat import android.text.Editable import android.text.TextWatcher import android.text.format.DateFormat -import android.util.Log import android.view.LayoutInflater import android.view.MotionEvent import android.view.View @@ -230,6 +229,12 @@ class AudioPlayer : Fragment(), PlaylistAdapter.IPlayer, TextWatcher, IAudioPlay playlistModel.service?.manageAbRepeatStep(binding.abRepeatReset, binding.abRepeatStop, binding.abRepeatContainer, abRepeatAddMarker) } + Settings.audioShowTrackNumbers.observe(viewLifecycleOwner) { showTrackNumbers -> + playlistAdapter.showTrackNumbers = showTrackNumbers + (binding.songsList.layoutManager as? LinearLayoutManager)?.let { + playlistAdapter.notifyItemRangeChanged(it.findFirstVisibleItemPosition(), it.findLastCompletelyVisibleItemPosition()) + } + } abRepeatAddMarker.setOnClickListener { playlistModel.service?.playlistManager?.setABRepeatValue(playlistModel.service?.playlistManager?.getCurrentMedia(), binding.timeline.progress.toLong()) diff --git a/application/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt b/application/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt index bc1bd97a55..532ed5fac5 100644 --- a/application/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt +++ b/application/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt @@ -71,6 +71,7 @@ private const val ACTION_MOVED = "action_moved" class PlaylistAdapter(private val player: IPlayer) : DiffUtilAdapter<MediaWrapper, PlaylistAdapter.ViewHolder>(), SwipeDragHelperAdapter, SchedulerCallback { + var showTrackNumbers: Boolean = false private var defaultCoverVideo: BitmapDrawable private var defaultCoverAudio: BitmapDrawable private var model: PlaylistModel? = null @@ -130,6 +131,7 @@ class PlaylistAdapter(private val player: IPlayer) : DiffUtilAdapter<MediaWrappe holder.binding.scaleType = ImageView.ScaleType.CENTER_CROP holder.binding.stopAfter.visibility = if (stopAfter == position) View.VISIBLE else View.GONE holder.binding.stopAfterThis = (position == stopAfter) + holder.binding.showTrackNumbers = showTrackNumbers if (currentIndex == position) { if (model?.playing != false) holder.binding.playing.start() else holder.binding.playing.stop() holder.binding.playing.visibility = View.VISIBLE diff --git a/application/vlc-android/src/org/videolan/vlc/gui/helpers/UiTools.kt b/application/vlc-android/src/org/videolan/vlc/gui/helpers/UiTools.kt index 33b131ab69..8f47f41f72 100644 --- a/application/vlc-android/src/org/videolan/vlc/gui/helpers/UiTools.kt +++ b/application/vlc-android/src/org/videolan/vlc/gui/helpers/UiTools.kt @@ -108,6 +108,7 @@ import org.videolan.vlc.util.LifecycleAwareScheduler import org.videolan.vlc.util.SchedulerCallback import org.videolan.vlc.util.ThumbnailsProvider import org.videolan.vlc.util.openLinkIfPossible +import org.videolan.vlc.util.trackNumberText import java.security.SecureRandom import java.util.concurrent.TimeUnit import kotlin.math.min @@ -975,6 +976,11 @@ fun selectedElevation(v: View, isSelected: Boolean?) { } } +@BindingAdapter("trackNumber") +fun trackNumber(v: View, media: MediaWrapper) { + (v as? TextView)?.text = media.trackNumberText() +} + fun BaseActivity.applyTheme() { forcedTheme()?.let { setTheme(it) diff --git a/application/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesAudioControls.kt b/application/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesAudioControls.kt index 6dd989c077..33b1d0f114 100644 --- a/application/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesAudioControls.kt +++ b/application/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesAudioControls.kt @@ -25,6 +25,7 @@ package org.videolan.vlc.gui.preferences import android.content.SharedPreferences import org.videolan.tools.KEY_AUDIO_JUMP_DELAY import org.videolan.tools.KEY_AUDIO_LONG_JUMP_DELAY +import org.videolan.tools.KEY_AUDIO_SHOW_TRACK_NUMBERS import org.videolan.tools.Settings import org.videolan.vlc.R import org.videolan.vlc.gui.video.VideoPlayerActivity @@ -56,6 +57,9 @@ class PreferencesAudioControls : BasePreferenceFragment(), SharedPreferences.OnS KEY_AUDIO_LONG_JUMP_DELAY -> { Settings.audioLongJumpDelay = sharedPreferences.getInt(KEY_AUDIO_LONG_JUMP_DELAY, 20) } + KEY_AUDIO_SHOW_TRACK_NUMBERS -> { + Settings.audioShowTrackNumbers.postValue(sharedPreferences.getBoolean(KEY_AUDIO_SHOW_TRACK_NUMBERS, false)) + } } Settings.onAudioControlsChanged() } diff --git a/application/vlc-android/src/org/videolan/vlc/util/Kextensions.kt b/application/vlc-android/src/org/videolan/vlc/util/Kextensions.kt index ffc6072341..d6e5da05c0 100644 --- a/application/vlc-android/src/org/videolan/vlc/util/Kextensions.kt +++ b/application/vlc-android/src/org/videolan/vlc/util/Kextensions.kt @@ -157,6 +157,7 @@ fun FragmentActivity.share(medias: List<MediaWrapper>) = lifecycleScope.launch { fun MediaWrapper?.isMedia() = this != null && (type == MediaWrapper.TYPE_AUDIO || type == MediaWrapper.TYPE_VIDEO) fun MediaWrapper?.isBrowserMedia() = this != null && (isMedia() || type == MediaWrapper.TYPE_DIR || type == MediaWrapper.TYPE_PLAYLIST) +fun MediaWrapper.trackNumberText() = if (trackNumber > 0) "$trackNumber." else "" fun Context.getAppSystemService(name: String) = applicationContext.getSystemService(name)!! -- GitLab