Merge "Fix affordance in lockscreen and dream" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
a1bd51fc79
@@ -186,7 +186,7 @@ class ControlsUiControllerImpl @Inject constructor (
|
|||||||
val allStructures = controlsController.get().getFavorites()
|
val allStructures = controlsController.get().getFavorites()
|
||||||
val selected = getPreferredSelectedItem(allStructures)
|
val selected = getPreferredSelectedItem(allStructures)
|
||||||
val anyPanels = controlsListingController.get().getCurrentServices()
|
val anyPanels = controlsListingController.get().getCurrentServices()
|
||||||
.none { it.panelActivity != null }
|
.any { it.panelActivity != null }
|
||||||
|
|
||||||
return if (controlsController.get().addSeedingFavoritesCallback(onSeedingComplete)) {
|
return if (controlsController.get().addSeedingFavoritesCallback(onSeedingComplete)) {
|
||||||
ControlsActivity::class.java
|
ControlsActivity::class.java
|
||||||
|
|||||||
@@ -136,8 +136,15 @@ public class DreamHomeControlsComplication implements Complication {
|
|||||||
final boolean hasFavorites = mControlsComponent.getControlsController()
|
final boolean hasFavorites = mControlsComponent.getControlsController()
|
||||||
.map(c -> !c.getFavorites().isEmpty())
|
.map(c -> !c.getFavorites().isEmpty())
|
||||||
.orElse(false);
|
.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();
|
final ControlsComponent.Visibility visibility = mControlsComponent.getVisibility();
|
||||||
return hasFavorites && visibility != UNAVAILABLE;
|
return (hasFavorites || hasPanels) && visibility != UNAVAILABLE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -130,6 +130,7 @@ constructor(
|
|||||||
state(
|
state(
|
||||||
isFeatureEnabled = component.isEnabled(),
|
isFeatureEnabled = component.isEnabled(),
|
||||||
hasFavorites = favorites?.isNotEmpty() == true,
|
hasFavorites = favorites?.isNotEmpty() == true,
|
||||||
|
hasPanels = serviceInfos.any { it.panelActivity != null },
|
||||||
hasServiceInfos = serviceInfos.isNotEmpty(),
|
hasServiceInfos = serviceInfos.isNotEmpty(),
|
||||||
iconResourceId = component.getTileImageId(),
|
iconResourceId = component.getTileImageId(),
|
||||||
visibility = component.getVisibility(),
|
visibility = component.getVisibility(),
|
||||||
@@ -148,13 +149,14 @@ constructor(
|
|||||||
private fun state(
|
private fun state(
|
||||||
isFeatureEnabled: Boolean,
|
isFeatureEnabled: Boolean,
|
||||||
hasFavorites: Boolean,
|
hasFavorites: Boolean,
|
||||||
|
hasPanels: Boolean,
|
||||||
hasServiceInfos: Boolean,
|
hasServiceInfos: Boolean,
|
||||||
visibility: ControlsComponent.Visibility,
|
visibility: ControlsComponent.Visibility,
|
||||||
@DrawableRes iconResourceId: Int?,
|
@DrawableRes iconResourceId: Int?,
|
||||||
): KeyguardQuickAffordanceConfig.LockScreenState {
|
): KeyguardQuickAffordanceConfig.LockScreenState {
|
||||||
return if (
|
return if (
|
||||||
isFeatureEnabled &&
|
isFeatureEnabled &&
|
||||||
hasFavorites &&
|
(hasFavorites || hasPanels) &&
|
||||||
hasServiceInfos &&
|
hasServiceInfos &&
|
||||||
iconResourceId != null &&
|
iconResourceId != null &&
|
||||||
visibility == ControlsComponent.Visibility.AVAILABLE
|
visibility == ControlsComponent.Visibility.AVAILABLE
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ import com.android.systemui.controls.CustomIconCache
|
|||||||
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.management.ControlsListingController
|
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.controls.settings.FakeControlsSettingsRepository
|
||||||
import com.android.systemui.dump.DumpManager
|
import com.android.systemui.dump.DumpManager
|
||||||
import com.android.systemui.plugins.ActivityStarter
|
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.capture
|
||||||
import com.android.systemui.util.mockito.eq
|
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.whenever
|
||||||
import com.android.systemui.util.time.FakeSystemClock
|
import com.android.systemui.util.time.FakeSystemClock
|
||||||
import com.android.wm.shell.TaskView
|
import com.android.wm.shell.TaskView
|
||||||
import com.android.wm.shell.TaskViewFactory
|
import com.android.wm.shell.TaskViewFactory
|
||||||
@@ -322,6 +324,45 @@ class ControlsUiControllerImplTest : SysuiTestCase() {
|
|||||||
.isFalse()
|
.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 {
|
private fun setUpPanel(panel: SelectedItem.PanelItem): ControlsServiceInfo {
|
||||||
val activity = ComponentName("pkg", "activity")
|
val activity = ComponentName("pkg", "activity")
|
||||||
sharedPreferences
|
sharedPreferences
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import static org.mockito.Mockito.never;
|
|||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.testing.AndroidTestingRunner;
|
import android.testing.AndroidTestingRunner;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -54,6 +55,7 @@ import org.mockito.Captor;
|
|||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@@ -146,6 +148,19 @@ public class DreamHomeControlsComplicationTest extends SysuiTestCase {
|
|||||||
verify(mDreamOverlayStateController, never()).addComplication(mComplication);
|
verify(mDreamOverlayStateController, never()).addComplication(mComplication);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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
|
@Test
|
||||||
public void complicationAvailability_serviceNotAvailable_haveFavorites_doNotAddComplication() {
|
public void complicationAvailability_serviceNotAvailable_haveFavorites_doNotAddComplication() {
|
||||||
final DreamHomeControlsComplication.Registrant registrant =
|
final DreamHomeControlsComplication.Registrant registrant =
|
||||||
@@ -232,6 +247,15 @@ public class DreamHomeControlsComplicationTest extends SysuiTestCase {
|
|||||||
triggerControlsListingCallback(serviceInfos);
|
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) {
|
private void setDreamOverlayActive(boolean value) {
|
||||||
when(mDreamOverlayStateController.isOverlayActive()).thenReturn(value);
|
when(mDreamOverlayStateController.isOverlayActive()).thenReturn(value);
|
||||||
verify(mDreamOverlayStateController).addCallback(mStateCallbackCaptor.capture());
|
verify(mDreamOverlayStateController).addCallback(mStateCallbackCaptor.capture());
|
||||||
|
|||||||
@@ -20,13 +20,14 @@ package com.android.systemui.keyguard.data.quickaffordance
|
|||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
import com.android.systemui.R
|
import com.android.systemui.R
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
|
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
|
||||||
import com.android.systemui.controls.management.ControlsListingController
|
import com.android.systemui.controls.management.ControlsListingController
|
||||||
import com.android.systemui.util.mockito.mock
|
import com.android.systemui.util.mockito.mock
|
||||||
import com.android.systemui.util.mockito.whenever
|
import com.android.systemui.util.mockito.whenever
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import java.util.*
|
import java.util.Optional
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
@@ -50,20 +51,22 @@ class HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest : SysuiTes
|
|||||||
companion object {
|
companion object {
|
||||||
@Parameters(
|
@Parameters(
|
||||||
name =
|
name =
|
||||||
"feature enabled = {0}, has favorites = {1}, has service infos = {2}, can show" +
|
"feature enabled = {0}, has favorites = {1}, has panels = {2}, " +
|
||||||
" while locked = {3}, visibility is AVAILABLE {4} - expected visible = {5}"
|
"has service infos = {3}, can show while locked = {4}, " +
|
||||||
|
"visibility is AVAILABLE {5} - expected visible = {6}"
|
||||||
)
|
)
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun data() =
|
fun data() =
|
||||||
(0 until 32)
|
(0 until 64)
|
||||||
.map { combination ->
|
.map { combination ->
|
||||||
arrayOf(
|
arrayOf(
|
||||||
/* isFeatureEnabled= */ combination and 0b10000 != 0,
|
/* isFeatureEnabled= */ combination and 0b100000 != 0,
|
||||||
/* hasFavorites= */ combination and 0b01000 != 0,
|
/* hasFavorites = */ combination and 0b010000 != 0,
|
||||||
/* hasServiceInfos= */ combination and 0b00100 != 0,
|
/* hasPanels = */ combination and 0b001000 != 0,
|
||||||
/* canShowWhileLocked= */ combination and 0b00010 != 0,
|
/* hasServiceInfos= */ combination and 0b000100 != 0,
|
||||||
/* visibilityAvailable= */ combination and 0b00001 != 0,
|
/* canShowWhileLocked= */ combination and 0b000010 != 0,
|
||||||
/* isVisible= */ combination == 0b11111,
|
/* visibilityAvailable= */ combination and 0b000001 != 0,
|
||||||
|
/* isVisible= */ combination in setOf(0b111111, 0b110111, 0b101111),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
.toList()
|
.toList()
|
||||||
@@ -72,6 +75,7 @@ class HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest : SysuiTes
|
|||||||
@Mock private lateinit var component: ControlsComponent
|
@Mock private lateinit var component: ControlsComponent
|
||||||
@Mock private lateinit var controlsController: ControlsController
|
@Mock private lateinit var controlsController: ControlsController
|
||||||
@Mock private lateinit var controlsListingController: ControlsListingController
|
@Mock private lateinit var controlsListingController: ControlsListingController
|
||||||
|
@Mock private lateinit var controlsServiceInfo: ControlsServiceInfo
|
||||||
@Captor
|
@Captor
|
||||||
private lateinit var callbackCaptor:
|
private lateinit var callbackCaptor:
|
||||||
ArgumentCaptor<ControlsListingController.ControlsListingCallback>
|
ArgumentCaptor<ControlsListingController.ControlsListingCallback>
|
||||||
@@ -80,10 +84,11 @@ class HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest : SysuiTes
|
|||||||
|
|
||||||
@JvmField @Parameter(0) var isFeatureEnabled: Boolean = false
|
@JvmField @Parameter(0) var isFeatureEnabled: Boolean = false
|
||||||
@JvmField @Parameter(1) var hasFavorites: Boolean = false
|
@JvmField @Parameter(1) var hasFavorites: Boolean = false
|
||||||
@JvmField @Parameter(2) var hasServiceInfos: Boolean = false
|
@JvmField @Parameter(2) var hasPanels: Boolean = false
|
||||||
@JvmField @Parameter(3) var canShowWhileLocked: Boolean = false
|
@JvmField @Parameter(3) var hasServiceInfos: Boolean = false
|
||||||
@JvmField @Parameter(4) var isVisibilityAvailable: Boolean = false
|
@JvmField @Parameter(4) var canShowWhileLocked: Boolean = false
|
||||||
@JvmField @Parameter(5) var isVisibleExpected: Boolean = false
|
@JvmField @Parameter(5) var isVisibilityAvailable: Boolean = false
|
||||||
|
@JvmField @Parameter(6) var isVisibleExpected: Boolean = false
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
fun setUp() {
|
fun setUp() {
|
||||||
@@ -93,10 +98,13 @@ class HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest : SysuiTes
|
|||||||
whenever(component.getControlsController()).thenReturn(Optional.of(controlsController))
|
whenever(component.getControlsController()).thenReturn(Optional.of(controlsController))
|
||||||
whenever(component.getControlsListingController())
|
whenever(component.getControlsListingController())
|
||||||
.thenReturn(Optional.of(controlsListingController))
|
.thenReturn(Optional.of(controlsListingController))
|
||||||
|
if (hasPanels) {
|
||||||
|
whenever(controlsServiceInfo.panelActivity).thenReturn(mock())
|
||||||
|
}
|
||||||
whenever(controlsListingController.getCurrentServices())
|
whenever(controlsListingController.getCurrentServices())
|
||||||
.thenReturn(
|
.thenReturn(
|
||||||
if (hasServiceInfos) {
|
if (hasServiceInfos) {
|
||||||
listOf(mock(), mock())
|
listOf(controlsServiceInfo, mock())
|
||||||
} else {
|
} else {
|
||||||
emptyList()
|
emptyList()
|
||||||
}
|
}
|
||||||
@@ -134,10 +142,15 @@ class HomeControlsKeyguardQuickAffordanceConfigParameterizedStateTest : SysuiTes
|
|||||||
val job = underTest.lockScreenState.onEach(values::add).launchIn(this)
|
val job = underTest.lockScreenState.onEach(values::add).launchIn(this)
|
||||||
|
|
||||||
if (canShowWhileLocked) {
|
if (canShowWhileLocked) {
|
||||||
|
val serviceInfoMock: ControlsServiceInfo = mock {
|
||||||
|
if (hasPanels) {
|
||||||
|
whenever(panelActivity).thenReturn(mock())
|
||||||
|
}
|
||||||
|
}
|
||||||
verify(controlsListingController).addCallback(callbackCaptor.capture())
|
verify(controlsListingController).addCallback(callbackCaptor.capture())
|
||||||
callbackCaptor.value.onServicesUpdated(
|
callbackCaptor.value.onServicesUpdated(
|
||||||
if (hasServiceInfos) {
|
if (hasServiceInfos) {
|
||||||
listOf(mock())
|
listOf(serviceInfoMock)
|
||||||
} else {
|
} else {
|
||||||
emptyList()
|
emptyList()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user