[Android] Add loading views to browse fragment

Nicolas Pomepuy git at videolan.org
Thu Apr 16 15:43:22 CEST 2020


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Wed Apr  1 11:39:46 2020 +0200| [f35eac4dfa044b5a491f78188a11d32beeb9451e] | committer: Nicolas Pomepuy

Add loading views to browse fragment

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

 .../vlc-android/res/layout/browser_entry.xml       | 11 ++++
 .../vlc/gui/browser/MainBrowserFragment.kt         | 61 +++++++++++++++++-----
 2 files changed, 59 insertions(+), 13 deletions(-)

diff --git a/application/vlc-android/res/layout/browser_entry.xml b/application/vlc-android/res/layout/browser_entry.xml
index 4e1469f74..32e1a24e9 100644
--- a/application/vlc-android/res/layout/browser_entry.xml
+++ b/application/vlc-android/res/layout/browser_entry.xml
@@ -48,4 +48,15 @@
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toBottomOf="@+id/title" />
+
+    <org.videolan.vlc.gui.view.EmptyLoadingStateView
+            android:id="@+id/loading"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="16dp"
+            android:layout_marginTop="16dp"
+            android:layout_marginEnd="16dp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="@+id/title"
+            app:layout_constraintTop_toBottomOf="@+id/title" />
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
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 13c3a398d..f36d153ad 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
@@ -39,6 +39,7 @@ import kotlinx.coroutines.*
 import org.videolan.medialibrary.interfaces.media.MediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
 import org.videolan.resources.*
+import org.videolan.tools.NetworkMonitor
 import org.videolan.tools.isStarted
 import org.videolan.vlc.R
 import org.videolan.vlc.gui.BaseFragment
@@ -50,6 +51,8 @@ import org.videolan.vlc.gui.helpers.UiTools.addToPlaylist
 import org.videolan.vlc.gui.helpers.UiTools.addToPlaylistAsync
 import org.videolan.vlc.gui.helpers.UiTools.showMediaInfo
 import org.videolan.vlc.gui.helpers.hf.OTG_SCHEME
+import org.videolan.vlc.gui.view.EmptyLoadingState
+import org.videolan.vlc.gui.view.EmptyLoadingStateView
 import org.videolan.vlc.media.MediaUtils
 import org.videolan.vlc.repository.BrowserFavRepository
 import org.videolan.vlc.viewmodels.browser.*
@@ -58,6 +61,7 @@ import org.videolan.vlc.viewmodels.browser.*
 @ExperimentalCoroutinesApi
 class MainBrowserFragment : BaseFragment(), View.OnClickListener, CtxActionReceiver {
 
+    private lateinit var networkMonitor: NetworkMonitor
     private var currentCtx: MainBrowserContainer? = null
     private lateinit var browserFavRepository: BrowserFavRepository
     private lateinit var localList: RecyclerView
@@ -117,6 +121,7 @@ class MainBrowserFragment : BaseFragment(), View.OnClickListener, CtxActionRecei
 
     override fun onCreate(savedInstanceState: Bundle?) {
         browserFavRepository = BrowserFavRepository.getInstance(requireContext())
+        networkMonitor = NetworkMonitor.getInstance(requireContext())
         super.onCreate(savedInstanceState)
     }
 
@@ -125,6 +130,7 @@ class MainBrowserFragment : BaseFragment(), View.OnClickListener, CtxActionRecei
 
         //local
         localEntry = view.findViewById(R.id.local_browser_entry)
+        val localLoading: EmptyLoadingStateView = localEntry.findViewById(R.id.loading)
         localEntry.findViewById<TextView>(R.id.title).text = getString(R.string.browser_storages)
         localList = localEntry.findViewById(R.id.list)
         localList.layoutManager = LinearLayoutManager(requireActivity(), RecyclerView.HORIZONTAL, false)
@@ -136,12 +142,12 @@ class MainBrowserFragment : BaseFragment(), View.OnClickListener, CtxActionRecei
         localViewModel.dataset.observe(viewLifecycleOwner, Observer<List<MediaLibraryItem>> { list ->
             list?.let {
                 storageBrowserAdapter.update(it)
-//                updateEmptyView()
-//                if (::cleanMenuItem.isInitialized) {
-//                    cleanMenuItem.isVisible = list.isNotEmpty()
-//                }
+                localLoading.state = if (list.isEmpty()) EmptyLoadingState.EMPTY else EmptyLoadingState.NONE
             }
         })
+        localViewModel.loading.observe(viewLifecycleOwner, Observer {
+            if (it) localLoading.state = EmptyLoadingState.LOADING
+        })
         localViewModel.browseRoot()
         localViewModel.getDescriptionUpdate().observe(viewLifecycleOwner, Observer { pair ->
             if (pair != null) storageBrowserAdapter.notifyItemChanged(pair.first, pair.second)
@@ -150,6 +156,7 @@ class MainBrowserFragment : BaseFragment(), View.OnClickListener, CtxActionRecei
 
 
         favoritesEntry = view.findViewById(R.id.fav_browser_entry)
+        val favoritesLoading: EmptyLoadingStateView = favoritesEntry.findViewById(R.id.loading)
         favoritesEntry.findViewById<TextView>(R.id.title).text = getString(R.string.favorites)
         favoritesList = favoritesEntry.findViewById(R.id.list)
         favoritesList.layoutManager = LinearLayoutManager(requireActivity(), RecyclerView.HORIZONTAL, false)
@@ -161,15 +168,14 @@ class MainBrowserFragment : BaseFragment(), View.OnClickListener, CtxActionRecei
         favoritesViewModel.updatedFavoriteList.observe(viewLifecycleOwner, Observer<List<MediaWrapper>> { list ->
             list?.let {
                 favoritesAdapter.update(it)
-//                updateEmptyView()
-//                if (::cleanMenuItem.isInitialized) {
-//                    cleanMenuItem.isVisible = list.isNotEmpty()
-//                }
+                favoritesLoading.state = if (list.isEmpty()) EmptyLoadingState.EMPTY else EmptyLoadingState.NONE
             }
         })
-        localViewModel.browseRoot()
 
         networkEntry = view.findViewById(R.id.network_browser_entry)
+        val networkLoading: EmptyLoadingStateView = networkEntry.findViewById(R.id.loading)
+        networkLoading.showNoMedia = false
+        networkLoading.emptyText = R.string.nomedia
         networkEntry.findViewById<TextView>(R.id.title).text = getString(R.string.network_browsing)
         networkList = networkEntry.findViewById(R.id.list)
         networkList.layoutManager = LinearLayoutManager(requireActivity(), RecyclerView.HORIZONTAL, false)
@@ -181,15 +187,44 @@ class MainBrowserFragment : BaseFragment(), View.OnClickListener, CtxActionRecei
         networkViewModel.dataset.observe(viewLifecycleOwner, Observer<List<MediaLibraryItem>> { list ->
             list?.let {
                 networkAdapter.update(it)
-//                updateEmptyView()
-//                if (::cleanMenuItem.isInitialized) {
-//                    cleanMenuItem.isVisible = list.isNotEmpty()
-//                }
+                updateNetworkEmptyView(networkLoading)
+                if (networkViewModel.loading.value == false) networkLoading.state = if (list.isEmpty()) EmptyLoadingState.EMPTY else EmptyLoadingState.NONE
             }
         })
+        networkViewModel.loading.observe(viewLifecycleOwner, Observer {
+            if (it) localLoading.state = EmptyLoadingState.LOADING
+            updateNetworkEmptyView(networkLoading)
+        })
         networkViewModel.browseRoot()
     }
 
+    private fun updateNetworkEmptyView(emptyLoading: EmptyLoadingStateView) {
+        if (networkMonitor.connected) {
+            if (networkViewModel.isEmpty()) {
+                if (networkViewModel.loading.value == true) {
+                    emptyLoading.state = EmptyLoadingState.LOADING
+                } else {
+                    if (networkMonitor.lanAllowed) {
+                        emptyLoading.state = EmptyLoadingState.LOADING
+                        emptyLoading.loadingText = R.string.network_shares_discovery
+                    } else {
+                        emptyLoading.state = EmptyLoadingState.EMPTY
+                        emptyLoading.emptyText = R.string.network_connection_needed
+                    }
+                    networkList.visibility = View.GONE
+//                    handler.sendEmptyMessage(MSG_HIDE_LOADING)
+                }
+            } else {
+                emptyLoading.state = EmptyLoadingState.NONE
+                networkList.visibility = View.VISIBLE
+            }
+        } else {
+            emptyLoading.state = EmptyLoadingState.EMPTY
+            emptyLoading.emptyText = R.string.network_connection_needed
+            networkList.visibility = View.GONE
+        }
+    }
+
     override fun onStart() {
         super.onStart()
         fabPlay?.setImageResource(R.drawable.ic_fab_add)



More information about the Android mailing list