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

Commit 761fadd2 authored by Lucas Silva's avatar Lucas Silva Committed by Android (Google) Code Review
Browse files

Merge "Fix bug with home panel dream" into main

parents e22d70dc 4fae2cd1
Loading
Loading
Loading
Loading
+1 −2
Original line number Original line Diff line number Diff line
@@ -17,7 +17,7 @@ package com.android.systemui.dreams.homecontrols


import com.android.systemui.controls.dagger.ControlsComponent
import com.android.systemui.controls.dagger.ControlsComponent
import com.android.systemui.controls.management.ControlsListingController
import com.android.systemui.controls.management.ControlsListingController
import com.android.systemui.controls.panels.AuthorizedPanelsRepository
import com.android.systemui.controls.panels.authorizedPanelsRepository
import com.android.systemui.controls.panels.selectedComponentRepository
import com.android.systemui.controls.panels.selectedComponentRepository
import com.android.systemui.dreams.homecontrols.domain.interactor.HomeControlsComponentInteractor
import com.android.systemui.dreams.homecontrols.domain.interactor.HomeControlsComponentInteractor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos
@@ -38,4 +38,3 @@ val Kosmos.homeControlsComponentInteractor by


val Kosmos.controlsComponent by Kosmos.Fixture<ControlsComponent> { mock() }
val Kosmos.controlsComponent by Kosmos.Fixture<ControlsComponent> { mock() }
val Kosmos.controlsListingController by Kosmos.Fixture<ControlsListingController> { mock() }
val Kosmos.controlsListingController by Kosmos.Fixture<ControlsListingController> { mock() }
val Kosmos.authorizedPanelsRepository by Kosmos.Fixture<AuthorizedPanelsRepository> { mock() }
+45 −41
Original line number Original line Diff line number Diff line
@@ -27,13 +27,14 @@ import com.android.systemui.controls.ControlsServiceInfo
import com.android.systemui.controls.dagger.ControlsComponent
import com.android.systemui.controls.dagger.ControlsComponent
import com.android.systemui.controls.management.ControlsListingController
import com.android.systemui.controls.management.ControlsListingController
import com.android.systemui.controls.panels.AuthorizedPanelsRepository
import com.android.systemui.controls.panels.AuthorizedPanelsRepository
import com.android.systemui.controls.panels.FakeSelectedComponentRepository
import com.android.systemui.controls.panels.SelectedComponentRepository
import com.android.systemui.controls.panels.SelectedComponentRepository
import com.android.systemui.controls.panels.authorizedPanelsRepository
import com.android.systemui.controls.panels.selectedComponentRepository
import com.android.systemui.controls.panels.selectedComponentRepository
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.dreams.homecontrols.domain.interactor.HomeControlsComponentInteractor
import com.android.systemui.dreams.homecontrols.domain.interactor.HomeControlsComponentInteractor
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.testScope
import com.android.systemui.settings.fakeUserTracker
import com.android.systemui.testKosmos
import com.android.systemui.testKosmos
import com.android.systemui.user.data.repository.FakeUserRepository
import com.android.systemui.user.data.repository.FakeUserRepository
import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.user.data.repository.fakeUserRepository
@@ -41,6 +42,9 @@ import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.mockito.withArgCaptor
import com.android.systemui.util.mockito.withArgCaptor
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertThat
import java.util.Optional
import java.util.Optional
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Before
import org.junit.Test
import org.junit.Test
@@ -48,6 +52,7 @@ import org.junit.runner.RunWith
import org.mockito.Mockito.verify
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
import org.mockito.MockitoAnnotations


@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@SmallTest
@RunWith(AndroidJUnit4::class)
@RunWith(AndroidJUnit4::class)
class HomeControlsComponentInteractorTest : SysuiTestCase() {
class HomeControlsComponentInteractorTest : SysuiTestCase() {
@@ -59,20 +64,20 @@ class HomeControlsComponentInteractorTest : SysuiTestCase() {
    private lateinit var authorizedPanelsRepository: AuthorizedPanelsRepository
    private lateinit var authorizedPanelsRepository: AuthorizedPanelsRepository
    private lateinit var underTest: HomeControlsComponentInteractor
    private lateinit var underTest: HomeControlsComponentInteractor
    private lateinit var userRepository: FakeUserRepository
    private lateinit var userRepository: FakeUserRepository
    private lateinit var selectedComponentRepository: FakeSelectedComponentRepository
    private lateinit var selectedComponentRepository: SelectedComponentRepository


    @Before
    @Before
    fun setUp() {
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        MockitoAnnotations.initMocks(this)
        userRepository = kosmos.fakeUserRepository
        userRepository.setUserInfos(listOf(PRIMARY_USER, ANOTHER_USER))


        controlsComponent = kosmos.controlsComponent
        controlsComponent = kosmos.controlsComponent
        authorizedPanelsRepository = kosmos.authorizedPanelsRepository
        authorizedPanelsRepository = kosmos.authorizedPanelsRepository
        controlsListingController = kosmos.controlsListingController
        controlsListingController = kosmos.controlsListingController
        selectedComponentRepository = kosmos.selectedComponentRepository
        selectedComponentRepository = kosmos.selectedComponentRepository


        selectedComponentRepository.setCurrentUserHandle(PRIMARY_USER.userHandle)
        userRepository = kosmos.fakeUserRepository
        userRepository.setUserInfos(listOf(PRIMARY_USER, ANOTHER_USER))

        whenever(controlsComponent.getControlsListingController())
        whenever(controlsComponent.getControlsListingController())
            .thenReturn(Optional.of(controlsListingController))
            .thenReturn(Optional.of(controlsListingController))


@@ -90,14 +95,13 @@ class HomeControlsComponentInteractorTest : SysuiTestCase() {
    fun testPanelComponentReturnsComponentNameForSelectedItemByUser() =
    fun testPanelComponentReturnsComponentNameForSelectedItemByUser() =
        with(kosmos) {
        with(kosmos) {
            testScope.runTest {
            testScope.runTest {
                whenever(authorizedPanelsRepository.getAuthorizedPanels())
                setActiveUser(PRIMARY_USER)
                    .thenReturn(setOf(TEST_PACKAGE_PANEL))
                authorizedPanelsRepository.addAuthorizedPanels(setOf(TEST_PACKAGE))
                userRepository.setSelectedUserInfo(PRIMARY_USER)
                selectedComponentRepository.setSelectedComponent(TEST_SELECTED_COMPONENT_PANEL)
                selectedComponentRepository.setSelectedComponent(TEST_SELECTED_COMPONENT_PANEL)
                val actualValue by collectLastValue(underTest.panelComponent)
                val actualValue by collectLastValue(underTest.panelComponent)
                assertThat(actualValue).isNull()
                assertThat(actualValue).isNull()
                runServicesUpdate()
                runServicesUpdate()
                assertThat(actualValue).isEqualTo(TEST_COMPONENT_PANEL)
                assertThat(actualValue).isEqualTo(TEST_COMPONENT)
            }
            }
        }
        }


@@ -105,16 +109,15 @@ class HomeControlsComponentInteractorTest : SysuiTestCase() {
    fun testPanelComponentReturnsComponentNameAsInitialValueWithoutServiceUpdate() =
    fun testPanelComponentReturnsComponentNameAsInitialValueWithoutServiceUpdate() =
        with(kosmos) {
        with(kosmos) {
            testScope.runTest {
            testScope.runTest {
                whenever(authorizedPanelsRepository.getAuthorizedPanels())
                setActiveUser(PRIMARY_USER)
                    .thenReturn(setOf(TEST_PACKAGE_PANEL))
                authorizedPanelsRepository.addAuthorizedPanels(setOf(TEST_PACKAGE))
                userRepository.setSelectedUserInfo(PRIMARY_USER)
                selectedComponentRepository.setSelectedComponent(TEST_SELECTED_COMPONENT_PANEL)
                selectedComponentRepository.setSelectedComponent(TEST_SELECTED_COMPONENT_PANEL)
                whenever(controlsListingController.getCurrentServices())
                whenever(controlsListingController.getCurrentServices())
                    .thenReturn(
                    .thenReturn(
                        listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
                        listOf(ControlsServiceInfo(TEST_COMPONENT, "panel", hasPanel = true))
                    )
                    )
                val actualValue by collectLastValue(underTest.panelComponent)
                val actualValue by collectLastValue(underTest.panelComponent)
                assertThat(actualValue).isEqualTo(TEST_COMPONENT_PANEL)
                assertThat(actualValue).isEqualTo(TEST_COMPONENT)
            }
            }
        }
        }


@@ -122,9 +125,8 @@ class HomeControlsComponentInteractorTest : SysuiTestCase() {
    fun testPanelComponentReturnsNullForHomeControlsThatDoesNotSupportPanel() =
    fun testPanelComponentReturnsNullForHomeControlsThatDoesNotSupportPanel() =
        with(kosmos) {
        with(kosmos) {
            testScope.runTest {
            testScope.runTest {
                whenever(authorizedPanelsRepository.getAuthorizedPanels())
                setActiveUser(PRIMARY_USER)
                    .thenReturn(setOf(TEST_PACKAGE_PANEL))
                authorizedPanelsRepository.addAuthorizedPanels(setOf(TEST_PACKAGE))
                userRepository.setSelectedUserInfo(PRIMARY_USER)
                selectedComponentRepository.setSelectedComponent(TEST_SELECTED_COMPONENT_NON_PANEL)
                selectedComponentRepository.setSelectedComponent(TEST_SELECTED_COMPONENT_NON_PANEL)
                val actualValue by collectLastValue(underTest.panelComponent)
                val actualValue by collectLastValue(underTest.panelComponent)
                assertThat(actualValue).isNull()
                assertThat(actualValue).isNull()
@@ -137,8 +139,8 @@ class HomeControlsComponentInteractorTest : SysuiTestCase() {
    fun testPanelComponentReturnsNullWhenPanelIsUnauthorized() =
    fun testPanelComponentReturnsNullWhenPanelIsUnauthorized() =
        with(kosmos) {
        with(kosmos) {
            testScope.runTest {
            testScope.runTest {
                whenever(authorizedPanelsRepository.getAuthorizedPanels()).thenReturn(setOf())
                setActiveUser(PRIMARY_USER)
                userRepository.setSelectedUserInfo(PRIMARY_USER)
                authorizedPanelsRepository.removeAuthorizedPanels(setOf(TEST_PACKAGE))
                selectedComponentRepository.setSelectedComponent(TEST_SELECTED_COMPONENT_PANEL)
                selectedComponentRepository.setSelectedComponent(TEST_SELECTED_COMPONENT_PANEL)
                val actualValue by collectLastValue(underTest.panelComponent)
                val actualValue by collectLastValue(underTest.panelComponent)
                assertThat(actualValue).isNull()
                assertThat(actualValue).isNull()
@@ -151,17 +153,24 @@ class HomeControlsComponentInteractorTest : SysuiTestCase() {
    fun testPanelComponentReturnsComponentNameForDifferentUsers() =
    fun testPanelComponentReturnsComponentNameForDifferentUsers() =
        with(kosmos) {
        with(kosmos) {
            testScope.runTest {
            testScope.runTest {
                whenever(authorizedPanelsRepository.getAuthorizedPanels())
                val actualValue by collectLastValue(underTest.panelComponent)
                    .thenReturn(setOf(TEST_PACKAGE_PANEL))

                userRepository.setSelectedUserInfo(ANOTHER_USER)
                // Secondary user has non-panel selected.
                setActiveUser(ANOTHER_USER)
                selectedComponentRepository.setSelectedComponent(TEST_SELECTED_COMPONENT_NON_PANEL)
                selectedComponentRepository.setSelectedComponent(TEST_SELECTED_COMPONENT_NON_PANEL)
                selectedComponentRepository.setCurrentUserHandle(ANOTHER_USER.userHandle)

                // Primary user has panel selected.
                setActiveUser(PRIMARY_USER)
                authorizedPanelsRepository.addAuthorizedPanels(setOf(TEST_PACKAGE))
                selectedComponentRepository.setSelectedComponent(TEST_SELECTED_COMPONENT_PANEL)
                selectedComponentRepository.setSelectedComponent(TEST_SELECTED_COMPONENT_PANEL)


                val actualValue by collectLastValue(underTest.panelComponent)
                assertThat(actualValue).isNull()
                runServicesUpdate()
                runServicesUpdate()
                assertThat(actualValue).isEqualTo(TEST_COMPONENT_PANEL)
                assertThat(actualValue).isEqualTo(TEST_COMPONENT)

                // Back to secondary user, should be null.
                setActiveUser(ANOTHER_USER)
                runServicesUpdate()
                assertThat(actualValue).isNull()
            }
            }
        }
        }


@@ -169,8 +178,7 @@ class HomeControlsComponentInteractorTest : SysuiTestCase() {
    fun testPanelComponentReturnsNullWhenControlsComponentReturnsNullForListingController() =
    fun testPanelComponentReturnsNullWhenControlsComponentReturnsNullForListingController() =
        with(kosmos) {
        with(kosmos) {
            testScope.runTest {
            testScope.runTest {
                whenever(authorizedPanelsRepository.getAuthorizedPanels())
                authorizedPanelsRepository.addAuthorizedPanels(setOf(TEST_PACKAGE))
                    .thenReturn(setOf(TEST_PACKAGE_PANEL))
                whenever(controlsComponent.getControlsListingController())
                whenever(controlsComponent.getControlsListingController())
                    .thenReturn(Optional.empty())
                    .thenReturn(Optional.empty())
                userRepository.setSelectedUserInfo(PRIMARY_USER)
                userRepository.setSelectedUserInfo(PRIMARY_USER)
@@ -182,11 +190,17 @@ class HomeControlsComponentInteractorTest : SysuiTestCase() {


    private fun runServicesUpdate(hasPanelBoolean: Boolean = true) {
    private fun runServicesUpdate(hasPanelBoolean: Boolean = true) {
        val listings =
        val listings =
            listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = hasPanelBoolean))
            listOf(ControlsServiceInfo(TEST_COMPONENT, "panel", hasPanel = hasPanelBoolean))
        val callback = withArgCaptor { verify(controlsListingController).addCallback(capture()) }
        val callback = withArgCaptor { verify(controlsListingController).addCallback(capture()) }
        callback.onServicesUpdated(listings)
        callback.onServicesUpdated(listings)
    }
    }


    private suspend fun TestScope.setActiveUser(user: UserInfo) {
        userRepository.setSelectedUserInfo(user)
        kosmos.fakeUserTracker.set(listOf(user), 0)
        runCurrent()
    }

    private fun ControlsServiceInfo(
    private fun ControlsServiceInfo(
        componentName: ComponentName,
        componentName: ComponentName,
        label: CharSequence,
        label: CharSequence,
@@ -237,19 +251,9 @@ class HomeControlsComponentInteractorTest : SysuiTestCase() {
            )
            )
        private const val TEST_PACKAGE = "pkg"
        private const val TEST_PACKAGE = "pkg"
        private val TEST_COMPONENT = ComponentName(TEST_PACKAGE, "service")
        private val TEST_COMPONENT = ComponentName(TEST_PACKAGE, "service")
        private const val TEST_PACKAGE_PANEL = "pkg.panel"
        private val TEST_COMPONENT_PANEL = ComponentName(TEST_PACKAGE_PANEL, "service")
        private val TEST_SELECTED_COMPONENT_PANEL =
        private val TEST_SELECTED_COMPONENT_PANEL =
            SelectedComponentRepository.SelectedComponent(
            SelectedComponentRepository.SelectedComponent(TEST_PACKAGE, TEST_COMPONENT, true)
                TEST_PACKAGE_PANEL,
                TEST_COMPONENT_PANEL,
                true
            )
        private val TEST_SELECTED_COMPONENT_NON_PANEL =
        private val TEST_SELECTED_COMPONENT_NON_PANEL =
            SelectedComponentRepository.SelectedComponent(
            SelectedComponentRepository.SelectedComponent(TEST_PACKAGE, TEST_COMPONENT, false)
                TEST_PACKAGE_PANEL,
                TEST_COMPONENT_PANEL,
                false
            )
    }
    }
}
}
+2 −2
Original line number Original line Diff line number Diff line
@@ -32,6 +32,7 @@ import com.android.systemui.controls.dagger.ControlsComponent
import com.android.systemui.controls.management.ControlsListingController
import com.android.systemui.controls.management.ControlsListingController
import com.android.systemui.controls.panels.AuthorizedPanelsRepository
import com.android.systemui.controls.panels.AuthorizedPanelsRepository
import com.android.systemui.controls.panels.SelectedComponentRepository
import com.android.systemui.controls.panels.SelectedComponentRepository
import com.android.systemui.controls.panels.authorizedPanelsRepository
import com.android.systemui.controls.panels.selectedComponentRepository
import com.android.systemui.controls.panels.selectedComponentRepository
import com.android.systemui.dreams.homecontrols.domain.interactor.HomeControlsComponentInteractor
import com.android.systemui.dreams.homecontrols.domain.interactor.HomeControlsComponentInteractor
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.applicationCoroutineScope
@@ -84,8 +85,7 @@ class HomeControlsDreamStartableTest : SysuiTestCase() {


        userRepository.setUserInfos(listOf(PRIMARY_USER))
        userRepository.setUserInfos(listOf(PRIMARY_USER))


        whenever(authorizedPanelsRepository.getAuthorizedPanels())
        authorizedPanelsRepository.addAuthorizedPanels(setOf(TEST_PACKAGE_PANEL))
            .thenReturn(setOf(TEST_PACKAGE_PANEL))


        whenever(controlsComponent.getControlsListingController())
        whenever(controlsComponent.getControlsListingController())
            .thenReturn(Optional.of(controlsListingController))
            .thenReturn(Optional.of(controlsListingController))
+3 −3
Original line number Original line Diff line number Diff line
@@ -28,8 +28,8 @@ import com.android.systemui.log.dagger.CommunalTableLog
import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.log.table.logDiffsForTable
import com.android.systemui.log.table.logDiffsForTable
import com.android.systemui.settings.UserFileManager
import com.android.systemui.settings.UserFileManager
import com.android.systemui.settings.UserFileManagerExt.observeSharedPreferences
import com.android.systemui.user.data.repository.UserRepository
import com.android.systemui.user.data.repository.UserRepository
import com.android.systemui.util.kotlin.SharedPreferencesExt.observe
import javax.inject.Inject
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.CoroutineScope
@@ -97,8 +97,8 @@ constructor(
        }
        }


    private fun observeCtaDismissState(user: UserInfo): Flow<Boolean> =
    private fun observeCtaDismissState(user: UserInfo): Flow<Boolean> =
        userFileManager
        getSharedPrefsForUser(user)
            .observeSharedPreferences(FILE_NAME, Context.MODE_PRIVATE, user.id)
            .observe(CTA_DISMISSED_STATE)
            // Emit at the start of collection to ensure we get an initial value
            // Emit at the start of collection to ensure we get an initial value
            .onStart { emit(Unit) }
            .onStart { emit(Unit) }
            .map { getCtaDismissedState() }
            .map { getCtaDismissedState() }
+5 −0
Original line number Original line Diff line number Diff line
@@ -17,11 +17,16 @@


package com.android.systemui.controls.panels
package com.android.systemui.controls.panels


import android.os.UserHandle
import kotlinx.coroutines.flow.Flow

/**
/**
 * Repository for keeping track of which packages the panel has authorized to show control panels
 * Repository for keeping track of which packages the panel has authorized to show control panels
 * (embedded activity).
 * (embedded activity).
 */
 */
interface AuthorizedPanelsRepository {
interface AuthorizedPanelsRepository {
    /** Exposes the authorized panels as a [Flow] for subscribing to updates */
    fun observeAuthorizedPanels(user: UserHandle): Flow<Set<String>>


    /** A set of package names that the user has previously authorized to show panels. */
    /** A set of package names that the user has previously authorized to show panels. */
    fun getAuthorizedPanels(): Set<String>
    fun getAuthorizedPanels(): Set<String>
Loading