From 8020b32541610d181d3cbd19652570e63e0e8a03 Mon Sep 17 00:00:00 2001 From: rebelonion <87634197+rebelonion@users.noreply.github.com> Date: Tue, 30 Jan 2024 00:39:12 -0600 Subject: [PATCH] backend preference wrapper --- app/src/main/java/ani/dantotsu/App.kt | 25 +-- app/src/main/java/ani/dantotsu/Functions.kt | 5 +- .../main/java/ani/dantotsu/MainActivity.kt | 25 +-- .../aniyomi/anime/custom/InjektModules.kt | 3 - .../dantotsu/connections/UpdateProgress.kt | 5 +- .../connections/anilist/AnilistQueries.kt | 19 +- .../connections/anilist/AnilistViewModel.kt | 10 +- .../ani/dantotsu/connections/anilist/Login.kt | 3 +- .../dantotsu/connections/anilist/UrlMedia.kt | 3 +- .../dantotsu/connections/discord/Discord.kt | 28 +-- .../connections/discord/DiscordService.kt | 28 +-- .../ani/dantotsu/connections/discord/Login.kt | 3 +- .../ani/dantotsu/connections/mal/Login.kt | 3 +- .../ani/dantotsu/download/DownloadsManager.kt | 9 +- .../download/anime/AnimeDownloaderService.kt | 6 +- .../download/anime/OfflineAnimeAdapter.kt | 8 +- .../download/anime/OfflineAnimeFragment.kt | 26 +-- .../download/manga/OfflineMangaAdapter.kt | 8 +- .../download/manga/OfflineMangaFragment.kt | 20 +- .../ani/dantotsu/download/video/Helper.kt | 11 +- .../java/ani/dantotsu/home/AnimeFragment.kt | 8 +- .../ani/dantotsu/home/AnimePageAdapter.kt | 18 +- .../java/ani/dantotsu/home/MangaFragment.kt | 9 +- .../ani/dantotsu/home/MangaPageAdapter.kt | 18 +- .../main/java/ani/dantotsu/home/NoInternet.kt | 10 +- .../java/ani/dantotsu/media/AuthorActivity.kt | 3 +- .../ani/dantotsu/media/CalendarActivity.kt | 3 +- .../media/CharacterDetailsActivity.kt | 3 +- .../java/ani/dantotsu/media/GenreActivity.kt | 3 +- .../dantotsu/media/MediaDetailsActivity.kt | 6 +- .../dantotsu/media/MediaDetailsViewModel.kt | 1 - .../ani/dantotsu/media/MediaInfoFragment.kt | 5 +- .../java/ani/dantotsu/media/SearchActivity.kt | 3 +- .../java/ani/dantotsu/media/SearchAdapter.kt | 13 +- .../dantotsu/media/SearchHistoryAdapter.kt | 28 +-- .../java/ani/dantotsu/media/StudioActivity.kt | 3 +- .../dantotsu/media/anime/AnimeWatchAdapter.kt | 9 +- .../media/anime/AnimeWatchFragment.kt | 11 +- .../dantotsu/media/anime/EpisodeAdapters.kt | 8 +- .../ani/dantotsu/media/anime/ExoplayerView.kt | 17 +- .../dantotsu/media/manga/MangaReadAdapter.kt | 8 +- .../manga/mangareader/MangaReaderActivity.kt | 16 +- .../novel/novelreader/NovelReaderActivity.kt | 3 +- .../ani/dantotsu/media/user/ListActivity.kt | 13 +- .../ani/dantotsu/offline/OfflineFragment.kt | 8 +- .../main/java/ani/dantotsu/others/LangSet.kt | 22 --- .../others/imagesearch/ImageSearchActivity.kt | 3 +- .../java/ani/dantotsu/parsers/AnimeSources.kt | 6 +- .../java/ani/dantotsu/parsers/MangaSources.kt | 8 +- .../parsers/novel/NovelExtensionGithubApi.kt | 9 +- .../dantotsu/settings/ExtensionsActivity.kt | 3 +- .../java/ani/dantotsu/settings/FAQActivity.kt | 3 +- .../settings/PlayerSettingsActivity.kt | 3 +- .../settings/ReaderSettingsActivity.kt | 3 +- .../ani/dantotsu/settings/SettingsActivity.kt | 114 ++++-------- .../settings/SettingsDialogFragment.kt | 18 +- .../settings/UserInterfaceSettingsActivity.kt | 3 +- .../dantotsu/settings/saving/PrefWrapper.kt | 171 ++++++++++++++++++ .../dantotsu/settings/saving/Preferences.kt | 43 +++++ .../saving}/SharedPreferenceLiveData.kt | 2 +- .../saving/internal/PreferenceInternal.kt | 19 ++ .../subcriptions/NotificationClickReceiver.kt | 6 +- .../java/ani/dantotsu/themes/ThemeManager.kt | 20 +- .../CurrentlyAiringWidgetConfigureActivity.kt | 3 +- .../util/AnimeExtensionInstallActivity.kt | 3 +- .../util/MangaExtensionInstallActivity.kt | 3 +- 66 files changed, 482 insertions(+), 458 deletions(-) delete mode 100644 app/src/main/java/ani/dantotsu/others/LangSet.kt create mode 100644 app/src/main/java/ani/dantotsu/settings/saving/PrefWrapper.kt create mode 100644 app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt rename app/src/main/java/ani/dantotsu/{others => settings/saving}/SharedPreferenceLiveData.kt (99%) create mode 100644 app/src/main/java/ani/dantotsu/settings/saving/internal/PreferenceInternal.kt diff --git a/app/src/main/java/ani/dantotsu/App.kt b/app/src/main/java/ani/dantotsu/App.kt index 30683f4c..0fef61f2 100644 --- a/app/src/main/java/ani/dantotsu/App.kt +++ b/app/src/main/java/ani/dantotsu/App.kt @@ -14,6 +14,8 @@ import ani.dantotsu.parsers.MangaSources import ani.dantotsu.parsers.NovelSources import ani.dantotsu.parsers.novel.NovelExtensionManager import ani.dantotsu.settings.SettingsActivity +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import com.google.android.material.color.DynamicColors import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.firebase.crashlytics.ktx.crashlytics @@ -51,8 +53,10 @@ class App : MultiDexApplication() { override fun onCreate() { super.onCreate() - val sharedPreferences = getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - val useMaterialYou = sharedPreferences.getBoolean("use_material_you", false) + + PrefWrapper.init(this) + + val useMaterialYou = PrefWrapper.getVal(PrefName.UseMaterialYou, false) if (useMaterialYou) { DynamicColors.applyToActivitiesIfAvailable(this) //TODO: HarmonizedColors @@ -60,19 +64,10 @@ class App : MultiDexApplication() { registerActivityLifecycleCallbacks(mFTActivityLifecycleCallbacks) Firebase.crashlytics.setCrashlyticsCollectionEnabled(!DisabledReports) - getSharedPreferences( - getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ).getBoolean("shared_user_id", true).let { + PrefWrapper.getVal(PrefName.SharedUserID, true).let { if (!it) return@let - val dUsername = getSharedPreferences( - getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ).getString("discord_username", null) - val aUsername = getSharedPreferences( - getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ).getString("anilist_username", null) + val dUsername = PrefWrapper.getVal(PrefName.DiscordUserName, null as String?) + val aUsername = PrefWrapper.getVal(PrefName.AnilistUserName, null as String?) if (dUsername != null || aUsername != null) { Firebase.crashlytics.setUserId("$dUsername - $aUsername") } @@ -104,7 +99,7 @@ class App : MultiDexApplication() { mangaScope.launch { mangaExtensionManager.findAvailableExtensions() logger("Manga Extensions: ${mangaExtensionManager.installedExtensionsFlow.first()}") - MangaSources.init(mangaExtensionManager.installedExtensionsFlow, this@App) + MangaSources.init(mangaExtensionManager.installedExtensionsFlow) } val novelScope = CoroutineScope(Dispatchers.Default) novelScope.launch { diff --git a/app/src/main/java/ani/dantotsu/Functions.kt b/app/src/main/java/ani/dantotsu/Functions.kt index da1325fa..c06b5356 100644 --- a/app/src/main/java/ani/dantotsu/Functions.kt +++ b/app/src/main/java/ani/dantotsu/Functions.kt @@ -48,6 +48,8 @@ import ani.dantotsu.databinding.ItemCountDownBinding import ani.dantotsu.media.Media import ani.dantotsu.parsers.ShowResponse import ani.dantotsu.settings.UserInterfaceSettings +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.subcriptions.NotificationClickReceiver import com.bumptech.glide.Glide import com.bumptech.glide.load.model.GlideUrl @@ -966,8 +968,7 @@ const val INCOGNITO_CHANNEL_ID = 26 fun incognitoNotification(context: Context) { val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager - val incognito = context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - .getBoolean("incognito", false) + val incognito = PrefWrapper.getVal(PrefName.Incognito, false) if (incognito) { val intent = Intent(context, NotificationClickReceiver::class.java) val pendingIntent = PendingIntent.getBroadcast( diff --git a/app/src/main/java/ani/dantotsu/MainActivity.kt b/app/src/main/java/ani/dantotsu/MainActivity.kt index 303861cf..878a7040 100644 --- a/app/src/main/java/ani/dantotsu/MainActivity.kt +++ b/app/src/main/java/ani/dantotsu/MainActivity.kt @@ -2,7 +2,6 @@ package ani.dantotsu import android.animation.ObjectAnimator import android.annotation.SuppressLint -import android.content.Context import android.content.Intent import android.graphics.drawable.Animatable import android.graphics.drawable.GradientDrawable @@ -45,9 +44,11 @@ import ani.dantotsu.home.MangaFragment import ani.dantotsu.home.NoInternet import ani.dantotsu.media.MediaDetailsActivity import ani.dantotsu.others.CustomBottomDialog -import ani.dantotsu.others.LangSet -import ani.dantotsu.others.SharedPreferenceBooleanLiveData import ani.dantotsu.settings.UserInterfaceSettings +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper +import ani.dantotsu.settings.saving.PrefWrapper.asLiveBool +import ani.dantotsu.settings.saving.SharedPreferenceBooleanLiveData import ani.dantotsu.subcriptions.Subscription.Companion.startSubscription import ani.dantotsu.themes.ThemeManager import eu.kanade.domain.source.service.SourcePreferences @@ -77,7 +78,7 @@ class MainActivity : AppCompatActivity() { @OptIn(UnstableApi::class) override fun onCreate(savedInstanceState: Bundle?) { ThemeManager(this).applyTheme() - LangSet.setLocale(this) + super.onCreate(savedInstanceState) //get FRAGMENT_CLASS_NAME from intent @@ -95,12 +96,8 @@ class MainActivity : AppCompatActivity() { backgroundDrawable.setColor(semiTransparentColor) _bottomBar.background = backgroundDrawable } - val sharedPreferences = getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - val colorOverflow = sharedPreferences.getBoolean("colorOverflow", false) - if (!colorOverflow) { - _bottomBar.background = ContextCompat.getDrawable(this, R.drawable.bottom_nav_gray) + _bottomBar.background = ContextCompat.getDrawable(this, R.drawable.bottom_nav_gray) - } val offset = try { val statusBarHeightId = resources.getIdentifier("status_bar_height", "dimen", "android") @@ -111,11 +108,10 @@ class MainActivity : AppCompatActivity() { val layoutParams = binding.incognito.layoutParams as ViewGroup.MarginLayoutParams layoutParams.topMargin = 11 * offset / 12 binding.incognito.layoutParams = layoutParams - incognitoLiveData = SharedPreferenceBooleanLiveData( - sharedPreferences, - "incognito", + incognitoLiveData = PrefWrapper.getLiveVal( + PrefName.Incognito, false - ) + ).asLiveBool() incognitoLiveData.observe(this) { if (it) { val slideDownAnim = ObjectAnimator.ofFloat( @@ -228,8 +224,7 @@ class MainActivity : AppCompatActivity() { } } - val offlineMode = getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - .getBoolean("offlineMode", false) + val offlineMode = PrefWrapper.getVal(PrefName.OfflineMode, false) if (!isOnline(this)) { snackString(this@MainActivity.getString(R.string.no_internet_connection)) startActivity(Intent(this, NoInternet::class.java)) diff --git a/app/src/main/java/ani/dantotsu/aniyomi/anime/custom/InjektModules.kt b/app/src/main/java/ani/dantotsu/aniyomi/anime/custom/InjektModules.kt index 19e45a58..d0f52269 100644 --- a/app/src/main/java/ani/dantotsu/aniyomi/anime/custom/InjektModules.kt +++ b/app/src/main/java/ani/dantotsu/aniyomi/anime/custom/InjektModules.kt @@ -45,9 +45,6 @@ class AppModule(val app: Application) : InjektModule { addSingletonFactory { AndroidAnimeSourceManager(app, get()) } addSingletonFactory { AndroidMangaSourceManager(app, get()) } - val sharedPreferences = app.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - addSingleton(sharedPreferences) - addSingletonFactory { Json { ignoreUnknownKeys = true diff --git a/app/src/main/java/ani/dantotsu/connections/UpdateProgress.kt b/app/src/main/java/ani/dantotsu/connections/UpdateProgress.kt index fb08c59d..72338f58 100644 --- a/app/src/main/java/ani/dantotsu/connections/UpdateProgress.kt +++ b/app/src/main/java/ani/dantotsu/connections/UpdateProgress.kt @@ -6,14 +6,15 @@ import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.mal.MAL import ani.dantotsu.currContext import ani.dantotsu.media.Media +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.toast import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch fun updateProgress(media: Media, number: String) { - val incognito = currContext()?.getSharedPreferences("Dantotsu", 0) - ?.getBoolean("incognito", false) ?: false + val incognito = PrefWrapper.getVal(PrefName.Incognito, false) if (!incognito) { if (Anilist.userid != null) { CoroutineScope(Dispatchers.IO).launch { 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 8042c5a5..4fea9569 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -1,7 +1,6 @@ package ani.dantotsu.connections.anilist import android.app.Activity -import android.content.Context import ani.dantotsu.R import ani.dantotsu.checkGenreTime import ani.dantotsu.checkId @@ -20,6 +19,8 @@ import ani.dantotsu.media.Media import ani.dantotsu.media.Studio import ani.dantotsu.others.MalScraper import ani.dantotsu.saveData +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.snackString import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll @@ -35,15 +36,7 @@ class AnilistQueries { }.also { println("time : $it") } val user = response?.data?.user ?: return false - currContext()?.let { - it.getSharedPreferences( - it.getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ) - .edit() - .putString("anilist_username", user.name) - .apply() - } + PrefWrapper.setVal(PrefName.AnilistUserName, user.name) Anilist.userid = user.id Anilist.username = user.name @@ -424,9 +417,9 @@ class AnilistQueries { sorted["Favourites"]?.sortWith(compareBy { it.userFavOrder }) sorted["All"] = all - val listsort = currContext()?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - ?.getString("sort_order", "score") - val sort = listsort ?: sortOrder ?: options?.rowOrder + val listSort = if (anime) PrefWrapper.getVal(PrefName.AnimeListSortOrder, "score") + else PrefWrapper.getVal(PrefName.MangaListSortOrder, "score") + val sort = listSort ?: sortOrder ?: options?.rowOrder for (i in sorted.keys) { when (sort) { "score" -> sorted[i]?.sortWith { b, a -> 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 4cc8451f..b93d9052 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt @@ -11,6 +11,8 @@ import ani.dantotsu.connections.mal.MAL import ani.dantotsu.loadData import ani.dantotsu.media.Media import ani.dantotsu.others.AppUpdater +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.snackString import ani.dantotsu.tryWithSuspend import kotlinx.coroutines.CoroutineScope @@ -19,12 +21,8 @@ import kotlinx.coroutines.launch suspend fun getUserId(context: Context, block: () -> Unit) { CoroutineScope(Dispatchers.IO).launch { - val sharedPref = context.getSharedPreferences( - context.getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ) - val token = sharedPref.getString("discord_token", null) - val userid = sharedPref.getString("discord_id", null) + val token = PrefWrapper.getVal(PrefName.DiscordToken, null as String?) + val userid = PrefWrapper.getVal(PrefName.DiscordId, null as String?) if (userid == null && token != null) { /*if (!Discord.getUserData()) snackString(context.getString(R.string.error_loading_discord_user_data))*/ diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/Login.kt b/app/src/main/java/ani/dantotsu/connections/anilist/Login.kt index fdba6d3a..497ca01f 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/Login.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/Login.kt @@ -6,14 +6,13 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import ani.dantotsu.logError import ani.dantotsu.logger -import ani.dantotsu.others.LangSet import ani.dantotsu.startMainActivity import ani.dantotsu.themes.ThemeManager class Login : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() val data: Uri? = intent?.data logger(data.toString()) diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/UrlMedia.kt b/app/src/main/java/ani/dantotsu/connections/anilist/UrlMedia.kt index 30be1706..53df3c05 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/UrlMedia.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/UrlMedia.kt @@ -5,14 +5,13 @@ import android.net.Uri import android.os.Bundle import androidx.core.os.bundleOf import ani.dantotsu.loadMedia -import ani.dantotsu.others.LangSet import ani.dantotsu.startMainActivity import ani.dantotsu.themes.ThemeManager class UrlMedia : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() var id: Int? = intent?.extras?.getInt("media", 0) ?: 0 var isMAL = false diff --git a/app/src/main/java/ani/dantotsu/connections/discord/Discord.kt b/app/src/main/java/ani/dantotsu/connections/discord/Discord.kt index 95450305..d3adc2ff 100644 --- a/app/src/main/java/ani/dantotsu/connections/discord/Discord.kt +++ b/app/src/main/java/ani/dantotsu/connections/discord/Discord.kt @@ -6,6 +6,8 @@ import android.widget.TextView import androidx.core.content.edit import ani.dantotsu.R import ani.dantotsu.others.CustomBottomDialog +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.toast import ani.dantotsu.tryWith import io.noties.markwon.Markwon @@ -18,37 +20,19 @@ object Discord { var userid: String? = null var avatar: String? = null - const val TOKEN = "discord_token" fun getSavedToken(context: Context): Boolean { - val sharedPref = context.getSharedPreferences( - context.getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ) - token = sharedPref.getString(TOKEN, null) + token = PrefWrapper.getVal( + PrefName.DiscordToken, null as String?) return token != null } fun saveToken(context: Context, token: String) { - val sharedPref = context.getSharedPreferences( - context.getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ) - sharedPref.edit { - putString(TOKEN, token) - commit() - } + PrefWrapper.setVal(PrefName.DiscordToken, token) } fun removeSavedToken(context: Context) { - val sharedPref = context.getSharedPreferences( - context.getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ) - sharedPref.edit { - remove(TOKEN) - commit() - } + PrefWrapper.removeVal(PrefName.DiscordToken) tryWith(true) { val dir = File(context.filesDir?.parentFile, "app_webview") diff --git a/app/src/main/java/ani/dantotsu/connections/discord/DiscordService.kt b/app/src/main/java/ani/dantotsu/connections/discord/DiscordService.kt index 3506ea25..5023ca70 100644 --- a/app/src/main/java/ani/dantotsu/connections/discord/DiscordService.kt +++ b/app/src/main/java/ani/dantotsu/connections/discord/DiscordService.kt @@ -24,6 +24,8 @@ import ani.dantotsu.R import ani.dantotsu.connections.discord.serializers.Presence import ani.dantotsu.connections.discord.serializers.User import ani.dantotsu.isOnline +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import com.google.gson.JsonArray import com.google.gson.JsonObject import com.google.gson.JsonParser @@ -149,19 +151,11 @@ class DiscordService : Service() { } fun saveProfile(response: String) { - val sharedPref = baseContext.getSharedPreferences( - baseContext.getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ) val user = json.decodeFromString(response).d.user log("User data: $user") - with(sharedPref.edit()) { - putString("discord_username", user.username) - putString("discord_id", user.id) - putString("discord_avatar", user.avatar) - apply() - } - + PrefWrapper.setVal(PrefName.DiscordUserName, user.username) + PrefWrapper.setVal(PrefName.DiscordId, user.id) + PrefWrapper.setVal(PrefName.DiscordAvatar, user.avatar) } override fun onBind(p0: Intent?): IBinder? = null @@ -318,17 +312,13 @@ class DiscordService : Service() { } fun getToken(context: Context): String { - val sharedPref = context.getSharedPreferences( - context.getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ) - val token = sharedPref.getString(Discord.TOKEN, null) - if (token == null) { + val token = PrefWrapper.getVal(PrefName.DiscordToken, null as String?) + return if (token == null) { log("WebSocket: Token not found") errorNotification("Could not set the presence", "token not found") - return "" + "" } else { - return token + token } } diff --git a/app/src/main/java/ani/dantotsu/connections/discord/Login.kt b/app/src/main/java/ani/dantotsu/connections/discord/Login.kt index 98048844..5d39cc86 100644 --- a/app/src/main/java/ani/dantotsu/connections/discord/Login.kt +++ b/app/src/main/java/ani/dantotsu/connections/discord/Login.kt @@ -11,7 +11,6 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import ani.dantotsu.R import ani.dantotsu.connections.discord.Discord.saveToken -import ani.dantotsu.others.LangSet import ani.dantotsu.startMainActivity import ani.dantotsu.themes.ThemeManager @@ -20,7 +19,7 @@ class Login : AppCompatActivity() { @SuppressLint("SetJavaScriptEnabled") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { val process = getProcessName() diff --git a/app/src/main/java/ani/dantotsu/connections/mal/Login.kt b/app/src/main/java/ani/dantotsu/connections/mal/Login.kt index 9ec2ca5a..b38baaa5 100644 --- a/app/src/main/java/ani/dantotsu/connections/mal/Login.kt +++ b/app/src/main/java/ani/dantotsu/connections/mal/Login.kt @@ -10,7 +10,6 @@ import ani.dantotsu.connections.mal.MAL.clientId import ani.dantotsu.connections.mal.MAL.saveResponse import ani.dantotsu.loadData import ani.dantotsu.logError -import ani.dantotsu.others.LangSet import ani.dantotsu.snackString import ani.dantotsu.startMainActivity import ani.dantotsu.themes.ThemeManager @@ -21,7 +20,7 @@ import kotlinx.coroutines.launch class Login : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() try { val data: Uri = intent?.data diff --git a/app/src/main/java/ani/dantotsu/download/DownloadsManager.kt b/app/src/main/java/ani/dantotsu/download/DownloadsManager.kt index c5a96546..1e1a4e64 100644 --- a/app/src/main/java/ani/dantotsu/download/DownloadsManager.kt +++ b/app/src/main/java/ani/dantotsu/download/DownloadsManager.kt @@ -1,17 +1,16 @@ package ani.dantotsu.download import android.content.Context -import android.content.SharedPreferences import android.os.Environment import android.widget.Toast +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import com.google.gson.Gson import com.google.gson.reflect.TypeToken import java.io.File import java.io.Serializable class DownloadsManager(private val context: Context) { - private val prefs: SharedPreferences = - context.getSharedPreferences("downloads_pref", Context.MODE_PRIVATE) private val gson = Gson() private val downloadsList = loadDownloads().toMutableList() @@ -24,11 +23,11 @@ class DownloadsManager(private val context: Context) { private fun saveDownloads() { val jsonString = gson.toJson(downloadsList) - prefs.edit().putString("downloads_key", jsonString).apply() + PrefWrapper.setVal(PrefName.DownloadsKeys, jsonString) } private fun loadDownloads(): List { - val jsonString = prefs.getString("downloads_key", null) + val jsonString = PrefWrapper.getVal(PrefName.DownloadsKeys, null as String?) return if (jsonString != null) { val type = object : TypeToken>() {}.type gson.fromJson(jsonString, type) diff --git a/app/src/main/java/ani/dantotsu/download/anime/AnimeDownloaderService.kt b/app/src/main/java/ani/dantotsu/download/anime/AnimeDownloaderService.kt index a69ef446..6b254bec 100644 --- a/app/src/main/java/ani/dantotsu/download/anime/AnimeDownloaderService.kt +++ b/app/src/main/java/ani/dantotsu/download/anime/AnimeDownloaderService.kt @@ -32,6 +32,7 @@ import ani.dantotsu.media.SubtitleDownloader import ani.dantotsu.media.anime.AnimeWatchFragment import ani.dantotsu.parsers.Subtitle import ani.dantotsu.parsers.Video +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.snackString import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.gson.GsonBuilder @@ -294,10 +295,7 @@ class AnimeDownloaderService : Service() { builder.setContentText("${task.title} - ${task.episode} Download completed") notificationManager.notify(NOTIFICATION_ID, builder.build()) snackString("${task.title} - ${task.episode} Download completed") - getSharedPreferences( - getString(R.string.anime_downloads), - Context.MODE_PRIVATE - ).edit().putString( + PrefWrapper.getAnimeDownloadPreferences().edit().putString( task.getTaskName(), task.video.file.url ).apply() diff --git a/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt b/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt index 4cd57f05..de5c9503 100644 --- a/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt +++ b/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt @@ -12,6 +12,8 @@ import android.widget.LinearLayout import android.widget.TextView import androidx.cardview.widget.CardView import ani.dantotsu.R +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper class OfflineAnimeAdapter( @@ -22,8 +24,7 @@ class OfflineAnimeAdapter( private val inflater: LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater private var originalItems: List = items - private var style = - context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).getInt("offline_view", 0) + private var style = PrefWrapper.getVal(PrefName.OfflineView, 0) override fun getCount(): Int { return items.size @@ -105,8 +106,7 @@ class OfflineAnimeAdapter( } fun notifyNewGrid() { - style = - context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).getInt("offline_view", 0) + style = PrefWrapper.getVal(PrefName.OfflineView, 0) notifyDataSetChanged() } } \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeFragment.kt b/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeFragment.kt index 32678a1a..8a2a780b 100644 --- a/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeFragment.kt +++ b/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeFragment.kt @@ -44,6 +44,8 @@ import ani.dantotsu.navBarHeight import ani.dantotsu.setSafeOnClickListener import ani.dantotsu.settings.SettingsDialogFragment import ani.dantotsu.settings.UserInterfaceSettings +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.snackString import com.google.android.material.card.MaterialCardView import com.google.android.material.imageview.ShapeableImageView @@ -98,12 +100,9 @@ class OfflineAnimeFragment : Fragment(), OfflineAnimeSearchListener { if (!uiSettings.immersiveMode) { view.rootView.fitsSystemWindows = true } - val colorOverflow = currContext()?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - ?.getBoolean("colorOverflow", false) ?: false - if (!colorOverflow) { - textInputLayout.boxBackgroundColor = (color and 0x00FFFFFF) or 0x28000000.toInt() - materialCardView.setCardBackgroundColor((color and 0x00FFFFFF) or 0x28000000.toInt()) - } + + textInputLayout.boxBackgroundColor = (color and 0x00FFFFFF) or 0x28000000.toInt() + materialCardView.setCardBackgroundColor((color and 0x00FFFFFF) or 0x28000000.toInt()) val searchView = view.findViewById(R.id.animeSearchBarText) searchView.addTextChangedListener(object : TextWatcher { @@ -117,8 +116,7 @@ class OfflineAnimeFragment : Fragment(), OfflineAnimeSearchListener { onSearchQuery(s.toString()) } }) - var style = context?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - ?.getInt("offline_view", 0) + var style = PrefWrapper.getVal(PrefName.OfflineView, 0) val layoutList = view.findViewById(R.id.downloadedList) val layoutcompact = view.findViewById(R.id.downloadedGrid) var selected = when (style) { @@ -137,8 +135,7 @@ class OfflineAnimeFragment : Fragment(), OfflineAnimeSearchListener { layoutList.setOnClickListener { selected(it as ImageView) style = 0 - context?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE)?.edit() - ?.putInt("offline_view", style!!)?.apply() + PrefWrapper.setVal(PrefName.OfflineView, style) gridView.visibility = View.GONE gridView = view.findViewById(R.id.gridView) adapter.notifyNewGrid() @@ -148,8 +145,7 @@ class OfflineAnimeFragment : Fragment(), OfflineAnimeSearchListener { layoutcompact.setOnClickListener { selected(it as ImageView) style = 1 - context?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE)?.edit() - ?.putInt("offline_view", style!!)?.apply() + PrefWrapper.setVal(PrefName.OfflineView, style) gridView.visibility = View.GONE gridView = view.findViewById(R.id.gridView1) adapter.notifyNewGrid() @@ -216,11 +212,7 @@ class OfflineAnimeFragment : Fragment(), OfflineAnimeSearchListener { builder.setMessage("Are you sure you want to delete ${item.title}?") builder.setPositiveButton("Yes") { _, _ -> downloadManager.removeMedia(item.title, type) - val mediaIds = requireContext().getSharedPreferences( - getString(R.string.anime_downloads), - Context.MODE_PRIVATE - ) - ?.all?.filter { it.key.contains(item.title) }?.values ?: emptySet() + val mediaIds = PrefWrapper.getAnimeDownloadPreferences().all?.filter { it.key.contains(item.title) }?.values ?: emptySet() if (mediaIds.isEmpty()) { snackString("No media found") // if this happens, terrible things have happened } diff --git a/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt b/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt index 4ec6ab43..a885355f 100644 --- a/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt +++ b/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt @@ -11,6 +11,8 @@ import android.widget.LinearLayout import android.widget.TextView import androidx.cardview.widget.CardView import ani.dantotsu.R +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper class OfflineMangaAdapter( @@ -21,8 +23,7 @@ class OfflineMangaAdapter( private val inflater: LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater private var originalItems: List = items - private var style = - context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).getInt("offline_view", 0) + private var style = PrefWrapper.getVal(PrefName.OfflineView, 0) override fun getCount(): Int { return items.size @@ -104,8 +105,7 @@ class OfflineMangaAdapter( } fun notifyNewGrid() { - style = - context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).getInt("offline_view", 0) + style = PrefWrapper.getVal(PrefName.OfflineView, 0) notifyDataSetChanged() } } \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaFragment.kt b/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaFragment.kt index 98586932..b0fdeddf 100644 --- a/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaFragment.kt +++ b/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaFragment.kt @@ -41,6 +41,8 @@ import ani.dantotsu.navBarHeight import ani.dantotsu.setSafeOnClickListener import ani.dantotsu.settings.SettingsDialogFragment import ani.dantotsu.settings.UserInterfaceSettings +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.snackString import com.google.android.material.card.MaterialCardView import com.google.android.material.imageview.ShapeableImageView @@ -91,12 +93,9 @@ class OfflineMangaFragment : Fragment(), OfflineMangaSearchListener { if (!uiSettings.immersiveMode) { view.rootView.fitsSystemWindows = true } - val colorOverflow = currContext()?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - ?.getBoolean("colorOverflow", false) ?: false - if (!colorOverflow) { - textInputLayout.boxBackgroundColor = (color and 0x00FFFFFF) or 0x28000000.toInt() - materialCardView.setCardBackgroundColor((color and 0x00FFFFFF) or 0x28000000.toInt()) - } + + textInputLayout.boxBackgroundColor = (color and 0x00FFFFFF) or 0x28000000.toInt() + materialCardView.setCardBackgroundColor((color and 0x00FFFFFF) or 0x28000000.toInt()) val searchView = view.findViewById(R.id.animeSearchBarText) searchView.addTextChangedListener(object : TextWatcher { @@ -110,8 +109,7 @@ class OfflineMangaFragment : Fragment(), OfflineMangaSearchListener { onSearchQuery(s.toString()) } }) - var style = context?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - ?.getInt("offline_view", 0) + var style = PrefWrapper.getVal(PrefName.OfflineView, 0) val layoutList = view.findViewById(R.id.downloadedList) val layoutcompact = view.findViewById(R.id.downloadedGrid) var selected = when (style) { @@ -130,8 +128,7 @@ class OfflineMangaFragment : Fragment(), OfflineMangaSearchListener { layoutList.setOnClickListener { selected(it as ImageView) style = 0 - requireContext().getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).edit() - .putInt("offline_view", style!!).apply() + PrefWrapper.setVal(PrefName.OfflineView, style) gridView.visibility = View.GONE gridView = view.findViewById(R.id.gridView) adapter.notifyNewGrid() @@ -142,8 +139,7 @@ class OfflineMangaFragment : Fragment(), OfflineMangaSearchListener { layoutcompact.setOnClickListener { selected(it as ImageView) style = 1 - requireContext().getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).edit() - .putInt("offline_view", style!!).apply() + PrefWrapper.setVal(PrefName.OfflineView, style) gridView.visibility = View.GONE gridView = view.findViewById(R.id.gridView1) adapter.notifyNewGrid() diff --git a/app/src/main/java/ani/dantotsu/download/video/Helper.kt b/app/src/main/java/ani/dantotsu/download/video/Helper.kt index e1438014..5ad05c16 100644 --- a/app/src/main/java/ani/dantotsu/download/video/Helper.kt +++ b/app/src/main/java/ani/dantotsu/download/video/Helper.kt @@ -43,6 +43,7 @@ import ani.dantotsu.parsers.Subtitle import ani.dantotsu.parsers.SubtitleType import ani.dantotsu.parsers.Video import ani.dantotsu.parsers.VideoType +import ani.dantotsu.settings.saving.PrefWrapper import eu.kanade.tachiyomi.network.NetworkHelper import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -229,19 +230,13 @@ object Helper { DownloadService.sendRemoveDownload( context, ExoplayerDownloadService::class.java, - context.getSharedPreferences( - getString(context, R.string.anime_downloads), - Context.MODE_PRIVATE - ).getString( + PrefWrapper.getAnimeDownloadPreferences().getString( animeDownloadTask.getTaskName(), "" ) ?: "", false ) - context.getSharedPreferences( - getString(context, R.string.anime_downloads), - Context.MODE_PRIVATE - ).edit() + PrefWrapper.getAnimeDownloadPreferences().edit() .remove(animeDownloadTask.getTaskName()) .apply() downloadsManger.removeDownload( diff --git a/app/src/main/java/ani/dantotsu/home/AnimeFragment.kt b/app/src/main/java/ani/dantotsu/home/AnimeFragment.kt index 7aecd40b..baaf95d6 100644 --- a/app/src/main/java/ani/dantotsu/home/AnimeFragment.kt +++ b/app/src/main/java/ani/dantotsu/home/AnimeFragment.kt @@ -2,9 +2,7 @@ package ani.dantotsu.home import android.animation.ObjectAnimator import android.annotation.SuppressLint -import android.content.Context import android.content.Intent -import android.content.SharedPreferences import android.os.Build import android.os.Bundle import android.view.LayoutInflater @@ -36,6 +34,8 @@ import ani.dantotsu.media.SearchActivity import ani.dantotsu.navBarHeight import ani.dantotsu.px import ani.dantotsu.settings.UserInterfaceSettings +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.snackString import ani.dantotsu.statusBarHeight import kotlinx.coroutines.Dispatchers @@ -271,8 +271,8 @@ class AnimeFragment : Fragment() { model.loaded = true model.loadTrending(1) model.loadUpdated() - model.loadPopular("ANIME", sort = Anilist.sortBy[1], onList = Injekt.get() - .getBoolean("popular_list", false)) + model.loadPopular("ANIME", sort = Anilist.sortBy[1], onList = PrefWrapper.getVal( + PrefName.PopularAnimeList, false)) } live.postValue(false) _binding?.animeRefresh?.isRefreshing = false diff --git a/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt b/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt index 5ee05276..40299a4b 100644 --- a/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt +++ b/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt @@ -34,6 +34,8 @@ import ani.dantotsu.setSlideIn import ani.dantotsu.setSlideUp import ani.dantotsu.settings.SettingsDialogFragment import ani.dantotsu.settings.UserInterfaceSettings +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.statusBarHeight import com.google.android.material.card.MaterialCardView import com.google.android.material.textfield.TextInputLayout @@ -68,13 +70,8 @@ class AnimePageAdapter : RecyclerView.Adapter onIncludeListClick.invoke(isChecked) - currContext()?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE)?.edit() - ?.putBoolean("popular_list", isChecked)?.apply() + PrefWrapper.setVal(PrefName.PopularAnimeList, isChecked) } if (ready.value == false) ready.postValue(true) diff --git a/app/src/main/java/ani/dantotsu/home/MangaFragment.kt b/app/src/main/java/ani/dantotsu/home/MangaFragment.kt index 07c7479e..db244a90 100644 --- a/app/src/main/java/ani/dantotsu/home/MangaFragment.kt +++ b/app/src/main/java/ani/dantotsu/home/MangaFragment.kt @@ -2,8 +2,6 @@ package ani.dantotsu.home import android.animation.ObjectAnimator import android.annotation.SuppressLint -import android.content.Context -import android.content.SharedPreferences import android.os.Build import android.os.Bundle import android.view.LayoutInflater @@ -33,6 +31,8 @@ import ani.dantotsu.media.ProgressAdapter import ani.dantotsu.navBarHeight import ani.dantotsu.px import ani.dantotsu.settings.UserInterfaceSettings +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.snackString import ani.dantotsu.statusBarHeight import kotlinx.coroutines.Dispatchers @@ -245,8 +245,9 @@ class MangaFragment : Fragment() { model.loaded = true model.loadTrending() model.loadTrendingNovel() - model.loadPopular("MANGA", sort = Anilist.sortBy[1], onList = Injekt.get() - .getBoolean("popular_list", false) ) + model.loadPopular("MANGA", sort = Anilist.sortBy[1], onList = PrefWrapper.getVal( + PrefName.PopularMangaList, false + )) } live.postValue(false) _binding?.mangaRefresh?.isRefreshing = false diff --git a/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt b/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt index 5cb0bec7..60c18f43 100644 --- a/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt +++ b/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt @@ -33,6 +33,8 @@ import ani.dantotsu.setSlideIn import ani.dantotsu.setSlideUp import ani.dantotsu.settings.SettingsDialogFragment import ani.dantotsu.settings.UserInterfaceSettings +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.statusBarHeight import com.google.android.material.card.MaterialCardView import com.google.android.material.textfield.TextInputLayout @@ -67,13 +69,8 @@ class MangaPageAdapter : RecyclerView.Adapter onIncludeListClick.invoke(isChecked) - currContext()?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE)?.edit() - ?.putBoolean("popular_list", isChecked)?.apply() + PrefWrapper.setVal(PrefName.PopularMangaList, isChecked) } if (ready.value == false) ready.postValue(true) diff --git a/app/src/main/java/ani/dantotsu/home/NoInternet.kt b/app/src/main/java/ani/dantotsu/home/NoInternet.kt index 147cf887..b6326221 100644 --- a/app/src/main/java/ani/dantotsu/home/NoInternet.kt +++ b/app/src/main/java/ani/dantotsu/home/NoInternet.kt @@ -1,6 +1,5 @@ package ani.dantotsu.home -import android.content.Context import android.graphics.drawable.GradientDrawable import android.os.Build import android.os.Bundle @@ -26,7 +25,6 @@ import ani.dantotsu.initActivity import ani.dantotsu.loadData import ani.dantotsu.navBarHeight import ani.dantotsu.offline.OfflineFragment -import ani.dantotsu.others.LangSet import ani.dantotsu.selectedOption import ani.dantotsu.settings.UserInterfaceSettings import ani.dantotsu.snackString @@ -39,7 +37,7 @@ class NoInternet : AppCompatActivity() { private var uiSettings = UserInterfaceSettings() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivityNoInternetBinding.inflate(layoutInflater) @@ -54,12 +52,8 @@ class NoInternet : AppCompatActivity() { backgroundDrawable.setColor(semiTransparentColor) _bottomBar.background = backgroundDrawable } - val colorOverflow = this.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - .getBoolean("colorOverflow", false) - if (!colorOverflow) { - _bottomBar.background = ContextCompat.getDrawable(this, R.drawable.bottom_nav_gray) + _bottomBar.background = ContextCompat.getDrawable(this, R.drawable.bottom_nav_gray) - } var doubleBackToExitPressedOnce = false onBackPressedDispatcher.addCallback(this) { diff --git a/app/src/main/java/ani/dantotsu/media/AuthorActivity.kt b/app/src/main/java/ani/dantotsu/media/AuthorActivity.kt index 9188b540..e2939b28 100644 --- a/app/src/main/java/ani/dantotsu/media/AuthorActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/AuthorActivity.kt @@ -18,7 +18,6 @@ import ani.dantotsu.Refresh import ani.dantotsu.databinding.ActivityAuthorBinding import ani.dantotsu.initActivity import ani.dantotsu.navBarHeight -import ani.dantotsu.others.LangSet import ani.dantotsu.others.getSerialized import ani.dantotsu.px import ani.dantotsu.statusBarHeight @@ -36,7 +35,7 @@ class AuthorActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivityAuthorBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/java/ani/dantotsu/media/CalendarActivity.kt b/app/src/main/java/ani/dantotsu/media/CalendarActivity.kt index 77035416..632058ff 100644 --- a/app/src/main/java/ani/dantotsu/media/CalendarActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/CalendarActivity.kt @@ -19,7 +19,6 @@ import ani.dantotsu.databinding.ActivityListBinding import ani.dantotsu.loadData import ani.dantotsu.media.user.ListViewPagerAdapter import ani.dantotsu.navBarHeight -import ani.dantotsu.others.LangSet import ani.dantotsu.settings.UserInterfaceSettings import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager @@ -38,7 +37,7 @@ class CalendarActivity : AppCompatActivity() { @SuppressLint("SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivityListBinding.inflate(layoutInflater) diff --git a/app/src/main/java/ani/dantotsu/media/CharacterDetailsActivity.kt b/app/src/main/java/ani/dantotsu/media/CharacterDetailsActivity.kt index 3ccba6e1..601c5719 100644 --- a/app/src/main/java/ani/dantotsu/media/CharacterDetailsActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/CharacterDetailsActivity.kt @@ -21,7 +21,6 @@ import ani.dantotsu.loadData import ani.dantotsu.loadImage import ani.dantotsu.navBarHeight import ani.dantotsu.others.ImageViewDialog -import ani.dantotsu.others.LangSet import ani.dantotsu.others.getSerialized import ani.dantotsu.px import ani.dantotsu.settings.UserInterfaceSettings @@ -42,7 +41,7 @@ class CharacterDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChang override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivityCharacterBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/java/ani/dantotsu/media/GenreActivity.kt b/app/src/main/java/ani/dantotsu/media/GenreActivity.kt index e5960502..728dacb2 100644 --- a/app/src/main/java/ani/dantotsu/media/GenreActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/GenreActivity.kt @@ -14,7 +14,6 @@ import ani.dantotsu.databinding.ActivityGenreBinding import ani.dantotsu.initActivity import ani.dantotsu.loadData import ani.dantotsu.navBarHeight -import ani.dantotsu.others.LangSet import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager import kotlinx.coroutines.Dispatchers @@ -27,7 +26,7 @@ class GenreActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivityGenreBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt index 4efa58bc..8d357514 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt @@ -46,6 +46,8 @@ import ani.dantotsu.others.ImageViewDialog import ani.dantotsu.others.getSerialized import ani.dantotsu.saveData import ani.dantotsu.settings.UserInterfaceSettings +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.snackString import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager @@ -159,9 +161,7 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi } }) banner.setOnTouchListener { _, motionEvent -> gestureDetector.onTouchEvent(motionEvent);true } - if (this.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - .getBoolean("incognito", false) - ) { + if (PrefWrapper.getVal(PrefName.Incognito, false)) { binding.mediaTitle.text = " ${media.userPreferredName}" binding.incognito.visibility = View.VISIBLE } else { diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt index a0c6002f..7c45180b 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt @@ -1,7 +1,6 @@ package ani.dantotsu.media import android.app.Activity -import android.content.SharedPreferences import android.os.Handler import android.os.Looper import androidx.fragment.app.FragmentManager diff --git a/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt b/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt index 6d061ee4..af375143 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt @@ -26,6 +26,8 @@ import ani.dantotsu.* import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.anilist.GenresViewModel import ani.dantotsu.databinding.* +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import io.noties.markwon.Markwon import io.noties.markwon.SoftBreakAddsNewLinePlugin import kotlinx.coroutines.Dispatchers @@ -60,8 +62,7 @@ class MediaInfoFragment : Fragment() { @SuppressLint("SetJavaScriptEnabled") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val model: MediaDetailsViewModel by activityViewModels() - val offline = requireContext().getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - .getBoolean("offlineMode", false) || !isOnline(requireContext()) + val offline = PrefWrapper.getVal(PrefName.OfflineMode, false) binding.mediaInfoProgressBar.visibility = if (!loaded) View.VISIBLE else View.GONE binding.mediaInfoContainer.visibility = if (loaded) View.VISIBLE else View.GONE binding.mediaInfoContainer.updateLayoutParams { bottomMargin += 128f.px + navBarHeight } diff --git a/app/src/main/java/ani/dantotsu/media/SearchActivity.kt b/app/src/main/java/ani/dantotsu/media/SearchActivity.kt index bc8341d4..8542b745 100644 --- a/app/src/main/java/ani/dantotsu/media/SearchActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/SearchActivity.kt @@ -16,7 +16,6 @@ import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.anilist.AnilistSearch import ani.dantotsu.connections.anilist.SearchResults import ani.dantotsu.databinding.ActivitySearchBinding -import ani.dantotsu.others.LangSet import ani.dantotsu.themes.ThemeManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -40,7 +39,7 @@ class SearchActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivitySearchBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt b/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt index 923bcb96..1359ebe8 100644 --- a/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt @@ -1,8 +1,6 @@ package ani.dantotsu.media import android.annotation.SuppressLint -import android.content.Context -import android.content.SharedPreferences import android.graphics.drawable.Drawable import android.text.Editable import android.text.TextWatcher @@ -22,19 +20,16 @@ import androidx.recyclerview.widget.RecyclerView.HORIZONTAL import ani.dantotsu.App.Companion.context import ani.dantotsu.R import ani.dantotsu.connections.anilist.Anilist -import ani.dantotsu.currContext import ani.dantotsu.databinding.ItemChipBinding import ani.dantotsu.databinding.ItemSearchHeaderBinding -import ani.dantotsu.logger -import ani.dantotsu.others.SharedPreferenceStringSetLiveData import ani.dantotsu.saveData +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import com.google.android.material.checkbox.MaterialCheckBox.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get class SearchAdapter(private val activity: SearchActivity, private val type: String) : @@ -78,9 +73,7 @@ class SearchAdapter(private val activity: SearchActivity, private val type: Stri } binding.searchBar.hint = activity.result.type - if (currContext()?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - ?.getBoolean("incognito", false) == true - ) { + if (PrefWrapper.getVal(PrefName.Incognito, false)) { val startIconDrawableRes = R.drawable.ic_incognito_24 val startIconDrawable: Drawable? = context?.let { AppCompatResources.getDrawable(it, startIconDrawableRes) } diff --git a/app/src/main/java/ani/dantotsu/media/SearchHistoryAdapter.kt b/app/src/main/java/ani/dantotsu/media/SearchHistoryAdapter.kt index f350f758..46028527 100644 --- a/app/src/main/java/ani/dantotsu/media/SearchHistoryAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/SearchHistoryAdapter.kt @@ -1,6 +1,5 @@ package ani.dantotsu.media -import android.content.SharedPreferences import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -9,24 +8,25 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import ani.dantotsu.R import ani.dantotsu.databinding.ItemSearchHistoryBinding -import ani.dantotsu.others.SharedPreferenceStringSetLiveData -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper +import ani.dantotsu.settings.saving.PrefWrapper.asLiveStringSet +import ani.dantotsu.settings.saving.SharedPreferenceStringSetLiveData +import java.util.Locale class SearchHistoryAdapter(private val type: String, private val searchClicked: (String) -> Unit) : ListAdapter( DIFF_CALLBACK_INSTALLED ) { private var searchHistoryLiveData: SharedPreferenceStringSetLiveData? = null private var searchHistory: MutableSet? = null - private var sharedPreferences: SharedPreferences? = null + private var historyType: PrefName = when (type.lowercase(Locale.ROOT)) { + "anime" -> PrefName.AnimeSearchHistory + "manga" -> PrefName.MangaSearchHistory + else -> throw IllegalArgumentException("Invalid type") + } init { - sharedPreferences = Injekt.get() - searchHistoryLiveData = SharedPreferenceStringSetLiveData( - sharedPreferences!!, - "searchHistory_$type", - mutableSetOf() - ) + searchHistoryLiveData = PrefWrapper.getLiveVal(historyType, mutableSetOf()).asLiveStringSet() searchHistoryLiveData?.observeForever { searchHistory = it.toMutableSet() submitList(searchHistory?.reversed()) @@ -35,14 +35,14 @@ class SearchHistoryAdapter(private val type: String, private val searchClicked: fun remove(item: String) { searchHistory?.remove(item) - sharedPreferences?.edit()?.putStringSet("searchHistory_$type", searchHistory)?.apply() + PrefWrapper.setVal(historyType, searchHistory) } fun add(item: String) { if (searchHistory?.contains(item) == true || item.isBlank()) return - if (sharedPreferences?.getBoolean("incognito", false) == true) return + if (PrefWrapper.getVal(PrefName.Incognito, false)) return searchHistory?.add(item) - sharedPreferences?.edit()?.putStringSet("searchHistory_$type", searchHistory)?.apply() + PrefWrapper.setVal(historyType, searchHistory) } override fun onCreateViewHolder( diff --git a/app/src/main/java/ani/dantotsu/media/StudioActivity.kt b/app/src/main/java/ani/dantotsu/media/StudioActivity.kt index 53e04a37..cfce7d6f 100644 --- a/app/src/main/java/ani/dantotsu/media/StudioActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/StudioActivity.kt @@ -18,7 +18,6 @@ import ani.dantotsu.Refresh import ani.dantotsu.databinding.ActivityStudioBinding import ani.dantotsu.initActivity import ani.dantotsu.navBarHeight -import ani.dantotsu.others.LangSet import ani.dantotsu.others.getSerialized import ani.dantotsu.px import ani.dantotsu.statusBarHeight @@ -36,7 +35,7 @@ class StudioActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivityStudioBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt index 1c06c806..3734a51e 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt @@ -27,6 +27,8 @@ import ani.dantotsu.others.webview.CookieCatcher import ani.dantotsu.parsers.AnimeSources import ani.dantotsu.parsers.DynamicAnimeParser import ani.dantotsu.parsers.WatchSources +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.subcriptions.Notifications.Companion.openSettings import ani.dantotsu.subcriptions.Subscription.Companion.getChannelId import com.google.android.material.chip.Chip @@ -90,11 +92,10 @@ class AnimeWatchAdapter( null ) } - val offline = if (!isOnline(binding.root.context) || currContext()?.getSharedPreferences( - "Dantotsu", - Context.MODE_PRIVATE + val offline = if (!isOnline(binding.root.context) || PrefWrapper.getVal( + PrefName.OfflineMode, + false ) - ?.getBoolean("offlineMode", false) == true ) View.GONE else View.VISIBLE binding.animeSourceNameContainer.visibility = offline diff --git a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt index 1a2f8827..ff9a0283 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt @@ -43,6 +43,7 @@ import ani.dantotsu.parsers.HAnimeSources import ani.dantotsu.settings.PlayerSettings import ani.dantotsu.settings.UserInterfaceSettings import ani.dantotsu.settings.extensionprefs.AnimeSourcePreferencesFragment +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.subcriptions.Notifications import ani.dantotsu.subcriptions.Notifications.Group.ANIME_GROUP import ani.dantotsu.subcriptions.Subscription.Companion.getChannelId @@ -476,17 +477,11 @@ class AnimeWatchFragment : Fragment() { ) ) val taskName = AnimeDownloaderService.AnimeDownloadTask.getTaskName(media.mainName(), i) - val id = requireContext().getSharedPreferences( - ContextCompat.getString(requireContext(), R.string.anime_downloads), - Context.MODE_PRIVATE - ).getString( + val id = PrefWrapper.getAnimeDownloadPreferences().getString( taskName, "" ) ?: "" - requireContext().getSharedPreferences( - ContextCompat.getString(requireContext(), R.string.anime_downloads), - Context.MODE_PRIVATE - ).edit().remove(taskName).apply() + PrefWrapper.getAnimeDownloadPreferences().edit().remove(taskName).apply() DownloadService.sendRemoveDownload( requireContext(), ExoplayerDownloadService::class.java, diff --git a/app/src/main/java/ani/dantotsu/media/anime/EpisodeAdapters.kt b/app/src/main/java/ani/dantotsu/media/anime/EpisodeAdapters.kt index 8dce6e34..261ebe9c 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/EpisodeAdapters.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/EpisodeAdapters.kt @@ -2,14 +2,12 @@ package ani.dantotsu.media.anime import android.annotation.SuppressLint import android.app.AlertDialog -import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.animation.LinearInterpolator import android.widget.LinearLayout import androidx.annotation.OptIn -import androidx.core.content.ContextCompat import androidx.lifecycle.coroutineScope import androidx.media3.common.util.UnstableApi import androidx.media3.exoplayer.offline.DownloadIndex @@ -22,6 +20,7 @@ import ani.dantotsu.databinding.ItemEpisodeListBinding import ani.dantotsu.download.anime.AnimeDownloaderService import ani.dantotsu.download.video.Helper import ani.dantotsu.media.Media +import ani.dantotsu.settings.saving.PrefWrapper import com.bumptech.glide.Glide import com.bumptech.glide.load.model.GlideUrl import kotlinx.coroutines.delay @@ -253,10 +252,7 @@ class EpisodeAdapter( media.mainName(), episodeNumber ) - val id = fragment.requireContext().getSharedPreferences( - ContextCompat.getString(fragment.requireContext(), R.string.anime_downloads), - Context.MODE_PRIVATE - ).getString( + val id = PrefWrapper.getAnimeDownloadPreferences().getString( taskName, "" ) ?: "" 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 e4646566..5df4ed6e 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt @@ -77,13 +77,14 @@ import ani.dantotsu.media.MediaDetailsViewModel import ani.dantotsu.media.SubtitleDownloader import ani.dantotsu.others.AniSkip import ani.dantotsu.others.AniSkip.getType -import ani.dantotsu.others.LangSet import ani.dantotsu.others.ResettableTimer import ani.dantotsu.others.getSerialized import ani.dantotsu.parsers.* import ani.dantotsu.settings.PlayerSettings import ani.dantotsu.settings.PlayerSettingsActivity import ani.dantotsu.settings.UserInterfaceSettings +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.themes.ThemeManager import com.bumptech.glide.Glide import com.google.android.gms.cast.framework.CastButtonFactory @@ -331,7 +332,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivityExoplayerBinding.inflate(layoutInflater) setContentView(binding.root) @@ -1013,8 +1014,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL preloading = false val context = this - val incognito = baseContext.getSharedPreferences("Dantotsu", MODE_PRIVATE) - .getBoolean("incognito", false) + val incognito = PrefWrapper.getVal(PrefName.Incognito, false) if (isOnline(context) && Discord.token != null && !incognito) { lifecycleScope.launch { val presence = RPC.createPresence(RPC.Companion.RPCData( @@ -1191,8 +1191,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL } preloading = false - val incognito = currContext()?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - ?.getBoolean("incognito", false) ?: false + val incognito = PrefWrapper.getVal(PrefName.Incognito, false) val showProgressDialog = if (settings.askIndividual) loadData("${media.id}_progressDialog") ?: true else false @@ -1343,7 +1342,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL val downloadedMediaItem = if (ext.server.offline) { val key = ext.server.name - downloadId = getSharedPreferences(getString(R.string.anime_downloads), MODE_PRIVATE) + downloadId = PrefWrapper.getAnimeDownloadPreferences() .getString(key, null) if (downloadId != null) { Helper.downloadManager(this) @@ -1550,7 +1549,6 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL override fun onResume() { super.onResume() - LangSet.setLocale(this) orientationListener?.enable() hideSystemBars() if (isInitialized) { @@ -1745,8 +1743,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL } private fun updateAniProgress() { - val incognito = currContext()?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - ?.getBoolean("incognito", false) ?: false + val incognito = PrefWrapper.getVal(PrefName.Incognito, false) if (!incognito && exoPlayer.currentPosition / episodeLength > settings.watchPercentage && Anilist.userid != null) if (loadData("${media.id}_save_progress") != false && if (media.isAdult) settings.updateForH else true) { media.anime!!.selectedEpisode?.apply { diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt index da0866b2..77051e19 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt @@ -28,6 +28,8 @@ import ani.dantotsu.others.webview.CookieCatcher import ani.dantotsu.parsers.DynamicMangaParser import ani.dantotsu.parsers.MangaReadSources import ani.dantotsu.parsers.MangaSources +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.subcriptions.Notifications.Companion.openSettings import ani.dantotsu.subcriptions.Subscription.Companion.getChannelId import com.google.android.material.chip.Chip @@ -69,11 +71,7 @@ class MangaReadAdapter( null ) } - val offline = if (!isOnline(binding.root.context) || currContext()?.getSharedPreferences( - "Dantotsu", - Context.MODE_PRIVATE - ) - ?.getBoolean("offlineMode", false) == true + val offline = if (!isOnline(binding.root.context) || PrefWrapper.getVal(PrefName.OfflineMode, false) ) View.GONE else View.VISIBLE binding.animeSourceNameContainer.visibility = offline diff --git a/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt b/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt index 8ec077c3..e07f2879 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt @@ -3,7 +3,6 @@ package ani.dantotsu.media.manga.mangareader import android.animation.ObjectAnimator import android.annotation.SuppressLint import android.app.AlertDialog -import android.content.Context import android.content.Intent import android.content.res.Configuration import android.content.res.Resources @@ -41,7 +40,6 @@ import ani.dantotsu.media.manga.MangaCache import ani.dantotsu.media.manga.MangaChapter import ani.dantotsu.media.manga.MangaNameAdapter import ani.dantotsu.others.ImageViewDialog -import ani.dantotsu.others.LangSet import ani.dantotsu.parsers.HMangaSources import ani.dantotsu.parsers.MangaImage import ani.dantotsu.parsers.MangaSources @@ -51,6 +49,8 @@ import ani.dantotsu.settings.CurrentReaderSettings.DualPageModes.* import ani.dantotsu.settings.CurrentReaderSettings.Layouts.* import ani.dantotsu.settings.ReaderSettings import ani.dantotsu.settings.UserInterfaceSettings +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.themes.ThemeManager import com.alexvasilkov.gestures.views.GestureFrameLayout import com.bumptech.glide.load.resource.bitmap.BitmapTransformation @@ -138,7 +138,7 @@ class MangaReaderActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivityMangaReaderBinding.inflate(layoutInflater) setContentView(binding.root) @@ -220,8 +220,7 @@ class MangaReaderActivity : AppCompatActivity() { val scope = lifecycleScope scope.launch(Dispatchers.IO) { mangaSources.init( - Injekt.get().installedExtensionsFlow, - this@MangaReaderActivity + Injekt.get().installedExtensionsFlow ) } model.mangaReadSources = mangaSources @@ -321,8 +320,7 @@ class MangaReaderActivity : AppCompatActivity() { chaptersTitleArr.getOrNull(currentChapterIndex - 1) ?: "" applySettings() val context = this - val incognito = context.getSharedPreferences("Dantotsu", 0) - ?.getBoolean("incognito", false) ?: false + val incognito = PrefWrapper.getVal(PrefName.Incognito, false) if (isOnline(context) && Discord.token != null && !incognito) { lifecycleScope.launch { val presence = RPC.createPresence( @@ -855,9 +853,7 @@ class MangaReaderActivity : AppCompatActivity() { showProgressDialog = if (settings.askIndividual) loadData("${media.id}_progressDialog") ?: true else false - val incognito = - currContext()?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - ?.getBoolean("incognito", false) ?: false + val incognito = PrefWrapper.getVal(PrefName.Incognito, false) if (showProgressDialog && !incognito) { val dialogView = layoutInflater.inflate(R.layout.item_custom_dialog, null) diff --git a/app/src/main/java/ani/dantotsu/media/novel/novelreader/NovelReaderActivity.kt b/app/src/main/java/ani/dantotsu/media/novel/novelreader/NovelReaderActivity.kt index b62032fa..d344ed83 100644 --- a/app/src/main/java/ani/dantotsu/media/novel/novelreader/NovelReaderActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/novel/novelreader/NovelReaderActivity.kt @@ -32,7 +32,6 @@ import ani.dantotsu.databinding.ActivityNovelReaderBinding import ani.dantotsu.hideSystemBars import ani.dantotsu.loadData import ani.dantotsu.others.ImageViewDialog -import ani.dantotsu.others.LangSet import ani.dantotsu.saveData import ani.dantotsu.setSafeOnClickListener import ani.dantotsu.settings.CurrentNovelReaderSettings @@ -171,7 +170,7 @@ class NovelReaderActivity : AppCompatActivity(), EbookReaderEventListener { return } - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivityNovelReaderBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt b/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt index a6d044e1..fb75d22e 100644 --- a/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt @@ -1,7 +1,6 @@ package ani.dantotsu.media.user import android.annotation.SuppressLint -import android.content.Context import android.os.Bundle import android.util.TypedValue import android.view.View @@ -17,12 +16,12 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.lifecycleScope import ani.dantotsu.R import ani.dantotsu.Refresh -import ani.dantotsu.currContext import ani.dantotsu.databinding.ActivityListBinding import ani.dantotsu.loadData import ani.dantotsu.navBarHeight -import ani.dantotsu.others.LangSet import ani.dantotsu.settings.UserInterfaceSettings +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager import com.google.android.material.tabs.TabLayout @@ -39,7 +38,7 @@ class ListActivity : AppCompatActivity() { @SuppressLint("SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivityListBinding.inflate(layoutInflater) @@ -154,8 +153,10 @@ class ListActivity : AppCompatActivity() { R.id.release -> "release" else -> null } - currContext()?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE)?.edit() - ?.putString("sort_order", sort)?.apply() + PrefWrapper.setVal( + if (anime) PrefName.AnimeListSortOrder else PrefName.MangaListSortOrder, + sort ?: "" + ) binding.listProgressBar.visibility = View.VISIBLE binding.listViewPager.adapter = null scope.launch { diff --git a/app/src/main/java/ani/dantotsu/offline/OfflineFragment.kt b/app/src/main/java/ani/dantotsu/offline/OfflineFragment.kt index 02779ab2..c7386a09 100644 --- a/app/src/main/java/ani/dantotsu/offline/OfflineFragment.kt +++ b/app/src/main/java/ani/dantotsu/offline/OfflineFragment.kt @@ -11,6 +11,8 @@ import ani.dantotsu.R import ani.dantotsu.databinding.FragmentOfflineBinding import ani.dantotsu.isOnline import ani.dantotsu.navBarHeight +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.startMainActivity import ani.dantotsu.statusBarHeight @@ -26,8 +28,7 @@ class OfflineFragment : Fragment() { topMargin = statusBarHeight bottomMargin = navBarHeight } - offline = requireContext().getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - ?.getBoolean("offlineMode", false) ?: false + offline = PrefWrapper.getVal(PrefName.OfflineMode, false) binding.noInternet.text = if (offline) "Offline Mode" else getString(R.string.no_internet) binding.refreshButton.visibility = if (offline) View.GONE else View.VISIBLE @@ -41,7 +42,6 @@ class OfflineFragment : Fragment() { override fun onResume() { super.onResume() - offline = requireContext().getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - ?.getBoolean("offlineMode", false) ?: false + offline = PrefWrapper.getVal(PrefName.OfflineMode, false) } } \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/others/LangSet.kt b/app/src/main/java/ani/dantotsu/others/LangSet.kt deleted file mode 100644 index 3e7857da..00000000 --- a/app/src/main/java/ani/dantotsu/others/LangSet.kt +++ /dev/null @@ -1,22 +0,0 @@ -package ani.dantotsu.others - -import android.app.Activity -import android.content.res.Configuration -import android.content.res.Resources -import java.util.Locale - - -class LangSet { - companion object { - fun setLocale(activity: Activity) { - val useCursedLang = activity.getSharedPreferences("Dantotsu", Activity.MODE_PRIVATE) - .getBoolean("use_cursed_lang", false) - val locale = if (useCursedLang) Locale("en", "DW") else Locale("en", "US") - Locale.setDefault(locale) - val resources: Resources = activity.resources - val config: Configuration = resources.configuration - config.setLocale(locale) - resources.updateConfiguration(config, resources.displayMetrics) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/others/imagesearch/ImageSearchActivity.kt b/app/src/main/java/ani/dantotsu/others/imagesearch/ImageSearchActivity.kt index 282c17fc..653ff984 100644 --- a/app/src/main/java/ani/dantotsu/others/imagesearch/ImageSearchActivity.kt +++ b/app/src/main/java/ani/dantotsu/others/imagesearch/ImageSearchActivity.kt @@ -19,7 +19,6 @@ import ani.dantotsu.databinding.ActivityImageSearchBinding import ani.dantotsu.initActivity import ani.dantotsu.media.MediaDetailsActivity import ani.dantotsu.navBarHeight -import ani.dantotsu.others.LangSet import ani.dantotsu.themes.ThemeManager import ani.dantotsu.toast import kotlinx.coroutines.Dispatchers @@ -52,7 +51,7 @@ class ImageSearchActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + initActivity(this) ThemeManager(this).applyTheme() binding = ActivityImageSearchBinding.inflate(layoutInflater) diff --git a/app/src/main/java/ani/dantotsu/parsers/AnimeSources.kt b/app/src/main/java/ani/dantotsu/parsers/AnimeSources.kt index 0cd7d5bb..138f4697 100644 --- a/app/src/main/java/ani/dantotsu/parsers/AnimeSources.kt +++ b/app/src/main/java/ani/dantotsu/parsers/AnimeSources.kt @@ -3,6 +3,8 @@ package ani.dantotsu.parsers import android.content.Context import ani.dantotsu.Lazier import ani.dantotsu.lazyList +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.first @@ -12,9 +14,7 @@ object AnimeSources : WatchSources() { var pinnedAnimeSources: Set = emptySet() suspend fun init(fromExtensions: StateFlow>, context: Context) { - val sharedPrefs = context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - pinnedAnimeSources = - sharedPrefs.getStringSet("pinned_anime_sources", emptySet()) ?: emptySet() + pinnedAnimeSources = PrefWrapper.getVal(PrefName.PinnedAnimeSources, emptySet()) // Initialize with the first value from StateFlow val initialExtensions = fromExtensions.first() diff --git a/app/src/main/java/ani/dantotsu/parsers/MangaSources.kt b/app/src/main/java/ani/dantotsu/parsers/MangaSources.kt index d22c27a3..93cc1ac7 100644 --- a/app/src/main/java/ani/dantotsu/parsers/MangaSources.kt +++ b/app/src/main/java/ani/dantotsu/parsers/MangaSources.kt @@ -3,6 +3,8 @@ package ani.dantotsu.parsers import android.content.Context import ani.dantotsu.Lazier import ani.dantotsu.lazyList +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.first @@ -11,10 +13,8 @@ object MangaSources : MangaReadSources() { override var list: List> = emptyList() var pinnedMangaSources: Set = emptySet() - suspend fun init(fromExtensions: StateFlow>, context: Context) { - val sharedPrefs = context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - pinnedMangaSources = - sharedPrefs.getStringSet("pinned_manga_sources", emptySet()) ?: emptySet() + suspend fun init(fromExtensions: StateFlow>) { + pinnedMangaSources = PrefWrapper.getVal(PrefName.PinnedMangaSources, emptySet()) // Initialize with the first value from StateFlow val initialExtensions = fromExtensions.first() diff --git a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionGithubApi.kt b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionGithubApi.kt index ea23fbeb..665f84f5 100644 --- a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionGithubApi.kt +++ b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionGithubApi.kt @@ -4,6 +4,8 @@ package ani.dantotsu.parsers.novel import android.content.Context import ani.dantotsu.currContext import ani.dantotsu.logger +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import eu.kanade.tachiyomi.extension.ExtensionUpdateNotifier import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import eu.kanade.tachiyomi.extension.anime.model.AnimeLoadResult @@ -26,9 +28,7 @@ class NovelExtensionGithubApi { private val novelExtensionManager: NovelExtensionManager by injectLazy() private val json: Json by injectLazy() - private val lastExtCheck: Long = - currContext()?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - ?.getLong("last_ext_check", 0) ?: 0 + private val lastExtCheck: Long = PrefWrapper.getVal(PrefName.NovelLastExtCheck, 0L) private var requiresFallbackSource = false @@ -86,8 +86,7 @@ class NovelExtensionGithubApi { novelExtensionManager.availableExtensionsFlow.value } else { findExtensions().also { - context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE)?.edit() - ?.putLong("last_ext_check", Date().time)?.apply() + PrefWrapper.setVal(PrefName.NovelLastExtCheck, Date().time) } } diff --git a/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt b/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt index 04701603..4f51430b 100644 --- a/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt @@ -16,7 +16,6 @@ import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 import ani.dantotsu.* import ani.dantotsu.databinding.ActivityExtensionsBinding -import ani.dantotsu.others.LangSet import ani.dantotsu.themes.ThemeManager import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator @@ -27,7 +26,7 @@ class ExtensionsActivity : AppCompatActivity() { @SuppressLint("SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivityExtensionsBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/java/ani/dantotsu/settings/FAQActivity.kt b/app/src/main/java/ani/dantotsu/settings/FAQActivity.kt index 74d9525d..8e994999 100644 --- a/app/src/main/java/ani/dantotsu/settings/FAQActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/FAQActivity.kt @@ -7,7 +7,6 @@ import ani.dantotsu.R import ani.dantotsu.currContext import ani.dantotsu.databinding.ActivityFaqBinding import ani.dantotsu.initActivity -import ani.dantotsu.others.LangSet import ani.dantotsu.themes.ThemeManager class FAQActivity : AppCompatActivity() { @@ -101,7 +100,7 @@ class FAQActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivityFaqBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt index 10130ee1..d76ae92b 100644 --- a/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt @@ -17,7 +17,6 @@ import ani.dantotsu.initActivity import ani.dantotsu.loadData import ani.dantotsu.media.Media import ani.dantotsu.navBarHeight -import ani.dantotsu.others.LangSet import ani.dantotsu.others.getSerialized import ani.dantotsu.parsers.Subtitle import ani.dantotsu.saveData @@ -39,7 +38,7 @@ class PlayerSettingsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivityPlayerSettingsBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/java/ani/dantotsu/settings/ReaderSettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/ReaderSettingsActivity.kt index 33a6ddf2..ebf7b836 100644 --- a/app/src/main/java/ani/dantotsu/settings/ReaderSettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/ReaderSettingsActivity.kt @@ -9,7 +9,6 @@ import ani.dantotsu.databinding.ActivityReaderSettingsBinding import ani.dantotsu.initActivity import ani.dantotsu.loadData import ani.dantotsu.navBarHeight -import ani.dantotsu.others.LangSet import ani.dantotsu.saveData import ani.dantotsu.snackString import ani.dantotsu.statusBarHeight @@ -20,7 +19,7 @@ class ReaderSettingsActivity : AppCompatActivity() { private val reader = "reader_settings" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivityReaderSettingsBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt index bc665cd4..3f36f15b 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt @@ -32,9 +32,10 @@ import ani.dantotsu.download.DownloadsManager import ani.dantotsu.download.video.ExoplayerDownloadService import ani.dantotsu.others.AppUpdater import ani.dantotsu.others.CustomBottomDialog -import ani.dantotsu.others.LangSet import ani.dantotsu.parsers.AnimeSources import ani.dantotsu.parsers.MangaSources +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.subcriptions.Notifications import ani.dantotsu.subcriptions.Notifications.Companion.openSettings import ani.dantotsu.subcriptions.Subscription.Companion.defaultTime @@ -71,7 +72,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene @SuppressLint("SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivitySettingsBinding.inflate(layoutInflater) setContentView(binding.root) @@ -96,26 +97,16 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene onBackPressedDispatcher.onBackPressed() } - binding.settingsUseMaterialYou.isChecked = - getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).getBoolean( - "use_material_you", - false - ) + binding.settingsUseMaterialYou.isChecked = PrefWrapper.getVal(PrefName.UseMaterialYou, false) binding.settingsUseMaterialYou.setOnCheckedChangeListener { _, isChecked -> - getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).edit() - .putBoolean("use_material_you", isChecked).apply() + PrefWrapper.setVal(PrefName.UseMaterialYou, isChecked) if (isChecked) binding.settingsUseCustomTheme.isChecked = false restartApp() } - binding.settingsUseCustomTheme.isChecked = - getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).getBoolean( - "use_custom_theme", - false - ) + binding.settingsUseCustomTheme.isChecked = PrefWrapper.getVal(PrefName.UseCustomTheme, false) binding.settingsUseCustomTheme.setOnCheckedChangeListener { _, isChecked -> - getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).edit() - .putBoolean("use_custom_theme", isChecked).apply() + PrefWrapper.setVal(PrefName.UseCustomTheme, isChecked) if (isChecked) { binding.settingsUseMaterialYou.isChecked = false } @@ -123,26 +114,19 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene restartApp() } - binding.settingsUseSourceTheme.isChecked = - getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).getBoolean( - "use_source_theme", - false - ) + binding.settingsUseSourceTheme.isChecked = PrefWrapper.getVal(PrefName.UseSourceTheme, false) binding.settingsUseSourceTheme.setOnCheckedChangeListener { _, isChecked -> - getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).edit() - .putBoolean("use_source_theme", isChecked).apply() - } - - binding.settingsUseOLED.isChecked = - getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).getBoolean("use_oled", false) - binding.settingsUseOLED.setOnCheckedChangeListener { _, isChecked -> - getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).edit() - .putBoolean("use_oled", isChecked).apply() + PrefWrapper.setVal(PrefName.UseSourceTheme, isChecked) restartApp() } - val themeString = - getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).getString("theme", "PURPLE")!! + binding.settingsUseOLED.isChecked = PrefWrapper.getVal(PrefName.UseOLED, false) + binding.settingsUseOLED.setOnCheckedChangeListener { _, isChecked -> + PrefWrapper.setVal(PrefName.UseOLED, isChecked) + restartApp() + } + + val themeString = PrefWrapper.getVal(PrefName.Theme, "PURPLE") binding.themeSwitcher.setText( themeString.substring(0, 1) + themeString.substring(1).lowercase() ) @@ -151,13 +135,12 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene ArrayAdapter( this, R.layout.item_dropdown, - ThemeManager.Companion.Theme.values() + ThemeManager.Companion.Theme.entries .map { it.theme.substring(0, 1) + it.theme.substring(1).lowercase() }) ) binding.themeSwitcher.setOnItemClickListener { _, _, i, _ -> - getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).edit() - .putString("theme", ThemeManager.Companion.Theme.values()[i].theme).apply() + PrefWrapper.setVal(PrefName.Theme, ThemeManager.Companion.Theme.entries[i].theme) //ActivityHelper.shouldRefreshMainActivity = true binding.themeSwitcher.clearFocus() restartApp() @@ -166,10 +149,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene binding.customTheme.setOnClickListener { - val originalColor = getSharedPreferences("Dantotsu", MODE_PRIVATE).getInt( - "custom_theme_int", - Color.parseColor("#6200EE") - ) + val originalColor = PrefWrapper.getVal(PrefName.CustomThemeInt, Color.parseColor("#6200EE")) class CustomColorDialog : SimpleColorDialog() { //idk where to put it override fun onPositiveButtonClick() { @@ -196,11 +176,8 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene val names = animeSourcesWithoutDownloadsSource.map { it.name } val pinnedSourcesBoolean = animeSourcesWithoutDownloadsSource.map { it.name in AnimeSources.pinnedAnimeSources } - val pinnedSourcesOriginal = getSharedPreferences( - "Dantotsu", - Context.MODE_PRIVATE - ).getStringSet("pinned_anime_sources", null) - val pinnedSources = pinnedSourcesOriginal?.toMutableSet() ?: mutableSetOf() + val pinnedSourcesOriginal = PrefWrapper.getVal(PrefName.PinnedAnimeSources, setOf()) + val pinnedSources = pinnedSourcesOriginal.toMutableSet() ?: mutableSetOf() val alertDialog = AlertDialog.Builder(this, R.style.MyPopup) .setTitle("Pinned Anime Sources") .setMultiChoiceItems( @@ -214,8 +191,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene } } .setPositiveButton("OK") { dialog, _ -> - getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).edit() - .putStringSet("pinned_anime_sources", pinnedSources).apply() + PrefWrapper.setVal(PrefName.PinnedAnimeSources, pinnedSources) AnimeSources.pinnedAnimeSources = pinnedSources AnimeSources.performReorderAnimeSources() dialog.dismiss() @@ -395,15 +371,9 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene binding.settingsRecentlyListOnly.setOnCheckedChangeListener { _, isChecked -> saveData("recently_list_only", isChecked) } - binding.settingsShareUsername.isChecked = getSharedPreferences( - getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ).getBoolean("shared_user_id", true) + binding.settingsShareUsername.isChecked = PrefWrapper.getVal(PrefName.SharedUserID, true) binding.settingsShareUsername.setOnCheckedChangeListener { _, isChecked -> - getSharedPreferences( - getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ).edit().putBoolean("shared_user_id", isChecked).apply() + PrefWrapper.setVal(PrefName.SharedUserID, isChecked) } binding.settingsPreferDub.isChecked = loadData("settings_prefer_dub") ?: false @@ -417,11 +387,8 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene val names = mangaSourcesWithoutDownloadsSource.map { it.name } val pinnedSourcesBoolean = mangaSourcesWithoutDownloadsSource.map { it.name in MangaSources.pinnedMangaSources } - val pinnedSourcesOriginal = getSharedPreferences( - "Dantotsu", - Context.MODE_PRIVATE - ).getStringSet("pinned_manga_sources", null) - val pinnedSources = pinnedSourcesOriginal?.toMutableSet() ?: mutableSetOf() + val pinnedSourcesOriginal = PrefWrapper.getVal(PrefName.PinnedMangaSources, setOf()) + val pinnedSources = pinnedSourcesOriginal.toMutableSet() val alertDialog = AlertDialog.Builder(this, R.style.MyPopup) .setTitle("Pinned Manga Sources") .setMultiChoiceItems( @@ -435,8 +402,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene } } .setPositiveButton("OK") { dialog, _ -> - getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).edit() - .putStringSet("pinned_manga_sources", pinnedSources).apply() + PrefWrapper.setVal(PrefName.PinnedMangaSources, pinnedSources) MangaSources.pinnedMangaSources = pinnedSources MangaSources.performReorderMangaSources() dialog.dismiss() @@ -605,13 +571,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene Toast.makeText(this, "youwu have been cuwsed :pwayge:", Toast.LENGTH_LONG).show() val url = "https://www.youtube.com/watch?v=dQw4w9WgXcQ" openLinkInBrowser(url) - getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).edit().putBoolean( - "use_cursed_lang", - getSharedPreferences( - "Dantotsu", - Context.MODE_PRIVATE - ).getBoolean("use_cursed_lang", false).not() - ).apply() + //PrefWrapper.setVal(PrefName.SomethingSpecial, !PrefWrapper.getVal(PrefName.SomethingSpecial, false)) } else { snackString(array[(Math.random() * array.size).toInt()], this) } @@ -772,18 +732,9 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene } if (Discord.token != null) { - val id = getSharedPreferences( - getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ).getString("discord_id", null) - val avatar = getSharedPreferences( - getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ).getString("discord_avatar", null) - val username = getSharedPreferences( - getString(R.string.preference_file_key), - Context.MODE_PRIVATE - ).getString("discord_username", null) + val id = PrefWrapper.getVal(PrefName.DiscordId, null as String?) + val avatar = PrefWrapper.getVal(PrefName.DiscordAvatar, null as String?) + val username = PrefWrapper.getVal(PrefName.DiscordUserName, null as String?) if (id != null && avatar != null) { binding.settingsDiscordAvatar.loadImage("https://cdn.discordapp.com/avatars/$id/$avatar.png") } @@ -838,8 +789,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene if (which == BUTTON_POSITIVE) { if (dialogTag == "colorPicker") { val color = extras.getInt(SimpleColorDialog.COLOR) - getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).edit() - .putInt("custom_theme_int", color).apply() + PrefWrapper.setVal(PrefName.CustomThemeInt, color) logger("Custom Theme: $color") } } diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt b/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt index 48341259..f7b6d782 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt @@ -1,6 +1,5 @@ package ani.dantotsu.settings -import android.content.Context import android.content.Intent import android.graphics.Color import android.os.Bundle @@ -26,6 +25,8 @@ import ani.dantotsu.offline.OfflineFragment import ani.dantotsu.openLinkInBrowser import ani.dantotsu.others.imagesearch.ImageSearchActivity import ani.dantotsu.setSafeOnClickListener +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.startMainActivity class SettingsDialogFragment : BottomSheetDialogFragment() { @@ -75,14 +76,10 @@ class SettingsDialogFragment : BottomSheetDialogFragment() { } binding.settingsIncognito.isChecked = - context?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE)?.getBoolean( - "incognito", - false - ) ?: false + PrefWrapper.getVal(PrefName.Incognito, false) binding.settingsIncognito.setOnCheckedChangeListener { _, isChecked -> - context?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE)?.edit() - ?.putBoolean("incognito", isChecked)?.apply() + PrefWrapper.setVal(PrefName.Incognito, isChecked) incognitoNotification(requireContext()) } binding.settingsExtensionSettings.setSafeOnClickListener { @@ -102,9 +99,7 @@ class SettingsDialogFragment : BottomSheetDialogFragment() { dismiss() } - binding.settingsDownloads.isChecked = - context?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - ?.getBoolean("offlineMode", false) ?: false + binding.settingsDownloads.isChecked = PrefWrapper.getVal(PrefName.OfflineMode, false) binding.settingsDownloads.setOnCheckedChangeListener { _, isChecked -> when (pageType) { PageType.MANGA -> { @@ -154,8 +149,7 @@ class SettingsDialogFragment : BottomSheetDialogFragment() { } dismiss() - context?.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE)?.edit() - ?.putBoolean("offlineMode", isChecked)?.apply() + PrefWrapper.setVal(PrefName.OfflineMode, isChecked) } } diff --git a/app/src/main/java/ani/dantotsu/settings/UserInterfaceSettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/UserInterfaceSettingsActivity.kt index d3499d5c..d4d18aa1 100644 --- a/app/src/main/java/ani/dantotsu/settings/UserInterfaceSettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/UserInterfaceSettingsActivity.kt @@ -11,7 +11,6 @@ import ani.dantotsu.databinding.ActivityUserInterfaceSettingsBinding import ani.dantotsu.initActivity import ani.dantotsu.loadData import ani.dantotsu.navBarHeight -import ani.dantotsu.others.LangSet import ani.dantotsu.saveData import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager @@ -22,7 +21,7 @@ class UserInterfaceSettingsActivity : AppCompatActivity() { private val ui = "ui_settings" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() binding = ActivityUserInterfaceSettingsBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/java/ani/dantotsu/settings/saving/PrefWrapper.kt b/app/src/main/java/ani/dantotsu/settings/saving/PrefWrapper.kt new file mode 100644 index 00000000..9f2daf2d --- /dev/null +++ b/app/src/main/java/ani/dantotsu/settings/saving/PrefWrapper.kt @@ -0,0 +1,171 @@ +package ani.dantotsu.settings.saving + +import android.content.Context +import android.content.SharedPreferences +import ani.dantotsu.settings.saving.internal.Location + +object PrefWrapper { + + private var generalPreferences: SharedPreferences? = null + private var animePreferences: SharedPreferences? = null + private var mangaPreferences: SharedPreferences? = null + private var playerPreferences: SharedPreferences? = null + private var readerPreferences: SharedPreferences? = null + private var irrelevantPreferences: SharedPreferences? = null + private var animeDownloadsPreferences: SharedPreferences? = null + private var protectedPreferences: SharedPreferences? = null + + fun init(context: Context) { + generalPreferences = context.getSharedPreferences(Location.General.location, Context.MODE_PRIVATE) + animePreferences = context.getSharedPreferences(Location.Anime.location, Context.MODE_PRIVATE) + mangaPreferences = context.getSharedPreferences(Location.Manga.location, Context.MODE_PRIVATE) + playerPreferences = context.getSharedPreferences(Location.Player.location, Context.MODE_PRIVATE) + readerPreferences = context.getSharedPreferences(Location.Reader.location, Context.MODE_PRIVATE) + irrelevantPreferences = context.getSharedPreferences(Location.Irrelevant.location, Context.MODE_PRIVATE) + animeDownloadsPreferences = context.getSharedPreferences(Location.AnimeDownloads.location, Context.MODE_PRIVATE) + protectedPreferences = context.getSharedPreferences(Location.Protected.location, Context.MODE_PRIVATE) + } + + @Suppress("UNCHECKED_CAST") + fun setVal(prefName: PrefName, value: T) { + val pref = when (prefName.data.prefLocation) { + Location.General -> generalPreferences + Location.Anime -> animePreferences + Location.Manga -> mangaPreferences + Location.Player -> playerPreferences + Location.Reader -> readerPreferences + Location.Irrelevant -> irrelevantPreferences + Location.AnimeDownloads -> animeDownloadsPreferences + Location.Protected -> protectedPreferences + } + with(pref!!.edit()) { + when (prefName.data.type) { + Boolean::class -> putBoolean(prefName.name, value as Boolean) + Int::class -> putInt(prefName.name, value as Int) + Float::class -> putFloat(prefName.name, value as Float) + Long::class -> putLong(prefName.name, value as Long) + String::class -> putString(prefName.name, value as String) + Set::class -> putStringSet(prefName.name, value as Set) + else -> throw IllegalArgumentException("Type not supported") + } + apply() + } + } + + @Suppress("UNCHECKED_CAST") + fun getVal(prefName: PrefName, default: T) : T { + return try { + val pref = when (prefName.data.prefLocation) { + Location.General -> generalPreferences + Location.Anime -> animePreferences + Location.Manga -> mangaPreferences + Location.Player -> playerPreferences + Location.Reader -> readerPreferences + Location.Irrelevant -> irrelevantPreferences + Location.AnimeDownloads -> animeDownloadsPreferences + Location.Protected -> protectedPreferences + } + when (prefName.data.type) { + Boolean::class -> pref!!.getBoolean(prefName.name, default as Boolean) as T + Int::class -> pref!!.getInt(prefName.name, default as Int) as T + 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 -> pref!!.getStringSet(prefName.name, default as Set) as T + else -> throw IllegalArgumentException("Type not supported") + } + } catch (e: Exception) { + default + } + } + + @Suppress("UNCHECKED_CAST") + fun getLiveVal(prefName: PrefName, default: T) : SharedPreferenceLiveData { + val pref = when (prefName.data.prefLocation) { + Location.General -> generalPreferences + Location.Anime -> animePreferences + Location.Manga -> mangaPreferences + Location.Player -> playerPreferences + Location.Reader -> readerPreferences + Location.Irrelevant -> irrelevantPreferences + Location.AnimeDownloads -> animeDownloadsPreferences + Location.Protected -> protectedPreferences + } + return when (prefName.data.type) { + Boolean::class -> SharedPreferenceBooleanLiveData( + pref!!, + prefName.name, + default as Boolean + ) as SharedPreferenceLiveData + Int::class -> SharedPreferenceIntLiveData( + pref!!, + prefName.name, + default as Int + ) as SharedPreferenceLiveData + Float::class -> SharedPreferenceFloatLiveData( + pref!!, + prefName.name, + default as Float + ) as SharedPreferenceLiveData + Long::class -> SharedPreferenceLongLiveData( + pref!!, + prefName.name, + default as Long + ) as SharedPreferenceLiveData + String::class -> SharedPreferenceStringLiveData( + pref!!, + prefName.name, + default as String + ) as SharedPreferenceLiveData + Set::class -> SharedPreferenceStringSetLiveData( + pref!!, + prefName.name, + default as Set + ) as SharedPreferenceLiveData + else -> throw IllegalArgumentException("Type not supported") + } + } + + fun removeVal(prefName: PrefName) { + val pref = when (prefName.data.prefLocation) { + Location.General -> generalPreferences + Location.Anime -> animePreferences + Location.Manga -> mangaPreferences + Location.Player -> playerPreferences + Location.Reader -> readerPreferences + Location.Irrelevant -> irrelevantPreferences + Location.AnimeDownloads -> animeDownloadsPreferences + Location.Protected -> protectedPreferences + } + with(pref!!.edit()) { + remove(prefName.name) + apply() + } + } + + fun SharedPreferenceLiveData<*>.asLiveBool(): SharedPreferenceBooleanLiveData = + this as? SharedPreferenceBooleanLiveData + ?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData") + + fun SharedPreferenceLiveData<*>.asLiveInt(): SharedPreferenceIntLiveData = + this as? SharedPreferenceIntLiveData + ?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData") + + fun SharedPreferenceLiveData<*>.asLiveFloat(): SharedPreferenceFloatLiveData = + this as? SharedPreferenceFloatLiveData + ?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData") + + fun SharedPreferenceLiveData<*>.asLiveLong(): SharedPreferenceLongLiveData = + this as? SharedPreferenceLongLiveData + ?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData") + + fun SharedPreferenceLiveData<*>.asLiveString(): SharedPreferenceStringLiveData = + this as? SharedPreferenceStringLiveData + ?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData") + + fun SharedPreferenceLiveData<*>.asLiveStringSet(): SharedPreferenceStringSetLiveData = + this as? SharedPreferenceStringSetLiveData + ?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData>") + + fun getAnimeDownloadPreferences(): SharedPreferences = animeDownloadsPreferences!! //needs to be used externally +} \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt b/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt new file mode 100644 index 00000000..59f97ec8 --- /dev/null +++ b/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt @@ -0,0 +1,43 @@ +package ani.dantotsu.settings.saving + +import ani.dantotsu.settings.saving.internal.Pref +import ani.dantotsu.settings.saving.internal.Location + +enum class PrefName(val data: Pref) { + //General + SharedUserID(Pref(Location.General, Boolean::class)), + OfflineView(Pref(Location.General, Int::class)), + UseOLED(Pref(Location.General, Boolean::class)), + UseCustomTheme(Pref(Location.General, Boolean::class)), + CustomThemeInt(Pref(Location.General, Int::class)), + UseSourceTheme(Pref(Location.General, Boolean::class)), + UseMaterialYou(Pref(Location.General, Boolean::class)), + Theme(Pref(Location.General, String::class)), + + //Anime + AnimeListSortOrder(Pref(Location.Anime, String::class)), + PinnedAnimeSources(Pref(Location.Anime, Set::class)), + PopularAnimeList(Pref(Location.Anime, Boolean::class)), + AnimeSearchHistory(Pref(Location.Anime, Set::class)), + + //Manga + MangaListSortOrder(Pref(Location.Manga, String::class)), + PinnedMangaSources(Pref(Location.Manga, Set::class)), + PopularMangaList(Pref(Location.Manga, Boolean::class)), + MangaSearchHistory(Pref(Location.Manga, Set::class)), + + + //Irrelevant + Incognito(Pref(Location.Irrelevant, Boolean::class)), + OfflineMode(Pref(Location.Irrelevant, Boolean::class)), + DownloadsKeys(Pref(Location.Irrelevant, String::class)), + NovelLastExtCheck(Pref(Location.Irrelevant, Long::class)), + SomethingSpecial(Pref(Location.Irrelevant, Boolean::class)), + + //Protected + DiscordToken(Pref(Location.Protected, String::class)), + DiscordId(Pref(Location.Protected, String::class)), + DiscordUserName(Pref(Location.Protected, String::class)), + DiscordAvatar(Pref(Location.Protected, String::class)), + AnilistUserName(Pref(Location.Protected, String::class)), +} \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/others/SharedPreferenceLiveData.kt b/app/src/main/java/ani/dantotsu/settings/saving/SharedPreferenceLiveData.kt similarity index 99% rename from app/src/main/java/ani/dantotsu/others/SharedPreferenceLiveData.kt rename to app/src/main/java/ani/dantotsu/settings/saving/SharedPreferenceLiveData.kt index 70c9b4f7..037fe6f6 100644 --- a/app/src/main/java/ani/dantotsu/others/SharedPreferenceLiveData.kt +++ b/app/src/main/java/ani/dantotsu/settings/saving/SharedPreferenceLiveData.kt @@ -1,4 +1,4 @@ -package ani.dantotsu.others +package ani.dantotsu.settings.saving import android.content.SharedPreferences import androidx.lifecycle.LiveData diff --git a/app/src/main/java/ani/dantotsu/settings/saving/internal/PreferenceInternal.kt b/app/src/main/java/ani/dantotsu/settings/saving/internal/PreferenceInternal.kt new file mode 100644 index 00000000..b44fb07f --- /dev/null +++ b/app/src/main/java/ani/dantotsu/settings/saving/internal/PreferenceInternal.kt @@ -0,0 +1,19 @@ +package ani.dantotsu.settings.saving.internal + +import kotlin.reflect.KClass + + +data class Pref( + val prefLocation: Location, + val type: KClass<*> +) +enum class Location(val location: String) { + General("ani.dantotsu.general"), + Anime("ani.dantotsu.anime"), + Manga("ani.dantotsu.manga"), + Player("ani.dantotsu.player"), + Reader("ani.dantotsu.reader"), + Irrelevant("ani.dantotsu.irrelevant"), + AnimeDownloads("animeDownloads"), //different for legacy reasons + Protected("ani.dantotsu.protected") +} diff --git a/app/src/main/java/ani/dantotsu/subcriptions/NotificationClickReceiver.kt b/app/src/main/java/ani/dantotsu/subcriptions/NotificationClickReceiver.kt index 6b6e20b2..c35af707 100644 --- a/app/src/main/java/ani/dantotsu/subcriptions/NotificationClickReceiver.kt +++ b/app/src/main/java/ani/dantotsu/subcriptions/NotificationClickReceiver.kt @@ -5,14 +5,14 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import ani.dantotsu.INCOGNITO_CHANNEL_ID +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper class NotificationClickReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent?) { - context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).edit() - .putBoolean("incognito", false) - .apply() + PrefWrapper.setVal(PrefName.Incognito, false) val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.cancel(INCOGNITO_CHANNEL_ID) diff --git a/app/src/main/java/ani/dantotsu/themes/ThemeManager.kt b/app/src/main/java/ani/dantotsu/themes/ThemeManager.kt index 4dc1da4f..bc9ac598 100644 --- a/app/src/main/java/ani/dantotsu/themes/ThemeManager.kt +++ b/app/src/main/java/ani/dantotsu/themes/ThemeManager.kt @@ -7,22 +7,19 @@ import android.graphics.Bitmap import android.view.Window import android.view.WindowManager import ani.dantotsu.R +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import com.google.android.material.color.DynamicColors import com.google.android.material.color.DynamicColorsOptions class ThemeManager(private val context: Activity) { fun applyTheme(fromImage: Bitmap? = null) { - val useOLED = context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - .getBoolean("use_oled", false) && isDarkThemeActive(context) - val useCustomTheme = context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - .getBoolean("use_custom_theme", false) - val customTheme = context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - .getInt("custom_theme_int", 16712221) - val useSource = context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - .getBoolean("use_source_theme", false) - val useMaterial = context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - .getBoolean("use_material_you", false) + val useOLED = PrefWrapper.getVal(PrefName.UseOLED, false) && isDarkThemeActive(context) + val useCustomTheme = PrefWrapper.getVal(PrefName.UseCustomTheme, false) + val customTheme = PrefWrapper.getVal(PrefName.CustomThemeInt, 16712221) + val useSource = PrefWrapper.getVal(PrefName.UseSourceTheme, false) + val useMaterial = PrefWrapper.getVal(PrefName.UseMaterialYou, false) if (useSource) { val returnedEarly = applyDynamicColors( useMaterial, @@ -40,8 +37,7 @@ class ThemeManager(private val context: Activity) { val returnedEarly = applyDynamicColors(useMaterial, context, useOLED, useCustom = null) if (!returnedEarly) return } - val theme = context.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE) - .getString("theme", "PURPLE")!! + val theme = PrefWrapper.getVal(PrefName.Theme, "PURPLE") val themeToApply = when (theme) { "BLUE" -> if (useOLED) R.style.Theme_Dantotsu_BlueOLED else R.style.Theme_Dantotsu_Blue diff --git a/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringWidgetConfigureActivity.kt b/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringWidgetConfigureActivity.kt index 79b928f5..762013ef 100644 --- a/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringWidgetConfigureActivity.kt +++ b/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringWidgetConfigureActivity.kt @@ -9,7 +9,6 @@ import android.view.View import android.widget.EditText import ani.dantotsu.R import ani.dantotsu.databinding.CurrentlyAiringWidgetConfigureBinding -import ani.dantotsu.others.LangSet import ani.dantotsu.themes.ThemeManager /** @@ -46,7 +45,7 @@ class CurrentlyAiringWidgetConfigureActivity : Activity() { private lateinit var binding: CurrentlyAiringWidgetConfigureBinding public override fun onCreate(icicle: Bundle?) { - LangSet.setLocale(this) + ThemeManager(this).applyTheme() super.onCreate(icicle) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallActivity.kt index 38e4d791..d36be2fd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallActivity.kt @@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.extension.anime.util import android.app.Activity import android.content.Intent import android.os.Bundle -import ani.dantotsu.others.LangSet import ani.dantotsu.themes.ThemeManager import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager @@ -26,7 +25,7 @@ class AnimeExtensionInstallActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() val installIntent = Intent(Intent.ACTION_INSTALL_PACKAGE) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallActivity.kt index 0ba16d84..4f1a688e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallActivity.kt @@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.extension.manga.util import android.app.Activity import android.content.Intent import android.os.Bundle -import ani.dantotsu.others.LangSet import ani.dantotsu.themes.ThemeManager import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager @@ -26,7 +25,7 @@ class MangaExtensionInstallActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - LangSet.setLocale(this) + ThemeManager(this).applyTheme() val installIntent = Intent(Intent.ACTION_INSTALL_PACKAGE)