fix: sorting extensions order

This commit is contained in:
rebelonion 2024-02-04 01:19:34 -06:00
parent 15abcd77d0
commit c2f108bf44
12 changed files with 146 additions and 82 deletions

View file

@ -1,5 +1,6 @@
package ani.dantotsu.settings
import android.annotation.SuppressLint
import android.app.NotificationManager
import android.content.Context
import android.os.Bundle
@ -14,6 +15,7 @@ import androidx.core.app.NotificationCompat
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
@ -21,6 +23,7 @@ import ani.dantotsu.R
import ani.dantotsu.currContext
import ani.dantotsu.databinding.FragmentNovelExtensionsBinding
import ani.dantotsu.others.LanguageMapper
import ani.dantotsu.parsers.NovelSources
import ani.dantotsu.parsers.novel.NovelExtension
import ani.dantotsu.parsers.novel.NovelExtensionManager
import ani.dantotsu.settings.saving.PrefName
@ -32,6 +35,7 @@ import kotlinx.coroutines.launch
import rx.android.schedulers.AndroidSchedulers
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.util.Collections
import java.util.Locale
class InstalledNovelExtensionsFragment : Fragment(), SearchQueryHandler {
@ -41,7 +45,7 @@ class InstalledNovelExtensionsFragment : Fragment(), SearchQueryHandler {
private val skipIcons: Boolean = PrefManager.getVal(PrefName.SkipExtensionIcons)
private val novelExtensionManager: NovelExtensionManager = Injekt.get()
private val extensionsAdapter = NovelExtensionsAdapter(
{ pkg ->
{ _ ->
Toast.makeText(requireContext(), "Source is not configurable", Toast.LENGTH_SHORT)
.show()
},
@ -85,7 +89,7 @@ class InstalledNovelExtensionsFragment : Fragment(), SearchQueryHandler {
context,
Notifications.CHANNEL_DOWNLOADER_PROGRESS
)
.setSmallIcon(androidx.media3.ui.R.drawable.exo_ic_check)
.setSmallIcon(R.drawable.ic_check)
.setContentTitle("Update complete")
.setContentText("The extension has been successfully updated.")
.setPriority(NotificationCompat.PRIORITY_LOW)
@ -112,22 +116,58 @@ class InstalledNovelExtensionsFragment : Fragment(), SearchQueryHandler {
extensionsRecyclerView.layoutManager = LinearLayoutManager(requireContext())
extensionsRecyclerView.adapter = extensionsAdapter
val itemTouchHelperCallback = object : ItemTouchHelper.SimpleCallback(
ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0) {
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
extensionsAdapter.onMove(viewHolder.absoluteAdapterPosition, target.absoluteAdapterPosition)
return true
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {}
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
super.onSelectedChanged(viewHolder, actionState)
if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
viewHolder?.itemView?.elevation = 8f
viewHolder?.itemView?.translationZ = 8f
}
}
override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
super.clearView(recyclerView, viewHolder)
viewHolder.itemView.elevation = 0f
viewHolder.itemView.translationZ = 0f
}
}
ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(extensionsRecyclerView)
lifecycleScope.launch {
novelExtensionManager.installedExtensionsFlow.collect { extensions ->
extensionsAdapter.updateData(extensions)
extensionsAdapter.updateData(sortToNovelSourcesList(extensions))
}
}
val extensionsRecyclerView: RecyclerView = binding.allNovelExtensionsRecyclerView
return binding.root
}
private fun sortToNovelSourcesList(inpt: List<NovelExtension.Installed>): List<NovelExtension.Installed> {
val sourcesMap = inpt.associateBy { it.name }
val orderedSources = NovelSources.pinnedNovelSources.mapNotNull { name ->
sourcesMap[name]
}
return orderedSources + inpt.filter { !NovelSources.pinnedNovelSources.contains(it.name) }
}
override fun onDestroyView() {
super.onDestroyView();_binding = null
}
override fun updateContentBasedOnQuery(query: String?) {
extensionsAdapter.filter(query ?: "", novelExtensionManager.installedExtensionsFlow.value)
extensionsAdapter.filter(query ?: "", sortToNovelSourcesList(novelExtensionManager.installedExtensionsFlow.value))
}
override fun notifyDataChanged() { // do nothing
@ -136,16 +176,25 @@ class InstalledNovelExtensionsFragment : Fragment(), SearchQueryHandler {
private class NovelExtensionsAdapter(
private val onSettingsClicked: (NovelExtension.Installed) -> Unit,
private val onUninstallClicked: (NovelExtension.Installed, Boolean) -> Unit,
skipIcons: Boolean
val skipIcons: Boolean
) : ListAdapter<NovelExtension.Installed, NovelExtensionsAdapter.ViewHolder>(
DIFF_CALLBACK_INSTALLED
) {
val skipIcons = skipIcons
private val data: MutableList<NovelExtension.Installed> = mutableListOf()
fun updateData(newExtensions: List<NovelExtension.Installed>) {
Log.d("NovelExtensionsAdapter", "updateData: $newExtensions")
submitList(newExtensions) // Use submitList instead of manual list handling
submitList(newExtensions)
data.clear()
data.addAll(newExtensions)
}
fun onMove(fromPosition: Int, toPosition: Int) {
Collections.swap(data, fromPosition, toPosition)
val map = data.map { it.name }.toList()
PrefManager.setVal(PrefName.NovelSourcesOrder, map)
NovelSources.pinnedNovelSources = map
NovelSources.performReorderNovelSources()
notifyItemMoved(fromPosition, toPosition)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
@ -155,6 +204,7 @@ class InstalledNovelExtensionsFragment : Fragment(), SearchQueryHandler {
return ViewHolder(view)
}
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val extension = getItem(position) // Use getItem() from ListAdapter
val nsfw = ""
@ -175,7 +225,7 @@ class InstalledNovelExtensionsFragment : Fragment(), SearchQueryHandler {
holder.settingsImageView.setOnClickListener {
onSettingsClicked(extension)
}
holder.card.setOnLongClickListener {
holder.closeTextView.setOnLongClickListener {
onUninstallClicked(extension, true)
true
}
@ -198,7 +248,6 @@ class InstalledNovelExtensionsFragment : Fragment(), SearchQueryHandler {
val settingsImageView: ImageView = view.findViewById(R.id.settingsImageView)
val extensionIconImageView: ImageView = view.findViewById(R.id.extensionIconImageView)
val closeTextView: ImageView = view.findViewById(R.id.closeTextView)
val card = view.findViewById<View>(R.id.extensionCardView)
}
companion object {