[Android] Listen to permission changes to reload the browse fragment
Nicolas Pomepuy
git at videolan.org
Tue Dec 3 17:57:43 UTC 2024
vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Tue Dec 3 15:45:42 2024 +0100| [ee3b1cb4f7553e2baab67358f253a820b70d682a] | committer: Nicolas Pomepuy
Listen to permission changes to reload the browse fragment
Fixes #3114
> https://code.videolan.org/videolan/vlc-android/commit/ee3b1cb4f7553e2baab67358f253a820b70d682a
---
.../org/videolan/television/viewmodel/MainTvModel.kt | 2 +-
.../videolan/vlc/gui/browser/MainBrowserFragment.kt | 7 +++++++
.../src/org/videolan/vlc/providers/BrowserProvider.kt | 5 ++++-
.../videolan/vlc/repository/BrowserFavRepository.kt | 3 +--
.../vlc/viewmodels/browser/BrowserFavoritesModel.kt | 18 ++++++++++++++++--
5 files changed, 29 insertions(+), 6 deletions(-)
diff --git a/application/television/src/main/java/org/videolan/television/viewmodel/MainTvModel.kt b/application/television/src/main/java/org/videolan/television/viewmodel/MainTvModel.kt
index bbc4164f52..b1d0e93d03 100644
--- a/application/television/src/main/java/org/videolan/television/viewmodel/MainTvModel.kt
+++ b/application/television/src/main/java/org/videolan/television/viewmodel/MainTvModel.kt
@@ -82,7 +82,7 @@ class MainTvModel(app: Application) : AndroidViewModel(app), Medialibrary.OnMedi
var showHistory = false
private set
// LiveData
- private val favorites: LiveData<List<BrowserFav>> = browserFavRepository.browserFavorites.asLiveData(viewModelScope.coroutineContext)
+ private val favorites: LiveData<List<BrowserFav>> = browserFavRepository.getFavDao().asLiveData(viewModelScope.coroutineContext)
val nowPlaying: LiveData<List<MediaLibraryItem>> = MutableLiveData()
val videos: LiveData<List<MediaLibraryItem>> = MutableLiveData()
val audioCategories: LiveData<List<MediaLibraryItem>> = MutableLiveData()
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/browser/MainBrowserFragment.kt b/application/vlc-android/src/org/videolan/vlc/gui/browser/MainBrowserFragment.kt
index 28cb873897..c802fbcf3d 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/browser/MainBrowserFragment.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/browser/MainBrowserFragment.kt
@@ -43,6 +43,7 @@ import org.videolan.vlc.gui.BaseFragment
import org.videolan.vlc.gui.SecondaryActivity
import org.videolan.vlc.gui.dialogs.CtxActionReceiver
import org.videolan.vlc.gui.dialogs.NetworkServerDialog
+import org.videolan.vlc.gui.dialogs.PermissionListDialog
import org.videolan.vlc.gui.dialogs.showContext
import org.videolan.vlc.gui.helpers.UiTools.addToPlaylist
import org.videolan.vlc.gui.helpers.UiTools.addToPlaylistAsync
@@ -176,6 +177,12 @@ class MainBrowserFragment : BaseFragment(), View.OnClickListener, CtxActionRecei
val storageBrowserAdapter = BaseBrowserAdapter(storageBrowserContainer)
localEntry.list.adapter = storageBrowserAdapter
containerAdapterAssociation[storageBrowserContainer] = Pair(storageBrowserAdapter, localViewModel)
+ PermissionListDialog.hasAnyPermission.observe(viewLifecycleOwner) {
+ if (it) {
+ localViewModel.provider.refresh()
+ favoritesViewModel.provider.refresh()
+ }
+ }
localViewModel.dataset.observe(viewLifecycleOwner) { list ->
list?.let {
if (Permissions.canReadStorage(requireActivity())) storageBrowserAdapter.update(it)
diff --git a/application/vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt b/application/vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt
index 6d580d6672..bd7418cb44 100644
--- a/application/vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt
+++ b/application/vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt
@@ -269,7 +269,10 @@ abstract class BrowserProvider(val context: Context, val dataset: LiveDataset<Me
}
open fun refresh() {
- if (url === null) return
+ if (url === null) {
+ browseRoot()
+ return
+ }
parsingJob?.cancel()
parsingJob = null
loading.postValue(true)
diff --git a/application/vlc-android/src/org/videolan/vlc/repository/BrowserFavRepository.kt b/application/vlc-android/src/org/videolan/vlc/repository/BrowserFavRepository.kt
index 611aaf7111..961f0aa032 100644
--- a/application/vlc-android/src/org/videolan/vlc/repository/BrowserFavRepository.kt
+++ b/application/vlc-android/src/org/videolan/vlc/repository/BrowserFavRepository.kt
@@ -47,12 +47,11 @@ class BrowserFavRepository(private val browserFavDao: BrowserFavDao) {
val networkFavs by lazy { browserFavDao.getAllNetworkFavs() }
- val browserFavorites by lazy {
+ fun getFavDao() =
if (Permissions.canReadStorage(AppContextProvider.appContext))
browserFavDao.getAll()
else
browserFavDao.getAllNetworkFavs()
- }
val localFavorites by lazy { browserFavDao.getAllLocalFavs() }
diff --git a/application/vlc-android/src/org/videolan/vlc/viewmodels/browser/BrowserFavoritesModel.kt b/application/vlc-android/src/org/videolan/vlc/viewmodels/browser/BrowserFavoritesModel.kt
index ef166f106a..95e26ac53a 100644
--- a/application/vlc-android/src/org/videolan/vlc/viewmodels/browser/BrowserFavoritesModel.kt
+++ b/application/vlc-android/src/org/videolan/vlc/viewmodels/browser/BrowserFavoritesModel.kt
@@ -51,12 +51,12 @@ class BrowserFavoritesModel(context: Context) : ViewModel() {
class FavoritesProvider(
context: Context,
dataset: LiveDataset<MediaLibraryItem>,
- scope: CoroutineScope
+ private val scope: CoroutineScope
) : BrowserProvider(context, dataset, null, Medialibrary.SORT_FILENAME, false) {
private val browserFavRepository = BrowserFavRepository.getInstance(context)
init {
- browserFavRepository.browserFavorites
+ browserFavRepository.getFavDao()
.onEach { list ->
convertFavorites(list.sortedWith(compareBy(BrowserFav::title, BrowserFav::type))).let {
@Suppress("UNCHECKED_CAST")
@@ -68,6 +68,20 @@ class FavoritesProvider(
.launchIn(scope)
}
+ override fun refresh() {
+ browserFavRepository.getFavDao()
+ .onEach { list ->
+ convertFavorites(list.sortedWith(compareBy(BrowserFav::title, BrowserFav::type))).let {
+ @Suppress("UNCHECKED_CAST")
+ dataset.postValue(it as MutableList<MediaLibraryItem>)
+ parseSubDirectories()
+ }
+ }
+ .flowOn(Dispatchers.IO)
+ .launchIn(scope)
+ super.refresh()
+ }
+
override suspend fun requestBrowsing(url: String?, eventListener: MediaBrowser.EventListener, interact : Boolean) = withContext(coroutineContextProvider.IO) {
initBrowser()
mediabrowser?.let {
More information about the Android
mailing list