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
-        }
-    }
 }