Merge "Gate binding with UserManager.isUserUnlocked" into tm-qpr-dev am: 2c779222b1
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22224869 Change-Id: I4620cec77050ff441e2a686ba07df58274a4c43e Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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,24 +203,70 @@ 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)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testPreferredSelectionPanel_listingNoPanel_notBind() {
|
||||
val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = false))
|
||||
@@ -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,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user