Various fixes to search presets
This commit is contained in:
parent
fa6f60d454
commit
4e2c9dc083
20
app/proguard-rules.pro
vendored
20
app/proguard-rules.pro
vendored
@ -1,8 +1,7 @@
|
|||||||
-dontobfuscate
|
-dontobfuscate
|
||||||
|
|
||||||
-dontwarn eu.kanade.tachiyomi.**
|
-dontwarn eu.kanade.tachiyomi.**
|
||||||
-keep class eu.kanade.tachiyomi.**
|
-keep class eu.kanade.tachiyomi.** { *; }
|
||||||
-keep class eu.kanade.tachiyomi.source.model.** { *; }
|
|
||||||
|
|
||||||
-keep class com.hippo.image.** { *; }
|
-keep class com.hippo.image.** { *; }
|
||||||
-keep interface com.hippo.image.** { *; }
|
-keep interface com.hippo.image.** { *; }
|
||||||
@ -112,3 +111,20 @@
|
|||||||
# Keep google stuff
|
# Keep google stuff
|
||||||
-dontwarn com.google.android.gms.**
|
-dontwarn com.google.android.gms.**
|
||||||
-dontwarn com.google.firebase.**
|
-dontwarn com.google.firebase.**
|
||||||
|
|
||||||
|
# Jackson
|
||||||
|
# Proguard configuration for Jackson 2.x
|
||||||
|
-keep class com.fasterxml.jackson.databind.ObjectMapper {
|
||||||
|
public <methods>;
|
||||||
|
protected <methods>;
|
||||||
|
}
|
||||||
|
-keep class com.fasterxml.jackson.databind.ObjectWriter {
|
||||||
|
public ** writeValueAsString(**);
|
||||||
|
}
|
||||||
|
-keepnames class com.fasterxml.jackson.** { *; }
|
||||||
|
-dontwarn com.fasterxml.jackson.databind.**
|
||||||
|
# Proguard configuration for Jackson 2.x
|
||||||
|
-dontwarn com.fasterxml.jackson.databind.**
|
||||||
|
-keepclassmembers class * {
|
||||||
|
@com.fasterxml.jackson.annotation.* *;
|
||||||
|
}
|
@ -250,5 +250,5 @@ class PreferencesHelper(val context: Context) {
|
|||||||
|
|
||||||
fun eh_lastVersionCode() = rxPrefs.getInteger("eh_last_version_code", 0)
|
fun eh_lastVersionCode() = rxPrefs.getInteger("eh_last_version_code", 0)
|
||||||
|
|
||||||
fun eh_savedSearches() = rxPrefs.getString("eh_saved_searches", "")
|
fun eh_savedSearches() = rxPrefs.getStringSet("eh_saved_searches", emptySet())
|
||||||
}
|
}
|
||||||
|
@ -143,30 +143,21 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|||||||
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, Gravity.END)
|
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, Gravity.END)
|
||||||
|
|
||||||
// EXH -->
|
// EXH -->
|
||||||
presenter.loadSearches()?.let {
|
navView.setSavedSearches(presenter.loadSearches().map { it.second })
|
||||||
navView.setSavedSearches(it)
|
|
||||||
} ?: run {
|
|
||||||
MaterialDialog.Builder(navView.context)
|
|
||||||
.title("Failed to load saved searches!")
|
|
||||||
.content("An error occurred while loading your saved searches.")
|
|
||||||
.cancelable(true)
|
|
||||||
.canceledOnTouchOutside(true)
|
|
||||||
.show()
|
|
||||||
}
|
|
||||||
navView.onSaveClicked = {
|
navView.onSaveClicked = {
|
||||||
MaterialDialog.Builder(navView.context)
|
MaterialDialog.Builder(navView.context)
|
||||||
.title("Save current search query?")
|
.title("Save current search query?")
|
||||||
.input("My search name", "") { _, searchName ->
|
.input("My search name", "") { _, searchName ->
|
||||||
val oldSavedSearches = presenter.loadSearches() ?: emptyList()
|
val oldSavedSearches = presenter.loadSearches()
|
||||||
if(searchName.isNotBlank()
|
if(searchName.isNotBlank()
|
||||||
&& oldSavedSearches.size < CatalogueNavigationView.MAX_SAVED_SEARCHES) {
|
&& oldSavedSearches.size < CatalogueNavigationView.MAX_SAVED_SEARCHES) {
|
||||||
val newSearches = oldSavedSearches + EXHSavedSearch(
|
val newSearches = oldSavedSearches + (presenter.source.id to EXHSavedSearch(
|
||||||
searchName.toString().trim(),
|
searchName.toString().trim(),
|
||||||
presenter.query,
|
presenter.query,
|
||||||
presenter.sourceFilters.toList()
|
presenter.sourceFilters.toList()
|
||||||
)
|
))
|
||||||
presenter.saveSearches(newSearches)
|
presenter.saveSearches(newSearches)
|
||||||
navView.setSavedSearches(newSearches)
|
navView.setSavedSearches(newSearches.map { it.second })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.positiveText("Save")
|
.positiveText("Save")
|
||||||
@ -179,7 +170,9 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|||||||
navView.onSavedSearchClicked = cb@{ indexToSearch ->
|
navView.onSavedSearchClicked = cb@{ indexToSearch ->
|
||||||
val savedSearches = presenter.loadSearches()
|
val savedSearches = presenter.loadSearches()
|
||||||
|
|
||||||
if(savedSearches == null) {
|
val search = savedSearches.getOrNull(indexToSearch)
|
||||||
|
|
||||||
|
if(search == null) {
|
||||||
MaterialDialog.Builder(navView.context)
|
MaterialDialog.Builder(navView.context)
|
||||||
.title("Failed to load saved searches!")
|
.title("Failed to load saved searches!")
|
||||||
.content("An error occurred while loading your saved searches.")
|
.content("An error occurred while loading your saved searches.")
|
||||||
@ -189,23 +182,23 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|||||||
return@cb
|
return@cb
|
||||||
}
|
}
|
||||||
|
|
||||||
val search = savedSearches[indexToSearch]
|
presenter.sourceFilters = FilterList(search.second.filterList)
|
||||||
|
|
||||||
presenter.sourceFilters = FilterList(search.filterList)
|
|
||||||
navView.setFilters(presenter.filterItems)
|
navView.setFilters(presenter.filterItems)
|
||||||
val allDefault = presenter.sourceFilters == presenter.source.getFilterList()
|
val allDefault = presenter.sourceFilters == presenter.source.getFilterList()
|
||||||
|
|
||||||
showProgressBar()
|
showProgressBar()
|
||||||
adapter?.clear()
|
adapter?.clear()
|
||||||
drawer.closeDrawer(Gravity.END)
|
drawer.closeDrawer(Gravity.END)
|
||||||
presenter.restartPager(search.query, if (allDefault) FilterList() else presenter.sourceFilters)
|
presenter.restartPager(search.second.query, if (allDefault) FilterList() else presenter.sourceFilters)
|
||||||
activity?.invalidateOptionsMenu()
|
activity?.invalidateOptionsMenu()
|
||||||
}
|
}
|
||||||
|
|
||||||
navView.onSavedSearchDeleteClicked = cb@{ indexToDelete ->
|
navView.onSavedSearchDeleteClicked = cb@{ indexToDelete ->
|
||||||
val savedSearches = presenter.loadSearches()
|
val savedSearches = presenter.loadSearches()
|
||||||
|
|
||||||
if(savedSearches == null) {
|
val search = savedSearches.getOrNull(indexToDelete)
|
||||||
|
|
||||||
|
if(search == null) {
|
||||||
MaterialDialog.Builder(navView.context)
|
MaterialDialog.Builder(navView.context)
|
||||||
.title("Failed to delete saved search!")
|
.title("Failed to delete saved search!")
|
||||||
.content("An error occurred while deleting the search.")
|
.content("An error occurred while deleting the search.")
|
||||||
@ -215,11 +208,9 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|||||||
return@cb
|
return@cb
|
||||||
}
|
}
|
||||||
|
|
||||||
val search = savedSearches[indexToDelete]
|
|
||||||
|
|
||||||
MaterialDialog.Builder(navView.context)
|
MaterialDialog.Builder(navView.context)
|
||||||
.title("Delete saved search query?")
|
.title("Delete saved search query?")
|
||||||
.content("Are you sure you wish to delete your saved search query: '${search.name}'?")
|
.content("Are you sure you wish to delete your saved search query: '${search.second.name}'?")
|
||||||
.positiveText("Cancel")
|
.positiveText("Cancel")
|
||||||
.negativeText("Confirm")
|
.negativeText("Confirm")
|
||||||
.onNegative { _, _ ->
|
.onNegative { _, _ ->
|
||||||
@ -227,7 +218,7 @@ open class BrowseCatalogueController(bundle: Bundle) :
|
|||||||
index != indexToDelete
|
index != indexToDelete
|
||||||
}
|
}
|
||||||
presenter.saveSearches(newSearches)
|
presenter.saveSearches(newSearches)
|
||||||
navView.setSavedSearches(newSearches)
|
navView.setSavedSearches(newSearches.map { it.second })
|
||||||
}
|
}
|
||||||
.cancelable(true)
|
.cancelable(true)
|
||||||
.canceledOnTouchOutside(true)
|
.canceledOnTouchOutside(true)
|
||||||
|
@ -1,7 +1,12 @@
|
|||||||
package eu.kanade.tachiyomi.ui.catalogue.browse
|
package eu.kanade.tachiyomi.ui.catalogue.browse
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import com.fasterxml.jackson.annotation.JsonAutoDetect
|
||||||
|
import com.fasterxml.jackson.annotation.PropertyAccessor
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException
|
import com.fasterxml.jackson.core.JsonProcessingException
|
||||||
|
import com.fasterxml.jackson.databind.DeserializationFeature
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper
|
||||||
|
import com.fasterxml.jackson.databind.type.TypeFactory
|
||||||
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||||
import com.fasterxml.jackson.module.kotlin.readValue
|
import com.fasterxml.jackson.module.kotlin.readValue
|
||||||
import eu.davidea.flexibleadapter.items.IFlexible
|
import eu.davidea.flexibleadapter.items.IFlexible
|
||||||
@ -29,6 +34,7 @@ import rx.subjects.PublishSubject
|
|||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
import uy.kohesive.injekt.api.get
|
import uy.kohesive.injekt.api.get
|
||||||
|
import uy.kohesive.injekt.injectLazy
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Presenter of [BrowseCatalogueController].
|
* Presenter of [BrowseCatalogueController].
|
||||||
@ -380,22 +386,37 @@ open class BrowseCataloguePresenter(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// EXH -->
|
// EXH -->
|
||||||
private val mapper = jacksonObjectMapper().enableDefaultTyping()
|
private val sourceManager: SourceManager by injectLazy()
|
||||||
fun saveSearches(searches: List<EXHSavedSearch>) {
|
private fun mapper() = jacksonObjectMapper().enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL)
|
||||||
val serialized = mapper.writeValueAsString(searches.toTypedArray())
|
.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)
|
||||||
|
.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
|
||||||
|
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
|
||||||
|
fun saveSearches(searches: List<Pair<Long, EXHSavedSearch>>) {
|
||||||
|
val m = mapper()
|
||||||
|
val serialized = searches.map {
|
||||||
|
"${it.first}:" + m.writeValueAsString(it.second)
|
||||||
|
}.toSet()
|
||||||
prefs.eh_savedSearches().set(serialized)
|
prefs.eh_savedSearches().set(serialized)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun loadSearches(): List<EXHSavedSearch>? {
|
fun loadSearches(): List<Pair<Long, EXHSavedSearch>> {
|
||||||
val loaded = prefs.eh_savedSearches().getOrDefault()
|
val loaded = prefs.eh_savedSearches().getOrDefault()
|
||||||
return try {
|
return loaded.map {
|
||||||
if (!loaded.isEmpty()) mapper.readValue<Array<EXHSavedSearch>>(loaded).toList()
|
try {
|
||||||
else emptyList()
|
val id = it.substringBefore(':').toLong()
|
||||||
|
val content = it.substringAfter(':')
|
||||||
|
val newMapper = mapper()
|
||||||
|
.setTypeFactory(TypeFactory.defaultInstance()
|
||||||
|
.withClassLoader(sourceManager.getOrStub(id).javaClass.classLoader))
|
||||||
|
id to newMapper.readValue<EXHSavedSearch>(content)
|
||||||
|
|
||||||
} catch(t: JsonProcessingException) {
|
} catch(t: JsonProcessingException) {
|
||||||
// Load failed
|
// Load failed
|
||||||
Timber.e(t, "Failed to load saved searches!")
|
Timber.e(t, "Failed to load saved search!")
|
||||||
|
t.printStackTrace()
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
}.filterNotNull()
|
||||||
}
|
}
|
||||||
// EXH <--
|
// EXH <--
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,6 @@ const val PERV_EDEN_IT_SOURCE_ID = LEWD_SOURCE_SERIES + 6
|
|||||||
|
|
||||||
const val NHENTAI_SOURCE_ID = LEWD_SOURCE_SERIES + 7
|
const val NHENTAI_SOURCE_ID = LEWD_SOURCE_SERIES + 7
|
||||||
|
|
||||||
@Deprecated("Now a delegated source")
|
|
||||||
val HENTAI_CAFE_SOURCE_ID = SourceManager.DELEGATED_SOURCES.entries.find {
|
val HENTAI_CAFE_SOURCE_ID = SourceManager.DELEGATED_SOURCES.entries.find {
|
||||||
it.value.newSourceClass == HentaiCafe::class
|
it.value.newSourceClass == HentaiCafe::class
|
||||||
}!!.value.sourceId
|
}!!.value.sourceId
|
||||||
|
@ -34,5 +34,5 @@ object DebugFunctions {
|
|||||||
it.favorite && db.getSearchMetadataForManga(it.id!!).executeAsBlocking() == null
|
it.favorite && db.getSearchMetadataForManga(it.id!!).executeAsBlocking() == null
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clearSavedSearches() = prefs.eh_savedSearches().set("")
|
fun clearSavedSearches() = prefs.eh_savedSearches().set(emptySet())
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user