|
|
@ -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!!)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|