浏览代码

Merge pull request #9461 from nextcloud/unifiedSearch_showNoResults

If no search results from any provider, show it
Álvaro Brey 3 年之前
父节点
当前提交
41f650586f

+ 37 - 4
src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt

@@ -20,6 +20,7 @@
  */
 package com.owncloud.android.ui.fragment
 
+import android.content.Intent
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.Menu
@@ -29,6 +30,7 @@ import android.view.ViewGroup
 import androidx.annotation.VisibleForTesting
 import androidx.appcompat.widget.SearchView
 import androidx.core.view.MenuItemCompat
+import androidx.core.view.updatePadding
 import androidx.fragment.app.Fragment
 import androidx.lifecycle.ViewModelProvider
 import androidx.recyclerview.widget.GridLayoutManager
@@ -40,20 +42,21 @@ import com.nextcloud.client.network.ClientFactory
 import com.owncloud.android.R
 import com.owncloud.android.databinding.ListFragmentBinding
 import com.owncloud.android.datamodel.FileDataStorageManager
+import com.owncloud.android.datamodel.OCFile
 import com.owncloud.android.lib.common.SearchResultEntry
 import com.owncloud.android.lib.common.utils.Log_OC
 import com.owncloud.android.ui.activity.FileDisplayActivity
 import com.owncloud.android.ui.adapter.UnifiedSearchListAdapter
+import com.owncloud.android.ui.fragment.util.PairMediatorLiveData
 import com.owncloud.android.ui.interfaces.UnifiedSearchListInterface
+import com.owncloud.android.ui.unifiedsearch.IUnifiedSearchViewModel
 import com.owncloud.android.ui.unifiedsearch.ProviderID
 import com.owncloud.android.ui.unifiedsearch.UnifiedSearchSection
 import com.owncloud.android.ui.unifiedsearch.UnifiedSearchViewModel
 import com.owncloud.android.utils.DisplayUtils
+import com.owncloud.android.utils.theme.ThemeColorUtils
+import com.owncloud.android.utils.theme.ThemeDrawableUtils
 import javax.inject.Inject
-import android.content.Intent
-import androidx.core.view.updatePadding
-import com.owncloud.android.datamodel.OCFile
-import com.owncloud.android.ui.unifiedsearch.IUnifiedSearchViewModel
 
 /**
  * Starts query to all capable unified search providers and displays them Opens result in our app, redirect to other
@@ -97,6 +100,36 @@ class UnifiedSearchFragment : Fragment(), Injectable, UnifiedSearchListInterface
         vm.isLoading.observe(this) { loading ->
             binding.swipeContainingList.isRefreshing = loading
         }
+
+        PairMediatorLiveData(vm.searchResults, vm.isLoading).observe(this) { pair ->
+            if (pair.second == false) {
+                var count = 0
+
+                pair.first?.forEach {
+                    count += it.entries.size
+                }
+
+                if (count == 0 && pair.first?.isNotEmpty() == true && context != null) {
+                    binding.emptyList.root.visibility = View.VISIBLE
+                    binding.emptyList.emptyListIcon.visibility = View.VISIBLE
+                    binding.emptyList.emptyListViewHeadline.visibility = View.VISIBLE
+                    binding.emptyList.emptyListViewText.visibility = View.VISIBLE
+                    binding.emptyList.emptyListIcon.visibility = View.VISIBLE
+
+                    binding.emptyList.emptyListViewHeadline.text =
+                        requireContext().getString(R.string.file_list_empty_headline_server_search)
+                    binding.emptyList.emptyListViewText.text =
+                        requireContext().getString(R.string.file_list_empty_unified_search_no_results)
+                    binding.emptyList.emptyListIcon.setImageDrawable(
+                        ThemeDrawableUtils.tintDrawable(
+                            R.drawable.ic_search_grey,
+                            ThemeColorUtils.primaryColor(context, true)
+                        )
+                    )
+                }
+            }
+        }
+
         vm.error.observe(this) { error ->
             if (!error.isNullOrEmpty()) {
                 DisplayUtils.showSnackMessage(binding.root, error)

+ 37 - 0
src/main/java/com/owncloud/android/ui/fragment/util/PairMediatorLiveData.kt

@@ -0,0 +1,37 @@
+/*
+ *
+ * Nextcloud Android client application
+ *
+ * @author Tobias Kaminsky
+ * Copyright (C) 2021 Tobias Kaminsky
+ * Copyright (C) 2021 Nextcloud GmbH
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ * 
+ * Inspired by https://medium.com/codex/how-to-use-mediatorlivedata-with-multiple-livedata-types-a40e1a59e8cf
+ * 
+ */
+
+package com.owncloud.android.ui.fragment.util
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MediatorLiveData
+
+class PairMediatorLiveData<F, S>(firstLiveData: LiveData<F>, secondLiveData: LiveData<S>) :
+    MediatorLiveData<Pair<F?, S?>>() {
+    init {
+        addSource(firstLiveData) { firstLiveDataValue: F -> value = firstLiveDataValue to secondLiveData.value }
+        addSource(secondLiveData) { secondLiveDataValue: S -> value = firstLiveData.value to secondLiveDataValue }
+    }
+}

+ 1 - 0
src/main/res/values/strings.xml

@@ -1005,5 +1005,6 @@
     <string name="load_more_results">Load more results</string>
     <string name="file_management_permission">Permissions needed</string>
     <string name="file_management_permission_text">%1$s needs file management permissions to work properly. Please enable it in the following screen to continue.</string>
+    <string name="file_list_empty_unified_search_no_results">No results found for your query</string>
     <string name="file_list_empty_gallery">Found no images or videos</string>
 </resources>