[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