Merge "Support flagging for PreferenceScreenCreator" into main
diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBinding.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBinding.kt
index 9be0e71..5fcf478 100644
--- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBinding.kt
+++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBinding.kt
@@ -108,6 +108,9 @@
/** Abstract preference screen to provide preference hierarchy and binding factory. */
interface PreferenceScreenCreator : PreferenceScreenMetadata, PreferenceScreenProvider {
+ /** Returns if the flag (e.g. for rollout) is enabled on current screen. */
+ fun isFlagEnabled(context: Context): Boolean = true
+
val preferenceBindingFactory: PreferenceBindingFactory
get() = DefaultPreferenceBindingFactory
diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt
index 68f640b..a270681 100644
--- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt
+++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt
@@ -44,13 +44,8 @@
fun createPreferenceScreenFromResource() =
factory.inflate(getPreferenceScreenResId(context))
- if (!usePreferenceScreenMetadata()) return createPreferenceScreenFromResource()
-
- val screenKey = getPreferenceScreenBindingKey(context)
val screenCreator =
- (PreferenceScreenRegistry[screenKey] as? PreferenceScreenCreator)
- ?: return createPreferenceScreenFromResource()
-
+ getPreferenceScreenCreator(context) ?: return createPreferenceScreenFromResource()
val preferenceBindingFactory = screenCreator.preferenceBindingFactory
val preferenceHierarchy = screenCreator.getPreferenceHierarchy(context)
val preferenceScreen =
@@ -73,17 +68,14 @@
return preferenceScreen
}
- /**
- * Returns if preference screen metadata can be used to set up preference screen.
- *
- * This is for flagging purpose. If false (e.g. flag is disabled), xml resource is used to build
- * preference screen.
- */
- protected open fun usePreferenceScreenMetadata(): Boolean = false
-
/** Returns the xml resource to create preference screen. */
@XmlRes protected open fun getPreferenceScreenResId(context: Context): Int = 0
+ protected fun getPreferenceScreenCreator(context: Context): PreferenceScreenCreator? =
+ (PreferenceScreenRegistry[getPreferenceScreenBindingKey(context)]
+ as? PreferenceScreenCreator)
+ ?.run { if (isFlagEnabled(context)) this else null }
+
override fun getPreferenceScreenBindingKey(context: Context): String? =
arguments?.getString(EXTRA_BINDING_SCREEN_KEY)
@@ -91,19 +83,4 @@
preferenceScreenBindingHelper?.close()
super.onDestroy()
}
-
- companion object {
- /** Returns [PreferenceFragment] instance to display the preference screen of given key. */
- fun of(screenKey: String): PreferenceFragment? {
- val screenMetadata = PreferenceScreenRegistry[screenKey] ?: return null
- if (
- screenMetadata is PreferenceScreenCreator && screenMetadata.hasCompleteHierarchy()
- ) {
- return PreferenceFragment().apply {
- arguments = Bundle().apply { putString(EXTRA_BINDING_SCREEN_KEY, screenKey) }
- }
- }
- return null
- }
- }
}