From e36a2c68f112f98155f5eea859a59a13cc22e168 Mon Sep 17 00:00:00 2001 From: arkon Date: Sat, 16 Dec 2023 10:16:05 -0500 Subject: [PATCH] Avoid crashing in SourcePreferencesFragment if source can't be loaded Should probably wait for sources to definitely be loaded first, but that's sort of a bigger change and needs to be lifecycle-aware. --- .../details/SourcePreferencesScreen.kt | 47 ++++++++++--------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/SourcePreferencesScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/SourcePreferencesScreen.kt index b4c1321c0b..3eac8accf6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/SourcePreferencesScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/SourcePreferencesScreen.kt @@ -65,8 +65,7 @@ class SourcePreferencesScreen(val sourceId: Long) : Screen() { .fillMaxSize() .padding(contentPadding), ) { - val fragment = SourcePreferencesFragment.getInstance(sourceId) - add(it, fragment, null) + add(it, SourcePreferencesFragment.getInstance(sourceId), null) } } } @@ -127,26 +126,28 @@ class SourcePreferencesFragment : PreferenceFragmentCompat() { private fun populateScreen(): PreferenceScreen { val sourceId = requireArguments().getLong(SOURCE_ID) - val source = Injekt.get().get(sourceId)!! as ConfigurableSource - - val dataStore = SharedPreferencesDataStore(source.sourcePreferences()) - preferenceManager.preferenceDataStore = dataStore - + val source = Injekt.get().getOrStub(sourceId) val sourceScreen = preferenceManager.createPreferenceScreen(requireContext()) - source.setupPreferenceScreen(sourceScreen) - sourceScreen.forEach { pref -> - pref.isIconSpaceReserved = false - pref.isSingleLineTitle = false - if (pref is DialogPreference && pref.dialogTitle.isNullOrEmpty()) { - pref.dialogTitle = pref.title - } - // Apply incognito IME for EditTextPreference - if (pref is EditTextPreference) { - val setListener = pref.getOnBindEditTextListener() - pref.setOnBindEditTextListener { - setListener?.onBindEditText(it) - it.setIncognito(lifecycleScope) + if (source is ConfigurableSource) { + val dataStore = SharedPreferencesDataStore(source.sourcePreferences()) + preferenceManager.preferenceDataStore = dataStore + + source.setupPreferenceScreen(sourceScreen) + sourceScreen.forEach { pref -> + pref.isIconSpaceReserved = false + pref.isSingleLineTitle = false + if (pref is DialogPreference && pref.dialogTitle.isNullOrEmpty()) { + pref.dialogTitle = pref.title + } + + // Apply incognito IME for EditTextPreference + if (pref is EditTextPreference) { + val setListener = pref.getOnBindEditTextListener() + pref.setOnBindEditTextListener { + setListener?.onBindEditText(it) + it.setIncognito(lifecycleScope) + } } } } @@ -158,9 +159,9 @@ class SourcePreferencesFragment : PreferenceFragmentCompat() { private const val SOURCE_ID = "source_id" fun getInstance(sourceId: Long): SourcePreferencesFragment { - val fragment = SourcePreferencesFragment() - fragment.arguments = bundleOf(SOURCE_ID to sourceId) - return fragment + return SourcePreferencesFragment().apply { + arguments = bundleOf(SOURCE_ID to sourceId) + } } } }