From 95409f7eda0436cc89160f46ccf53439c711dee9 Mon Sep 17 00:00:00 2001 From: rebelonion <87634197+rebelonion@users.noreply.github.com> Date: Tue, 6 Feb 2024 18:58:21 -0600 Subject: [PATCH] fix: remove some overhead when storing sets --- .../connections/anilist/AnilistQueries.kt | 2 +- .../connections/anilist/AnilistViewModel.kt | 2 +- .../ani/dantotsu/media/anime/ExoplayerView.kt | 8 +-- .../dantotsu/settings/saving/PrefManager.kt | 69 ++++--------------- .../dantotsu/settings/saving/Preferences.kt | 2 +- 5 files changed, 20 insertions(+), 63 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt index d56dd111..f2103393 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -444,7 +444,7 @@ class AnilistQueries { } - suspend fun getGenresAndTags(activity: Activity): Boolean { + suspend fun getGenresAndTags(): Boolean { var genres: ArrayList? = PrefManager.getVal>(PrefName.GenresList) .toMutableList() as ArrayList? val adultTags = PrefManager.getVal>(PrefName.TagsListIsAdult).toMutableList() diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt index ef10fb73..5e3bacb9 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt @@ -104,7 +104,7 @@ class AnilistHomeViewModel : ViewModel() { if (!BuildConfig.FLAVOR.contains("fdroid")) { if (PrefManager.getVal(PrefName.CheckUpdate)) AppUpdater.check(context) } - genres.postValue(Anilist.query.getGenresAndTags(context)) + genres.postValue(Anilist.query.getGenresAndTags()) } val empty = MutableLiveData(null) diff --git a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt index 888e6be9..cbe39704 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt @@ -1244,10 +1244,10 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL media.anime!!.selectedEpisode!! ) - val set = PrefManager.getVal>(PrefName.ContinueAnime).toMutableSet() - if (set.contains(media.id)) set.remove(media.id) - set.add(media.id) - PrefManager.setVal(PrefName.ContinueAnime, set.toSet()) + val list = PrefManager.getVal>(PrefName.ContinuedAnime).toMutableList() + if (list.contains(media.id)) list.remove(media.id) + list.add(media.id) + PrefManager.setVal(PrefName.ContinuedAnime, list.toList()) lifecycleScope.launch(Dispatchers.IO) { extractor?.onVideoStopped(video) diff --git a/app/src/main/java/ani/dantotsu/settings/saving/PrefManager.kt b/app/src/main/java/ani/dantotsu/settings/saving/PrefManager.kt index 8f1b87ec..f66d1353 100644 --- a/app/src/main/java/ani/dantotsu/settings/saving/PrefManager.kt +++ b/app/src/main/java/ani/dantotsu/settings/saving/PrefManager.kt @@ -37,6 +37,7 @@ object PrefManager { Compat.importOldPrefs(context) } + @Suppress("UNCHECKED_CAST") fun setVal(prefName: PrefName, value: T?) { val pref = getPrefLocation(prefName.data.prefLocation) with(pref.edit()) { @@ -46,7 +47,7 @@ object PrefManager { is Float -> putFloat(prefName.name, value) is Long -> putLong(prefName.name, value) is String -> putString(prefName.name, value) - is Set<*> -> convertAndPutStringSet(prefName.name, value) + is Set<*> -> putStringSet(prefName.name, value as Set) null -> remove(prefName.name) else -> serializeClass(prefName.name, value, prefName.data.prefLocation) } @@ -64,10 +65,7 @@ object PrefManager { Float::class -> pref.getFloat(prefName.name, default as Float) as T Long::class -> pref.getLong(prefName.name, default as Long) as T String::class -> pref.getString(prefName.name, default as String?) as T - Set::class -> convertFromStringSet( - pref.getStringSet(prefName.name, null), - default - ) as T + Set::class -> pref.getStringSet(prefName.name, default as Set) as T List::class -> deserializeClass( prefName.name, @@ -100,9 +98,9 @@ object PrefManager { prefName.data.default as String? ) as T - Set::class -> convertFromStringSet( - pref.getStringSet(prefName.name, null), - prefName.data.default + Set::class -> pref.getStringSet( + prefName.name, + prefName.data.default as Set ) as T List::class -> deserializeClass( @@ -131,10 +129,7 @@ object PrefManager { Float::class -> pref.getFloat(prefName.name, default as Float) as T? Long::class -> pref.getLong(prefName.name, default as Long) as T? String::class -> pref.getString(prefName.name, default as String?) as T? - Set::class -> convertFromStringSet( - pref.getStringSet(prefName.name, null), - default - ) as T? + Set::class -> pref.getStringSet(prefName.name, default as Set) as T? else -> deserializeClass(prefName.name, default, prefName.data.prefLocation) } @@ -152,11 +147,7 @@ object PrefManager { is Float -> irrelevantPreferences!!.getFloat(key, default) as T is Long -> irrelevantPreferences!!.getLong(key, default) as T is String -> irrelevantPreferences!!.getString(key, default) as T - is Set<*> -> convertFromStringSet( - irrelevantPreferences!!.getStringSet(key, null), - default - ) as T - + is Set<*> -> irrelevantPreferences!!.getStringSet(key, default as Set) as T else -> throw IllegalArgumentException("Type not supported") } } catch (e: Exception) { @@ -193,9 +184,9 @@ object PrefManager { default as? String ) as T? - clazz.isAssignableFrom(Set::class.java) -> convertFromStringSet( - irrelevantPreferences!!.getStringSet(key, null), - default + clazz.isAssignableFrom(Set::class.java) -> irrelevantPreferences!!.getStringSet( + key, + default as? Set ?: setOf() ) as T? else -> deserializeClass(key, default, Location.Irrelevant) @@ -214,6 +205,7 @@ object PrefManager { } } + @Suppress("UNCHECKED_CAST") fun setCustomVal(key: String, value: T?) { //for custom force irrelevant with(irrelevantPreferences!!.edit()) { @@ -223,7 +215,7 @@ object PrefManager { is Float -> putFloat(key, value as Float) is Long -> putLong(key, value as Long) is String -> putString(key, value as String) - is Set<*> -> convertAndPutStringSet(key, value) + is Set<*> -> putStringSet(key, value as Set) null -> remove(key) else -> serializeClass(key, value, Location.Irrelevant) } @@ -370,41 +362,6 @@ object PrefManager { }!! } - private fun convertFromStringSet(stringSet: Set?, default: T): Set<*> { - if (stringSet.isNullOrEmpty()) return default as Set<*> - - return try { - val typeIdentifier = stringSet.first() - val convertedSet = stringSet.drop(1) // Remove the type identifier - when (typeIdentifier) { - "Int" -> convertedSet.mapNotNull { it.toIntOrNull() }.toSet() - "Boolean" -> convertedSet.mapNotNull { it.toBooleanStrictOrNull() }.toSet() - "Float" -> convertedSet.mapNotNull { it.toFloatOrNull() }.toSet() - "Long" -> convertedSet.mapNotNull { it.toLongOrNull() }.toSet() - "String" -> convertedSet.toSet() - else -> stringSet - } - } catch (e: Exception) { - snackString("Error converting preference: ${e.message}") - default as Set<*> - } - } - - private fun SharedPreferences.Editor.convertAndPutStringSet(key: String, value: Set<*>) { - val typeIdentifier = when (value.firstOrNull()) { - is Int -> "Int" - is Boolean -> "Boolean" - is Float -> "Float" - is Long -> "Long" - is String -> "String" - null -> return - else -> throw IllegalArgumentException("Type not supported") - } - val stringSet = setOf(typeIdentifier) + value.map { it.toString() } - putStringSet(key, stringSet) - } - - private fun serializeClass(key: String, value: T, location: Location) { val pref = getPrefLocation(location) try { diff --git a/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt b/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt index 533dc2ba..09027a3a 100644 --- a/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt +++ b/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt @@ -96,7 +96,7 @@ enum class PrefName(val data: Pref) { //TODO: Split this into multiple files Cast(Pref(Location.Player, Boolean::class, true)), Pip(Pref(Location.Player, Boolean::class, true)), RotationPlayer(Pref(Location.Player, Boolean::class, true)), - ContinueAnime(Pref(Location.Player, Set::class, setOf())), + ContinuedAnime(Pref(Location.Player, List::class, listOf())), //Reader ShowSource(Pref(Location.Reader, Boolean::class, true)),