[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