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

Commit 1f7c8174 authored by Matt Pietal's avatar Matt Pietal
Browse files

Controls UI - Support seeding for up to 6 structures

Limit to 36 controls: 6 structures with up to 6 controls per structure

Fixes: 153606605
Test: atest ControlsControllerImplTest

Change-Id: Ieddceda4a0902e4b42208680c7a77ee03514a16c
parent 4f5af837
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -98,9 +98,12 @@ public abstract class ControlsProviderService extends Service {
     *
     * The service may be asked to provide a small number of recommended controls, in
     * order to suggest some controls to the user for favoriting. The controls shall be built using
     * the stateless builder {@link Control.StatelessBuilder}. The number of controls requested
     * through {@link Subscription#request} will be limited. Call {@link Subscriber#onComplete}
     * when done, or {@link Subscriber#onError} for error scenarios.
     * the stateless builder {@link Control.StatelessBuilder}. The total number of controls
     * requested through {@link Subscription#request} will be restricted to a maximum. Within this
     * larger limit, only 6 controls per structure will be loaded. Therefore, it is advisable to
     * seed multiple structures if they exist. Any control sent over this limit  will be discarded.
     * Call {@link Subscriber#onComplete} when done, or {@link Subscriber#onError} for error
     * scenarios.
     */
    @Nullable
    public Publisher<Control> createPublisherForSuggested() {
+3 −1
Original line number Diff line number Diff line
@@ -46,7 +46,9 @@ open class ControlsBindingControllerImpl @Inject constructor(
    companion object {
        private const val TAG = "ControlsBindingControllerImpl"
        private const val MAX_CONTROLS_REQUEST = 100000L
        private const val SUGGESTED_CONTROLS_REQUEST = 6L
        private const val SUGGESTED_STRUCTURES = 6L
        private const val SUGGESTED_CONTROLS_REQUEST =
            ControlsControllerImpl.SUGGESTED_CONTROLS_PER_STRUCTURE * SUGGESTED_STRUCTURES
    }

    private var currentUser = UserHandle.of(ActivityManager.getCurrentUser())
+6 −3
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ class ControlsControllerImpl @Inject constructor (
        private const val USER_CHANGE_RETRY_DELAY = 500L // ms
        private const val DEFAULT_ENABLED = 1
        private const val PERMISSION_SELF = "com.android.systemui.permission.SELF"
        const val SUGGESTED_CONTROLS_PER_STRUCTURE = 6

        private fun isAvailable(userId: Int, cr: ContentResolver) = Settings.Secure.getIntForUser(
            cr, CONTROLS_AVAILABLE, DEFAULT_ENABLED, userId) != 0
@@ -396,10 +397,12 @@ class ControlsControllerImpl @Inject constructor (
                            val structure = it.structure ?: ""
                            val list = structureToControls.get(structure)
                                ?: mutableListOf<ControlInfo>()
                            if (list.size < SUGGESTED_CONTROLS_PER_STRUCTURE) {
                                list.add(
                                    ControlInfo(it.controlId, it.title, it.subtitle, it.deviceType))
                                structureToControls.put(structure, list)
                            }
                        }

                        structureToControls.forEach {
                            (s, cs) -> Favorites.replaceControls(
+16 −6
Original line number Diff line number Diff line
@@ -797,11 +797,14 @@ class ControlsControllerImplTest : SysuiTestCase() {
    }

    @Test
    fun testSeedFavoritesForComponent() {
    fun testSeedFavoritesForComponentWithLimit() {
        var succeeded = false
        val control = statelessBuilderFromInfo(TEST_CONTROL_INFO, TEST_STRUCTURE_INFO.structure)
            .build()

        val controls = mutableListOf<Control>()
        for (i in 1..10) {
            controls.add(statelessBuilderFromInfo(ControlInfo("id$i", TEST_CONTROL_TITLE,
                TEST_CONTROL_SUBTITLE, TEST_DEVICE_TYPE), "testStructure").build())
        }
        controller.seedFavoritesForComponent(TEST_COMPONENT, Consumer { accepted ->
            succeeded = accepted
        })
@@ -809,12 +812,19 @@ class ControlsControllerImplTest : SysuiTestCase() {
        verify(bindingController).bindAndLoadSuggested(eq(TEST_COMPONENT),
                capture(controlLoadCallbackCaptor))

        controlLoadCallbackCaptor.value.accept(listOf(control))
        controlLoadCallbackCaptor.value.accept(controls)

        delayableExecutor.runAllReady()

        assertEquals(listOf(TEST_STRUCTURE_INFO),
            controller.getFavoritesForComponent(TEST_COMPONENT))
        val structureInfo = controller.getFavoritesForComponent(TEST_COMPONENT)[0]
        assertEquals(structureInfo.controls.size,
            ControlsControllerImpl.SUGGESTED_CONTROLS_PER_STRUCTURE)

        var i = 1
        structureInfo.controls.forEach {
            assertEquals(it.controlId, "id$i")
            i++
        }
        assertTrue(succeeded)
    }