From 9175d9ec29a5805220c4689ce2030b5f474bf9fc Mon Sep 17 00:00:00 2001 From: David Allison <62114487+david-allison@users.noreply.github.com> Date: Tue, 5 Mar 2024 18:53:41 +0000 Subject: [PATCH] chore: 'DialogFragmentProvider' - make optional If a call to super is requested, `null` may be returned In this case, `super` would be called This is useful if you would optionally want to inherit from a class (say `EditTextPreference`), but also allow conditionally return a different fragment --- .../ichi2/anki/preferences/SettingsFragment.kt | 15 +++++++-------- .../java/com/ichi2/preferences/PreferenceUtil.kt | 4 ++-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/SettingsFragment.kt b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/SettingsFragment.kt index 3e9ec1a4b0..b27ee9667c 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/preferences/SettingsFragment.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/preferences/SettingsFragment.kt @@ -29,6 +29,7 @@ import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager.OnPreferenceTreeClickListener import com.ichi2.anki.analytics.UsageAnalytics import com.ichi2.preferences.DialogFragmentProvider +import timber.log.Timber import java.lang.NumberFormatException import kotlin.reflect.KClass import kotlin.reflect.jvm.jvmName @@ -91,14 +92,12 @@ abstract class SettingsFragment : // `getTargetFragment()`, which throws if `setTargetFragment()` isn't used before. // While this isn't fixed on upstream, suppress the deprecation warning override fun onDisplayPreferenceDialog(preference: Preference) { - if (preference is DialogFragmentProvider) { - val dialogFragment = preference.makeDialogFragment() - dialogFragment.arguments = bundleOf("key" to preference.key) - dialogFragment.setTargetFragment(this, 0) - dialogFragment.show(parentFragmentManager, "androidx.preference.PreferenceFragment.DIALOG") - } else { - super.onDisplayPreferenceDialog(preference) - } + val dialogFragment = (preference as? DialogFragmentProvider)?.makeDialogFragment() + ?: return super.onDisplayPreferenceDialog(preference) + Timber.d("displaying custom preference: ${dialogFragment::class.simpleName}") + dialogFragment.arguments = bundleOf("key" to preference.key) + dialogFragment.setTargetFragment(this, 0) + dialogFragment.show(parentFragmentManager, "androidx.preference.PreferenceFragment.DIALOG") } override fun onStart() { diff --git a/AnkiDroid/src/main/java/com/ichi2/preferences/PreferenceUtil.kt b/AnkiDroid/src/main/java/com/ichi2/preferences/PreferenceUtil.kt index 2370172077..5a58235e3a 100644 --- a/AnkiDroid/src/main/java/com/ichi2/preferences/PreferenceUtil.kt +++ b/AnkiDroid/src/main/java/com/ichi2/preferences/PreferenceUtil.kt @@ -35,11 +35,11 @@ import kotlin.contracts.contract interface DialogFragmentProvider { /** - * @return A DialogFragment to show. + * @return A DialogFragment to show or `null` to use the parent fragment * The dialog must have a zero-parameter constructor. * Any arguments set via [Fragment.setArguments] may get overridden. */ - fun makeDialogFragment(): DialogFragment + fun makeDialogFragment(): DialogFragment? } /**