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

Commit 91fabba7 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Support flagging for PreferenceScreenCreator" into main

parents ee7ce4ea bf8d0dfc
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
        }
    }
}