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.

(cherry picked from commit e36a2c68f112f98155f5eea859a59a13cc22e168)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/details/SourcePreferencesScreen.kt
This commit is contained in:
arkon 2023-12-16 10:16:05 -05:00 committed by Jobobby04
parent 7de2e72228
commit b9fb77aeb1

View File

@ -66,8 +66,7 @@ class SourcePreferencesScreen(val sourceId: Long) : Screen() {
.fillMaxSize() .fillMaxSize()
.padding(contentPadding), .padding(contentPadding),
) { ) {
val fragment = SourcePreferencesFragment.getInstance(sourceId) add(it, SourcePreferencesFragment.getInstance(sourceId), null)
add(it, fragment, null)
} }
} }
} }
@ -130,7 +129,7 @@ class SourcePreferencesFragment : PreferenceFragmentCompat() {
val sourceId = requireArguments().getLong(SOURCE_ID) val sourceId = requireArguments().getLong(SOURCE_ID)
// SY --> // SY -->
val source = Injekt.get<SourceManager>() val source = Injekt.get<SourceManager>()
.get(sourceId) .getOrStub(sourceId)
?.let { source -> ?.let { source ->
if (source is EnhancedHttpSource) { if (source is EnhancedHttpSource) {
if (source.enhancedSource is ConfigurableSource) { if (source.enhancedSource is ConfigurableSource) {
@ -144,27 +143,27 @@ class SourcePreferencesFragment : PreferenceFragmentCompat() {
} }
?: throw NullPointerException("source = null, SOURCE_ID = $SOURCE_ID") ?: throw NullPointerException("source = null, SOURCE_ID = $SOURCE_ID")
// SY <-- // SY <--
check(source is ConfigurableSource)
val dataStore = SharedPreferencesDataStore(source.sourcePreferences())
preferenceManager.preferenceDataStore = dataStore
val sourceScreen = preferenceManager.createPreferenceScreen(requireContext()) 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 (source is ConfigurableSource) {
if (pref is EditTextPreference) { val dataStore = SharedPreferencesDataStore(source.sourcePreferences())
val setListener = pref.getOnBindEditTextListener() preferenceManager.preferenceDataStore = dataStore
pref.setOnBindEditTextListener {
setListener?.onBindEditText(it) source.setupPreferenceScreen(sourceScreen)
it.setIncognito(lifecycleScope) 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)
}
} }
} }
} }
@ -176,9 +175,9 @@ class SourcePreferencesFragment : PreferenceFragmentCompat() {
private const val SOURCE_ID = "source_id" private const val SOURCE_ID = "source_id"
fun getInstance(sourceId: Long): SourcePreferencesFragment { fun getInstance(sourceId: Long): SourcePreferencesFragment {
val fragment = SourcePreferencesFragment() return SourcePreferencesFragment().apply {
fragment.arguments = bundleOf(SOURCE_ID to sourceId) arguments = bundleOf(SOURCE_ID to sourceId)
return fragment }
} }
} }
} }