Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 38509f65 authored by Fabián Kozynski's avatar Fabián Kozynski
Browse files

Fix issues with CTS in new QS

This CL fixes two issues:

* QQS should not be composed when the shade is closed.
 Neither isQsVisible or setListening have the correct state. Instead,
 make sure to track ShadeInteractor.isAnyExpanded
* Clicks on TileService coming from adb (through CommandQueue) should
  not be routed through the UI (because it changes). Instead, route
  through QSHost.

Flag: com.android.systemui.qs_ui_refactor_compose_fragment
Test: atest QSFragmentComposeViewModelTest
Test: atest CentralSurfacesCommandQueueCallbacksTest
Test: atest CtsTileServiceTestCases
Test: atest CtsSystemUiHostTestCases
Bug: 376224290
Change-Id: I56dfdc2ce43ace96cdc10ab0d100ca53f8cf87e4
parent 3d8a5de4
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -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
@@ -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
+51 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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 {
@@ -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;

@@ -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
@@ -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);
    }
}
+8 −0
Original line number Diff line number Diff line
@@ -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;

@@ -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}
+10 −1
Original line number Diff line number Diff line
@@ -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
@@ -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].
@@ -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)
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -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