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

Commit 39974daa authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

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

parents 1d1d5e2d be24c45c
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