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
|
package com.android.systemui.controls.start
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.IntentFilter
|
||||||
import android.os.UserHandle
|
import android.os.UserHandle
|
||||||
|
import android.os.UserManager
|
||||||
import androidx.annotation.WorkerThread
|
import androidx.annotation.WorkerThread
|
||||||
import com.android.systemui.CoreStartable
|
import com.android.systemui.CoreStartable
|
||||||
|
import com.android.systemui.broadcast.BroadcastDispatcher
|
||||||
import com.android.systemui.controls.controller.ControlsController
|
import com.android.systemui.controls.controller.ControlsController
|
||||||
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
|
||||||
@@ -53,6 +58,8 @@ constructor(
|
|||||||
private val userTracker: UserTracker,
|
private val userTracker: UserTracker,
|
||||||
private val authorizedPanelsRepository: AuthorizedPanelsRepository,
|
private val authorizedPanelsRepository: AuthorizedPanelsRepository,
|
||||||
private val selectedComponentRepository: SelectedComponentRepository,
|
private val selectedComponentRepository: SelectedComponentRepository,
|
||||||
|
private val userManager: UserManager,
|
||||||
|
private val broadcastDispatcher: BroadcastDispatcher,
|
||||||
) : CoreStartable {
|
) : CoreStartable {
|
||||||
|
|
||||||
// These two controllers can only be accessed after `start` method once we've checked if the
|
// 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()) {
|
if (!controlsComponent.isEnabled()) {
|
||||||
// Controls is disabled, we don't need this anymore
|
// Controls is disabled, we don't need this anymore
|
||||||
return
|
return
|
||||||
@@ -112,11 +121,30 @@ constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun bindToPanel() {
|
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 currentSelection = controlsController.getPreferredSelection()
|
||||||
val panels =
|
val panels =
|
||||||
controlsListingController.getCurrentServices().filter { it.panelActivity != null }
|
controlsListingController.getCurrentServices().filter { it.panelActivity != null }
|
||||||
if (
|
if (currentSelection is SelectedItem.PanelItem &&
|
||||||
currentSelection is SelectedItem.PanelItem &&
|
|
||||||
panels.firstOrNull { it.componentName == currentSelection.componentName } != null
|
panels.firstOrNull { it.componentName == currentSelection.componentName } != null
|
||||||
) {
|
) {
|
||||||
controlsController.bindComponentForPanel(currentSelection.componentName)
|
controlsController.bindComponentForPanel(currentSelection.componentName)
|
||||||
|
|||||||
@@ -17,13 +17,18 @@
|
|||||||
|
|
||||||
package com.android.systemui.controls.start
|
package com.android.systemui.controls.start
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver
|
||||||
import android.content.ComponentName
|
import android.content.ComponentName
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.IntentFilter
|
||||||
import android.content.pm.ApplicationInfo
|
import android.content.pm.ApplicationInfo
|
||||||
import android.content.pm.ServiceInfo
|
import android.content.pm.ServiceInfo
|
||||||
|
import android.os.UserManager
|
||||||
import android.testing.AndroidTestingRunner
|
import android.testing.AndroidTestingRunner
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
|
import com.android.systemui.broadcast.BroadcastDispatcher
|
||||||
import com.android.systemui.controls.ControlsServiceInfo
|
import com.android.systemui.controls.ControlsServiceInfo
|
||||||
import com.android.systemui.controls.controller.ControlsController
|
import com.android.systemui.controls.controller.ControlsController
|
||||||
import com.android.systemui.controls.dagger.ControlsComponent
|
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.settings.UserTracker
|
||||||
import com.android.systemui.util.concurrency.FakeExecutor
|
import com.android.systemui.util.concurrency.FakeExecutor
|
||||||
import com.android.systemui.util.mockito.any
|
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.mock
|
||||||
|
import com.android.systemui.util.mockito.nullable
|
||||||
import com.android.systemui.util.mockito.whenever
|
import com.android.systemui.util.mockito.whenever
|
||||||
import com.android.systemui.util.time.FakeSystemClock
|
import com.android.systemui.util.time.FakeSystemClock
|
||||||
|
import com.google.common.truth.Truth.assertThat
|
||||||
import java.util.Optional
|
import java.util.Optional
|
||||||
import org.junit.Before
|
import org.junit.Before
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.mockito.Mock
|
import org.mockito.Mock
|
||||||
|
import org.mockito.Mockito.anyInt
|
||||||
import org.mockito.Mockito.doAnswer
|
import org.mockito.Mockito.doAnswer
|
||||||
import org.mockito.Mockito.doReturn
|
import org.mockito.Mockito.doReturn
|
||||||
import org.mockito.Mockito.never
|
import org.mockito.Mockito.never
|
||||||
@@ -58,6 +69,8 @@ class ControlsStartableTest : SysuiTestCase() {
|
|||||||
@Mock private lateinit var controlsListingController: ControlsListingController
|
@Mock private lateinit var controlsListingController: ControlsListingController
|
||||||
@Mock private lateinit var userTracker: UserTracker
|
@Mock private lateinit var userTracker: UserTracker
|
||||||
@Mock private lateinit var authorizedPanelsRepository: AuthorizedPanelsRepository
|
@Mock private lateinit var authorizedPanelsRepository: AuthorizedPanelsRepository
|
||||||
|
@Mock private lateinit var userManager: UserManager
|
||||||
|
@Mock private lateinit var broadcastDispatcher: BroadcastDispatcher
|
||||||
|
|
||||||
private val preferredPanelsRepository = FakeSelectedComponentRepository()
|
private val preferredPanelsRepository = FakeSelectedComponentRepository()
|
||||||
|
|
||||||
@@ -67,13 +80,27 @@ class ControlsStartableTest : SysuiTestCase() {
|
|||||||
fun setUp() {
|
fun setUp() {
|
||||||
MockitoAnnotations.initMocks(this)
|
MockitoAnnotations.initMocks(this)
|
||||||
whenever(authorizedPanelsRepository.getPreferredPackages()).thenReturn(setOf())
|
whenever(authorizedPanelsRepository.getPreferredPackages()).thenReturn(setOf())
|
||||||
|
whenever(userManager.isUserUnlocked(anyInt())).thenReturn(true)
|
||||||
|
|
||||||
fakeExecutor = FakeExecutor(FakeSystemClock())
|
fakeExecutor = FakeExecutor(FakeSystemClock())
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testDisabledNothingIsCalled() {
|
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)
|
verifyZeroInteractions(controlsController, controlsListingController, userTracker)
|
||||||
}
|
}
|
||||||
@@ -84,7 +111,7 @@ class ControlsStartableTest : SysuiTestCase() {
|
|||||||
val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
|
val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
|
||||||
setUpControlsListingControls(listings)
|
setUpControlsListingControls(listings)
|
||||||
|
|
||||||
createStartable(enabled = true).start()
|
createStartable(enabled = true).onBootCompleted()
|
||||||
fakeExecutor.runAllReady()
|
fakeExecutor.runAllReady()
|
||||||
|
|
||||||
verify(controlsController, never()).setPreferredSelection(any())
|
verify(controlsController, never()).setPreferredSelection(any())
|
||||||
@@ -97,7 +124,7 @@ class ControlsStartableTest : SysuiTestCase() {
|
|||||||
`when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
|
`when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
|
||||||
setUpControlsListingControls(emptyList())
|
setUpControlsListingControls(emptyList())
|
||||||
|
|
||||||
createStartable(enabled = true).start()
|
createStartable(enabled = true).onBootCompleted()
|
||||||
fakeExecutor.runAllReady()
|
fakeExecutor.runAllReady()
|
||||||
|
|
||||||
verify(controlsController, never()).setPreferredSelection(any())
|
verify(controlsController, never()).setPreferredSelection(any())
|
||||||
@@ -111,7 +138,7 @@ class ControlsStartableTest : SysuiTestCase() {
|
|||||||
val listings = listOf(ControlsServiceInfo(TEST_COMPONENT, "not panel", hasPanel = false))
|
val listings = listOf(ControlsServiceInfo(TEST_COMPONENT, "not panel", hasPanel = false))
|
||||||
setUpControlsListingControls(listings)
|
setUpControlsListingControls(listings)
|
||||||
|
|
||||||
createStartable(enabled = true).start()
|
createStartable(enabled = true).onBootCompleted()
|
||||||
fakeExecutor.runAllReady()
|
fakeExecutor.runAllReady()
|
||||||
|
|
||||||
verify(controlsController, never()).setPreferredSelection(any())
|
verify(controlsController, never()).setPreferredSelection(any())
|
||||||
@@ -126,7 +153,7 @@ class ControlsStartableTest : SysuiTestCase() {
|
|||||||
val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
|
val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
|
||||||
setUpControlsListingControls(listings)
|
setUpControlsListingControls(listings)
|
||||||
|
|
||||||
createStartable(enabled = true).start()
|
createStartable(enabled = true).onBootCompleted()
|
||||||
fakeExecutor.runAllReady()
|
fakeExecutor.runAllReady()
|
||||||
|
|
||||||
verify(controlsController, never()).setPreferredSelection(any())
|
verify(controlsController, never()).setPreferredSelection(any())
|
||||||
@@ -140,7 +167,7 @@ class ControlsStartableTest : SysuiTestCase() {
|
|||||||
val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
|
val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
|
||||||
setUpControlsListingControls(listings)
|
setUpControlsListingControls(listings)
|
||||||
|
|
||||||
createStartable(enabled = true).start()
|
createStartable(enabled = true).onBootCompleted()
|
||||||
fakeExecutor.runAllReady()
|
fakeExecutor.runAllReady()
|
||||||
|
|
||||||
verify(controlsController).setPreferredSelection(listings[0].toPanelItem())
|
verify(controlsController).setPreferredSelection(listings[0].toPanelItem())
|
||||||
@@ -158,7 +185,7 @@ class ControlsStartableTest : SysuiTestCase() {
|
|||||||
)
|
)
|
||||||
setUpControlsListingControls(listings)
|
setUpControlsListingControls(listings)
|
||||||
|
|
||||||
createStartable(enabled = true).start()
|
createStartable(enabled = true).onBootCompleted()
|
||||||
fakeExecutor.runAllReady()
|
fakeExecutor.runAllReady()
|
||||||
|
|
||||||
verify(controlsController).setPreferredSelection(listings[0].toPanelItem())
|
verify(controlsController).setPreferredSelection(listings[0].toPanelItem())
|
||||||
@@ -176,24 +203,70 @@ class ControlsStartableTest : SysuiTestCase() {
|
|||||||
)
|
)
|
||||||
setUpControlsListingControls(listings)
|
setUpControlsListingControls(listings)
|
||||||
|
|
||||||
createStartable(enabled = true).start()
|
createStartable(enabled = true).onBootCompleted()
|
||||||
fakeExecutor.runAllReady()
|
fakeExecutor.runAllReady()
|
||||||
|
|
||||||
verify(controlsController).setPreferredSelection(listings[1].toPanelItem())
|
verify(controlsController).setPreferredSelection(listings[1].toPanelItem())
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testPreferredSelectionIsPanel_bindOnStart() {
|
fun testPreferredSelectionIsPanel_bindOnBoot() {
|
||||||
val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
|
val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
|
||||||
setUpControlsListingControls(listings)
|
setUpControlsListingControls(listings)
|
||||||
`when`(controlsController.getPreferredSelection()).thenReturn(listings[0].toPanelItem())
|
`when`(controlsController.getPreferredSelection()).thenReturn(listings[0].toPanelItem())
|
||||||
|
|
||||||
createStartable(enabled = true).start()
|
createStartable(enabled = true).onBootCompleted()
|
||||||
fakeExecutor.runAllReady()
|
fakeExecutor.runAllReady()
|
||||||
|
|
||||||
verify(controlsController).bindComponentForPanel(TEST_COMPONENT_PANEL)
|
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
|
@Test
|
||||||
fun testPreferredSelectionPanel_listingNoPanel_notBind() {
|
fun testPreferredSelectionPanel_listingNoPanel_notBind() {
|
||||||
val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = false))
|
val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = false))
|
||||||
@@ -201,7 +274,7 @@ class ControlsStartableTest : SysuiTestCase() {
|
|||||||
`when`(controlsController.getPreferredSelection())
|
`when`(controlsController.getPreferredSelection())
|
||||||
.thenReturn(SelectedItem.PanelItem("panel", TEST_COMPONENT_PANEL))
|
.thenReturn(SelectedItem.PanelItem("panel", TEST_COMPONENT_PANEL))
|
||||||
|
|
||||||
createStartable(enabled = true).start()
|
createStartable(enabled = true).onBootCompleted()
|
||||||
fakeExecutor.runAllReady()
|
fakeExecutor.runAllReady()
|
||||||
|
|
||||||
verify(controlsController, never()).bindComponentForPanel(any())
|
verify(controlsController, never()).bindComponentForPanel(any())
|
||||||
@@ -213,7 +286,7 @@ class ControlsStartableTest : SysuiTestCase() {
|
|||||||
setUpControlsListingControls(listings)
|
setUpControlsListingControls(listings)
|
||||||
`when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
|
`when`(controlsController.getPreferredSelection()).thenReturn(SelectedItem.EMPTY_SELECTION)
|
||||||
|
|
||||||
createStartable(enabled = true).start()
|
createStartable(enabled = true).onBootCompleted()
|
||||||
fakeExecutor.runAllReady()
|
fakeExecutor.runAllReady()
|
||||||
|
|
||||||
verify(controlsController, never()).bindComponentForPanel(any())
|
verify(controlsController, never()).bindComponentForPanel(any())
|
||||||
@@ -228,7 +301,7 @@ class ControlsStartableTest : SysuiTestCase() {
|
|||||||
val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
|
val listings = listOf(ControlsServiceInfo(TEST_COMPONENT_PANEL, "panel", hasPanel = true))
|
||||||
`when`(controlsListingController.getCurrentServices()).thenReturn(listings)
|
`when`(controlsListingController.getCurrentServices()).thenReturn(listings)
|
||||||
|
|
||||||
createStartable(enabled = true).start()
|
createStartable(enabled = true).onBootCompleted()
|
||||||
|
|
||||||
verify(controlsController, never()).setPreferredSelection(any())
|
verify(controlsController, never()).setPreferredSelection(any())
|
||||||
}
|
}
|
||||||
@@ -258,6 +331,8 @@ class ControlsStartableTest : SysuiTestCase() {
|
|||||||
userTracker,
|
userTracker,
|
||||||
authorizedPanelsRepository,
|
authorizedPanelsRepository,
|
||||||
preferredPanelsRepository,
|
preferredPanelsRepository,
|
||||||
|
userManager,
|
||||||
|
broadcastDispatcher,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user