[Android] Scroll to media when browsing its parent

Nicolas Pomepuy git at videolan.org
Mon Sep 1 08:32:51 UTC 2025


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Fri Aug 29 13:03:40 2025 +0200| [76d2aac563cde7fdc19abfa3d3775a30cc1c5c94] | committer: Duncan McNamara

Scroll to media when browsing its parent

> https://code.videolan.org/videolan/vlc-android/commit/76d2aac563cde7fdc19abfa3d3775a30cc1c5c94
---

 .../src/org/videolan/vlc/gui/SecondaryActivity.kt     |  3 ++-
 .../videolan/vlc/gui/browser/BaseBrowserFragment.kt   | 19 +++++++++++++++++++
 .../src/org/videolan/vlc/util/Kextensions.kt          |  2 ++
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/application/vlc-android/src/org/videolan/vlc/gui/SecondaryActivity.kt b/application/vlc-android/src/org/videolan/vlc/gui/SecondaryActivity.kt
index 4fb1223956..6966c0c547 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/SecondaryActivity.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/SecondaryActivity.kt
@@ -58,6 +58,7 @@ import org.videolan.vlc.R
 import org.videolan.vlc.gui.audio.AudioAlbumsSongsFragment
 import org.videolan.vlc.gui.audio.AudioBrowserFragment
 import org.videolan.vlc.gui.browser.FileBrowserFragment
+import org.videolan.vlc.gui.browser.KEY_JUMP_TO
 import org.videolan.vlc.gui.browser.KEY_MEDIA
 import org.videolan.vlc.gui.browser.MLStorageBrowserFragment
 import org.videolan.vlc.gui.browser.NetworkBrowserFragment
@@ -222,7 +223,7 @@ class SecondaryActivity : ContentActivity(), IDialogManager {
                 (intent.parcelable(KEY_MEDIA) as? MediaWrapper)?.let { media ->
                     fragment = if (media.uri.scheme.isSchemeNetwork()) NetworkBrowserFragment()
                     else FileBrowserFragment()
-                    fragment?.apply { arguments = bundleOf(KEY_MEDIA to media) }
+                    fragment?.apply { arguments = bundleOf(KEY_MEDIA to media, KEY_JUMP_TO to intent.parcelable(KEY_JUMP_TO)) }
                 }
             }
             else -> throw IllegalArgumentException("Wrong fragment id.")
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt b/application/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt
index 4a53d49386..ab22507f02 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt
@@ -44,6 +44,7 @@ import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.asFlow
 import androidx.lifecycle.lifecycleScope
 import androidx.lifecycle.repeatOnLifecycle
+import androidx.preference.PreferenceGroup
 import androidx.recyclerview.widget.DividerItemDecoration
 import androidx.recyclerview.widget.GridLayoutManager
 import androidx.recyclerview.widget.LinearLayoutManager
@@ -84,6 +85,7 @@ import org.videolan.tools.KeyHelper
 import org.videolan.tools.MultiSelectHelper
 import org.videolan.tools.Settings
 import org.videolan.tools.dp
+import org.videolan.tools.getposition
 import org.videolan.tools.isStarted
 import org.videolan.tools.putSingle
 import org.videolan.tools.removeFileScheme
@@ -148,6 +150,7 @@ import org.videolan.vlc.util.SchedulerCallback
 import org.videolan.vlc.util.isSchemeSupported
 import org.videolan.vlc.util.isTalkbackIsEnabled
 import org.videolan.vlc.util.launchWhenStarted
+import org.videolan.vlc.util.onAnyChange
 import org.videolan.vlc.viewmodels.PlaylistModel
 import org.videolan.vlc.viewmodels.browser.BrowserModel
 import java.io.File
@@ -156,6 +159,7 @@ import java.util.LinkedList
 private const val TAG = "VLC/BaseBrowserFragment"
 
 internal const val KEY_MEDIA = "key_media"
+internal const val KEY_JUMP_TO = "key_jump_to"
 const val KEY_PICKER_TYPE = "key_picker_type"
 private const val MSG_SHOW_LOADING = "msg_show_loading"
 internal const val MSG_HIDE_LOADING = "msg_hide_loading"
@@ -170,6 +174,7 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
     private lateinit var layoutManager: LinearLayoutManager
     override var mrl: String? = null
     protected var currentMedia: MediaWrapper? = null
+    protected var currentJumpTo: MediaWrapper? = null
     override var isRootDirectory: Boolean = false
     override val scannedDirectory = false
     override var inCards = true
@@ -195,6 +200,7 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
         val bundle = savedInstanceState ?: arguments
         if (bundle != null) {
             currentMedia = bundle.parcelable(KEY_MEDIA)
+            currentJumpTo = bundle.parcelable(KEY_JUMP_TO)
             mrl = currentMedia?.location ?: bundle.getString(KEY_MRL)
         } else if (requireActivity().intent != null) {
             mrl = requireActivity().intent.dataString
@@ -267,6 +273,19 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
             adapter.update(mediaLibraryItems!!)
             if (::addPlaylistFolderOnly.isInitialized) addPlaylistFolderOnly.isVisible = adapter.mediaCount > 0
         }
+        adapter.onAnyChange {
+            if (currentJumpTo != null) {
+                val position = adapter.dataset.getposition(currentJumpTo)
+                binding.networkList.postDelayed({
+                    binding.networkList.layoutManager?.findViewByPosition(position)?.isPressed  = true
+                    binding.networkList.postDelayed({
+                        binding.networkList.layoutManager?.findViewByPosition(position)?.isPressed  = false
+                            }, 600)
+                }, 200)
+                binding.networkList.scrollToPosition(position)
+                currentJumpTo = null
+            }
+        }
         viewModel.getDescriptionUpdate().observe(viewLifecycleOwner) { pair -> if (pair != null) adapter.notifyItemChanged(pair.first, pair.second) }
         viewModel.loading.observe(viewLifecycleOwner) { loading ->
             swipeRefreshLayout.isRefreshing = loading
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 fd3d0c4764..013ddc7392 100644
--- a/application/vlc-android/src/org/videolan/vlc/util/Kextensions.kt
+++ b/application/vlc-android/src/org/videolan/vlc/util/Kextensions.kt
@@ -63,6 +63,7 @@ import org.videolan.tools.isStarted
 import org.videolan.tools.retrieveParent
 import org.videolan.vlc.R
 import org.videolan.vlc.gui.SecondaryActivity
+import org.videolan.vlc.gui.browser.KEY_JUMP_TO
 import org.videolan.vlc.gui.browser.KEY_MEDIA
 import java.io.File
 import java.lang.ref.WeakReference
@@ -519,6 +520,7 @@ fun Fragment.showParentFolder(media: MediaWrapper) {
     }
     val intent = Intent(requireActivity().applicationContext, SecondaryActivity::class.java)
     intent.putExtra(KEY_MEDIA, parent)
+    intent.putExtra(KEY_JUMP_TO, media)
     intent.putExtra("fragment", SecondaryActivity.FILE_BROWSER)
     startActivity(intent)
 }



More information about the Android mailing list