diff options
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/controls/start/ControlsStartable.kt | 36 | ||||
| -rw-r--r-- | packages/SystemUI/tests/src/com/android/systemui/controls/start/ControlsStartableTest.kt | 101 |
2 files changed, 120 insertions, 17 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/controls/start/ControlsStartable.kt b/packages/SystemUI/src/com/android/systemui/controls/start/ControlsStartable.kt index 461caccc86d3..0218f452a13b 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/start/ControlsStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/start/ControlsStartable.kt @@ -17,10 +17,15 @@ package com.android.systemui.controls.start +import android.content.BroadcastReceiver import android.content.Context +import android.content.Intent +import android.content.IntentFilter import android.os.UserHandle +import android.os.UserManager import androidx.annotation.WorkerThread import com.android.systemui.CoreStartable +import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.controller.ControlsController import com.android.systemui.controls.dagger.ControlsComponent import com.android.systemui.controls.management.ControlsListingController @@ -53,6 +58,8 @@ constructor( private val userTracker: UserTracker, private val authorizedPanelsRepository: AuthorizedPanelsRepository, private val selectedComponentRepository: SelectedComponentRepository, + private val userManager: UserManager, + private val broadcastDispatcher: BroadcastDispatcher, ) : CoreStartable { // These two controllers can only be accessed after `start` method once we've checked if the @@ -71,7 +78,9 @@ constructor( } } - override fun start() { + override fun start() {} + + override fun onBootCompleted() { if (!controlsComponent.isEnabled()) { // Controls is disabled, we don't need this anymore return @@ -112,11 +121,30 @@ constructor( } private fun bindToPanel() { + if (userManager.isUserUnlocked(userTracker.userId)) { + bindToPanelInternal() + } else { + broadcastDispatcher.registerReceiver( + receiver = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + if (userManager.isUserUnlocked(userTracker.userId)) { + bindToPanelInternal() + broadcastDispatcher.unregisterReceiver(this) + } + } + }, + filter = IntentFilter(Intent.ACTION_USER_UNLOCKED), + executor = executor, + user = userTracker.userHandle, + ) + } + } + + private fun bindToPanelInternal() { val currentSelection = controlsController.getPreferredSelection() val panels = - controlsListingController.getCurrentServices().filter { it.panelActivity != null } - if ( - currentSelection is SelectedItem.PanelItem && + controlsListingController.getCurrentServices().filter { it.panelActivity != null } + if (currentSelection is SelectedItem.PanelItem && panels.firstOrNull { it.componentName == currentSelection.componentName } != null ) { controlsController.bindComponentForPanel(currentSelection.componentName) diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/start/ControlsStartableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/start/ControlsStartableTest.kt index bd7e98e16b91..8f65fc8c3930 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/start/ControlsStartableTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/start/ControlsStartableTest.kt @@ -17,13 +17,18 @@ package com.android.systemui.controls.start +import android.content.BroadcastReceiver import android.content.ComponentName import android.content.Context +import android.content.Intent +import android.content.IntentFilter import android.content.pm.ApplicationInfo import android.content.pm.ServiceInfo +import android.os.UserManager import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.controller.ControlsController import com.android.systemui.controls.dagger.ControlsComponent @@ -34,14 +39,20 @@ import com.android.systemui.controls.ui.SelectedItem import com.android.systemui.settings.UserTracker import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.any +import com.android.systemui.util.mockito.argumentCaptor +import com.android.systemui.util.mockito.capture +import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.mock +import com.android.systemui.util.mockito.nullable import com.android.systemui.util.mockito.whenever import com.android.systemui.util.time.FakeSystemClock +import com.google.common.truth.Truth.assertThat import java.util.Optional import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock +import org.mockito.Mockito.anyInt import org.mockito.Mockito.doAnswer import org.mockito.Mockito.doReturn import org.mockito.Mockito.never @@ -58,6 +69,8 @@ class ControlsStartableTest : SysuiTestCase() { @Mock private lateinit var controlsListingController: ControlsListingController @Mock private lateinit var userTracker: UserTracker @Mock private lateinit var authorizedPanelsRepository: AuthorizedPanelsRepository + @Mock private lateinit var userManager: UserManager + @Mock private lateinit var broadcastDispatcher: BroadcastDispatcher private val preferredPanelsRepository = FakeSelectedComponentRepository() @@ -67,13 +80,27 @@ class ControlsStartableTest : SysuiTestCase() { fun setUp() { MockitoAnnotations.initMocks(this) whenever(authorizedPanelsRepository.getPreferredPackages()).thenReturn(setOf()) + whenever(userManager.isUserUnlocked(anyInt())).thenReturn(true) fakeExecutor = FakeExecutor(FakeSystemClock()) } @Test fun testDisabledNothingIsCalled() { - createStartable(enabled = false).start() + createStartable(enabled = false).apply { + start() + onBootCompleted() + } + + verifyZeroInteractions(controlsController, controlsListingController, userTracker) + } + + @Test + fun testNothingCalledOnStart() { + createStartable(enabled = true).start() + + fakeExecutor.advanceClockToLast() + fakeExecutor.runAllReady() verifyZeroInteractions(controlsController, controlsListingController, userTracker) } @@ -84,7 +111,7 @@ class ControlsStartableTest : SysuiTestCase() { val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true)) setUpControlsListingControls(listings) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController, never()).setPreferredSelection(any()) @@ -97,7 +124,7 @@ class ControlsStartableTest : SysuiTestCase() { `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION) setUpControlsListingControls(emptyList()) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController, never()).setPreferredSelection(any()) @@ -111,7 +138,7 @@ class ControlsStartableTest : SysuiTestCase() { val listings = listOf(ControlsServiceInfo(TEST_COMPONENT, "not panel", hasPanel = false)) setUpControlsListingControls(listings) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController, never()).setPreferredSelection(any()) @@ -126,7 +153,7 @@ class ControlsStartableTest : SysuiTestCase() { val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true)) setUpControlsListingControls(listings) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController, never()).setPreferredSelection(any()) @@ -140,7 +167,7 @@ class ControlsStartableTest : SysuiTestCase() { val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true)) setUpControlsListingControls(listings) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController).setPreferredSelection(listings[0].toPanelItem()) @@ -158,7 +185,7 @@ class ControlsStartableTest : SysuiTestCase() { ) setUpControlsListingControls(listings) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController).setPreferredSelection(listings[0].toPanelItem()) @@ -176,21 +203,67 @@ class ControlsStartableTest : SysuiTestCase() { ) setUpControlsListingControls(listings) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController).setPreferredSelection(listings[1].toPanelItem()) } @Test - fun testPreferredSelectionIsPanel_bindOnStart() { + fun testPreferredSelectionIsPanel_bindOnBoot() { val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true)) setUpControlsListingControls(listings) `when`(controlsController.getPreferredSelection()).thenReturn(listings[0].toPanelItem()) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() + fakeExecutor.runAllReady() + + verify(controlsController).bindComponentForPanel(TEST_COMPONENT_PANEL) + } + + @Test + fun testPreferredSelectionIsPanel_userNotUnlocked_notBind() { + whenever(userManager.isUserUnlocked(anyInt())).thenReturn(false) + + val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true)) + setUpControlsListingControls(listings) + `when`(controlsController.getPreferredSelection()).thenReturn(listings[0].toPanelItem()) + + createStartable(enabled = true).onBootCompleted() + fakeExecutor.runAllReady() + + verify(controlsController, never()).bindComponentForPanel(TEST_COMPONENT_PANEL) + } + + @Test + fun testPreferredSelectionIsPanel_userNotUnlocked_broadcastRegistered_broadcastSentBinds() { + whenever(userManager.isUserUnlocked(anyInt())).thenReturn(false) + + val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true)) + setUpControlsListingControls(listings) + `when`(controlsController.getPreferredSelection()).thenReturn(listings[0].toPanelItem()) + + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() + val intentFilterCaptor = argumentCaptor<IntentFilter>() + val receiverCaptor = argumentCaptor<BroadcastReceiver>() + + verify(broadcastDispatcher) + .registerReceiver( + capture(receiverCaptor), + capture(intentFilterCaptor), + eq(fakeExecutor), + nullable(), + anyInt(), + nullable() + ) + assertThat(intentFilterCaptor.value.matchAction(Intent.ACTION_USER_UNLOCKED)).isTrue() + + // User is unlocked + whenever(userManager.isUserUnlocked(anyInt())).thenReturn(true) + receiverCaptor.value.onReceive(mock(), Intent(Intent.ACTION_USER_UNLOCKED)) + verify(controlsController).bindComponentForPanel(TEST_COMPONENT_PANEL) } @@ -201,7 +274,7 @@ class ControlsStartableTest : SysuiTestCase() { `when`(controlsController.getPreferredSelection()) .thenReturn(SelectedItem.PanelItem("panel", TEST_COMPONENT_PANEL)) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController, never()).bindComponentForPanel(any()) @@ -213,7 +286,7 @@ class ControlsStartableTest : SysuiTestCase() { setUpControlsListingControls(listings) `when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() fakeExecutor.runAllReady() verify(controlsController, never()).bindComponentForPanel(any()) @@ -228,7 +301,7 @@ class ControlsStartableTest : SysuiTestCase() { val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true)) `when`(controlsListingController.getCurrentServices()).thenReturn(listings) - createStartable(enabled = true).start() + createStartable(enabled = true).onBootCompleted() verify(controlsController, never()).setPreferredSelection(any()) } @@ -258,6 +331,8 @@ class ControlsStartableTest : SysuiTestCase() { userTracker, authorizedPanelsRepository, preferredPanelsRepository, + userManager, + broadcastDispatcher, ) } |