Merge "[DO NOT MERGE] Make sure WiFi and Cell tiles are not created in Provider Model" into sc-qpr1-dev

This commit is contained in:
TreeHugger Robot
2021-09-13 15:52:25 +00:00
committed by Android (Google) Code Review
6 changed files with 107 additions and 18 deletions

View File

@@ -51,6 +51,7 @@ import com.android.systemui.qs.external.TileServices;
import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.settings.UserTracker; import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.phone.AutoTileManager; import com.android.systemui.statusbar.phone.AutoTileManager;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarIconController;
@@ -95,6 +96,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
private final UiEventLogger mUiEventLogger; private final UiEventLogger mUiEventLogger;
private final InstanceIdSequence mInstanceIdSequence; private final InstanceIdSequence mInstanceIdSequence;
private final CustomTileStatePersister mCustomTileStatePersister; private final CustomTileStatePersister mCustomTileStatePersister;
private final FeatureFlags mFeatureFlags;
private final List<Callback> mCallbacks = new ArrayList<>(); private final List<Callback> mCallbacks = new ArrayList<>();
private AutoTileManager mAutoTiles; private AutoTileManager mAutoTiles;
@@ -122,7 +124,8 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
UiEventLogger uiEventLogger, UiEventLogger uiEventLogger,
UserTracker userTracker, UserTracker userTracker,
SecureSettings secureSettings, SecureSettings secureSettings,
CustomTileStatePersister customTileStatePersister CustomTileStatePersister customTileStatePersister,
FeatureFlags featureFlags
) { ) {
mIconController = iconController; mIconController = iconController;
mContext = context; mContext = context;
@@ -144,6 +147,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
mUserTracker = userTracker; mUserTracker = userTracker;
mSecureSettings = secureSettings; mSecureSettings = secureSettings;
mCustomTileStatePersister = customTileStatePersister; mCustomTileStatePersister = customTileStatePersister;
mFeatureFlags = featureFlags;
mainHandler.post(() -> { mainHandler.post(() -> {
// This is technically a hack to avoid circular dependency of // This is technically a hack to avoid circular dependency of
@@ -265,7 +269,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
if (newValue == null && UserManager.isDeviceInDemoMode(mContext)) { if (newValue == null && UserManager.isDeviceInDemoMode(mContext)) {
newValue = mContext.getResources().getString(R.string.quick_settings_tiles_retail_mode); 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(); int currentUser = mUserTracker.getUserId();
if (currentUser != mCurrentUser) { if (currentUser != mCurrentUser) {
mUserContext = mUserTracker.getUserContext(); mUserContext = mUserTracker.getUserContext();
@@ -334,7 +338,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
if (newTiles.isEmpty() && !tileSpecs.isEmpty()) { if (newTiles.isEmpty() && !tileSpecs.isEmpty()) {
// If we didn't manage to create any tiles, set it to empty (default) // 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."); Log.d(TAG, "No valid tiles on tuning changed. Setting to default.");
changeTiles(currentSpecs, loadTileSpecs(mContext, "")); changeTiles(currentSpecs, loadTileSpecs(mContext, "", mFeatureFlags));
} else { } else {
for (int i = 0; i < mCallbacks.size(); i++) { for (int i = 0; i < mCallbacks.size(); i++) {
mCallbacks.get(i).onTilesChanged(); mCallbacks.get(i).onTilesChanged();
@@ -402,7 +406,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
private void changeTileSpecs(Predicate<List<String>> changeFunction) { private void changeTileSpecs(Predicate<List<String>> changeFunction) {
final String setting = mSecureSettings.getStringForUser(TILES_SETTING, mCurrentUser); 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)) { if (changeFunction.test(tileSpecs)) {
saveTilesToSettings(tileSpecs); saveTilesToSettings(tileSpecs);
} }
@@ -491,7 +495,8 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
throw new RuntimeException("Default factory didn't create view for " + tile.getTileSpec()); 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(); final Resources res = context.getResources();
if (TextUtils.isEmpty(tileList)) { if (TextUtils.isEmpty(tileList)) {
@@ -524,6 +529,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; return tiles;
} }

View File

@@ -41,6 +41,7 @@ import com.android.systemui.qs.dagger.QSScope;
import com.android.systemui.qs.external.CustomTile; import com.android.systemui.qs.external.CustomTile;
import com.android.systemui.qs.tileimpl.QSTileImpl.DrawableIcon; import com.android.systemui.qs.tileimpl.QSTileImpl.DrawableIcon;
import com.android.systemui.settings.UserTracker; import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.util.leak.GarbageMonitor; import com.android.systemui.util.leak.GarbageMonitor;
import java.util.ArrayList; import java.util.ArrayList;
@@ -62,6 +63,7 @@ public class TileQueryHelper {
private final Executor mBgExecutor; private final Executor mBgExecutor;
private final Context mContext; private final Context mContext;
private final UserTracker mUserTracker; private final UserTracker mUserTracker;
private final FeatureFlags mFeatureFlags;
private TileStateListener mListener; private TileStateListener mListener;
private boolean mFinished; private boolean mFinished;
@@ -71,12 +73,14 @@ public class TileQueryHelper {
Context context, Context context,
UserTracker userTracker, UserTracker userTracker,
@Main Executor mainExecutor, @Main Executor mainExecutor,
@Background Executor bgExecutor @Background Executor bgExecutor,
FeatureFlags featureFlags
) { ) {
mContext = context; mContext = context;
mMainExecutor = mainExecutor; mMainExecutor = mainExecutor;
mBgExecutor = bgExecutor; mBgExecutor = bgExecutor;
mUserTracker = userTracker; mUserTracker = userTracker;
mFeatureFlags = featureFlags;
} }
public void setListener(TileStateListener listener) { public void setListener(TileStateListener listener) {
@@ -117,6 +121,10 @@ public class TileQueryHelper {
} }
final ArrayList<QSTile> tilesToAdd = new ArrayList<>(); final ArrayList<QSTile> tilesToAdd = new ArrayList<>();
if (mFeatureFlags.isProviderModelSettingEnabled()) {
possibleTiles.remove("cell");
possibleTiles.remove("wifi");
}
for (String spec : possibleTiles) { for (String spec : possibleTiles) {
// Only add current and stock tiles that can be created from QSFactoryImpl. // Only add current and stock tiles that can be created from QSFactoryImpl.

View File

@@ -139,7 +139,7 @@ public class QSFragmentTest extends SysuiBaseFragmentTest {
() -> mock(AutoTileManager.class), mock(DumpManager.class), () -> mock(AutoTileManager.class), mock(DumpManager.class),
mock(BroadcastDispatcher.class), Optional.of(mock(StatusBar.class)), mock(BroadcastDispatcher.class), Optional.of(mock(StatusBar.class)),
mock(QSLogger.class), mock(UiEventLogger.class), mock(UserTracker.class), mock(QSLogger.class), mock(UiEventLogger.class), mock(UserTracker.class),
mock(SecureSettings.class), mock(CustomTileStatePersister.class)); mock(SecureSettings.class), mock(CustomTileStatePersister.class), mFeatureFlags);
qs.setHost(host); qs.setHost(host);
qs.setListening(true); qs.setListening(true);

View File

@@ -60,6 +60,7 @@ import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.settings.UserTracker; import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.phone.AutoTileManager; import com.android.systemui.statusbar.phone.AutoTileManager;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarIconController;
@@ -120,6 +121,8 @@ public class QSTileHostTest extends SysuiTestCase {
private SecureSettings mSecureSettings; private SecureSettings mSecureSettings;
@Mock @Mock
private CustomTileStatePersister mCustomTileStatePersister; private CustomTileStatePersister mCustomTileStatePersister;
@Mock
private FeatureFlags mFeatureFlags;
private Handler mHandler; private Handler mHandler;
private TestableLooper mLooper; private TestableLooper mLooper;
@@ -137,8 +140,9 @@ public class QSTileHostTest extends SysuiTestCase {
mQSTileHost = new TestQSTileHost(mContext, mIconController, mDefaultFactory, mHandler, mQSTileHost = new TestQSTileHost(mContext, mIconController, mDefaultFactory, mHandler,
mLooper.getLooper(), mPluginManager, mTunerService, mAutoTiles, mDumpManager, mLooper.getLooper(), mPluginManager, mTunerService, mAutoTiles, mDumpManager,
mBroadcastDispatcher, mStatusBar, mQSLogger, mUiEventLogger, mUserTracker, mBroadcastDispatcher, mStatusBar, mQSLogger, mUiEventLogger, mUserTracker,
mSecureSettings, mCustomTileStatePersister); mSecureSettings, mCustomTileStatePersister, mFeatureFlags);
setUpTileFactory(); setUpTileFactory();
when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(false);
} }
private void setUpTileFactory() { private void setUpTileFactory() {
@@ -166,13 +170,13 @@ public class QSTileHostTest extends SysuiTestCase {
@Test @Test
public void testLoadTileSpecs_emptySetting() { public void testLoadTileSpecs_emptySetting() {
List<String> tiles = QSTileHost.loadTileSpecs(mContext, ""); List<String> tiles = QSTileHost.loadTileSpecs(mContext, "", mFeatureFlags);
assertFalse(tiles.isEmpty()); assertFalse(tiles.isEmpty());
} }
@Test @Test
public void testLoadTileSpecs_nullSetting() { public void testLoadTileSpecs_nullSetting() {
List<String> tiles = QSTileHost.loadTileSpecs(mContext, null); List<String> tiles = QSTileHost.loadTileSpecs(mContext, null, mFeatureFlags);
assertFalse(tiles.isEmpty()); assertFalse(tiles.isEmpty());
} }
@@ -185,6 +189,55 @@ public class QSTileHostTest extends SysuiTestCase {
assertEquals(2, mQSTileHost.getTiles().size()); 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 @Test
public void testSpecWithInvalidDoesNotUseDefault() { public void testSpecWithInvalidDoesNotUseDefault() {
mContext.getOrCreateTestableResources() mContext.getOrCreateTestableResources()
@@ -318,7 +371,7 @@ public class QSTileHostTest extends SysuiTestCase {
@Test @Test
public void testLoadTileSpec_repeated() { 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(2, specs.size());
assertEquals("spec1", specs.get(0)); assertEquals("spec1", specs.get(0));
@@ -329,7 +382,7 @@ public class QSTileHostTest extends SysuiTestCase {
public void testLoadTileSpec_repeatedInDefault() { public void testLoadTileSpec_repeatedInDefault() {
mContext.getOrCreateTestableResources() mContext.getOrCreateTestableResources()
.addOverride(R.string.quick_settings_tiles_default, "spec1,spec1"); .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 // Remove spurious tiles, like dbg:mem
specs.removeIf(spec -> !"spec1".equals(spec)); specs.removeIf(spec -> !"spec1".equals(spec));
@@ -340,7 +393,7 @@ public class QSTileHostTest extends SysuiTestCase {
public void testLoadTileSpec_repeatedDefaultAndSetting() { public void testLoadTileSpec_repeatedDefaultAndSetting() {
mContext.getOrCreateTestableResources() mContext.getOrCreateTestableResources()
.addOverride(R.string.quick_settings_tiles_default, "spec1"); .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 // Remove spurious tiles, like dbg:mem
specs.removeIf(spec -> !"spec1".equals(spec)); specs.removeIf(spec -> !"spec1".equals(spec));
@@ -378,11 +431,12 @@ public class QSTileHostTest extends SysuiTestCase {
Provider<AutoTileManager> autoTiles, DumpManager dumpManager, Provider<AutoTileManager> autoTiles, DumpManager dumpManager,
BroadcastDispatcher broadcastDispatcher, StatusBar statusBar, QSLogger qsLogger, BroadcastDispatcher broadcastDispatcher, StatusBar statusBar, QSLogger qsLogger,
UiEventLogger uiEventLogger, UserTracker userTracker, UiEventLogger uiEventLogger, UserTracker userTracker,
SecureSettings secureSettings, CustomTileStatePersister customTileStatePersister) { SecureSettings secureSettings, CustomTileStatePersister customTileStatePersister,
FeatureFlags featureFlags) {
super(context, iconController, defaultFactory, mainHandler, bgLooper, pluginManager, super(context, iconController, defaultFactory, mainHandler, bgLooper, pluginManager,
tunerService, autoTiles, dumpManager, broadcastDispatcher, tunerService, autoTiles, dumpManager, broadcastDispatcher,
Optional.of(statusBar), qsLogger, uiEventLogger, userTracker, secureSettings, Optional.of(statusBar), qsLogger, uiEventLogger, userTracker, secureSettings,
customTileStatePersister); customTileStatePersister, featureFlags);
} }
@Override @Override

View File

@@ -58,6 +58,7 @@ import com.android.systemui.plugins.qs.QSIconView;
import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.qs.QSTile;
import com.android.systemui.qs.QSTileHost; import com.android.systemui.qs.QSTileHost;
import com.android.systemui.settings.UserTracker; import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock; import com.android.systemui.util.time.FakeSystemClock;
@@ -108,6 +109,8 @@ public class TileQueryHelperTest extends SysuiTestCase {
private PackageManager mPackageManager; private PackageManager mPackageManager;
@Mock @Mock
private UserTracker mUserTracker; private UserTracker mUserTracker;
@Mock
private FeatureFlags mFeatureFlags;
@Captor @Captor
private ArgumentCaptor<List<TileQueryHelper.TileInfo>> mCaptor; private ArgumentCaptor<List<TileQueryHelper.TileInfo>> mCaptor;
@@ -133,12 +136,12 @@ public class TileQueryHelperTest extends SysuiTestCase {
} }
} }
).when(mQSTileHost).createTile(anyString()); ).when(mQSTileHost).createTile(anyString());
when(mFeatureFlags.isProviderModelSettingEnabled()).thenReturn(false);
FakeSystemClock clock = new FakeSystemClock(); FakeSystemClock clock = new FakeSystemClock();
mMainExecutor = new FakeExecutor(clock); mMainExecutor = new FakeExecutor(clock);
mBgExecutor = new FakeExecutor(clock); mBgExecutor = new FakeExecutor(clock);
mTileQueryHelper = new TileQueryHelper( mTileQueryHelper = new TileQueryHelper(
mContext, mUserTracker, mMainExecutor, mBgExecutor); mContext, mUserTracker, mMainExecutor, mBgExecutor, mFeatureFlags);
mTileQueryHelper.setListener(mListener); mTileQueryHelper.setListener(mListener);
} }

View File

@@ -48,6 +48,7 @@ import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.qs.tileimpl.QSFactoryImpl; import com.android.systemui.qs.tileimpl.QSFactoryImpl;
import com.android.systemui.settings.UserTracker; import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.phone.AutoTileManager; import com.android.systemui.statusbar.phone.AutoTileManager;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarIconController;
@@ -98,6 +99,8 @@ public class TileServicesTest extends SysuiTestCase {
private UserTracker mUserTracker; private UserTracker mUserTracker;
@Mock @Mock
private SecureSettings mSecureSettings; private SecureSettings mSecureSettings;
@Mock
private FeatureFlags mFeatureFlags;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
@@ -119,7 +122,8 @@ public class TileServicesTest extends SysuiTestCase {
mUiEventLogger, mUiEventLogger,
mUserTracker, mUserTracker,
mSecureSettings, mSecureSettings,
mock(CustomTileStatePersister.class)); mock(CustomTileStatePersister.class),
mFeatureFlags);
mTileService = new TestTileServices(host, Looper.getMainLooper(), mBroadcastDispatcher, mTileService = new TestTileServices(host, Looper.getMainLooper(), mBroadcastDispatcher,
mUserTracker); mUserTracker);
} }