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 Original line Diff line number Diff line
@@ -108,6 +108,9 @@ interface PreferenceBinding {
/** Abstract preference screen to provide preference hierarchy and binding factory. */
/** Abstract preference screen to provide preference hierarchy and binding factory. */
interface PreferenceScreenCreator : PreferenceScreenMetadata, PreferenceScreenProvider {
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
    val preferenceBindingFactory: PreferenceBindingFactory
        get() = DefaultPreferenceBindingFactory
        get() = DefaultPreferenceBindingFactory


+6 −29
Original line number Original line Diff line number Diff line
@@ -44,13 +44,8 @@ open class PreferenceFragment :
        fun createPreferenceScreenFromResource() =
        fun createPreferenceScreenFromResource() =
            factory.inflate(getPreferenceScreenResId(context))
            factory.inflate(getPreferenceScreenResId(context))


        if (!usePreferenceScreenMetadata()) return createPreferenceScreenFromResource()

        val screenKey = getPreferenceScreenBindingKey(context)
        val screenCreator =
        val screenCreator =
            (PreferenceScreenRegistry[screenKey] as? PreferenceScreenCreator)
            getPreferenceScreenCreator(context) ?: return createPreferenceScreenFromResource()
                ?: return createPreferenceScreenFromResource()

        val preferenceBindingFactory = screenCreator.preferenceBindingFactory
        val preferenceBindingFactory = screenCreator.preferenceBindingFactory
        val preferenceHierarchy = screenCreator.getPreferenceHierarchy(context)
        val preferenceHierarchy = screenCreator.getPreferenceHierarchy(context)
        val preferenceScreen =
        val preferenceScreen =
@@ -73,17 +68,14 @@ open class PreferenceFragment :
        return preferenceScreen
        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. */
    /** Returns the xml resource to create preference screen. */
    @XmlRes protected open fun getPreferenceScreenResId(context: Context): Int = 0
    @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? =
    override fun getPreferenceScreenBindingKey(context: Context): String? =
        arguments?.getString(EXTRA_BINDING_SCREEN_KEY)
        arguments?.getString(EXTRA_BINDING_SCREEN_KEY)


@@ -91,19 +83,4 @@ open class PreferenceFragment :
        preferenceScreenBindingHelper?.close()
        preferenceScreenBindingHelper?.close()
        super.onDestroy()
        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
        }
    }
}
}