Implement search feature in add-ons page

pull/50/head
Abhijit Valluri 4 years ago
parent e952589ef2
commit 938a14ad1c

@ -6,9 +6,10 @@ package org.mozilla.fenix.addons
import android.content.Context import android.content.Context
import android.os.Bundle import android.os.Bundle
import android.view.Gravity import android.view.*
import android.view.View
import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityEvent
import android.view.inputmethod.EditorInfo
import androidx.appcompat.widget.SearchView
import androidx.core.content.res.ResourcesCompat import androidx.core.content.res.ResourcesCompat
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
@ -23,8 +24,6 @@ import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import mozilla.components.feature.addons.Addon import mozilla.components.feature.addons.Addon
import mozilla.components.feature.addons.AddonManagerException import mozilla.components.feature.addons.AddonManagerException
import mozilla.components.feature.addons.ui.AddonInstallationDialogFragment
import mozilla.components.feature.addons.ui.AddonsManagerAdapter
import mozilla.components.feature.addons.ui.PermissionsDialogFragment import mozilla.components.feature.addons.ui.PermissionsDialogFragment
import mozilla.components.feature.addons.ui.translatedName import mozilla.components.feature.addons.ui.translatedName
import network.novak.fenix.components.PagedAddonsManagerAdapter import network.novak.fenix.components.PagedAddonsManagerAdapter
@ -37,6 +36,7 @@ import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.ext.showToolbar
import org.mozilla.fenix.theme.ThemeManager import org.mozilla.fenix.theme.ThemeManager
import java.util.Locale
import java.util.concurrent.CancellationException import java.util.concurrent.CancellationException
/** /**
@ -50,12 +50,76 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management)
*/ */
private var isInstallationInProgress = false private var isInstallationInProgress = false
private var adapter: PagedAddonsManagerAdapter? = null private var adapter: PagedAddonsManagerAdapter? = null
private var addons: List<Addon>? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
setHasOptionsMenu(true)
return super.onCreateView(inflater, container, savedInstanceState)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
bindRecyclerView(view) bindRecyclerView(view)
} }
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.addons_menu, menu)
val searchItem = menu.findItem(R.id.search)
val searchView: SearchView = searchItem.actionView as SearchView
searchView.imeOptions = EditorInfo.IME_ACTION_DONE
searchView.queryHint = getString(R.string.addons_search_hint)
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String): Boolean {
return searchAddons(query.trim())
}
override fun onQueryTextChange(newText: String): Boolean {
return searchAddons(newText.trim())
}
})
}
private fun searchAddons(addonNameSubStr: String): Boolean {
if (adapter == null) {
return false
}
val searchedAddons = arrayListOf<Addon>()
addons?.forEach { addon ->
val names = addon.translatableName
names["en-US"]?.let { name ->
if (name.toLowerCase(Locale.ENGLISH).contains(addonNameSubStr.toLowerCase(Locale.ENGLISH))) {
searchedAddons.add(addon)
}
}
}
updateUI(searchedAddons)
return true
}
private fun updateUI(searchedAddons: List<Addon>) {
adapter?.updateAddons(searchedAddons)
if (searchedAddons.isEmpty()) {
view?.let { view ->
view.add_ons_empty_message.visibility = View.VISIBLE
view.add_ons_list.visibility = View.GONE
}
} else {
view?.let { view ->
view.add_ons_empty_message.visibility = View.GONE
view.add_ons_list.visibility = View.VISIBLE
}
}
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
showToolbar(getString(R.string.preferences_addons)) showToolbar(getString(R.string.preferences_addons))
@ -85,14 +149,14 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management)
val shouldRefresh = adapter != null val shouldRefresh = adapter != null
lifecycleScope.launch(IO) { lifecycleScope.launch(IO) {
try { try {
val addons = requireContext().components.addonManager.getAddons() addons = requireContext().components.addonManager.getAddons()
lifecycleScope.launch(Dispatchers.Main) { lifecycleScope.launch(Dispatchers.Main) {
runIfFragmentIsAttached { runIfFragmentIsAttached {
if (!shouldRefresh) { if (!shouldRefresh) {
adapter = PagedAddonsManagerAdapter( adapter = PagedAddonsManagerAdapter(
requireContext().components.addonCollectionProvider, requireContext().components.addonCollectionProvider,
managementView, managementView,
addons, addons!!,
style = createAddonStyle(requireContext()) style = createAddonStyle(requireContext())
) )
} }
@ -102,7 +166,7 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management)
recyclerView.adapter = adapter recyclerView.adapter = adapter
if (shouldRefresh) { if (shouldRefresh) {
adapter?.updateAddons(addons) adapter?.updateAddons(addons!!)
} }
} }
} }

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?><!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/search"
android:icon="@drawable/ic_search"
android:title="@string/addons_search_hint"
app:iconTint="?primaryText"
app:actionViewClass="androidx.appcompat.widget.SearchView"
android:contentDescription="@string/addons_search_hint"
app:showAsAction="ifRoom|collapseActionView" />
</menu>

@ -324,6 +324,8 @@
<string name="preferences_external_download_manager">External download manager</string> <string name="preferences_external_download_manager">External download manager</string>
<!-- Preference for add_ons --> <!-- Preference for add_ons -->
<string name="preferences_addons">Add-ons</string> <string name="preferences_addons">Add-ons</string>
<!-- Placeholder text shown in the search bar before a user enters text -->
<string name="addons_search_hint">Search add-ons</string>
<!-- Preference for notifications --> <!-- Preference for notifications -->
<string name="preferences_notifications">Notifications</string> <string name="preferences_notifications">Notifications</string>

Loading…
Cancel
Save