Merge "Fix blank screen when launching controls activity" into tm-qpr-dev am: 9434998be5

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19644303

Change-Id: Ida74e6c062b4a631c1487095654376ae732e82fc
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Matt Pietal
2022-09-08 12:10:05 +00:00
committed by Automerger Merge Worker
4 changed files with 75 additions and 19 deletions

View File

@@ -32,6 +32,12 @@ interface ControlsUiController {
fun show(parent: ViewGroup, onDismiss: Runnable, activityContext: Context) fun show(parent: ViewGroup, onDismiss: Runnable, activityContext: Context)
fun hide() fun hide()
/**
* Returns the preferred activity to start, depending on if the user has favorited any
* controls.
*/
fun resolveActivity(): Class<*>
/** /**
* Request all open dialogs be closed. Set [immediately] to true to dismiss without * Request all open dialogs be closed. Set [immediately] to true to dismiss without
* animations. * animations.

View File

@@ -149,6 +149,19 @@ class ControlsUiControllerImpl @Inject constructor (
} }
} }
override fun resolveActivity(): Class<*> {
val allStructures = controlsController.get().getFavorites()
val selectedStructure = getPreferredStructure(allStructures)
return if (controlsController.get().addSeedingFavoritesCallback(onSeedingComplete)) {
ControlsActivity::class.java
} else if (selectedStructure.controls.isEmpty() && allStructures.size <= 1) {
ControlsProviderSelectorActivity::class.java
} else {
ControlsActivity::class.java
}
}
override fun show( override fun show(
parent: ViewGroup, parent: ViewGroup,
onDismiss: Runnable, onDismiss: Runnable,

View File

@@ -31,7 +31,6 @@ 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.dagger.ControlsComponent.Visibility.AVAILABLE import com.android.systemui.controls.dagger.ControlsComponent.Visibility.AVAILABLE
import com.android.systemui.controls.management.ControlsListingController import com.android.systemui.controls.management.ControlsListingController
import com.android.systemui.controls.ui.ControlsActivity
import com.android.systemui.controls.ui.ControlsUiController import com.android.systemui.controls.ui.ControlsUiController
import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dagger.qualifiers.Main
@@ -42,7 +41,6 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.qs.QSHost import com.android.systemui.qs.QSHost
import com.android.systemui.qs.logging.QSLogger import com.android.systemui.qs.logging.QSLogger
import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.qs.tileimpl.QSTileImpl
import com.android.systemui.statusbar.policy.KeyguardStateController
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
import javax.inject.Inject import javax.inject.Inject
@@ -55,8 +53,7 @@ class DeviceControlsTile @Inject constructor(
statusBarStateController: StatusBarStateController, statusBarStateController: StatusBarStateController,
activityStarter: ActivityStarter, activityStarter: ActivityStarter,
qsLogger: QSLogger, qsLogger: QSLogger,
private val controlsComponent: ControlsComponent, private val controlsComponent: ControlsComponent
private val keyguardStateController: KeyguardStateController
) : QSTileImpl<QSTile.State>( ) : QSTileImpl<QSTile.State>(
host, host,
backgroundLooper, backgroundLooper,
@@ -105,7 +102,8 @@ class DeviceControlsTile @Inject constructor(
} }
val intent = Intent().apply { val intent = Intent().apply {
component = ComponentName(mContext, ControlsActivity::class.java) component = ComponentName(mContext, controlsComponent.getControlsUiController().get()
.resolveActivity())
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
putExtra(ControlsUiController.EXTRA_ANIMATE, true) putExtra(ControlsUiController.EXTRA_ANIMATE, true)
} }
@@ -127,10 +125,15 @@ class DeviceControlsTile @Inject constructor(
state.icon = icon state.icon = icon
if (controlsComponent.isEnabled() && hasControlsApps.get()) { if (controlsComponent.isEnabled() && hasControlsApps.get()) {
if (controlsComponent.getVisibility() == AVAILABLE) { if (controlsComponent.getVisibility() == AVAILABLE) {
val structure = controlsComponent val structureInfo = controlsComponent
.getControlsController().get().getPreferredStructure().structure .getControlsController().get().getPreferredStructure()
state.state = Tile.STATE_ACTIVE state.state = if (structureInfo.controls.isEmpty()) {
state.secondaryLabel = if (structure == tileLabel) null else structure Tile.STATE_INACTIVE
} else {
Tile.STATE_ACTIVE
}
val label = structureInfo.structure
state.secondaryLabel = if (label == tileLabel) null else label
} else { } else {
state.state = Tile.STATE_INACTIVE state.state = Tile.STATE_INACTIVE
state.secondaryLabel = mContext.getText(R.string.controls_tile_locked) state.secondaryLabel = mContext.getText(R.string.controls_tile_locked)

View File

@@ -33,17 +33,18 @@ import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.ActivityLaunchAnimator import com.android.systemui.animation.ActivityLaunchAnimator
import com.android.systemui.classifier.FalsingManagerFake import com.android.systemui.classifier.FalsingManagerFake
import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.ControlsServiceInfo
import com.android.systemui.controls.controller.ControlInfo
import com.android.systemui.controls.controller.ControlsController import com.android.systemui.controls.controller.ControlsController
import com.android.systemui.controls.controller.StructureInfo import com.android.systemui.controls.controller.StructureInfo
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.ui.ControlsActivity
import com.android.systemui.controls.ui.ControlsUiController import com.android.systemui.controls.ui.ControlsUiController
import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.qs.QSHost import com.android.systemui.qs.QSHost
import com.android.systemui.qs.logging.QSLogger import com.android.systemui.qs.logging.QSLogger
import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.qs.tileimpl.QSTileImpl
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.capture
import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.eq
@@ -57,13 +58,13 @@ import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers.anyBoolean import org.mockito.ArgumentMatchers.anyBoolean
import org.mockito.Captor import org.mockito.Captor
import org.mockito.Mock import org.mockito.Mock
import org.mockito.MockitoAnnotations
import org.mockito.Mockito.`when` import org.mockito.Mockito.`when`
import org.mockito.Mockito.doNothing import org.mockito.Mockito.doNothing
import org.mockito.Mockito.nullable import org.mockito.Mockito.nullable
import org.mockito.Mockito.spy import org.mockito.Mockito.spy
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyZeroInteractions import org.mockito.Mockito.verifyZeroInteractions
import org.mockito.MockitoAnnotations
import java.util.Optional import java.util.Optional
@SmallTest @SmallTest
@@ -93,8 +94,6 @@ class DeviceControlsTileTest : SysuiTestCase() {
private lateinit var serviceInfo: ControlsServiceInfo private lateinit var serviceInfo: ControlsServiceInfo
@Mock @Mock
private lateinit var uiEventLogger: UiEventLogger private lateinit var uiEventLogger: UiEventLogger
@Mock
private lateinit var keyguardStateController: KeyguardStateController
@Captor @Captor
private lateinit var listingCallbackCaptor: private lateinit var listingCallbackCaptor:
ArgumentCaptor<ControlsListingController.ControlsListingCallback> ArgumentCaptor<ControlsListingController.ControlsListingCallback>
@@ -119,7 +118,6 @@ class DeviceControlsTileTest : SysuiTestCase() {
`when`(qsHost.context).thenReturn(spiedContext) `when`(qsHost.context).thenReturn(spiedContext)
`when`(qsHost.uiEventLogger).thenReturn(uiEventLogger) `when`(qsHost.uiEventLogger).thenReturn(uiEventLogger)
`when`(controlsComponent.isEnabled()).thenReturn(true) `when`(controlsComponent.isEnabled()).thenReturn(true)
`when`(keyguardStateController.isUnlocked()).thenReturn(true)
`when`(controlsController.getPreferredStructure()) `when`(controlsController.getPreferredStructure())
.thenReturn(StructureInfo(ComponentName("pkg", "cls"), "structure", listOf())) .thenReturn(StructureInfo(ComponentName("pkg", "cls"), "structure", listOf()))
secureSettings.putInt(Settings.Secure.LOCKSCREEN_SHOW_CONTROLS, 1) secureSettings.putInt(Settings.Secure.LOCKSCREEN_SHOW_CONTROLS, 1)
@@ -222,12 +220,19 @@ class DeviceControlsTileTest : SysuiTestCase() {
} }
@Test @Test
fun testStateAvailableIfListings() { fun testStateActiveIfListingsHasControlsFavorited() {
verify(controlsListingController).observe( verify(controlsListingController).observe(
any(LifecycleOwner::class.java), any(LifecycleOwner::class.java),
capture(listingCallbackCaptor) capture(listingCallbackCaptor)
) )
`when`(controlsComponent.getVisibility()).thenReturn(ControlsComponent.Visibility.AVAILABLE) `when`(controlsComponent.getVisibility()).thenReturn(ControlsComponent.Visibility.AVAILABLE)
`when`(controlsController.getPreferredStructure()).thenReturn(
StructureInfo(
ComponentName("pkg", "cls"),
"structure",
listOf(ControlInfo("id", "title", "subtitle", 1))
)
)
listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo)) listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
testableLooper.processAllMessages() testableLooper.processAllMessages()
@@ -235,6 +240,22 @@ class DeviceControlsTileTest : SysuiTestCase() {
assertThat(tile.state.state).isEqualTo(Tile.STATE_ACTIVE) assertThat(tile.state.state).isEqualTo(Tile.STATE_ACTIVE)
} }
@Test
fun testStateInactiveIfListingsHasNoControlsFavorited() {
verify(controlsListingController).observe(
any(LifecycleOwner::class.java),
capture(listingCallbackCaptor)
)
`when`(controlsComponent.getVisibility()).thenReturn(ControlsComponent.Visibility.AVAILABLE)
`when`(controlsController.getPreferredStructure())
.thenReturn(StructureInfo(ComponentName("pkg", "cls"), "structure", listOf()))
listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
testableLooper.processAllMessages()
assertThat(tile.state.state).isEqualTo(Tile.STATE_INACTIVE)
}
@Test @Test
fun testStateInactiveIfLocked() { fun testStateInactiveIfLocked() {
verify(controlsListingController).observe( verify(controlsListingController).observe(
@@ -281,7 +302,14 @@ class DeviceControlsTileTest : SysuiTestCase() {
capture(listingCallbackCaptor) capture(listingCallbackCaptor)
) )
`when`(controlsComponent.getVisibility()).thenReturn(ControlsComponent.Visibility.AVAILABLE) `when`(controlsComponent.getVisibility()).thenReturn(ControlsComponent.Visibility.AVAILABLE)
`when`(keyguardStateController.isUnlocked).thenReturn(true) `when`(controlsUiController.resolveActivity()).thenReturn(ControlsActivity::class.java)
`when`(controlsController.getPreferredStructure()).thenReturn(
StructureInfo(
ComponentName("pkg", "cls"),
"structure",
listOf(ControlInfo("id", "title", "subtitle", 1))
)
)
listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo)) listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
testableLooper.processAllMessages() testableLooper.processAllMessages()
@@ -305,7 +333,14 @@ class DeviceControlsTileTest : SysuiTestCase() {
) )
`when`(controlsComponent.getVisibility()) `when`(controlsComponent.getVisibility())
.thenReturn(ControlsComponent.Visibility.AVAILABLE_AFTER_UNLOCK) .thenReturn(ControlsComponent.Visibility.AVAILABLE_AFTER_UNLOCK)
`when`(keyguardStateController.isUnlocked).thenReturn(false) `when`(controlsUiController.resolveActivity()).thenReturn(ControlsActivity::class.java)
`when`(controlsController.getPreferredStructure()).thenReturn(
StructureInfo(
ComponentName("pkg", "cls"),
"structure",
listOf(ControlInfo("id", "title", "subtitle", 1))
)
)
listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo)) listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo))
testableLooper.processAllMessages() testableLooper.processAllMessages()
@@ -345,8 +380,7 @@ class DeviceControlsTileTest : SysuiTestCase() {
statusBarStateController, statusBarStateController,
activityStarter, activityStarter,
qsLogger, qsLogger,
controlsComponent, controlsComponent
keyguardStateController
).also { ).also {
it.initialize() it.initialize()
testableLooper.processAllMessages() testableLooper.processAllMessages()