Updates to clean DB controller

No more RX, hello coroutines (because idk how to invoke rx after sorting)
Option to sort sources by most entries as well as alphabetical
Option to select uninstalled sources
Also keeping the Stubsource check for drawable setting Seishirou added before, since theres a delay with stub source apparently
This commit is contained in:
Jays2Kings 2022-04-22 01:06:42 -04:00
parent 9f4a6698be
commit d5f66926c0
5 changed files with 132 additions and 26 deletions

View file

@ -24,8 +24,8 @@ import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.Payload
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.ClearDatabaseControllerBinding
import eu.kanade.tachiyomi.ui.base.controller.BaseCoroutineController
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
import eu.kanade.tachiyomi.util.system.rootWindowInsetsCompat
import eu.kanade.tachiyomi.util.view.activityBinding
import eu.kanade.tachiyomi.util.view.fullAppBarHeight
@ -35,7 +35,7 @@ import kotlin.math.max
import kotlin.math.roundToInt
class ClearDatabaseController :
NucleusController<ClearDatabaseControllerBinding, ClearDatabasePresenter>(),
BaseCoroutineController<ClearDatabaseControllerBinding, ClearDatabasePresenter>(),
FlexibleAdapter.OnItemClickListener,
FlexibleAdapter.OnUpdateListener {
@ -46,9 +46,7 @@ class ClearDatabaseController :
return ClearDatabaseControllerBinding.inflate(inflater)
}
override fun createPresenter(): ClearDatabasePresenter {
return ClearDatabasePresenter()
}
override val presenter = ClearDatabasePresenter()
override fun getTitle(): String? {
return activity?.getString(R.string.clear_database)
@ -130,9 +128,20 @@ class ClearDatabaseController :
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.generic_selection, menu)
inflater.inflate(R.menu.clear_database, menu)
this.menu = menu
val id = when (presenter.sortBy) {
ClearDatabasePresenter.SortSources.ALPHA -> R.id.action_sort_alpha
ClearDatabasePresenter.SortSources.MOST_ENTRIES -> R.id.action_sort_largest
}
menu.findItem(id).isChecked = true
menu.forEach { menuItem -> menuItem.isVisible = (adapter?.itemCount ?: 0) > 0 }
setUninstalledMenuItem()
}
private fun setUninstalledMenuItem() {
menu?.findItem(R.id.action_select_uninstalled)?.isVisible =
presenter.hasStubSources && adapter?.itemCount ?: 0 > 0
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
@ -140,11 +149,26 @@ class ClearDatabaseController :
when (item.itemId) {
R.id.action_select_all -> adapter.selectAll()
R.id.action_select_inverse -> {
adapter.currentItems.forEachIndexed { index, _ ->
adapter.toggleSelection(index)
}
}
R.id.action_sort_alpha, R.id.action_sort_largest -> {
val sortBy = when (item.itemId) {
R.id.action_sort_alpha -> ClearDatabasePresenter.SortSources.ALPHA
R.id.action_sort_largest -> ClearDatabasePresenter.SortSources.MOST_ENTRIES
else -> return false
}
presenter.reorder(sortBy)
item.isChecked = true
adapter.clearSelection()
}
R.id.action_select_uninstalled -> {
val currentSelection = adapter.selectedPositionsAsSet
val invertedSelection = (0..adapter.itemCount)
.filterNot { currentSelection.contains(it) }
val uninstalledSelection = (0 until adapter.itemCount)
.filter { adapter.getItem(it)?.isStub == true }
currentSelection.clear()
currentSelection.addAll(invertedSelection)
currentSelection.addAll(uninstalledSelection)
}
}
adapter.notifyItemRangeChanged(0, adapter.itemCount, Payload.SELECTION)
@ -162,6 +186,7 @@ class ClearDatabaseController :
)
}
menu?.forEach { menuItem -> menuItem.isVisible = size > 0 }
setUninstalledMenuItem()
}
override fun onItemClick(view: View?, position: Int): Boolean {
@ -176,10 +201,12 @@ class ClearDatabaseController :
super.onPrepareOptionsMenu(menu)
val size = adapter?.itemCount ?: 0
menu.forEach { menuItem -> menuItem.isVisible = size > 0 }
setUninstalledMenuItem()
}
fun setItems(items: List<ClearDatabaseSourceItem>) {
adapter?.updateDataSet(items)
menu?.findItem(R.id.action_select_uninstalled)?.isVisible = presenter.hasStubSources
}
private fun updateFab() {

View file

@ -1,40 +1,68 @@
package eu.kanade.tachiyomi.ui.setting.database
import android.os.Bundle
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
import rx.Observable
import rx.android.schedulers.AndroidSchedulers
import rx.schedulers.Schedulers
import eu.kanade.tachiyomi.ui.base.presenter.BaseCoroutinePresenter
import eu.kanade.tachiyomi.util.system.launchUI
import eu.kanade.tachiyomi.util.system.withUIContext
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
class ClearDatabasePresenter : BasePresenter<ClearDatabaseController>() {
class ClearDatabasePresenter : BaseCoroutinePresenter<ClearDatabaseController>() {
private val db = Injekt.get<DatabaseHelper>()
private val sourceManager = Injekt.get<SourceManager>()
override fun onCreate(savedState: Bundle?) {
super.onCreate(savedState)
getDatabaseSourcesObservable()
.subscribeOn(Schedulers.io())
.subscribeLatestCache(ClearDatabaseController::setItems)
var sortBy = SortSources.ALPHA
private set
var hasStubSources = false
enum class SortSources {
ALPHA,
MOST_ENTRIES,
}
override fun onCreate() {
super.onCreate()
getDatabaseSources()
}
fun clearDatabaseForSourceIds(sources: List<Long>) {
db.deleteMangasNotInLibraryBySourceIds(sources).executeAsBlocking()
db.deleteHistoryNoLastRead().executeAsBlocking()
getDatabaseSources()
}
private fun getDatabaseSourcesObservable(): Observable<List<ClearDatabaseSourceItem>> {
return db.getSourceIdsWithNonLibraryManga().asRxObservable().observeOn(AndroidSchedulers.mainThread())
.map { sourceCounts ->
sourceCounts.map {
fun reorder(sortBy: SortSources) {
this.sortBy = sortBy
getDatabaseSources()
}
private fun getDatabaseSources() {
presenterScope.launchUI {
hasStubSources = false
val sources = db.getSourceIdsWithNonLibraryManga().executeAsBlocking()
.map {
val sourceObj = sourceManager.getOrStub(it.source)
hasStubSources = sourceObj is SourceManager.StubSource || hasStubSources
ClearDatabaseSourceItem(sourceObj, it.count)
}.sortedBy { it.source.name }
}
.sortedWith(
compareBy(
{
when (sortBy) {
SortSources.ALPHA -> it.source.name
SortSources.MOST_ENTRIES -> Int.MAX_VALUE - it.mangaCount
}
},
{ it.source.name }
)
)
withUIContext {
controller?.setItems(sources)
}
}
}
}

View file

@ -10,9 +10,12 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.ClearDatabaseSourceItemBinding
import eu.kanade.tachiyomi.source.LocalSource
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.icon
data class ClearDatabaseSourceItem(val source: Source, private val mangaCount: Int) : AbstractFlexibleItem<ClearDatabaseSourceItem.Holder>() {
data class ClearDatabaseSourceItem(val source: Source, val mangaCount: Int) : AbstractFlexibleItem<ClearDatabaseSourceItem.Holder>() {
val isStub: Boolean = source is SourceManager.StubSource
override fun getLayoutRes(): Int {
return R.layout.clear_database_source_item
@ -37,6 +40,7 @@ data class ClearDatabaseSourceItem(val source: Source, private val mangaCount: I
itemView.post {
when {
source.id == LocalSource.ID -> binding.thumbnail.setImageResource(R.mipmap.ic_local_source)
source is SourceManager.StubSource -> binding.thumbnail.setImageDrawable(null)
else -> binding.thumbnail.setImageDrawable(source.icon())
}
}

View file

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_select_all"
android:icon="@drawable/ic_select_all_24dp"
android:title="@string/select_all"
app:iconTint="?colorOnSurface"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_select_inverse"
android:icon="@drawable/ic_flip_to_back_24dp"
android:title="@string/select_inverse"
app:iconTint="?colorOnSurface"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_sort"
android:icon="@drawable/ic_sort_24dp"
android:title="@string/sort_by"
app:iconTint="?colorOnSurface"
app:showAsAction="ifRoom" >
<menu>
<group android:checkableBehavior="single"
android:id="@+id/action_sort_group">
<item
android:id="@+id/action_sort_alpha"
android:title="@string/alphabetically"/>
<item
android:id="@+id/action_sort_largest"
android:title="@string/most_entries"/>
</group>
</menu>
</item>
<item
android:id="@+id/action_select_uninstalled"
android:icon="@drawable/ic_select_none_24dp"
android:title="@string/select_uninstalled_sources"
app:iconTint="?colorOnSurface"
app:showAsAction="ifRoom" />
</menu>

View file

@ -822,6 +822,8 @@
<string name="clear_cached_covers_non_library">Clear cached covers not in library</string>
<string name="delete_all_covers__not_in_library_used_">Delete all covers cached that are
not in your library \nCurrently using: %1$s</string>
<string name="most_entries">Most entries</string>
<string name="select_uninstalled_sources">Select uninstalled sources</string>
<!-- Browse Settings -->
<string name="pref_global_search">Global search</string>