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

Commit a0827935 authored by Jacky Wang's avatar Jacky Wang Committed by Android (Google) Code Review
Browse files

Merge "[Catalyst] Do not check isFlagEnabled in PreferenceHierarchy" into main

parents d26b673c af3ee4fd
Loading
Loading
Loading
Loading
+10 −25
Original line number Diff line number Diff line
@@ -96,7 +96,7 @@ class PreferenceHierarchy : PreferenceHierarchyNode {
     */
    infix fun String.args(args: Bundle) = createPreferenceScreenHierarchy(this, args)

    operator fun PreferenceHierarchyNode.unaryPlus() = also { add(it) }
    operator fun PreferenceHierarchyNode.unaryPlus() = also { children.add(it) }

    /** Specifies preference order in the hierarchy. */
    infix fun PreferenceHierarchyNode.order(order: Int) = apply { this.order = order }
@@ -109,26 +109,10 @@ class PreferenceHierarchy : PreferenceHierarchyNode {
    fun add(metadata: PreferenceMetadata, order: Int? = null) {
        PreferenceHierarchyNode(metadata).also {
            it.order = order
            add(it)
            children.add(it)
        }
    }

    private fun add(node: PreferenceHierarchyNode) {
        if (node.isFlagEnabled()) children.add(node)
    }

    private fun add(index: Int, node: PreferenceHierarchyNode) {
        if (node.isFlagEnabled()) children.add(index, node)
    }

    private fun PreferenceHierarchyNode.isFlagEnabled(): Boolean {
        if ((metadata as? PreferenceScreenMetadata)?.isFlagEnabled(context) == false) {
            Log.w(TAG, "$metadata is not added to hierarchy as it is not enabled")
            return false
        }
        return true
    }

    /**
     * Adds a sub hierarchy with coroutine.
     *
@@ -160,25 +144,25 @@ class PreferenceHierarchy : PreferenceHierarchyNode {
    /** Adds a preference to the hierarchy before given key. */
    fun addBefore(key: String, metadata: PreferenceMetadata) {
        val (hierarchy, index) = findPreference(key) ?: (this to children.size)
        hierarchy.add(index, PreferenceHierarchyNode(metadata))
        hierarchy.children.add(index, PreferenceHierarchyNode(metadata))
    }

    /** Adds a preference group to the hierarchy before given key. */
    fun addGroupBefore(key: String, group: PreferenceGroup): PreferenceHierarchy {
        val (hierarchy, index) = findPreference(key) ?: (this to children.size)
        return PreferenceHierarchy(context, group).also { hierarchy.add(index, it) }
        return PreferenceHierarchy(context, group).also { hierarchy.children.add(index, it) }
    }

    /** Adds a preference to the hierarchy after given key. */
    fun addAfter(key: String, metadata: PreferenceMetadata) {
        val (hierarchy, index) = findPreference(key) ?: (this to children.size - 1)
        hierarchy.add(index + 1, PreferenceHierarchyNode(metadata))
        hierarchy.children.add(index + 1, PreferenceHierarchyNode(metadata))
    }

    /** Adds a preference group to the hierarchy after given key. */
    fun addGroupAfter(key: String, group: PreferenceGroup): PreferenceHierarchy {
        val (hierarchy, index) = findPreference(key) ?: (this to children.size - 1)
        return PreferenceHierarchy(context, group).also { hierarchy.add(index + 1, it) }
        return PreferenceHierarchy(context, group).also { hierarchy.children.add(index + 1, it) }
    }

    /** Manipulates hierarchy on a preference group with given key. */
@@ -198,14 +182,15 @@ class PreferenceHierarchy : PreferenceHierarchyNode {
    }

    /** Adds a preference group to the hierarchy. */
    operator fun PreferenceGroup.unaryPlus() = PreferenceHierarchy(context, this).also { add(it) }
    operator fun PreferenceGroup.unaryPlus() =
        PreferenceHierarchy(context, this).also { children.add(it) }

    /** Adds a preference group and returns its preference hierarchy. */
    @JvmOverloads
    fun addGroup(group: PreferenceGroup, order: Int? = null): PreferenceHierarchy =
        PreferenceHierarchy(context, group).also {
            it.order = order
            add(it)
            children.add(it)
        }

    /**
@@ -230,7 +215,7 @@ class PreferenceHierarchy : PreferenceHierarchyNode {
    fun addPreferenceScreen(screenKey: String) = addPreferenceScreen(screenKey, null)

    private fun addPreferenceScreen(screenKey: String, args: Bundle?): PreferenceHierarchyNode =
        createPreferenceScreenHierarchy(screenKey, args).also { add(it) }
        createPreferenceScreenHierarchy(screenKey, args).also { children.add(it) }

    private fun createPreferenceScreenHierarchy(screenKey: String, args: Bundle?) =
        PreferenceHierarchyNode(PreferenceScreenRegistry.create(context, screenKey, args)!!)
+3 −3
Original line number Diff line number Diff line
@@ -77,10 +77,10 @@ interface PreferenceScreenMetadata : PreferenceGroup {
    fun hasCompleteHierarchy(): Boolean = true

    /**
     * Returns the static hierarchy of preference screen.
     * Returns the hierarchy of preference screen.
     *
     * The implementation MUST include all preferences into the hierarchy regardless of the runtime
     * conditions. DO NOT check any condition (except compile time flag) before adding a preference.
     * The implementation should include all preferences into the hierarchy but pay attention to the
     * flag guard when [hasCompleteHierarchy] is false.
     *
     * If the screen has different [PreferenceHierarchy] based on additional information (e.g. app
     * filter, profile), implements [PreferenceHierarchyGenerator]. The UI framework will support
+7 −31
Original line number Diff line number Diff line
@@ -24,7 +24,6 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.stub

@RunWith(AndroidJUnit4::class)
class PreferenceHierarchyTest {
@@ -35,43 +34,20 @@ class PreferenceHierarchyTest {
    private val preference = mock<PreferenceMetadata> { on { key } doReturn "key" }

    @Test
    fun addScreen_flagDisabled() {
        subScreen.stub { on { isFlagEnabled(context) } doReturn false }
    fun addMetadata() {
        val hierarchy =
            screen.preferenceHierarchy(context) {
                +subScreen
                +subScreen order 1
                +preference
                add(subScreen, 1)
                addBefore(preference.key, subScreen)
                addAfter(preference.key, subScreen)
                addGroup(subScreen)
                addGroupBefore(preference.key, subScreen)
                addGroupAfter(preference.key, subScreen)
            }
        assertThat(hierarchy.children).hasSize(1)
        (hierarchy.children[0] as PreferenceHierarchyNode).apply {
            assertThat(metadata).isSameInstanceAs(preference)
        }
    }

    @Test
    fun addScreen_flagEnabled() {
        subScreen.stub { on { isFlagEnabled(context) } doReturn true }
        val hierarchy = screen.preferenceHierarchy(context) { +subScreen }
        assertThat(hierarchy.children).hasSize(1)
        (hierarchy.children[0] as PreferenceHierarchyNode).apply {
            assertThat(metadata).isSameInstanceAs(subScreen)
        }
    }

    @Test
    fun addScreen_flagEnabled_withOrder() {
        subScreen.stub { on { isFlagEnabled(context) } doReturn true }
        val hierarchy = screen.preferenceHierarchy(context) { +subScreen order 1 }
        assertThat(hierarchy.children).hasSize(1)
        assertThat(hierarchy.children).hasSize(2)
        (hierarchy.children[0] as PreferenceHierarchyNode).apply {
            assertThat(metadata).isSameInstanceAs(subScreen)
            assertThat(order).isEqualTo(1)
        }
        (hierarchy.children[1] as PreferenceHierarchyNode).apply {
            assertThat(metadata).isSameInstanceAs(preference)
            assertThat(order).isNull()
        }
    }
}