Loading packages/SystemUI/multivalentTests/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelTest.kt +23 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import com.android.systemui.qs.fgsManagerController import com.android.systemui.qs.panels.domain.interactor.tileSquishinessInteractor import com.android.systemui.qs.panels.ui.viewmodel.setConfigurationForMediaInRow import com.android.systemui.res.R import com.android.systemui.shade.data.repository.fakeShadeRepository import com.android.systemui.shade.largeScreenHeaderHelper import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.disableflags.data.repository.fakeDisableFlagsRepository Loading Loading @@ -436,6 +437,28 @@ class QSFragmentComposeViewModelTest : AbstractQSFragmentComposeViewModelTest() } } @Test fun qsVisibleAndAnyShadeVisible() = with(kosmos) { testScope.testWithinLifecycle { underTest.isQsVisible = false fakeShadeRepository.setLegacyExpandedOrAwaitingInputTransfer(false) assertThat(underTest.isQsVisibleAndAnyShadeExpanded).isFalse() underTest.isQsVisible = true fakeShadeRepository.setLegacyExpandedOrAwaitingInputTransfer(false) assertThat(underTest.isQsVisibleAndAnyShadeExpanded).isFalse() underTest.isQsVisible = false fakeShadeRepository.setLegacyExpandedOrAwaitingInputTransfer(true) assertThat(underTest.isQsVisibleAndAnyShadeExpanded).isFalse() underTest.isQsVisible = true fakeShadeRepository.setLegacyExpandedOrAwaitingInputTransfer(true) assertThat(underTest.isQsVisibleAndAnyShadeExpanded).isTrue() } } private fun TestScope.setMediaState(state: MediaState) { with(kosmos) { val activeMedia = state == ACTIVE_MEDIA Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java +51 −3 Original line number Diff line number Diff line Loading @@ -30,6 +30,8 @@ import android.content.ComponentName; import android.os.PowerManager; import android.os.UserHandle; import android.os.Vibrator; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.view.HapticFeedbackConstants; import androidx.test.ext.junit.runners.AndroidJUnit4; Loading @@ -45,6 +47,8 @@ import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.QSPanelController; import com.android.systemui.qs.flags.QSComposeFragment; import com.android.systemui.recents.ScreenPinningRequest; import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.CameraLauncher; Loading @@ -54,15 +58,14 @@ import com.android.systemui.shade.ShadeHeaderController; import com.android.systemui.shade.ShadeViewController; import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor; import com.android.systemui.shade.domain.interactor.ShadeInteractor; import com.android.systemui.shade.shared.flag.DualShade; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.notification.headsup.HeadsUpManager; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.notification.headsup.HeadsUpManager; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler; import dagger.Lazy; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading @@ -72,6 +75,8 @@ import org.mockito.stubbing.Answer; import java.util.Optional; import dagger.Lazy; @SmallTest @RunWith(AndroidJUnit4.class) public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase { Loading Loading @@ -105,6 +110,7 @@ public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase { @Mock private ActivityStarter mActivityStarter; @Mock private EmergencyGestureIntentFactory mEmergencyGestureIntentFactory; @Mock private KeyguardInteractor mKeyguardInteractor; @Mock private QSPanelController mQSPanelController; CentralSurfacesCommandQueueCallbacks mSbcqCallbacks; Loading Loading @@ -150,6 +156,7 @@ public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase { when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true); when(mRemoteInputQuickSettingsDisabler.adjustDisableFlags(anyInt())) .thenAnswer((Answer<Integer>) invocation -> invocation.getArgument(0)); when(mCentralSurfaces.getQSPanelController()).thenReturn(mQSPanelController); } @Test Loading Loading @@ -230,4 +237,45 @@ public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase { verify(mQSHost).addTile(c, false); } @Test @DisableFlags(value = {QSComposeFragment.FLAG_NAME, DualShade.FLAG_NAME}) public void clickQsTile_flagsDisabled_callsQSPanelController() { ComponentName c = new ComponentName("testpkg", "testcls"); mSbcqCallbacks.clickTile(c); verify(mQSPanelController).clickTile(c); } @Test @DisableFlags(DualShade.FLAG_NAME) @EnableFlags(QSComposeFragment.FLAG_NAME) public void clickQsTile_onlyQSComposeFlag_callsQSHost() { ComponentName c = new ComponentName("testpkg", "testcls"); mSbcqCallbacks.clickTile(c); verify(mQSPanelController, never()).clickTile(c); verify(mQSHost).clickTile(c); } @Test @EnableFlags(DualShade.FLAG_NAME) @DisableFlags(QSComposeFragment.FLAG_NAME) public void clickQsTile_onlyDualShadeFlag_callsQSHost() { ComponentName c = new ComponentName("testpkg", "testcls"); mSbcqCallbacks.clickTile(c); verify(mQSPanelController, never()).clickTile(c); verify(mQSHost).clickTile(c); } @Test @EnableFlags(value = {QSComposeFragment.FLAG_NAME, DualShade.FLAG_NAME}) public void clickQsTile_qsComposeAndDualShadeFlags_callsQSHost() { ComponentName c = new ComponentName("testpkg", "testcls"); mSbcqCallbacks.clickTile(c); verify(mQSPanelController, never()).clickTile(c); verify(mQSHost).clickTile(c); } } packages/SystemUI/src/com/android/systemui/qs/QSHost.java +8 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ import android.content.Context; import android.content.res.Resources; import android.provider.Settings; import androidx.annotation.NonNull; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.res.R; Loading Loading @@ -79,6 +81,12 @@ public interface QSHost { void addTile(String spec, int requestPosition); void addTile(ComponentName tile); /** * Click on a tile. Used by external commands * @param tile the component name of the {@link android.service.quicksettings.TileService} */ void clickTile(@NonNull ComponentName tile); /** * Adds a custom tile to the set of current tiles. * @param tile the component name of the {@link android.service.quicksettings.TileService} Loading packages/SystemUI/src/com/android/systemui/qs/QSHostAdapter.kt +10 −1 Original line number Diff line number Diff line Loading @@ -19,11 +19,13 @@ package com.android.systemui.qs import android.content.ComponentName import android.content.Context import androidx.annotation.GuardedBy import com.android.app.tracing.coroutines.launchTraced as launch import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.qs.QSTile import com.android.systemui.qs.external.TileServiceRequestController import com.android.systemui.qs.flags.QsInCompose import com.android.systemui.qs.pipeline.data.repository.TileSpecRepository.Companion.POSITION_AT_END import com.android.systemui.qs.pipeline.domain.interactor.CurrentTilesInteractor import com.android.systemui.qs.pipeline.shared.QSPipelineFlagsRepository Loading @@ -32,7 +34,6 @@ import com.android.systemui.shade.ShadeDisplayAware import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import com.android.app.tracing.coroutines.launchTraced as launch /** * Adapter to determine what real class to use for classes that depend on [QSHost]. Loading Loading @@ -135,4 +136,12 @@ constructor( override fun indexOf(tileSpec: String): Int { return specs.indexOf(tileSpec) } override fun clickTile(tile: ComponentName) { if (QsInCompose.isUnexpectedlyInLegacyMode()) { return } val spec = TileSpec.create(tile) interactor.currentTiles.value.firstOrNull { it.spec == spec }?.tile?.click(null) } } packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt +1 −1 Original line number Diff line number Diff line Loading @@ -248,7 +248,7 @@ constructor( PlatformTheme(isDarkTheme = true) { ProvideShortcutHelperIndication(interactionsConfig = interactionsConfig()) { AnimatedVisibility( visible = viewModel.isQsVisible, visible = viewModel.isQsVisibleAndAnyShadeExpanded, modifier = Modifier.graphicsLayer { alpha = viewModel.viewAlpha } // Clipping before translation to match QSContainerImpl.onDraw Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModelTest.kt +23 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import com.android.systemui.qs.fgsManagerController import com.android.systemui.qs.panels.domain.interactor.tileSquishinessInteractor import com.android.systemui.qs.panels.ui.viewmodel.setConfigurationForMediaInRow import com.android.systemui.res.R import com.android.systemui.shade.data.repository.fakeShadeRepository import com.android.systemui.shade.largeScreenHeaderHelper import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.disableflags.data.repository.fakeDisableFlagsRepository Loading Loading @@ -436,6 +437,28 @@ class QSFragmentComposeViewModelTest : AbstractQSFragmentComposeViewModelTest() } } @Test fun qsVisibleAndAnyShadeVisible() = with(kosmos) { testScope.testWithinLifecycle { underTest.isQsVisible = false fakeShadeRepository.setLegacyExpandedOrAwaitingInputTransfer(false) assertThat(underTest.isQsVisibleAndAnyShadeExpanded).isFalse() underTest.isQsVisible = true fakeShadeRepository.setLegacyExpandedOrAwaitingInputTransfer(false) assertThat(underTest.isQsVisibleAndAnyShadeExpanded).isFalse() underTest.isQsVisible = false fakeShadeRepository.setLegacyExpandedOrAwaitingInputTransfer(true) assertThat(underTest.isQsVisibleAndAnyShadeExpanded).isFalse() underTest.isQsVisible = true fakeShadeRepository.setLegacyExpandedOrAwaitingInputTransfer(true) assertThat(underTest.isQsVisibleAndAnyShadeExpanded).isTrue() } } private fun TestScope.setMediaState(state: MediaState) { with(kosmos) { val activeMedia = state == ACTIVE_MEDIA Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java +51 −3 Original line number Diff line number Diff line Loading @@ -30,6 +30,8 @@ import android.content.ComponentName; import android.os.PowerManager; import android.os.UserHandle; import android.os.Vibrator; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.view.HapticFeedbackConstants; import androidx.test.ext.junit.runners.AndroidJUnit4; Loading @@ -45,6 +47,8 @@ import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.QSPanelController; import com.android.systemui.qs.flags.QSComposeFragment; import com.android.systemui.recents.ScreenPinningRequest; import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.CameraLauncher; Loading @@ -54,15 +58,14 @@ import com.android.systemui.shade.ShadeHeaderController; import com.android.systemui.shade.ShadeViewController; import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor; import com.android.systemui.shade.domain.interactor.ShadeInteractor; import com.android.systemui.shade.shared.flag.DualShade; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.notification.headsup.HeadsUpManager; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.notification.headsup.HeadsUpManager; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler; import dagger.Lazy; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading @@ -72,6 +75,8 @@ import org.mockito.stubbing.Answer; import java.util.Optional; import dagger.Lazy; @SmallTest @RunWith(AndroidJUnit4.class) public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase { Loading Loading @@ -105,6 +110,7 @@ public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase { @Mock private ActivityStarter mActivityStarter; @Mock private EmergencyGestureIntentFactory mEmergencyGestureIntentFactory; @Mock private KeyguardInteractor mKeyguardInteractor; @Mock private QSPanelController mQSPanelController; CentralSurfacesCommandQueueCallbacks mSbcqCallbacks; Loading Loading @@ -150,6 +156,7 @@ public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase { when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true); when(mRemoteInputQuickSettingsDisabler.adjustDisableFlags(anyInt())) .thenAnswer((Answer<Integer>) invocation -> invocation.getArgument(0)); when(mCentralSurfaces.getQSPanelController()).thenReturn(mQSPanelController); } @Test Loading Loading @@ -230,4 +237,45 @@ public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase { verify(mQSHost).addTile(c, false); } @Test @DisableFlags(value = {QSComposeFragment.FLAG_NAME, DualShade.FLAG_NAME}) public void clickQsTile_flagsDisabled_callsQSPanelController() { ComponentName c = new ComponentName("testpkg", "testcls"); mSbcqCallbacks.clickTile(c); verify(mQSPanelController).clickTile(c); } @Test @DisableFlags(DualShade.FLAG_NAME) @EnableFlags(QSComposeFragment.FLAG_NAME) public void clickQsTile_onlyQSComposeFlag_callsQSHost() { ComponentName c = new ComponentName("testpkg", "testcls"); mSbcqCallbacks.clickTile(c); verify(mQSPanelController, never()).clickTile(c); verify(mQSHost).clickTile(c); } @Test @EnableFlags(DualShade.FLAG_NAME) @DisableFlags(QSComposeFragment.FLAG_NAME) public void clickQsTile_onlyDualShadeFlag_callsQSHost() { ComponentName c = new ComponentName("testpkg", "testcls"); mSbcqCallbacks.clickTile(c); verify(mQSPanelController, never()).clickTile(c); verify(mQSHost).clickTile(c); } @Test @EnableFlags(value = {QSComposeFragment.FLAG_NAME, DualShade.FLAG_NAME}) public void clickQsTile_qsComposeAndDualShadeFlags_callsQSHost() { ComponentName c = new ComponentName("testpkg", "testcls"); mSbcqCallbacks.clickTile(c); verify(mQSPanelController, never()).clickTile(c); verify(mQSHost).clickTile(c); } }
packages/SystemUI/src/com/android/systemui/qs/QSHost.java +8 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ import android.content.Context; import android.content.res.Resources; import android.provider.Settings; import androidx.annotation.NonNull; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.res.R; Loading Loading @@ -79,6 +81,12 @@ public interface QSHost { void addTile(String spec, int requestPosition); void addTile(ComponentName tile); /** * Click on a tile. Used by external commands * @param tile the component name of the {@link android.service.quicksettings.TileService} */ void clickTile(@NonNull ComponentName tile); /** * Adds a custom tile to the set of current tiles. * @param tile the component name of the {@link android.service.quicksettings.TileService} Loading
packages/SystemUI/src/com/android/systemui/qs/QSHostAdapter.kt +10 −1 Original line number Diff line number Diff line Loading @@ -19,11 +19,13 @@ package com.android.systemui.qs import android.content.ComponentName import android.content.Context import androidx.annotation.GuardedBy import com.android.app.tracing.coroutines.launchTraced as launch import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.qs.QSTile import com.android.systemui.qs.external.TileServiceRequestController import com.android.systemui.qs.flags.QsInCompose import com.android.systemui.qs.pipeline.data.repository.TileSpecRepository.Companion.POSITION_AT_END import com.android.systemui.qs.pipeline.domain.interactor.CurrentTilesInteractor import com.android.systemui.qs.pipeline.shared.QSPipelineFlagsRepository Loading @@ -32,7 +34,6 @@ import com.android.systemui.shade.ShadeDisplayAware import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import com.android.app.tracing.coroutines.launchTraced as launch /** * Adapter to determine what real class to use for classes that depend on [QSHost]. Loading Loading @@ -135,4 +136,12 @@ constructor( override fun indexOf(tileSpec: String): Int { return specs.indexOf(tileSpec) } override fun clickTile(tile: ComponentName) { if (QsInCompose.isUnexpectedlyInLegacyMode()) { return } val spec = TileSpec.create(tile) interactor.currentTiles.value.firstOrNull { it.spec == spec }?.tile?.click(null) } }
packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt +1 −1 Original line number Diff line number Diff line Loading @@ -248,7 +248,7 @@ constructor( PlatformTheme(isDarkTheme = true) { ProvideShortcutHelperIndication(interactionsConfig = interactionsConfig()) { AnimatedVisibility( visible = viewModel.isQsVisible, visible = viewModel.isQsVisibleAndAnyShadeExpanded, modifier = Modifier.graphicsLayer { alpha = viewModel.viewAlpha } // Clipping before translation to match QSContainerImpl.onDraw Loading