Loading packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceHierarchy.kt +10 −25 Original line number Diff line number Diff line Loading @@ -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 } Loading @@ -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. * Loading Loading @@ -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. */ Loading @@ -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) } /** Loading @@ -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)!!) Loading packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceScreenMetadata.kt +3 −3 Original line number Diff line number Diff line Loading @@ -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 Loading packages/SettingsLib/Metadata/tests/src/com/android/settingslib/metadata/PreferenceHierarchyTest.kt +7 −31 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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() } } } Loading
packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceHierarchy.kt +10 −25 Original line number Diff line number Diff line Loading @@ -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 } Loading @@ -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. * Loading Loading @@ -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. */ Loading @@ -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) } /** Loading @@ -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)!!) Loading
packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceScreenMetadata.kt +3 −3 Original line number Diff line number Diff line Loading @@ -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 Loading
packages/SettingsLib/Metadata/tests/src/com/android/settingslib/metadata/PreferenceHierarchyTest.kt +7 −31 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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() } } }