mirror of
https://github.com/null2264/yokai.git
synced 2025-06-21 10:44:42 +00:00
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:
parent
9f4a6698be
commit
d5f66926c0
5 changed files with 132 additions and 26 deletions
|
@ -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() {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
|
45
app/src/main/res/menu/clear_database.xml
Normal file
45
app/src/main/res/menu/clear_database.xml
Normal 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>
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue