diff --git a/app/src/main/java/ani/dantotsu/MainActivity.kt b/app/src/main/java/ani/dantotsu/MainActivity.kt index 878a7040..705783af 100644 --- a/app/src/main/java/ani/dantotsu/MainActivity.kt +++ b/app/src/main/java/ani/dantotsu/MainActivity.kt @@ -78,11 +78,11 @@ class MainActivity : AppCompatActivity() { @OptIn(UnstableApi::class) override fun onCreate(savedInstanceState: Bundle?) { ThemeManager(this).applyTheme() - + super.onCreate(savedInstanceState) //get FRAGMENT_CLASS_NAME from intent - val FRAGMENT_CLASS_NAME = intent.getStringExtra("FRAGMENT_CLASS_NAME") + val fragment = intent.getStringExtra("FRAGMENT_CLASS_NAME") binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) @@ -209,8 +209,8 @@ class MainActivity : AppCompatActivity() { binding.root.doOnAttach { initActivity(this) uiSettings = loadData("ui_settings") ?: uiSettings - selectedOption = if (FRAGMENT_CLASS_NAME != null) { - when (FRAGMENT_CLASS_NAME) { + selectedOption = if (fragment != null) { + when (fragment) { AnimeFragment::class.java.name -> 0 HomeFragment::class.java.name -> 1 MangaFragment::class.java.name -> 2 @@ -299,7 +299,7 @@ class MainActivity : AppCompatActivity() { } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - if (loadData("allow_opening_links", this) != true) { + if (!PrefWrapper.getVal(PrefName.AllowOpeningLinks, false)) { CustomBottomDialog.newInstance().apply { title = "Allow Dantotsu to automatically open Anilist & MAL Links?" val md = "Open settings & click +Add Links & select Anilist & Mal urls" @@ -311,18 +311,19 @@ class MainActivity : AppCompatActivity() { }) setNegativeButton(this@MainActivity.getString(R.string.no)) { - saveData("allow_opening_links", true, this@MainActivity) + PrefWrapper.setVal(PrefName.AllowOpeningLinks, true) dismiss() } setPositiveButton(this@MainActivity.getString(R.string.yes)) { - saveData("allow_opening_links", true, this@MainActivity) + PrefWrapper.setVal(PrefName.AllowOpeningLinks, true) tryWith(true) { startActivity( Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS) .setData(Uri.parse("package:$packageName")) ) } + dismiss() } }.show(supportFragmentManager, "dialog") } @@ -336,7 +337,7 @@ class MainActivity : AppCompatActivity() { while (downloadCursor.moveToNext()) { val download = downloadCursor.download Log.e("Downloader", download.request.uri.toString()) - Log.e("Downloader", download.request.id.toString()) + Log.e("Downloader", download.request.id) Log.e("Downloader", download.request.mimeType.toString()) Log.e("Downloader", download.request.data.size.toString()) Log.e("Downloader", download.bytesDownloaded.toString()) 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 4fea9569..5086cb17 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -719,7 +719,7 @@ Page(page:$page,perPage:50) { if (smaller) { val response = execute()?.airingSchedules ?: return null val idArr = mutableListOf() - val listOnly = loadData("recently_list_only") ?: false + val listOnly = PrefWrapper.getVal(PrefName.RecentlyListOnly, false) return response.mapNotNull { i -> i.media?.let { if (!idArr.contains(it.id)) 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 b93d9052..825b982d 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt @@ -101,7 +101,7 @@ class AnilistHomeViewModel : ViewModel() { Anilist.getSavedToken(context) MAL.getSavedToken(context) Discord.getSavedToken(context) - if (loadData("check_update") != false) AppUpdater.check(context) + if (PrefWrapper.getVal(PrefName.CheckUpdate, false)) AppUpdater.check(context) genres.postValue(Anilist.query.getGenresAndTags(context)) } diff --git a/app/src/main/java/ani/dantotsu/home/AnimeFragment.kt b/app/src/main/java/ani/dantotsu/home/AnimeFragment.kt index baaf95d6..1f5061bd 100644 --- a/app/src/main/java/ani/dantotsu/home/AnimeFragment.kt +++ b/app/src/main/java/ani/dantotsu/home/AnimeFragment.kt @@ -272,7 +272,7 @@ class AnimeFragment : Fragment() { model.loadTrending(1) model.loadUpdated() model.loadPopular("ANIME", sort = Anilist.sortBy[1], onList = PrefWrapper.getVal( - PrefName.PopularAnimeList, false)) + PrefName.PopularAnimeList, true)) } live.postValue(false) _binding?.animeRefresh?.isRefreshing = false diff --git a/app/src/main/java/ani/dantotsu/home/MangaFragment.kt b/app/src/main/java/ani/dantotsu/home/MangaFragment.kt index db244a90..cdaed640 100644 --- a/app/src/main/java/ani/dantotsu/home/MangaFragment.kt +++ b/app/src/main/java/ani/dantotsu/home/MangaFragment.kt @@ -246,8 +246,7 @@ class MangaFragment : Fragment() { model.loadTrending() model.loadTrendingNovel() model.loadPopular("MANGA", sort = Anilist.sortBy[1], onList = PrefWrapper.getVal( - PrefName.PopularMangaList, false - )) + PrefName.PopularMangaList, true)) } 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 60c18f43..617752d5 100644 --- a/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt +++ b/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt @@ -123,7 +123,7 @@ class MangaPageAdapter : RecyclerView.Adapter onIncludeListClick.invoke(isChecked) diff --git a/app/src/main/java/ani/dantotsu/home/NoInternet.kt b/app/src/main/java/ani/dantotsu/home/NoInternet.kt index b6326221..58e9c235 100644 --- a/app/src/main/java/ani/dantotsu/home/NoInternet.kt +++ b/app/src/main/java/ani/dantotsu/home/NoInternet.kt @@ -33,7 +33,6 @@ import nl.joery.animatedbottombar.AnimatedBottomBar class NoInternet : AppCompatActivity() { private lateinit var binding: ActivityNoInternetBinding - lateinit var bottomBar: AnimatedBottomBar private var uiSettings = UserInterfaceSettings() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -43,16 +42,16 @@ class NoInternet : AppCompatActivity() { binding = ActivityNoInternetBinding.inflate(layoutInflater) setContentView(binding.root) - val _bottomBar = findViewById(R.id.navbar) + val bottomBar = findViewById(R.id.navbar) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - val backgroundDrawable = _bottomBar.background as GradientDrawable + val backgroundDrawable = bottomBar.background as GradientDrawable val currentColor = backgroundDrawable.color?.defaultColor ?: 0 val semiTransparentColor = (currentColor and 0x00FFFFFF) or 0xE8000000.toInt() backgroundDrawable.setColor(semiTransparentColor) - _bottomBar.background = backgroundDrawable + bottomBar.background = backgroundDrawable } - _bottomBar.background = ContextCompat.getDrawable(this, R.drawable.bottom_nav_gray) + bottomBar.background = ContextCompat.getDrawable(this, R.drawable.bottom_nav_gray) var doubleBackToExitPressedOnce = false diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt index 8d357514..07ff41cd 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt @@ -355,7 +355,7 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi viewPager.setCurrentItem(selected, false) if (model.continueMedia == null && media.cameFromContinue) { - model.continueMedia = loadData("continue_media") ?: true + model.continueMedia = PrefWrapper.getVal(PrefName.ContinueMedia, true) selected = 1 } diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt index 7c45180b..498227a0 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt @@ -28,6 +28,8 @@ import ani.dantotsu.parsers.ShowResponse import ani.dantotsu.parsers.VideoExtractor import ani.dantotsu.parsers.WatchSources import ani.dantotsu.saveData +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.snackString import ani.dantotsu.tryWithSuspend import com.bumptech.glide.load.resource.bitmap.BitmapTransformation @@ -48,7 +50,7 @@ class MediaDetailsViewModel : ViewModel() { fun loadSelected(media: Media, isDownload: Boolean = false): Selected { val data = loadData("${media.id}-select") ?: Selected().let { it.sourceIndex = 0 - it.preferDub = loadData("settings_prefer_dub") ?: false + it.preferDub = PrefWrapper.getVal(PrefName.SettingsPreferDub, false) saveSelected(media.id, it) it } diff --git a/app/src/main/java/ani/dantotsu/media/SearchActivity.kt b/app/src/main/java/ani/dantotsu/media/SearchActivity.kt index 8542b745..5e72c9bb 100644 --- a/app/src/main/java/ani/dantotsu/media/SearchActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/SearchActivity.kt @@ -16,6 +16,8 @@ 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.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.themes.ThemeManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -51,7 +53,7 @@ class SearchActivity : AppCompatActivity() { bottom = navBarHeight + 80f.px ) - style = loadData("searchStyle") ?: 0 + style = PrefWrapper.getVal(PrefName.SearchStyle,0) var listOnly: Boolean? = intent.getBooleanExtra("listOnly", false) if (!listOnly!!) listOnly = null diff --git a/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt b/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt index 1359ebe8..d8c803ee 100644 --- a/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt @@ -22,7 +22,6 @@ import ani.dantotsu.R import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.databinding.ItemChipBinding import ani.dantotsu.databinding.ItemSearchHeaderBinding -import ani.dantotsu.saveData import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.settings.saving.PrefWrapper import com.google.android.material.checkbox.MaterialCheckBox.* @@ -149,14 +148,14 @@ class SearchAdapter(private val activity: SearchActivity, private val type: Stri it.alpha = 1f binding.searchResultList.alpha = 0.33f activity.style = 0 - saveData("searchStyle", 0) + PrefWrapper.setVal(PrefName.SearchStyle, 0) activity.recycler() } binding.searchResultList.setOnClickListener { it.alpha = 1f binding.searchResultGrid.alpha = 0.33f activity.style = 1 - saveData("searchStyle", 1) + PrefWrapper.setVal(PrefName.SearchStyle, 1) activity.recycler() } 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 ff9a0283..a8a1b6a1 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt @@ -383,12 +383,10 @@ class AnimeWatchFragment : Fragment() { if (allSettings.size > 1) { val names = allSettings.map { LanguageMapper.mapLanguageCodeToName(it.lang) }.toTypedArray() - var selectedIndex = 0 val dialog = AlertDialog.Builder(requireContext(), R.style.MyPopup) .setTitle("Select a Source") - .setSingleChoiceItems(names, selectedIndex) { dialog, which -> - selectedIndex = which - selectedSetting = allSettings[selectedIndex] + .setSingleChoiceItems(names, -1) { dialog, which -> + selectedSetting = allSettings[which] itemSelected = true dialog.dismiss() 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 5df4ed6e..0025987b 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt @@ -543,7 +543,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL exoPlayer.seekTo(exoPlayer.currentPosition + settings.skipTime * 1000) } exoSkip.setOnLongClickListener { - val dialog = Dialog(this, R.style.DialogTheme) + val dialog = Dialog(this, R.style.MyPopup) dialog.setContentView(R.layout.item_seekbar_dialog) dialog.setCancelable(true) dialog.setCanceledOnTouchOutside(true) @@ -1013,9 +1013,9 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL initPlayer() preloading = false val context = this - + val offline = PrefWrapper.getVal(PrefName.OfflineMode, false) val incognito = PrefWrapper.getVal(PrefName.Incognito, false) - if (isOnline(context) && Discord.token != null && !incognito) { + if ((isOnline(context) && !offline) && Discord.token != null && !incognito) { lifecycleScope.launch { val presence = RPC.createPresence(RPC.Companion.RPCData( applicationId = Discord.application_Id, @@ -1144,7 +1144,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL playbackParameters = PlaybackParameters(speeds[curSpeed]) var speed: Float val speedDialog = - AlertDialog.Builder(this, R.style.DialogTheme).setTitle(getString(R.string.speed)) + AlertDialog.Builder(this, R.style.MyPopup).setTitle(getString(R.string.speed)) exoSpeed.setOnClickListener { val dialog = speedDialog.setSingleChoiceItems(speedsName, curSpeed) { dialog, i -> if (isInitialized) { @@ -1413,7 +1413,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL ) ) ) - val dialog = AlertDialog.Builder(this, R.style.DialogTheme) + val dialog = AlertDialog.Builder(this, R.style.MyPopup) .setTitle(getString(R.string.continue_from, time)).apply { setCancelable(false) setPositiveButton(getString(R.string.yes)) { d, _ -> diff --git a/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt b/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt index 7c5fbdfe..f7945fb8 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt @@ -27,6 +27,8 @@ import ani.dantotsu.others.Download.download import ani.dantotsu.parsers.Subtitle import ani.dantotsu.parsers.VideoExtractor import ani.dantotsu.parsers.VideoType +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import com.google.firebase.crashlytics.FirebaseCrashlytics import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -299,7 +301,7 @@ class SelectorDialogFragment : BottomSheetDialogFragment() { extractor.server.name media!!.anime!!.episodes!![media!!.anime!!.selectedEpisode!!]!!.selectedVideo = position - if ((loadData("settings_download_manager") ?: 0) != 0) { + if (PrefWrapper.getVal(PrefName.DownloadManager, 0) != 0) { download( requireActivity(), media!!.anime!!.episodes!![media!!.anime!!.selectedEpisode!!]!!, diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt index e13828bb..40e85f82 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt @@ -386,12 +386,10 @@ open class MangaReadFragment : Fragment(), ScanlatorSelectionListener { if (allSettings.size > 1) { val names = allSettings.map { LanguageMapper.mapLanguageCodeToName(it.lang) }.toTypedArray() - var selectedIndex = 0 val dialog = AlertDialog.Builder(requireContext(), R.style.MyPopup) .setTitle("Select a Source") - .setSingleChoiceItems(names, selectedIndex) { dialog, which -> - selectedIndex = which - selectedSetting = allSettings[selectedIndex] + .setSingleChoiceItems(names, -1) { dialog, which -> + selectedSetting = allSettings[which] itemSelected = true dialog.dismiss() 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 e07f2879..3f7e3df1 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 @@ -98,8 +98,6 @@ class MangaReaderActivity : AppCompatActivity() { var sliding = false var isAnimating = false - private var rpc: RPC? = null - override fun onAttachedToWindow() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !settings.showSystemBars) { val displayCutout = window.decorView.rootWindowInsets.displayCutout @@ -320,8 +318,9 @@ class MangaReaderActivity : AppCompatActivity() { chaptersTitleArr.getOrNull(currentChapterIndex - 1) ?: "" applySettings() val context = this + val offline = PrefWrapper.getVal(PrefName.OfflineMode, false) val incognito = PrefWrapper.getVal(PrefName.Incognito, false) - if (isOnline(context) && Discord.token != null && !incognito) { + if ((isOnline(context) && !offline) && Discord.token != null && !incognito) { lifecycleScope.launch { val presence = RPC.createPresence( RPC.Companion.RPCData( diff --git a/app/src/main/java/ani/dantotsu/media/novel/NovelResponseAdapter.kt b/app/src/main/java/ani/dantotsu/media/novel/NovelResponseAdapter.kt index 6d570374..49b3fc61 100644 --- a/app/src/main/java/ani/dantotsu/media/novel/NovelResponseAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/novel/NovelResponseAdapter.kt @@ -104,7 +104,7 @@ class NovelResponseAdapter( binding.root.setOnLongClickListener { val builder = androidx.appcompat.app.AlertDialog.Builder( fragment.requireContext(), - R.style.DialogTheme + R.style.MyPopup ) builder.setTitle("Delete ${novel.name}?") builder.setMessage("Are you sure you want to delete ${novel.name}?") diff --git a/app/src/main/java/ani/dantotsu/others/Download.kt b/app/src/main/java/ani/dantotsu/others/Download.kt index 8a8b496a..f176c629 100644 --- a/app/src/main/java/ani/dantotsu/others/Download.kt +++ b/app/src/main/java/ani/dantotsu/others/Download.kt @@ -17,6 +17,8 @@ import ani.dantotsu.defaultHeaders import ani.dantotsu.loadData import ani.dantotsu.media.anime.Episode import ani.dantotsu.parsers.Book +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.toast import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -36,7 +38,7 @@ object Download { private fun getDownloadDir(context: Context): File { val direct: File - if (loadData("sd_dl") == true) { + if (PrefWrapper.getVal(PrefName.SdDl, false)) { val arrayOfFiles = ContextCompat.getExternalFilesDirs(context, null) val parentDirectory = arrayOfFiles[1].toString() direct = File(parentDirectory) @@ -92,7 +94,7 @@ object Download { if (!file.url.startsWith("http")) toast(context.getString(R.string.invalid_url)) else - when (loadData("settings_download_manager", context, false) ?: 0) { + when (PrefWrapper.getVal(PrefName.DownloadManager, 0)) { 1 -> oneDM(context, file, notif ?: fileName) 2 -> adm(context, file, fileName, folder) else -> defaultDownload(context, file, fileName, folder, notif ?: fileName) @@ -117,7 +119,7 @@ object Download { request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) val arrayOfFiles = ContextCompat.getExternalFilesDirs(context, null) - if (loadData("sd_dl") == true && arrayOfFiles.size > 1 && arrayOfFiles[0] != null && arrayOfFiles[1] != null) { + if (PrefWrapper.getVal(PrefName.SdDl, false) && arrayOfFiles.size > 1 && arrayOfFiles[0] != null && arrayOfFiles[1] != null) { val parentDirectory = arrayOfFiles[1].toString() + folder val direct = File(parentDirectory) if (!direct.exists()) direct.mkdirs() diff --git a/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt b/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt index 4f51430b..f0be5db2 100644 --- a/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt @@ -1,12 +1,12 @@ package ani.dantotsu.settings import android.annotation.SuppressLint +import android.app.AlertDialog import android.os.Build.* import android.os.Build.VERSION.* import android.os.Bundle import android.text.Editable import android.text.TextWatcher -import android.view.View import android.view.ViewGroup import android.widget.AutoCompleteTextView import androidx.appcompat.app.AppCompatActivity @@ -16,6 +16,9 @@ import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 import ani.dantotsu.* import ani.dantotsu.databinding.ActivityExtensionsBinding +import ani.dantotsu.others.LanguageMapper +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.themes.ThemeManager import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator @@ -111,20 +114,20 @@ class ExtensionsActivity : AppCompatActivity() { } }) - initActivity(this) - binding.languageselect.visibility = View.GONE - /* TODO - binding.languageselect.setOnClickListener { - val popup = PopupMenu(this, it) - popup.inflate(R.menu.launguage_selector_menu) - popup.setOnMenuItemClickListener { menuItem -> - true - } - popup.setOnDismissListener { - } - popup.show() - }*/ + binding.languageselect.setOnClickListener { + val languageOptions = LanguageMapper.Companion.Language.entries.map{ it.name }.toTypedArray() + val builder = AlertDialog.Builder(currContext(), R.style.MyPopup) + val listOrder = PrefWrapper.getVal(PrefName.LangSort,"all") + val index = LanguageMapper.Companion.Language.entries.toTypedArray().indexOfFirst{it.code == listOrder} + builder.setTitle("Language") + builder.setSingleChoiceItems(languageOptions, index){ dialog, i -> + PrefWrapper.setVal(PrefName.LangSort, LanguageMapper.Companion.Language.entries[i].code) + dialog.dismiss() + } + val dialog = builder.show() + dialog.window?.setDimAmount(0.8f) + } binding.settingsContainer.updateLayoutParams { topMargin = statusBarHeight bottomMargin = navBarHeight diff --git a/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt index 6f83009a..dab800c7 100644 --- a/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt @@ -26,6 +26,8 @@ import ani.dantotsu.databinding.FragmentAnimeExtensionsBinding import ani.dantotsu.loadData import ani.dantotsu.others.LanguageMapper import ani.dantotsu.settings.extensionprefs.AnimeSourcePreferencesFragment +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.snackString import com.google.android.material.tabs.TabLayout import com.google.android.material.textfield.TextInputLayout @@ -46,7 +48,7 @@ class InstalledAnimeExtensionsFragment : Fragment(), SearchQueryHandler { private var _binding: FragmentAnimeExtensionsBinding? = null private val binding get() = _binding!! private lateinit var extensionsRecyclerView: RecyclerView - private val skipIcons = loadData("skip_extension_icons") ?: false + private val skipIcons = PrefWrapper.getVal(PrefName.SkipExtensionIcons, false) private val animeExtensionManager: AnimeExtensionManager = Injekt.get() private val extensionsAdapter = AnimeExtensionsAdapter( { pkg -> diff --git a/app/src/main/java/ani/dantotsu/settings/InstalledMangaExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/InstalledMangaExtensionsFragment.kt index 1ad5228a..90fbe618 100644 --- a/app/src/main/java/ani/dantotsu/settings/InstalledMangaExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/InstalledMangaExtensionsFragment.kt @@ -27,6 +27,8 @@ import ani.dantotsu.databinding.FragmentMangaExtensionsBinding import ani.dantotsu.loadData import ani.dantotsu.others.LanguageMapper import ani.dantotsu.settings.extensionprefs.MangaSourcePreferencesFragment +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.snackString import com.google.android.material.tabs.TabLayout import com.google.android.material.textfield.TextInputLayout @@ -45,7 +47,7 @@ class InstalledMangaExtensionsFragment : Fragment(), SearchQueryHandler { private var _binding: FragmentMangaExtensionsBinding? = null private val binding get() = _binding!! private lateinit var extensionsRecyclerView: RecyclerView - private val skipIcons = loadData("skip_extension_icons") ?: false + private val skipIcons = PrefWrapper.getVal(PrefName.SkipExtensionIcons, false) private val mangaExtensionManager: MangaExtensionManager = Injekt.get() private val extensionsAdapter = MangaExtensionsAdapter( { pkg -> diff --git a/app/src/main/java/ani/dantotsu/settings/InstalledNovelExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/InstalledNovelExtensionsFragment.kt index 76b84bca..2f951376 100644 --- a/app/src/main/java/ani/dantotsu/settings/InstalledNovelExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/InstalledNovelExtensionsFragment.kt @@ -24,6 +24,8 @@ import ani.dantotsu.loadData import ani.dantotsu.others.LanguageMapper import ani.dantotsu.parsers.novel.NovelExtension import ani.dantotsu.parsers.novel.NovelExtensionManager +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.snackString import com.google.firebase.crashlytics.FirebaseCrashlytics import eu.kanade.tachiyomi.data.notification.Notifications @@ -37,7 +39,7 @@ class InstalledNovelExtensionsFragment : Fragment(), SearchQueryHandler { private var _binding: FragmentNovelExtensionsBinding? = null private val binding get() = _binding!! private lateinit var extensionsRecyclerView: RecyclerView - val skipIcons = loadData("skip_extension_icons") ?: false + val skipIcons = PrefWrapper.getVal(PrefName.SkipExtensionIcons, false) private val novelExtensionManager: NovelExtensionManager = Injekt.get() private val extensionsAdapter = NovelExtensionsAdapter( { pkg -> diff --git a/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt index d76ae92b..23d960f1 100644 --- a/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt @@ -95,7 +95,7 @@ class PlayerSettingsActivity : AppCompatActivity() { var speedsName = curSpeedArr.map { "${it}x" }.toTypedArray() binding.playerSettingsSpeed.text = getString(R.string.default_playback_speed, speedsName[settings.defaultSpeed]) - val speedDialog = AlertDialog.Builder(this, R.style.DialogTheme) + val speedDialog = AlertDialog.Builder(this, R.style.MyPopup) .setTitle(getString(R.string.default_speed)) binding.playerSettingsSpeed.setOnClickListener { val dialog = @@ -246,7 +246,7 @@ class PlayerSettingsActivity : AppCompatActivity() { } val resizeModes = arrayOf("Original", "Zoom", "Stretch") - val resizeDialog = AlertDialog.Builder(this, R.style.DialogTheme) + val resizeDialog = AlertDialog.Builder(this, R.style.MyPopup) .setTitle(getString(R.string.default_resize_mode)) binding.playerResizeMode.setOnClickListener { val dialog = @@ -332,7 +332,7 @@ class PlayerSettingsActivity : AppCompatActivity() { "Blue", "Magenta" ) - val primaryColorDialog = AlertDialog.Builder(this, R.style.DialogTheme) + val primaryColorDialog = AlertDialog.Builder(this, R.style.MyPopup) .setTitle(getString(R.string.primary_sub_color)) binding.videoSubColorPrimary.setOnClickListener { val dialog = primaryColorDialog.setSingleChoiceItems( @@ -359,7 +359,7 @@ class PlayerSettingsActivity : AppCompatActivity() { "Magenta", "Transparent" ) - val secondaryColorDialog = AlertDialog.Builder(this, R.style.DialogTheme) + val secondaryColorDialog = AlertDialog.Builder(this, R.style.MyPopup) .setTitle(getString(R.string.outline_sub_color)) binding.videoSubColorSecondary.setOnClickListener { val dialog = secondaryColorDialog.setSingleChoiceItems( @@ -373,7 +373,7 @@ class PlayerSettingsActivity : AppCompatActivity() { dialog.window?.setDimAmount(0.8f) } val typesOutline = arrayOf("Outline", "Shine", "Drop Shadow", "None") - val outlineDialog = AlertDialog.Builder(this, R.style.DialogTheme) + val outlineDialog = AlertDialog.Builder(this, R.style.MyPopup) .setTitle(getString(R.string.outline_type)) binding.videoSubOutline.setOnClickListener { val dialog = outlineDialog.setSingleChoiceItems( @@ -400,7 +400,7 @@ class PlayerSettingsActivity : AppCompatActivity() { "Blue", "Magenta" ) - val subBackgroundDialog = AlertDialog.Builder(this, R.style.DialogTheme) + val subBackgroundDialog = AlertDialog.Builder(this, R.style.MyPopup) .setTitle(getString(R.string.outline_sub_color)) binding.videoSubColorBackground.setOnClickListener { val dialog = subBackgroundDialog.setSingleChoiceItems( @@ -428,7 +428,7 @@ class PlayerSettingsActivity : AppCompatActivity() { "Blue", "Magenta" ) - val subWindowDialog = AlertDialog.Builder(this, R.style.DialogTheme) + val subWindowDialog = AlertDialog.Builder(this, R.style.MyPopup) .setTitle(getString(R.string.outline_sub_color)) binding.videoSubColorWindow.setOnClickListener { val dialog = subWindowDialog.setSingleChoiceItems( @@ -449,7 +449,7 @@ class PlayerSettingsActivity : AppCompatActivity() { "Century Gothic", "Century Gothic Bold" ) - val fontDialog = AlertDialog.Builder(this, R.style.DialogTheme) + val fontDialog = AlertDialog.Builder(this, R.style.MyPopup) .setTitle(getString(R.string.subtitle_font)) binding.videoSubFont.setOnClickListener { val dialog = fontDialog.setSingleChoiceItems(fonts, settings.font) { dialog, count -> diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt index 3f36f15b..38cc70cb 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt @@ -207,15 +207,15 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene val managers = arrayOf("Default", "1DM", "ADM") val downloadManagerDialog = - AlertDialog.Builder(this, R.style.DialogTheme).setTitle("Download Manager") - var downloadManager = loadData("settings_download_manager") ?: 0 + AlertDialog.Builder(this, R.style.MyPopup).setTitle("Download Manager") + var downloadManager = PrefWrapper.getVal(PrefName.DownloadManager, 0) binding.settingsDownloadManager.setOnClickListener { val dialog = downloadManagerDialog.setSingleChoiceItems( managers, downloadManager ) { dialog, count -> downloadManager = count - saveData("settings_download_manager", downloadManager) + PrefWrapper.setVal(PrefName.DownloadManager, downloadManager) dialog.dismiss() }.show() dialog.window?.setDimAmount(0.8f) @@ -287,13 +287,13 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene } } - binding.skipExtensionIcons.isChecked = loadData("skip_extension_icons") ?: false + binding.skipExtensionIcons.isChecked = PrefWrapper.getVal(PrefName.SkipExtensionIcons, false) binding.skipExtensionIcons.setOnCheckedChangeListener { _, isChecked -> - saveData("skip_extension_icons", isChecked) + PrefWrapper.getVal(PrefName.SkipExtensionIcons, isChecked) } - binding.NSFWExtension.isChecked = loadData("NSFWExtension") ?: true + binding.NSFWExtension.isChecked = PrefWrapper.getVal(PrefName.NSFWExtension, true) binding.NSFWExtension.setOnCheckedChangeListener { _, isChecked -> - saveData("NSFWExtension", isChecked) + PrefWrapper.setVal(PrefName.NSFWExtension,isChecked) } @@ -348,37 +348,37 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene Toast.makeText(this, "Restart app to apply changes", Toast.LENGTH_LONG).show() } - binding.settingsDownloadInSd.isChecked = loadData("sd_dl") ?: false + binding.settingsDownloadInSd.isChecked = PrefWrapper.getVal(PrefName.SdDl, false) binding.settingsDownloadInSd.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { val arrayOfFiles = ContextCompat.getExternalFilesDirs(this, null) if (arrayOfFiles.size > 1 && arrayOfFiles[1] != null) { - saveData("sd_dl", true) + PrefWrapper.setVal(PrefName.SdDl, true) } else { binding.settingsDownloadInSd.isChecked = false - saveData("sd_dl", false) + PrefWrapper.setVal(PrefName.SdDl, true) snackString(getString(R.string.noSdFound)) } - } else saveData("sd_dl", false) + } else PrefWrapper.setVal(PrefName.SdDl, true) } - binding.settingsContinueMedia.isChecked = loadData("continue_media") ?: true + binding.settingsContinueMedia.isChecked = PrefWrapper.getVal(PrefName.ContinueMedia, true) binding.settingsContinueMedia.setOnCheckedChangeListener { _, isChecked -> - saveData("continue_media", isChecked) + PrefWrapper.setVal(PrefName.ContinueMedia, isChecked) } - binding.settingsRecentlyListOnly.isChecked = loadData("recently_list_only") ?: false + binding.settingsRecentlyListOnly.isChecked = PrefWrapper.getVal(PrefName.RecentlyListOnly, false) binding.settingsRecentlyListOnly.setOnCheckedChangeListener { _, isChecked -> - saveData("recently_list_only", isChecked) + PrefWrapper.setVal(PrefName.RecentlyListOnly, isChecked) } binding.settingsShareUsername.isChecked = PrefWrapper.getVal(PrefName.SharedUserID, true) binding.settingsShareUsername.setOnCheckedChangeListener { _, isChecked -> PrefWrapper.setVal(PrefName.SharedUserID, isChecked) } - binding.settingsPreferDub.isChecked = loadData("settings_prefer_dub") ?: false + binding.settingsPreferDub.isChecked = PrefWrapper.getVal(PrefName.SettingsPreferDub, false) binding.settingsPreferDub.setOnCheckedChangeListener { _, isChecked -> - saveData("settings_prefer_dub", isChecked) + PrefWrapper.setVal(PrefName.SettingsPreferDub, isChecked) } binding.settingsPinnedMangaSources.setOnClickListener { @@ -599,7 +599,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene } } - var curTime = loadData("subscriptions_time_s") ?: defaultTime + var curTime = PrefWrapper.getVal(PrefName.SubscriptionsTimeS, defaultTime) val timeNames = timeMinutes.map { val mins = it % 60 val hours = it / 60 @@ -608,14 +608,14 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene }.toTypedArray() binding.settingsSubscriptionsTime.text = getString(R.string.subscriptions_checking_time_s, timeNames[curTime]) - val speedDialog = AlertDialog.Builder(this, R.style.DialogTheme) + val speedDialog = AlertDialog.Builder(this, R.style.MyPopup) .setTitle(R.string.subscriptions_checking_time) binding.settingsSubscriptionsTime.setOnClickListener { val dialog = speedDialog.setSingleChoiceItems(timeNames, curTime) { dialog, i -> curTime = i binding.settingsSubscriptionsTime.text = getString(R.string.subscriptions_checking_time_s, timeNames[i]) - saveData("subscriptions_time_s", curTime) + PrefWrapper.setVal(PrefName.SubscriptionsTimeS, curTime) dialog.dismiss() startSubscription(true) }.show() @@ -628,9 +628,9 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene } binding.settingsNotificationsCheckingSubscriptions.isChecked = - loadData("subscription_checking_notifications") ?: true + PrefWrapper.getVal(PrefName.SubscriptionCheckingNotifications, true) binding.settingsNotificationsCheckingSubscriptions.setOnCheckedChangeListener { _, isChecked -> - saveData("subscription_checking_notifications", isChecked) + PrefWrapper.setVal(PrefName.SubscriptionCheckingNotifications, isChecked) if (isChecked) Notifications.createChannel( this, @@ -648,9 +648,10 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene } - binding.settingsCheckUpdate.isChecked = loadData("check_update") ?: true + binding.settingsCheckUpdate.isChecked = PrefWrapper.getVal(PrefName.CheckUpdate, true) binding.settingsCheckUpdate.setOnCheckedChangeListener { _, isChecked -> saveData("check_update", isChecked) + PrefWrapper.setVal(PrefName.CheckUpdate, isChecked) if (!isChecked) { snackString(getString(R.string.long_click_to_check_update)) } diff --git a/app/src/main/java/ani/dantotsu/settings/UserInterfaceSettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/UserInterfaceSettingsActivity.kt index d4d18aa1..7e97d3a3 100644 --- a/app/src/main/java/ani/dantotsu/settings/UserInterfaceSettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/UserInterfaceSettingsActivity.kt @@ -41,7 +41,7 @@ class UserInterfaceSettingsActivity : AppCompatActivity() { val views = resources.getStringArray(R.array.home_layouts) binding.uiSettingsHomeLayout.setOnClickListener { - val dialog = AlertDialog.Builder(this, R.style.DialogTheme) + val dialog = AlertDialog.Builder(this, R.style.MyPopup) .setTitle(getString(R.string.home_layout_show)).apply { setMultiChoiceItems( views, diff --git a/app/src/main/java/ani/dantotsu/settings/paging/AnimePagingSource.kt b/app/src/main/java/ani/dantotsu/settings/paging/AnimePagingSource.kt index 46efaf5a..065fa58b 100644 --- a/app/src/main/java/ani/dantotsu/settings/paging/AnimePagingSource.kt +++ b/app/src/main/java/ani/dantotsu/settings/paging/AnimePagingSource.kt @@ -19,8 +19,9 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import ani.dantotsu.R import ani.dantotsu.databinding.ItemExtensionAllBinding -import ani.dantotsu.loadData import ani.dantotsu.others.LanguageMapper +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import com.bumptech.glide.Glide import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension @@ -92,15 +93,16 @@ class AnimeExtensionPagingSource( val availableExtensions = availableExtensionsFlow.filterNot { it.pkgName in installedExtensions } val query = searchQuery - val isNsfwEnabled: Boolean = loadData("NSFWExtension") ?: true + val isNsfwEnabled: Boolean = PrefWrapper.getVal(PrefName.NSFWExtension,true) val filteredExtensions = if (query.isEmpty()) { availableExtensions } else { availableExtensions.filter { it.name.contains(query, ignoreCase = true) } } - val filternfsw = - if (isNsfwEnabled) filteredExtensions else filteredExtensions.filterNot { it.isNsfw } + val lang = PrefWrapper.getVal(PrefName.LangSort, "all") + val langFilter = if (lang != "all") filteredExtensions.filter { it.lang == lang } else filteredExtensions + val filternfsw = if (isNsfwEnabled) langFilter else langFilter.filterNot { it.isNsfw } return try { val sublist = filternfsw.subList( fromIndex = position, @@ -126,7 +128,7 @@ class AnimeExtensionAdapter(private val clickListener: OnAnimeInstallClickListen DIFF_CALLBACK ) { - private val skipIcons = loadData("skip_extension_icons") ?: false + private val skipIcons = PrefWrapper.getVal(PrefName.SkipExtensionIcons, false) companion object { private val DIFF_CALLBACK = object : DiffUtil.ItemCallback() { diff --git a/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt b/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt index ed95c2be..d8f0a0e4 100644 --- a/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt +++ b/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt @@ -21,6 +21,8 @@ import ani.dantotsu.R import ani.dantotsu.databinding.ItemExtensionAllBinding import ani.dantotsu.loadData import ani.dantotsu.others.LanguageMapper +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import com.bumptech.glide.Glide import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.extension.manga.model.MangaExtension @@ -92,14 +94,15 @@ class MangaExtensionPagingSource( val availableExtensions = availableExtensionsFlow.filterNot { it.pkgName in installedExtensions } val query = searchQuery - val isNsfwEnabled: Boolean = loadData("NSFWExtension") ?: true + val isNsfwEnabled: Boolean = PrefWrapper.getVal(PrefName.NSFWExtension,true) val filteredExtensions = if (query.isEmpty()) { availableExtensions } else { availableExtensions.filter { it.name.contains(query, ignoreCase = true) } } - val filternfsw = - if (isNsfwEnabled) filteredExtensions else filteredExtensions.filterNot { it.isNsfw } + val lang = PrefWrapper.getVal(PrefName.LangSort, "all") + val langFilter = if (lang != "all") filteredExtensions.filter { it.lang == lang } else filteredExtensions + val filternfsw = if (isNsfwEnabled) langFilter else langFilter.filterNot { it.isNsfw } return try { val sublist = filternfsw.subList( fromIndex = position, @@ -125,7 +128,7 @@ class MangaExtensionAdapter(private val clickListener: OnMangaInstallClickListen DIFF_CALLBACK ) { - private val skipIcons = loadData("skip_extension_icons") ?: false + private val skipIcons = PrefWrapper.getVal(PrefName.SkipExtensionIcons, false) companion object { private val DIFF_CALLBACK = object : DiffUtil.ItemCallback() { diff --git a/app/src/main/java/ani/dantotsu/settings/paging/NovelPagingSource.kt b/app/src/main/java/ani/dantotsu/settings/paging/NovelPagingSource.kt index 91dcffd6..c9f2a01f 100644 --- a/app/src/main/java/ani/dantotsu/settings/paging/NovelPagingSource.kt +++ b/app/src/main/java/ani/dantotsu/settings/paging/NovelPagingSource.kt @@ -22,6 +22,8 @@ import ani.dantotsu.loadData import ani.dantotsu.others.LanguageMapper import ani.dantotsu.parsers.novel.NovelExtension import ani.dantotsu.parsers.novel.NovelExtensionManager +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import com.bumptech.glide.Glide import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -93,7 +95,7 @@ class NovelExtensionPagingSource( val availableExtensions = availableExtensionsFlow.filterNot { it.pkgName in installedExtensions } val query = searchQuery - val isNsfwEnabled: Boolean = loadData("NFSWExtension") ?: true + val isNsfwEnabled: Boolean = PrefWrapper.getVal(PrefName.NSFWExtension,true) val filteredExtensions = if (query.isEmpty()) { availableExtensions } else { @@ -130,7 +132,7 @@ class NovelExtensionAdapter(private val clickListener: OnNovelInstallClickListen DIFF_CALLBACK ) { - private val skipIcons = loadData("skip_extension_icons") ?: false + private val skipIcons = PrefWrapper.getVal(PrefName.SkipExtensionIcons, false) companion object { private val DIFF_CALLBACK = object : DiffUtil.ItemCallback() { diff --git a/app/src/main/java/ani/dantotsu/settings/saving/PrefWrapper.kt b/app/src/main/java/ani/dantotsu/settings/saving/PrefWrapper.kt index 35f6d32d..b5193a07 100644 --- a/app/src/main/java/ani/dantotsu/settings/saving/PrefWrapper.kt +++ b/app/src/main/java/ani/dantotsu/settings/saving/PrefWrapper.kt @@ -1,8 +1,11 @@ package ani.dantotsu.settings.saving +import android.annotation.SuppressLint import android.content.Context import android.content.SharedPreferences +import ani.dantotsu.settings.saving.internal.Compat import ani.dantotsu.settings.saving.internal.Location +import ani.dantotsu.snackString object PrefWrapper { @@ -15,7 +18,7 @@ object PrefWrapper { private var animeDownloadsPreferences: SharedPreferences? = null private var protectedPreferences: SharedPreferences? = null - fun init(context: Context) { + fun init(context: Context) { //must be called in Application class or will crash 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) @@ -24,27 +27,19 @@ object PrefWrapper { 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) + Compat.importOldPrefs(context) } @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()) { + val pref = getPrefLocation(prefName) + 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) + String::class -> putString(prefName.name, value as String?) Set::class -> putStringSet(prefName.name, value as Set) else -> throw IllegalArgumentException("Type not supported") } @@ -55,70 +50,53 @@ object PrefWrapper { @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 - } + val pref = getPrefLocation(prefName) 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 + 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) { + snackString("Error getting preference: ${e.message}") 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 - } + val pref = getPrefLocation(prefName) return when (prefName.data.type) { Boolean::class -> SharedPreferenceBooleanLiveData( - pref!!, + pref, prefName.name, default as Boolean ) as SharedPreferenceLiveData Int::class -> SharedPreferenceIntLiveData( - pref!!, + pref, prefName.name, default as Int ) as SharedPreferenceLiveData Float::class -> SharedPreferenceFloatLiveData( - pref!!, + pref, prefName.name, default as Float ) as SharedPreferenceLiveData Long::class -> SharedPreferenceLongLiveData( - pref!!, + pref, prefName.name, default as Long ) as SharedPreferenceLiveData String::class -> SharedPreferenceStringLiveData( - pref!!, + pref, prefName.name, default as String ) as SharedPreferenceLiveData Set::class -> SharedPreferenceStringSetLiveData( - pref!!, + pref, prefName.name, default as Set ) as SharedPreferenceLiveData @@ -127,17 +105,8 @@ object PrefWrapper { } 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()) { + val pref = getPrefLocation(prefName) + with(pref.edit()) { remove(prefName.name) apply() } @@ -211,4 +180,17 @@ object PrefWrapper { ?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData>") fun getAnimeDownloadPreferences(): SharedPreferences = animeDownloadsPreferences!! //needs to be used externally + + private fun getPrefLocation(prefName: PrefName): SharedPreferences { + return 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 + }!! + } } \ 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 index 59f97ec8..f8bf4cb5 100644 --- a/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt +++ b/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt @@ -13,6 +13,16 @@ enum class PrefName(val data: Pref) { UseSourceTheme(Pref(Location.General, Boolean::class)), UseMaterialYou(Pref(Location.General, Boolean::class)), Theme(Pref(Location.General, String::class)), + DownloadManager(Pref(Location.General, Int::class)), + NSFWExtension(Pref(Location.General, Boolean::class)), + SkipExtensionIcons(Pref(Location.General, Boolean::class)), + SdDl(Pref(Location.General, Boolean::class)), + ContinueMedia(Pref(Location.General, Boolean::class)), + RecentlyListOnly(Pref(Location.General, Boolean::class)), + SettingsPreferDub(Pref(Location.General, Boolean::class)), + SubscriptionsTimeS(Pref(Location.General, Int::class)), + SubscriptionCheckingNotifications(Pref(Location.General, Boolean::class)), + CheckUpdate(Pref(Location.General, Boolean::class)), //Anime AnimeListSortOrder(Pref(Location.Anime, String::class)), @@ -26,13 +36,16 @@ enum class PrefName(val data: Pref) { 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)), + AllowOpeningLinks(Pref(Location.Irrelevant, Boolean::class)), + SearchStyle(Pref(Location.Irrelevant, Int::class)), + HasUpdatedPrefs(Pref(Location.Irrelevant, Boolean::class)), + LangSort(Pref(Location.Irrelevant, String::class)), //Protected DiscordToken(Pref(Location.Protected, String::class)), diff --git a/app/src/main/java/ani/dantotsu/settings/saving/internal/Compat.kt b/app/src/main/java/ani/dantotsu/settings/saving/internal/Compat.kt new file mode 100644 index 00000000..8afdee78 --- /dev/null +++ b/app/src/main/java/ani/dantotsu/settings/saving/internal/Compat.kt @@ -0,0 +1,18 @@ +package ani.dantotsu.settings.saving.internal + +import android.content.Context +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper + +class Compat { + companion object { + fun importOldPrefs(context: Context) { + if (PrefWrapper.getVal(PrefName.HasUpdatedPrefs, false)) return + val oldPrefs = context.getSharedPreferences("downloads_pref", Context.MODE_PRIVATE) + val jsonString = oldPrefs.getString("downloads_key", null) + PrefWrapper.setVal(PrefName.DownloadsKeys, jsonString) + oldPrefs.edit().clear().apply() + PrefWrapper.setVal(PrefName.HasUpdatedPrefs, true) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/subcriptions/AlarmReceiver.kt b/app/src/main/java/ani/dantotsu/subcriptions/AlarmReceiver.kt index a326c531..2529c418 100644 --- a/app/src/main/java/ani/dantotsu/subcriptions/AlarmReceiver.kt +++ b/app/src/main/java/ani/dantotsu/subcriptions/AlarmReceiver.kt @@ -7,8 +7,9 @@ import android.content.Context import android.content.Intent import ani.dantotsu.currContext import ani.dantotsu.isOnline -import ani.dantotsu.loadData import ani.dantotsu.logger +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.subcriptions.Subscription.Companion.defaultTime import ani.dantotsu.subcriptions.Subscription.Companion.startSubscription import ani.dantotsu.subcriptions.Subscription.Companion.timeMinutes @@ -43,7 +44,7 @@ class AlarmReceiver : BroadcastReceiver() { PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager - val curTime = loadData("subscriptions_time_s", context) ?: defaultTime + val curTime = PrefWrapper.getVal(PrefName.SubscriptionsTimeS, defaultTime) if (timeMinutes[curTime] > 0) alarmManager.setRepeating( diff --git a/app/src/main/java/ani/dantotsu/subcriptions/Subscription.kt b/app/src/main/java/ani/dantotsu/subcriptions/Subscription.kt index 83b3bd70..c0551f7d 100644 --- a/app/src/main/java/ani/dantotsu/subcriptions/Subscription.kt +++ b/app/src/main/java/ani/dantotsu/subcriptions/Subscription.kt @@ -8,6 +8,8 @@ import androidx.core.app.NotificationManagerCompat import ani.dantotsu.* import ani.dantotsu.parsers.Episode import ani.dantotsu.parsers.MangaChapter +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay @@ -41,7 +43,7 @@ class Subscription { val notificationManager = NotificationManagerCompat.from(context) val progressEnabled = - loadData("subscription_checking_notifications", context) ?: true + PrefWrapper.getVal(PrefName.SubscriptionCheckingNotifications, true) val progressNotification = if (progressEnabled) getProgressNotification( context, subscriptions.size diff --git a/app/src/main/java/ani/dantotsu/subcriptions/SubscriptionHelper.kt b/app/src/main/java/ani/dantotsu/subcriptions/SubscriptionHelper.kt index 9593a5b8..9aeda2e5 100644 --- a/app/src/main/java/ani/dantotsu/subcriptions/SubscriptionHelper.kt +++ b/app/src/main/java/ani/dantotsu/subcriptions/SubscriptionHelper.kt @@ -16,6 +16,8 @@ import ani.dantotsu.parsers.MangaChapter import ani.dantotsu.parsers.MangaParser import ani.dantotsu.parsers.MangaSources import ani.dantotsu.saveData +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.tryWithSuspend import kotlinx.coroutines.withTimeoutOrNull @@ -29,7 +31,7 @@ class SubscriptionHelper { ): Selected { val data = loadData("${mediaId}-select", context) ?: Selected().let { it.sourceIndex = 0 - it.preferDub = loadData("settings_prefer_dub", context) ?: false + it.preferDub = PrefWrapper.getVal(PrefName.SettingsPreferDub, false) it } return data diff --git a/app/src/main/java/ani/dantotsu/subcriptions/SubscriptionWorker.kt b/app/src/main/java/ani/dantotsu/subcriptions/SubscriptionWorker.kt index bed58b21..4286d438 100644 --- a/app/src/main/java/ani/dantotsu/subcriptions/SubscriptionWorker.kt +++ b/app/src/main/java/ani/dantotsu/subcriptions/SubscriptionWorker.kt @@ -9,6 +9,8 @@ import androidx.work.PeriodicWorkRequest import androidx.work.WorkManager import androidx.work.WorkerParameters import ani.dantotsu.loadData +import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.settings.saving.PrefWrapper import ani.dantotsu.subcriptions.Subscription.Companion.defaultTime import ani.dantotsu.subcriptions.Subscription.Companion.timeMinutes import kotlinx.coroutines.Dispatchers @@ -29,7 +31,7 @@ class SubscriptionWorker(val context: Context, params: WorkerParameters) : private const val SUBSCRIPTION_WORK_NAME = "work_subscription" fun enqueue(context: Context) { - val curTime = loadData("subscriptions_time_s") ?: defaultTime + val curTime = PrefWrapper.getVal(PrefName.SubscriptionsTimeS, defaultTime) if (timeMinutes[curTime] > 0L) { val constraints = Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build() diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 6c595fb0..51168cb3 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -21,7 +21,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" - android:layout_marginTop="32dp" + android:layout_marginTop="31dp" app:cardBackgroundColor="@color/nav_bg_inv" app:cardCornerRadius="16dp" app:cardElevation="0dp"> @@ -46,7 +46,7 @@ @@ -71,254 +71,8 @@ android:animateLayoutChanges="true" android:clipToPadding="false" android:orientation="vertical" - android:paddingStart="32dp" - android:paddingEnd="32dp"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -