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

Commit be24c45c authored by yinxu's avatar yinxu
Browse files

Make sure WiFi and Cell tiles are not created in Provider Model

Bug: 199176067
Test: Manual tests, unit tests
Change-Id: Ic1b286a31c429b781652dcb24a1351b85f81edeb
parent 21737265
Loading
Loading
Loading
Loading
+25 −5
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.qs.QSFactory;
import com.android.systemui.plugins.qs.QSTile;
@@ -96,6 +97,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
    private final UiEventLogger mUiEventLogger;
    private final InstanceIdSequence mInstanceIdSequence;
    private final CustomTileStatePersister mCustomTileStatePersister;
    private final FeatureFlags mFeatureFlags;

    private final List<Callback> mCallbacks = new ArrayList<>();
    private AutoTileManager mAutoTiles;
@@ -126,7 +128,8 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
            UserTracker userTracker,
            SecureSettings secureSettings,
            CustomTileStatePersister customTileStatePersister,
            TileServiceRequestController.Builder tileServiceRequestControllerBuilder
            TileServiceRequestController.Builder tileServiceRequestControllerBuilder,
            FeatureFlags featureFlags
    ) {
        mIconController = iconController;
        mContext = context;
@@ -149,6 +152,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
        mUserTracker = userTracker;
        mSecureSettings = secureSettings;
        mCustomTileStatePersister = customTileStatePersister;
        mFeatureFlags = featureFlags;

        mainHandler.post(() -> {
            // This is technically a hack to avoid circular dependency of
@@ -272,7 +276,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
        if (newValue == null && UserManager.isDeviceInDemoMode(mContext)) {
            newValue = mContext.getResources().getString(R.string.quick_settings_tiles_retail_mode);
        }
        final List<String> tileSpecs = loadTileSpecs(mContext, newValue);
        final List<String> tileSpecs = loadTileSpecs(mContext, newValue, mFeatureFlags);
        int currentUser = mUserTracker.getUserId();
        if (currentUser != mCurrentUser) {
            mUserContext = mUserTracker.getUserContext();
@@ -341,7 +345,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
        if (newTiles.isEmpty() && !tileSpecs.isEmpty()) {
            // If we didn't manage to create any tiles, set it to empty (default)
            Log.d(TAG, "No valid tiles on tuning changed. Setting to default.");
            changeTiles(currentSpecs, loadTileSpecs(mContext, ""));
            changeTiles(currentSpecs, loadTileSpecs(mContext, "", mFeatureFlags));
        } else {
            for (int i = 0; i < mCallbacks.size(); i++) {
                mCallbacks.get(i).onTilesChanged();
@@ -409,7 +413,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D

    private void changeTileSpecs(Predicate<List<String>> changeFunction) {
        final String setting = mSecureSettings.getStringForUser(TILES_SETTING, mCurrentUser);
        final List<String> tileSpecs = loadTileSpecs(mContext, setting);
        final List<String> tileSpecs = loadTileSpecs(mContext, setting, mFeatureFlags);
        if (changeFunction.test(tileSpecs)) {
            saveTilesToSettings(tileSpecs);
        }
@@ -498,7 +502,8 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
        throw new RuntimeException("Default factory didn't create view for " + tile.getTileSpec());
    }

    protected static List<String> loadTileSpecs(Context context, String tileList) {
    protected static List<String> loadTileSpecs(
            Context context, String tileList, FeatureFlags featureFlags) {
        final Resources res = context.getResources();

        if (TextUtils.isEmpty(tileList)) {
@@ -531,6 +536,21 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
                }
            }
        }
        if (featureFlags.isProviderModelSettingEnabled()) {
            if (!tiles.contains("internet")) {
                if (tiles.contains("wifi")) {
                    // Replace the WiFi with Internet, and remove the Cell
                    tiles.set(tiles.indexOf("wifi"), "internet");
                    tiles.remove("cell");
                } else if (tiles.contains("cell")) {
                    // Replace the Cell with Internet
                    tiles.set(tiles.indexOf("cell"), "internet");
                }
            } else {
                tiles.remove("wifi");
                tiles.remove("cell");
            }
        }
        return tiles;
    }

+9 −1
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.widget.Button;
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.qs.QSTile;
import com.android.systemui.plugins.qs.QSTile.State;
import com.android.systemui.qs.QSTileHost;
@@ -62,6 +63,7 @@ public class TileQueryHelper {
    private final Executor mBgExecutor;
    private final Context mContext;
    private final UserTracker mUserTracker;
    private final FeatureFlags mFeatureFlags;
    private TileStateListener mListener;

    private boolean mFinished;
@@ -71,12 +73,14 @@ public class TileQueryHelper {
            Context context,
            UserTracker userTracker,
            @Main Executor mainExecutor,
            @Background Executor bgExecutor
            @Background Executor bgExecutor,
            FeatureFlags featureFlags
    ) {
        mContext = context;
        mMainExecutor = mainExecutor;
        mBgExecutor = bgExecutor;
        mUserTracker = userTracker;
        mFeatureFlags = featureFlags;
    }

    public void setListener(TileStateListener listener) {
@@ -117,6 +121,10 @@ public class TileQueryHelper {
        }

        final ArrayList<QSTile> tilesToAdd = new ArrayList<>();
        if (mFeatureFlags.isProviderModelSettingEnabled()) {
            possibleTiles.remove("cell");
            possibleTiles.remove("wifi");
        }

        for (String spec : possibleTiles) {
            // Only add current and stock tiles that can be created from QSFactoryImpl.
+4 −1
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import com.android.systemui.SystemUIFactory;
import com.android.systemui.SysuiBaseFragmentTest;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.media.MediaHost;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -100,6 +101,8 @@ public class QSFragmentTest extends SysuiBaseFragmentTest {
    private TileServiceRequestController.Builder mTileServiceRequestControllerBuilder;
    @Mock
    private TileServiceRequestController mTileServiceRequestController;
    @Mock
    private FeatureFlags mFeatureFlags;

    public QSFragmentTest() {
        super(QSFragment.class);
@@ -145,7 +148,7 @@ public class QSFragmentTest extends SysuiBaseFragmentTest {
                mock(BroadcastDispatcher.class), Optional.of(mock(StatusBar.class)),
                mock(QSLogger.class), mock(UiEventLogger.class), mock(UserTracker.class),
                mock(SecureSettings.class), mock(CustomTileStatePersister.class),
                mTileServiceRequestControllerBuilder);
                mTileServiceRequestControllerBuilder, mFeatureFlags);
        qs.setHost(host);

        qs.setListening(true);
+63 −8
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.classifier.FalsingManagerFake;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.qs.QSFactory;
import com.android.systemui.plugins.qs.QSTile;
@@ -126,6 +127,8 @@ public class QSTileHostTest extends SysuiTestCase {
    private TileServiceRequestController.Builder mTileServiceRequestControllerBuilder;
    @Mock
    private TileServiceRequestController mTileServiceRequestController;
    @Mock
    private FeatureFlags mFeatureFlags;

    private Handler mHandler;
    private TestableLooper mLooper;
@@ -145,8 +148,10 @@ public class QSTileHostTest extends SysuiTestCase {
        mQSTileHost = new TestQSTileHost(mContext, mIconController, mDefaultFactory, mHandler,
                mLooper.getLooper(), mPluginManager, mTunerService, mAutoTiles, mDumpManager,
                mBroadcastDispatcher, mStatusBar, mQSLogger, mUiEventLogger, mUserTracker,
                mSecureSettings, mCustomTileStatePersister, mTileServiceRequestControllerBuilder);
                mSecureSettings, mCustomTileStatePersister, mTileServiceRequestControllerBuilder,
                mFeatureFlags);
        setUpTileFactory();
        when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(false);
    }

    private void setUpTileFactory() {
@@ -174,13 +179,13 @@ public class QSTileHostTest extends SysuiTestCase {

    @Test
    public void testLoadTileSpecs_emptySetting() {
        List<String> tiles = QSTileHost.loadTileSpecs(mContext, "");
        List<String> tiles = QSTileHost.loadTileSpecs(mContext, "", mFeatureFlags);
        assertFalse(tiles.isEmpty());
    }

    @Test
    public void testLoadTileSpecs_nullSetting() {
        List<String> tiles = QSTileHost.loadTileSpecs(mContext, null);
        List<String> tiles = QSTileHost.loadTileSpecs(mContext, null, mFeatureFlags);
        assertFalse(tiles.isEmpty());
    }

@@ -193,6 +198,55 @@ public class QSTileHostTest extends SysuiTestCase {
        assertEquals(2, mQSTileHost.getTiles().size());
    }

    @Test
    public void testRemoveWifiAndCellularWithoutInternet() {
        when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(true);
        mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "wifi, spec1, cell, spec2");

        assertEquals("internet", mQSTileHost.mTileSpecs.get(0));
        assertEquals("spec1", mQSTileHost.mTileSpecs.get(1));
        assertEquals("spec2", mQSTileHost.mTileSpecs.get(2));
    }

    @Test
    public void testRemoveWifiAndCellularWithInternet() {
        when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(true);
        mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "wifi, spec1, cell, spec2, internet");

        assertEquals("spec1", mQSTileHost.mTileSpecs.get(0));
        assertEquals("spec2", mQSTileHost.mTileSpecs.get(1));
        assertEquals("internet", mQSTileHost.mTileSpecs.get(2));
    }

    @Test
    public void testRemoveWifiWithoutInternet() {
        when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(true);
        mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "spec1, wifi, spec2");

        assertEquals("spec1", mQSTileHost.mTileSpecs.get(0));
        assertEquals("internet", mQSTileHost.mTileSpecs.get(1));
        assertEquals("spec2", mQSTileHost.mTileSpecs.get(2));
    }

    @Test
    public void testRemoveCellWithInternet() {
        when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(true);
        mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "spec1, spec2, cell, internet");

        assertEquals("spec1", mQSTileHost.mTileSpecs.get(0));
        assertEquals("spec2", mQSTileHost.mTileSpecs.get(1));
        assertEquals("internet", mQSTileHost.mTileSpecs.get(2));
    }

    @Test
    public void testNoWifiNoCellularNoInternet() {
        when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(true);
        mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "spec1,spec2");

        assertEquals("spec1", mQSTileHost.mTileSpecs.get(0));
        assertEquals("spec2", mQSTileHost.mTileSpecs.get(1));
    }

    @Test
    public void testSpecWithInvalidDoesNotUseDefault() {
        mContext.getOrCreateTestableResources()
@@ -326,7 +380,7 @@ public class QSTileHostTest extends SysuiTestCase {

    @Test
    public void testLoadTileSpec_repeated() {
        List<String> specs = QSTileHost.loadTileSpecs(mContext, "spec1,spec1,spec2");
        List<String> specs = QSTileHost.loadTileSpecs(mContext, "spec1,spec1,spec2", mFeatureFlags);

        assertEquals(2, specs.size());
        assertEquals("spec1", specs.get(0));
@@ -337,7 +391,7 @@ public class QSTileHostTest extends SysuiTestCase {
    public void testLoadTileSpec_repeatedInDefault() {
        mContext.getOrCreateTestableResources()
                .addOverride(R.string.quick_settings_tiles_default, "spec1,spec1");
        List<String> specs = QSTileHost.loadTileSpecs(mContext, "default");
        List<String> specs = QSTileHost.loadTileSpecs(mContext, "default", mFeatureFlags);

        // Remove spurious tiles, like dbg:mem
        specs.removeIf(spec -> !"spec1".equals(spec));
@@ -348,7 +402,7 @@ public class QSTileHostTest extends SysuiTestCase {
    public void testLoadTileSpec_repeatedDefaultAndSetting() {
        mContext.getOrCreateTestableResources()
                .addOverride(R.string.quick_settings_tiles_default, "spec1");
        List<String> specs = QSTileHost.loadTileSpecs(mContext, "default,spec1");
        List<String> specs = QSTileHost.loadTileSpecs(mContext, "default,spec1", mFeatureFlags);

        // Remove spurious tiles, like dbg:mem
        specs.removeIf(spec -> !"spec1".equals(spec));
@@ -387,11 +441,12 @@ public class QSTileHostTest extends SysuiTestCase {
                BroadcastDispatcher broadcastDispatcher, StatusBar statusBar, QSLogger qsLogger,
                UiEventLogger uiEventLogger, UserTracker userTracker,
                SecureSettings secureSettings, CustomTileStatePersister customTileStatePersister,
                TileServiceRequestController.Builder tileServiceRequestControllerBuilder) {
                TileServiceRequestController.Builder tileServiceRequestControllerBuilder,
                FeatureFlags featureFlags) {
            super(context, iconController, defaultFactory, mainHandler, bgLooper, pluginManager,
                    tunerService, autoTiles, dumpManager, broadcastDispatcher,
                    Optional.of(statusBar), qsLogger, uiEventLogger, userTracker, secureSettings,
                    customTileStatePersister, tileServiceRequestControllerBuilder);
                    customTileStatePersister, tileServiceRequestControllerBuilder, featureFlags);
        }

        @Override
+5 −2
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ import androidx.test.filters.SmallTest;
import com.android.internal.logging.InstanceId;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.plugins.qs.QSIconView;
import com.android.systemui.plugins.qs.QSTile;
@@ -108,6 +109,8 @@ public class TileQueryHelperTest extends SysuiTestCase {
    private PackageManager mPackageManager;
    @Mock
    private UserTracker mUserTracker;
    @Mock
    private FeatureFlags mFeatureFlags;
    @Captor
    private ArgumentCaptor<List<TileQueryHelper.TileInfo>> mCaptor;

@@ -133,12 +136,12 @@ public class TileQueryHelperTest extends SysuiTestCase {
                    }
                }
        ).when(mQSTileHost).createTile(anyString());

        when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(false);
        FakeSystemClock clock = new FakeSystemClock();
        mMainExecutor = new FakeExecutor(clock);
        mBgExecutor = new FakeExecutor(clock);
        mTileQueryHelper = new TileQueryHelper(
                mContext, mUserTracker, mMainExecutor, mBgExecutor);
                mContext, mUserTracker, mMainExecutor, mBgExecutor, mFeatureFlags);
        mTileQueryHelper.setListener(mListener);
    }

Loading