mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	Various fixes to search presets
This commit is contained in:
		
							
								
								
									
										20
									
								
								app/proguard-rules.pro
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								app/proguard-rules.pro
									
									
									
									
										vendored
									
									
								
							| @@ -1,8 +1,7 @@ | ||||
| -dontobfuscate | ||||
|  | ||||
| -dontwarn eu.kanade.tachiyomi.** | ||||
| -keep class eu.kanade.tachiyomi.** | ||||
| -keep class eu.kanade.tachiyomi.source.model.** { *; } | ||||
| -keep class eu.kanade.tachiyomi.** { *; } | ||||
|  | ||||
| -keep class com.hippo.image.** { *; } | ||||
| -keep interface com.hippo.image.** { *; } | ||||
| @@ -112,3 +111,20 @@ | ||||
| # Keep google stuff | ||||
| -dontwarn com.google.android.gms.** | ||||
| -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_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) | ||||
|  | ||||
|         // EXH --> | ||||
|         presenter.loadSearches()?.let { | ||||
|             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.setSavedSearches(presenter.loadSearches().map { it.second }) | ||||
|         navView.onSaveClicked = { | ||||
|             MaterialDialog.Builder(navView.context) | ||||
|                     .title("Save current search query?") | ||||
|                     .input("My search name", "") { _, searchName -> | ||||
|                         val oldSavedSearches = presenter.loadSearches() ?: emptyList() | ||||
|                         val oldSavedSearches = presenter.loadSearches() | ||||
|                         if(searchName.isNotBlank() | ||||
|                                 && oldSavedSearches.size < CatalogueNavigationView.MAX_SAVED_SEARCHES) { | ||||
|                             val newSearches = oldSavedSearches + EXHSavedSearch( | ||||
|                             val newSearches = oldSavedSearches + (presenter.source.id to EXHSavedSearch( | ||||
|                                     searchName.toString().trim(), | ||||
|                                     presenter.query, | ||||
|                                     presenter.sourceFilters.toList() | ||||
|                             ) | ||||
|                             )) | ||||
|                             presenter.saveSearches(newSearches) | ||||
|                             navView.setSavedSearches(newSearches) | ||||
|                             navView.setSavedSearches(newSearches.map { it.second }) | ||||
|                         } | ||||
|                     } | ||||
|                     .positiveText("Save") | ||||
| @@ -179,7 +170,9 @@ open class BrowseCatalogueController(bundle: Bundle) : | ||||
|         navView.onSavedSearchClicked = cb@{ indexToSearch -> | ||||
|             val savedSearches = presenter.loadSearches() | ||||
|  | ||||
|             if(savedSearches == null) { | ||||
|             val search = savedSearches.getOrNull(indexToSearch) | ||||
|  | ||||
|             if(search == null) { | ||||
|                 MaterialDialog.Builder(navView.context) | ||||
|                         .title("Failed to load saved searches!") | ||||
|                         .content("An error occurred while loading your saved searches.") | ||||
| @@ -189,23 +182,23 @@ open class BrowseCatalogueController(bundle: Bundle) : | ||||
|                 return@cb | ||||
|             } | ||||
|  | ||||
|             val search = savedSearches[indexToSearch] | ||||
|  | ||||
|             presenter.sourceFilters = FilterList(search.filterList) | ||||
|             presenter.sourceFilters = FilterList(search.second.filterList) | ||||
|             navView.setFilters(presenter.filterItems) | ||||
|             val allDefault = presenter.sourceFilters == presenter.source.getFilterList() | ||||
|  | ||||
|             showProgressBar() | ||||
|             adapter?.clear() | ||||
|             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() | ||||
|         } | ||||
|  | ||||
|         navView.onSavedSearchDeleteClicked = cb@{ indexToDelete -> | ||||
|             val savedSearches = presenter.loadSearches() | ||||
|  | ||||
|             if(savedSearches == null) { | ||||
|             val search = savedSearches.getOrNull(indexToDelete) | ||||
|  | ||||
|             if(search == null) { | ||||
|                 MaterialDialog.Builder(navView.context) | ||||
|                         .title("Failed to delete saved search!") | ||||
|                         .content("An error occurred while deleting the search.") | ||||
| @@ -215,11 +208,9 @@ open class BrowseCatalogueController(bundle: Bundle) : | ||||
|                 return@cb | ||||
|             } | ||||
|  | ||||
|             val search = savedSearches[indexToDelete] | ||||
|  | ||||
|             MaterialDialog.Builder(navView.context) | ||||
|                     .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") | ||||
|                     .negativeText("Confirm") | ||||
|                     .onNegative { _, _ -> | ||||
| @@ -227,7 +218,7 @@ open class BrowseCatalogueController(bundle: Bundle) : | ||||
|                             index != indexToDelete | ||||
|                         } | ||||
|                         presenter.saveSearches(newSearches) | ||||
|                         navView.setSavedSearches(newSearches) | ||||
|                         navView.setSavedSearches(newSearches.map { it.second }) | ||||
|                     } | ||||
|                     .cancelable(true) | ||||
|                     .canceledOnTouchOutside(true) | ||||
|   | ||||
| @@ -1,7 +1,12 @@ | ||||
| package eu.kanade.tachiyomi.ui.catalogue.browse | ||||
|  | ||||
| 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.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.readValue | ||||
| import eu.davidea.flexibleadapter.items.IFlexible | ||||
| @@ -29,6 +34,7 @@ import rx.subjects.PublishSubject | ||||
| import timber.log.Timber | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import uy.kohesive.injekt.injectLazy | ||||
|  | ||||
| /** | ||||
|  * Presenter of [BrowseCatalogueController]. | ||||
| @@ -380,22 +386,37 @@ open class BrowseCataloguePresenter( | ||||
|     } | ||||
|  | ||||
|     // EXH --> | ||||
|     private val mapper = jacksonObjectMapper().enableDefaultTyping() | ||||
|     fun saveSearches(searches: List<EXHSavedSearch>) { | ||||
|         val serialized = mapper.writeValueAsString(searches.toTypedArray()) | ||||
|     private val sourceManager: SourceManager by injectLazy() | ||||
|     private fun mapper() = jacksonObjectMapper().enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL) | ||||
|             .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) | ||||
|     } | ||||
|  | ||||
|     fun loadSearches(): List<EXHSavedSearch>? { | ||||
|     fun loadSearches(): List<Pair<Long, EXHSavedSearch>> { | ||||
|         val loaded = prefs.eh_savedSearches().getOrDefault() | ||||
|         return try { | ||||
|             if (!loaded.isEmpty()) mapper.readValue<Array<EXHSavedSearch>>(loaded).toList() | ||||
|             else emptyList() | ||||
|         } catch(t: JsonProcessingException) { | ||||
|             // Load failed | ||||
|             Timber.e(t, "Failed to load saved searches!") | ||||
|             null | ||||
|         } | ||||
|         return loaded.map { | ||||
|             try { | ||||
|                 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) { | ||||
|                 // Load failed | ||||
|                 Timber.e(t, "Failed to load saved search!") | ||||
|                 t.printStackTrace() | ||||
|                 null | ||||
|             } | ||||
|         }.filterNotNull() | ||||
|     } | ||||
|     // 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 | ||||
|  | ||||
| @Deprecated("Now a delegated source") | ||||
| val HENTAI_CAFE_SOURCE_ID = SourceManager.DELEGATED_SOURCES.entries.find { | ||||
|     it.value.newSourceClass == HentaiCafe::class | ||||
| }!!.value.sourceId | ||||
|   | ||||
| @@ -34,5 +34,5 @@ object DebugFunctions { | ||||
|         it.favorite && db.getSearchMetadataForManga(it.id!!).executeAsBlocking() == null | ||||
|     } | ||||
|  | ||||
|     fun clearSavedSearches() = prefs.eh_savedSearches().set("") | ||||
|     fun clearSavedSearches() = prefs.eh_savedSearches().set(emptySet()) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user