Various fixes to search presets

This commit is contained in:
NerdNumber9 2019-04-06 09:05:32 -04:00
parent fa6f60d454
commit 4e2c9dc083
6 changed files with 68 additions and 41 deletions

View File

@ -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.* *;
}

View File

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

View File

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

View File

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

View File

@ -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

View File

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