diff options
6 files changed, 106 insertions, 19 deletions
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 fb678aa420bf..1e3e5cd1c31c 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt @@ -186,7 +186,7 @@ class ControlsUiControllerImpl @Inject constructor ( val allStructures = controlsController.get().getFavorites() val selected = getPreferredSelectedItem(allStructures) val anyPanels = controlsListingController.get().getCurrentServices() - .none { it.panelActivity != null } + .any { it.panelActivity != null } return if (controlsController.get().addSeedingFavoritesCallback(onSeedingComplete)) { ControlsActivity::class.java diff --git a/packages/SystemUI/src/com/android/systemui/dreams/complication/DreamHomeControlsComplication.java b/packages/SystemUI/src/com/android/systemui/dreams/complication/DreamHomeControlsComplication.java index ee0051220787..1065b94508f8 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/complication/DreamHomeControlsComplication.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/complication/DreamHomeControlsComplication.java @@ -136,8 +136,15 @@ public class DreamHomeControlsComplication implements Complication { final boolean hasFavorites = mControlsComponent.getControlsController() .map(c -> !c.getFavorites().isEmpty()) .orElse(false); + boolean hasPanels = false; + for (int i = 0; i < controlsServices.size(); i++) { + if (controlsServices.get(i).getPanelActivity() != null) { + hasPanels = true; + break; + } + } final ControlsComponent.Visibility visibility = mControlsComponent.getVisibility(); - return hasFavorites && visibility != UNAVAILABLE; + return (hasFavorites || hasPanels) && visibility != UNAVAILABLE; } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfig.kt index 2558fab216a0..394426df5552 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfig.kt @@ -130,6 +130,7 @@ constructor( state( isFeatureEnabled = component.isEnabled(), hasFavorites = favorites?.isNotEmpty() == true, + hasPanels = serviceInfos.any { it.panelActivity != null }, hasServiceInfos = serviceInfos.isNotEmpty(), iconResourceId = component.getTileImageId(), visibility = component.getVisibility(), @@ -148,13 +149,14 @@ constructor( private fun state( isFeatureEnabled: Boolean, hasFavorites: Boolean, + hasPanels: Boolean, hasServiceInfos: Boolean, visibility: ControlsComponent.Visibility, @DrawableRes iconResourceId: Int?, ): KeyguardQuickAffordanceConfig.LockScreenState { return if ( isFeatureEnabled && - hasFavorites && + (hasFavorites || hasPanels) && hasServiceInfos && iconResourceId != null && visibility == ControlsComponent.Visibility.AVAILABLE diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt index 779788aa0075..d172c9a2e630 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt @@ -38,6 +38,7 @@ import com.android.systemui.controls.CustomIconCache import com.android.systemui.controls.controller.ControlsController import com.android.systemui.controls.controller.StructureInfo import com.android.systemui.controls.management.ControlsListingController +import com.android.systemui.controls.management.ControlsProviderSelectorActivity import com.android.systemui.controls.settings.FakeControlsSettingsRepository import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.ActivityStarter @@ -53,6 +54,7 @@ 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.whenever import com.android.systemui.util.time.FakeSystemClock import com.android.wm.shell.TaskView import com.android.wm.shell.TaskViewFactory @@ -322,6 +324,45 @@ class ControlsUiControllerImplTest : SysuiTestCase() { .isFalse() } + @Test + fun testResolveActivityWhileSeeding_ControlsActivity() { + whenever(controlsController.addSeedingFavoritesCallback(any())).thenReturn(true) + assertThat(underTest.resolveActivity()).isEqualTo(ControlsActivity::class.java) + } + + @Test + fun testResolveActivityNotSeedingNoFavoritesNoPanels_ControlsProviderSelectorActivity() { + whenever(controlsController.addSeedingFavoritesCallback(any())).thenReturn(false) + whenever(controlsController.getFavorites()).thenReturn(emptyList()) + + val selectedItems = + listOf( + SelectedItem.StructureItem( + StructureInfo(ComponentName.unflattenFromString("pkg/.cls1"), "a", ArrayList()) + ), + ) + sharedPreferences + .edit() + .putString("controls_component", selectedItems[0].componentName.flattenToString()) + .putString("controls_structure", selectedItems[0].name.toString()) + .commit() + + assertThat(underTest.resolveActivity()) + .isEqualTo(ControlsProviderSelectorActivity::class.java) + } + + @Test + fun testResolveActivityNotSeedingNoDefaultNoFavoritesPanel_ControlsActivity() { + val panel = SelectedItem.PanelItem("App name", ComponentName("pkg", "cls")) + val activity = ComponentName("pkg", "activity") + val csi = ControlsServiceInfo(panel.componentName, panel.appName, activity) + whenever(controlsController.addSeedingFavoritesCallback(any())).thenReturn(true) + whenever(controlsController.getFavorites()).thenReturn(emptyList()) + whenever(controlsListingController.getCurrentServices()).thenReturn(listOf(csi)) + + assertThat(underTest.resolveActivity()).isEqualTo(ControlsActivity::class.java) + } + private fun setUpPanel(panel: SelectedItem.PanelItem): ControlsServiceInfo { val activity = ComponentName("pkg", "activity") sharedPreferences diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/DreamHomeControlsComplicationTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/DreamHomeControlsComplicationTest.java index e6d3a69593cd..89c728082cc5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/DreamHomeControlsComplicationTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/DreamHomeControlsComplicationTest.java @@ -27,6 +27,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.content.ComponentName; import android.content.Context; import android.testing.AndroidTestingRunner; import android.view.View; @@ -54,6 +55,7 @@ import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -147,6 +149,19 @@ public class DreamHomeControlsComplicationTest extends SysuiTestCase { } @Test + public void complicationAvailability_serviceAvailable_noFavorites_panel_addComplication() { + final DreamHomeControlsComplication.Registrant registrant = + new DreamHomeControlsComplication.Registrant(mComplication, + mDreamOverlayStateController, mControlsComponent); + registrant.start(); + + setHaveFavorites(false); + setServiceWithPanel(); + + verify(mDreamOverlayStateController).addComplication(mComplication); + } + + @Test public void complicationAvailability_serviceNotAvailable_haveFavorites_doNotAddComplication() { final DreamHomeControlsComplication.Registrant registrant = new DreamHomeControlsComplication.Registrant(mComplication, @@ -232,6 +247,15 @@ public class DreamHomeControlsComplicationTest extends SysuiTestCase { triggerControlsListingCallback(serviceInfos); } + private void setServiceWithPanel() { + final List<ControlsServiceInfo> serviceInfos = new ArrayList<>(); + ControlsServiceInfo csi = mock(ControlsServiceInfo.class); + serviceInfos.add(csi); + when(csi.getPanelActivity()).thenReturn(new ComponentName("a", "b")); + when(mControlsListingController.getCurrentServices()).thenReturn(serviceInfos); + triggerControlsListingCallback(serviceInfos); + } + private void setDreamOverlayActive(boolean value) { when(mDreamOverlayStateController.isOverlayActive()).thenReturn(value); verify(mDreamOverlayStateController).addCallback(mStateCallbackCaptor.capture()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest.kt index 322014a61a73..f8cb40885d21 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest.kt @@ -20,13 +20,14 @@ package com.android.systemui.keyguard.data.quickaffordance import androidx.test.filters.SmallTest import com.android.systemui.R import com.android.systemui.SysuiTestCase +import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.controller.ControlsController import com.android.systemui.controls.dagger.ControlsComponent import com.android.systemui.controls.management.ControlsListingController import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat -import java.util.* +import java.util.Optional import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -50,20 +51,22 @@ class HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest : SysuiTes companion object { @Parameters( name = - "feature enabled = {0}, has favorites = {1}, has service infos = {2}, can show" + - " while locked = {3}, visibility is AVAILABLE {4} - expected visible = {5}" + "feature enabled = {0}, has favorites = {1}, has panels = {2}, " + + "has service infos = {3}, can show while locked = {4}, " + + "visibility is AVAILABLE {5} - expected visible = {6}" ) @JvmStatic fun data() = - (0 until 32) + (0 until 64) .map { combination -> arrayOf( - /* isFeatureEnabled= */ combination and 0b10000 != 0, - /* hasFavorites= */ combination and 0b01000 != 0, - /* hasServiceInfos= */ combination and 0b00100 != 0, - /* canShowWhileLocked= */ combination and 0b00010 != 0, - /* visibilityAvailable= */ combination and 0b00001 != 0, - /* isVisible= */ combination == 0b11111, + /* isFeatureEnabled= */ combination and 0b100000 != 0, + /* hasFavorites = */ combination and 0b010000 != 0, + /* hasPanels = */ combination and 0b001000 != 0, + /* hasServiceInfos= */ combination and 0b000100 != 0, + /* canShowWhileLocked= */ combination and 0b000010 != 0, + /* visibilityAvailable= */ combination and 0b000001 != 0, + /* isVisible= */ combination in setOf(0b111111, 0b110111, 0b101111), ) } .toList() @@ -72,6 +75,7 @@ class HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest : SysuiTes @Mock private lateinit var component: ControlsComponent @Mock private lateinit var controlsController: ControlsController @Mock private lateinit var controlsListingController: ControlsListingController + @Mock private lateinit var controlsServiceInfo: ControlsServiceInfo @Captor private lateinit var callbackCaptor: ArgumentCaptor<ControlsListingController.ControlsListingCallback> @@ -80,10 +84,11 @@ class HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest : SysuiTes @JvmField @Parameter(0) var isFeatureEnabled: Boolean = false @JvmField @Parameter(1) var hasFavorites: Boolean = false - @JvmField @Parameter(2) var hasServiceInfos: Boolean = false - @JvmField @Parameter(3) var canShowWhileLocked: Boolean = false - @JvmField @Parameter(4) var isVisibilityAvailable: Boolean = false - @JvmField @Parameter(5) var isVisibleExpected: Boolean = false + @JvmField @Parameter(2) var hasPanels: Boolean = false + @JvmField @Parameter(3) var hasServiceInfos: Boolean = false + @JvmField @Parameter(4) var canShowWhileLocked: Boolean = false + @JvmField @Parameter(5) var isVisibilityAvailable: Boolean = false + @JvmField @Parameter(6) var isVisibleExpected: Boolean = false @Before fun setUp() { @@ -93,10 +98,13 @@ class HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest : SysuiTes whenever(component.getControlsController()).thenReturn(Optional.of(controlsController)) whenever(component.getControlsListingController()) .thenReturn(Optional.of(controlsListingController)) + if (hasPanels) { + whenever(controlsServiceInfo.panelActivity).thenReturn(mock()) + } whenever(controlsListingController.getCurrentServices()) .thenReturn( if (hasServiceInfos) { - listOf(mock(), mock()) + listOf(controlsServiceInfo, mock()) } else { emptyList() } @@ -134,10 +142,15 @@ class HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest : SysuiTes val job = underTest.lockScreenState.onEach(values::add).launchIn(this) if (canShowWhileLocked) { + val serviceInfoMock: ControlsServiceInfo = mock { + if (hasPanels) { + whenever(panelActivity).thenReturn(mock()) + } + } verify(controlsListingController).addCallback(callbackCaptor.capture()) callbackCaptor.value.onServicesUpdated( if (hasServiceInfos) { - listOf(mock()) + listOf(serviceInfoMock) } else { emptyList() } |