Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bf8d0dfc authored by Jacky Wang's avatar Jacky Wang
Browse files

Support flagging for PreferenceScreenCreator

Bug: 335132588
Flag: com.android.settingslib.flags.settings_catalyst
Test: Presubmit & Local test
Change-Id: Ib4ae1b4f9bec04a0fe68f03167598a65cbf62fbb
parent 923a70fc
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -108,6 +108,9 @@ interface PreferenceBinding {
/** 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

+6 −29
Original line number Diff line number Diff line
@@ -44,13 +44,8 @@ open class PreferenceFragment :
        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 @@ open class PreferenceFragment :
        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 @@ open class PreferenceFragment :
        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
        }
    }
}