diff options
4 files changed, 75 insertions, 19 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt index 91e75f6436c2..822f8f2e6191 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt @@ -33,6 +33,12 @@ interface ControlsUiController { 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 * animations. */ diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt index c1e99f578459..bf7d71635694 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt @@ -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( parent: ViewGroup, onDismiss: Runnable, diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt index 05b342072974..c65bd9b4348e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt @@ -31,7 +31,6 @@ import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.dagger.ControlsComponent import com.android.systemui.controls.dagger.ControlsComponent.Visibility.AVAILABLE 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.dagger.qualifiers.Background 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.logging.QSLogger import com.android.systemui.qs.tileimpl.QSTileImpl -import com.android.systemui.statusbar.policy.KeyguardStateController import java.util.concurrent.atomic.AtomicBoolean import javax.inject.Inject @@ -55,8 +53,7 @@ class DeviceControlsTile @Inject constructor( statusBarStateController: StatusBarStateController, activityStarter: ActivityStarter, qsLogger: QSLogger, - private val controlsComponent: ControlsComponent, - private val keyguardStateController: KeyguardStateController + private val controlsComponent: ControlsComponent ) : QSTileImpl<QSTile.State>( host, backgroundLooper, @@ -105,7 +102,8 @@ class DeviceControlsTile @Inject constructor( } 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) putExtra(ControlsUiController.EXTRA_ANIMATE, true) } @@ -127,10 +125,15 @@ class DeviceControlsTile @Inject constructor( state.icon = icon if (controlsComponent.isEnabled() && hasControlsApps.get()) { if (controlsComponent.getVisibility() == AVAILABLE) { - val structure = controlsComponent - .getControlsController().get().getPreferredStructure().structure - state.state = Tile.STATE_ACTIVE - state.secondaryLabel = if (structure == tileLabel) null else structure + val structureInfo = controlsComponent + .getControlsController().get().getPreferredStructure() + state.state = if (structureInfo.controls.isEmpty()) { + Tile.STATE_INACTIVE + } else { + Tile.STATE_ACTIVE + } + val label = structureInfo.structure + state.secondaryLabel = if (label == tileLabel) null else label } else { state.state = Tile.STATE_INACTIVE state.secondaryLabel = mContext.getText(R.string.controls_tile_locked) diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt index ed988810fc83..f7b9438e6535 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DeviceControlsTileTest.kt @@ -33,17 +33,18 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.animation.ActivityLaunchAnimator import com.android.systemui.classifier.FalsingManagerFake 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.StructureInfo import com.android.systemui.controls.dagger.ControlsComponent 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.plugins.ActivityStarter import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.qs.QSHost import com.android.systemui.qs.logging.QSLogger 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.capture import com.android.systemui.util.mockito.eq @@ -57,13 +58,13 @@ import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatchers.anyBoolean import org.mockito.Captor import org.mockito.Mock +import org.mockito.MockitoAnnotations import org.mockito.Mockito.`when` import org.mockito.Mockito.doNothing import org.mockito.Mockito.nullable import org.mockito.Mockito.spy import org.mockito.Mockito.verify import org.mockito.Mockito.verifyZeroInteractions -import org.mockito.MockitoAnnotations import java.util.Optional @SmallTest @@ -93,8 +94,6 @@ class DeviceControlsTileTest : SysuiTestCase() { private lateinit var serviceInfo: ControlsServiceInfo @Mock private lateinit var uiEventLogger: UiEventLogger - @Mock - private lateinit var keyguardStateController: KeyguardStateController @Captor private lateinit var listingCallbackCaptor: ArgumentCaptor<ControlsListingController.ControlsListingCallback> @@ -119,7 +118,6 @@ class DeviceControlsTileTest : SysuiTestCase() { `when`(qsHost.context).thenReturn(spiedContext) `when`(qsHost.uiEventLogger).thenReturn(uiEventLogger) `when`(controlsComponent.isEnabled()).thenReturn(true) - `when`(keyguardStateController.isUnlocked()).thenReturn(true) `when`(controlsController.getPreferredStructure()) .thenReturn(StructureInfo(ComponentName("pkg", "cls"), "structure", listOf())) secureSettings.putInt(Settings.Secure.LOCKSCREEN_SHOW_CONTROLS, 1) @@ -222,12 +220,19 @@ class DeviceControlsTileTest : SysuiTestCase() { } @Test - fun testStateAvailableIfListings() { + fun testStateActiveIfListingsHasControlsFavorited() { 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(ControlInfo("id", "title", "subtitle", 1)) + ) + ) listingCallbackCaptor.value.onServicesUpdated(listOf(serviceInfo)) testableLooper.processAllMessages() @@ -236,6 +241,22 @@ class DeviceControlsTileTest : SysuiTestCase() { } @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 fun testStateInactiveIfLocked() { verify(controlsListingController).observe( any(LifecycleOwner::class.java), @@ -281,7 +302,14 @@ class DeviceControlsTileTest : SysuiTestCase() { capture(listingCallbackCaptor) ) `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)) testableLooper.processAllMessages() @@ -305,7 +333,14 @@ class DeviceControlsTileTest : SysuiTestCase() { ) `when`(controlsComponent.getVisibility()) .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)) testableLooper.processAllMessages() @@ -345,8 +380,7 @@ class DeviceControlsTileTest : SysuiTestCase() { statusBarStateController, activityStarter, qsLogger, - controlsComponent, - keyguardStateController + controlsComponent ).also { it.initialize() testableLooper.processAllMessages() |