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 4fb122395..6966c0c54 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 4a53d4938..ab22507f0 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(), 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(), 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(), 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 fd3d0c476..013ddc739 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) }