Merge "Convert FeatureFlags to interface."

This commit is contained in:
Dave Mankoff
2021-11-18 02:17:16 +00:00
committed by Android (Google) Code Review
21 changed files with 165 additions and 122 deletions

View File

@@ -20,16 +20,23 @@ import android.content.Context
import android.os.Handler
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.util.settings.SettingsUtilModule
import dagger.Binds
import dagger.Module
import dagger.Provides
@Module(includes = [
SettingsUtilModule::class
])
object FlagsModule {
@JvmStatic
@Provides
fun provideFlagManager(context: Context, @Main handler: Handler): FlagManager {
return FlagManager(context, handler)
abstract class FlagsModule {
@Binds
abstract fun bindsFeatureFlagDebug(impl: FeatureFlagsDebug): FeatureFlags
@Module
companion object {
@JvmStatic
@Provides
fun provideFlagManager(context: Context, @Main handler: Handler): FlagManager {
return FlagManager(context, handler)
}
}
}

View File

@@ -16,7 +16,11 @@
package com.android.systemui.flags
import dagger.Binds
import dagger.Module
@Module
object FlagsModule
abstract class FlagsModule {
@Binds
abstract fun bindsFeatureFlagRelease(impl: FeatureFlagsRelease): FeatureFlags
}

View File

@@ -38,10 +38,7 @@ import com.android.systemui.demomode.dagger.DemoModeModule;
import com.android.systemui.doze.dagger.DozeComponent;
import com.android.systemui.dreams.dagger.DreamModule;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlagManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.FlagReader;
import com.android.systemui.flags.FlagWriter;
import com.android.systemui.flags.FlagsModule;
import com.android.systemui.fragments.FragmentService;
import com.android.systemui.log.dagger.LogModule;
@@ -161,12 +158,6 @@ public abstract class SystemUIModule {
return state;
}
@Binds
abstract FlagReader provideFlagReader(FeatureFlagManager impl);
@Binds
abstract FlagWriter provideFlagWriter(FeatureFlagManager impl);
@BindsOptionalOf
abstract CommandQueue optionalCommandQueue();

View File

@@ -16,114 +16,86 @@
package com.android.systemui.flags;
import android.content.Context;
import android.util.FeatureFlagUtils;
import com.android.systemui.dagger.SysUISingleton;
import javax.inject.Inject;
/**
* Class to manage simple DeviceConfig-based feature flags.
*
* See {@link Flags} for instructions on defining new flags.
*/
@SysUISingleton
public class FeatureFlags {
private final FlagReader mFlagReader;
@Inject
public FeatureFlags(FlagReader flagReader) {
mFlagReader = flagReader;
}
/**
* @param flag The {@link BooleanFlag} of interest.
* @return The value of the flag.
*/
public boolean isEnabled(BooleanFlag flag) {
return mFlagReader.isEnabled(flag);
}
public boolean isNewNotifPipelineRenderingEnabled() {
public interface FeatureFlags extends FlagReader {
default boolean isNewNotifPipelineRenderingEnabled() {
return isEnabled(Flags.NEW_NOTIFICATION_PIPELINE_RENDERING);
}
/** */
public boolean useNewLockscreenAnimations() {
default boolean useNewLockscreenAnimations() {
return isEnabled(Flags.LOCKSCREEN_ANIMATIONS);
}
public boolean isPeopleTileEnabled() {
default boolean isPeopleTileEnabled() {
return isEnabled(Flags.PEOPLE_TILE);
}
public boolean isMonetEnabled() {
default boolean isMonetEnabled() {
return isEnabled(Flags.MONET);
}
public boolean isPMLiteEnabled() {
default boolean isPMLiteEnabled() {
return isEnabled(Flags.POWER_MENU_LITE);
}
public boolean isChargingRippleEnabled() {
default boolean isChargingRippleEnabled() {
return isEnabled(Flags.CHARGING_RIPPLE);
}
public boolean isOngoingCallStatusBarChipEnabled() {
default boolean isOngoingCallStatusBarChipEnabled() {
return isEnabled(Flags.ONGOING_CALL_STATUS_BAR_CHIP);
}
public boolean isOngoingCallInImmersiveEnabled() {
default boolean isOngoingCallInImmersiveEnabled() {
return isOngoingCallStatusBarChipEnabled() && isEnabled(Flags.ONGOING_CALL_IN_IMMERSIVE);
}
public boolean isOngoingCallInImmersiveChipTapEnabled() {
default boolean isOngoingCallInImmersiveChipTapEnabled() {
return isOngoingCallInImmersiveEnabled()
&& isEnabled(Flags.ONGOING_CALL_IN_IMMERSIVE_CHIP_TAP);
}
public boolean isSmartspaceEnabled() {
default boolean isSmartspaceEnabled() {
return isEnabled(Flags.SMARTSPACE);
}
public boolean isSmartspaceDedupingEnabled() {
default boolean isSmartspaceDedupingEnabled() {
return isSmartspaceEnabled() && isEnabled(Flags.SMARTSPACE_DEDUPING);
}
public boolean isNewKeyguardSwipeAnimationEnabled() {
default boolean isNewKeyguardSwipeAnimationEnabled() {
return isEnabled(Flags.NEW_UNLOCK_SWIPE_ANIMATION);
}
public boolean isKeyguardQsUserDetailsShortcutEnabled() {
default boolean isKeyguardQsUserDetailsShortcutEnabled() {
return isEnabled(Flags.QS_USER_DETAIL_SHORTCUT);
}
public boolean isSmartSpaceSharedElementTransitionEnabled() {
default boolean isSmartSpaceSharedElementTransitionEnabled() {
return isEnabled(Flags.SMARTSPACE_SHARED_ELEMENT_TRANSITION_ENABLED);
}
/** Whether or not to use the provider model behavior for the status bar icons */
public boolean isCombinedStatusBarSignalIconsEnabled() {
default boolean isCombinedStatusBarSignalIconsEnabled() {
return isEnabled(Flags.COMBINED_STATUS_BAR_SIGNAL_ICONS);
}
/** System setting for provider model behavior */
public boolean isProviderModelSettingEnabled(Context context) {
return FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL);
}
/**
* Use the new version of the user switcher
*/
public boolean useNewUserSwitcher() {
default boolean useNewUserSwitcher() {
return isEnabled(Flags.NEW_USER_SWITCHER);
}
/**
* Use the new single view QS headers
*/
public boolean useCombinedQSHeaders() {
default boolean useCombinedQSHeaders() {
return isEnabled(Flags.COMBINED_QS_HEADERS);
}
}

View File

@@ -60,7 +60,7 @@ import javax.inject.Inject;
* To restore a flag back to its default, leave the `--ez value <0|1>` off of the command.
*/
@SysUISingleton
public class FeatureFlagManager implements FlagReader, FlagWriter, Dumpable {
public class FeatureFlagsDebug implements FeatureFlags, FlagWriter, Dumpable {
private static final String TAG = "SysUIFlags";
private final FlagManager mFlagManager;
@@ -69,7 +69,7 @@ public class FeatureFlagManager implements FlagReader, FlagWriter, Dumpable {
private final Map<Integer, Boolean> mBooleanFlagCache = new HashMap<>();
@Inject
public FeatureFlagManager(
public FeatureFlagsDebug(
FlagManager flagManager,
Context context,
SecureSettings secureSettings,

View File

@@ -36,10 +36,10 @@ import javax.inject.Inject;
* how to set flags.
*/
@SysUISingleton
public class FeatureFlagManager implements FlagReader, FlagWriter, Dumpable {
public class FeatureFlagsRelease implements FeatureFlags, FlagWriter, Dumpable {
SparseBooleanArray mAccessedFlags = new SparseBooleanArray();
@Inject
public FeatureFlagManager(DumpManager dumpManager) {
public FeatureFlagsRelease(DumpManager dumpManager) {
dumpManager.registerDumpable("SysUIFlags", this);
}

View File

@@ -33,7 +33,7 @@ import java.util.Map;
* On public release builds, flags will always return their default value. There is no way to
* change their value on release builds.
*
* See {@link FeatureFlagManager} for instructions on flipping the flags via adb.
* See {@link FeatureFlagsDebug} for instructions on flipping the flags via adb.
*/
public class Flags {
public static final BooleanFlag TEAMFOOD = new BooleanFlag(1, false);

View File

@@ -53,6 +53,7 @@ import com.android.systemui.qs.external.TileServices;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.connectivity.StatusBarFlags;
import com.android.systemui.statusbar.phone.AutoTileManager;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarIconController;
@@ -110,6 +111,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
private SecureSettings mSecureSettings;
private final TileServiceRequestController mTileServiceRequestController;
private final StatusBarFlags mStatusBarFlags;
@Inject
public QSTileHost(Context context,
@@ -129,7 +131,8 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
SecureSettings secureSettings,
CustomTileStatePersister customTileStatePersister,
TileServiceRequestController.Builder tileServiceRequestControllerBuilder,
FeatureFlags featureFlags
FeatureFlags featureFlags,
StatusBarFlags statusBarFlags
) {
mIconController = iconController;
mContext = context;
@@ -141,6 +144,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
mUiEventLogger = uiEventLogger;
mBroadcastDispatcher = broadcastDispatcher;
mTileServiceRequestController = tileServiceRequestControllerBuilder.create(this);
mStatusBarFlags = statusBarFlags;
mInstanceIdSequence = new InstanceIdSequence(MAX_QS_INSTANCE_ID);
mServices = new TileServices(this, bgLooper, mBroadcastDispatcher, userTracker);
@@ -276,7 +280,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, mFeatureFlags);
final List<String> tileSpecs = loadTileSpecs(mContext, newValue, mStatusBarFlags);
int currentUser = mUserTracker.getUserId();
if (currentUser != mCurrentUser) {
mUserContext = mUserTracker.getUserContext();
@@ -345,7 +349,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, "", mFeatureFlags));
changeTiles(currentSpecs, loadTileSpecs(mContext, "", mStatusBarFlags));
} else {
for (int i = 0; i < mCallbacks.size(); i++) {
mCallbacks.get(i).onTilesChanged();
@@ -413,7 +417,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, mFeatureFlags);
final List<String> tileSpecs = loadTileSpecs(mContext, setting, mStatusBarFlags);
if (changeFunction.test(tileSpecs)) {
saveTilesToSettings(tileSpecs);
}
@@ -503,7 +507,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
}
protected static List<String> loadTileSpecs(
Context context, String tileList, FeatureFlags featureFlags) {
Context context, String tileList, StatusBarFlags statusBarFlags) {
final Resources res = context.getResources();
if (TextUtils.isEmpty(tileList)) {
@@ -536,7 +540,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
}
}
}
if (featureFlags.isProviderModelSettingEnabled(context)) {
if (statusBarFlags.isProviderModelSettingEnabled()) {
if (!tiles.contains("internet")) {
if (tiles.contains("wifi")) {
// Replace the WiFi with Internet, and remove the Cell

View File

@@ -42,6 +42,7 @@ import com.android.systemui.qs.dagger.QSScope;
import com.android.systemui.qs.external.CustomTile;
import com.android.systemui.qs.tileimpl.QSTileImpl.DrawableIcon;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.connectivity.StatusBarFlags;
import com.android.systemui.util.leak.GarbageMonitor;
import java.util.ArrayList;
@@ -64,6 +65,7 @@ public class TileQueryHelper {
private final Context mContext;
private final UserTracker mUserTracker;
private final FeatureFlags mFeatureFlags;
private final StatusBarFlags mStatusBarFlags;
private TileStateListener mListener;
private boolean mFinished;
@@ -74,13 +76,15 @@ public class TileQueryHelper {
UserTracker userTracker,
@Main Executor mainExecutor,
@Background Executor bgExecutor,
FeatureFlags featureFlags
FeatureFlags featureFlags,
StatusBarFlags statusBarFlags
) {
mContext = context;
mMainExecutor = mainExecutor;
mBgExecutor = bgExecutor;
mUserTracker = userTracker;
mFeatureFlags = featureFlags;
mStatusBarFlags = statusBarFlags;
}
public void setListener(TileStateListener listener) {
@@ -121,7 +125,7 @@ public class TileQueryHelper {
}
final ArrayList<QSTile> tilesToAdd = new ArrayList<>();
if (mFeatureFlags.isProviderModelSettingEnabled(mContext)) {
if (mStatusBarFlags.isProviderModelSettingEnabled()) {
possibleTiles.remove("cell");
possibleTiles.remove("wifi");
}

View File

@@ -192,7 +192,8 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
SubscriptionDefaults defaults,
Looper receiverLooper,
CarrierConfigTracker carrierConfigTracker,
FeatureFlags featureFlags
FeatureFlags featureFlags,
StatusBarFlags statusBarFlags
) {
super("MobileSignalController(" + info.getSubscriptionId() + ")", context,
NetworkCapabilities.TRANSPORT_CELLULAR, callbackHandler,
@@ -227,7 +228,7 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
mMobileStatusTracker = new MobileStatusTracker(mPhone, receiverLooper,
info, mDefaults, mMobileCallback);
mProviderModelBehavior = featureFlags.isCombinedStatusBarSignalIconsEnabled();
mProviderModelSetting = featureFlags.isProviderModelSettingEnabled(mContext);
mProviderModelSetting = statusBarFlags.isProviderModelSettingEnabled();
}
void setConfiguration(Config config) {

View File

@@ -135,6 +135,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
private Config mConfig;
private final CarrierConfigTracker mCarrierConfigTracker;
private final FeatureFlags mFeatureFlags;
private final StatusBarFlags mStatusBarFlags;
private final DumpManager mDumpManager;
private TelephonyCallback.ActiveDataSubscriptionIdListener mPhoneStateListener;
@@ -210,6 +211,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
mReceiverHandler.post(() -> handleConfigurationChanged());
}
};
/**
* Construct this controller object and register for updates.
*/
@@ -233,6 +235,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
@Main Handler handler,
InternetDialogFactory internetDialogFactory,
FeatureFlags featureFlags,
StatusBarFlags statusBarFlags,
DumpManager dumpManager) {
this(context, connectivityManager,
telephonyManager,
@@ -252,6 +255,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
demoModeController,
carrierConfigTracker,
featureFlags,
statusBarFlags,
dumpManager);
mReceiverHandler.post(mRegisterListeners);
mMainHandler = handler;
@@ -275,6 +279,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
DemoModeController demoModeController,
CarrierConfigTracker carrierConfigTracker,
FeatureFlags featureFlags,
StatusBarFlags statusBarFlags,
DumpManager dumpManager
) {
mContext = context;
@@ -294,6 +299,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
mDemoModeController = demoModeController;
mCarrierConfigTracker = carrierConfigTracker;
mFeatureFlags = featureFlags;
mStatusBarFlags = statusBarFlags;
mDumpManager = dumpManager;
// telephony
@@ -316,7 +322,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
});
mWifiSignalController = new WifiSignalController(mContext, mHasMobileDataFeature,
mCallbackHandler, this, mWifiManager, mConnectivityManager, networkScoreManager,
mFeatureFlags);
mStatusBarFlags);
mEthernetSignalController = new EthernetSignalController(mContext, mCallbackHandler, this);
@@ -442,7 +448,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
mDemoModeController.addCallback(this);
mProviderModelBehavior = mFeatureFlags.isCombinedStatusBarSignalIconsEnabled();
mProviderModelSetting = mFeatureFlags.isProviderModelSettingEnabled(mContext);
mProviderModelSetting = mStatusBarFlags.isProviderModelSettingEnabled();
mDumpManager.registerDumpable(TAG, this);
}
@@ -958,7 +964,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
mHasMobileDataFeature, mPhone.createForSubscriptionId(subId),
mCallbackHandler, this, subscriptions.get(i),
mSubDefaults, mReceiverHandler.getLooper(), mCarrierConfigTracker,
mFeatureFlags);
mFeatureFlags, mStatusBarFlags);
controller.setUserSetupComplete(mUserSetup);
mMobileSignalControllers.put(subId, controller);
if (subscriptions.get(i).getSimSlotIndex() == 0) {
@@ -1436,7 +1442,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
mConfig, mHasMobileDataFeature,
mPhone.createForSubscriptionId(info.getSubscriptionId()), mCallbackHandler, this,
info, mSubDefaults, mReceiverHandler.getLooper(), mCarrierConfigTracker,
mFeatureFlags);
mFeatureFlags, mStatusBarFlags);
mMobileSignalControllers.put(id, controller);
controller.getState().userSetup = true;
return info;

View File

@@ -0,0 +1,42 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.connectivity;
import android.content.Context;
import android.util.FeatureFlagUtils;
import com.android.systemui.dagger.SysUISingleton;
import javax.inject.Inject;
/**
* Class for providing StatusBar specific logic around {@link FeatureFlags}.
*/
@SysUISingleton
public class StatusBarFlags {
private final Context mContext;
@Inject
public StatusBarFlags(Context context) {
mContext = context;
}
/** System setting for provider model behavior */
public boolean isProviderModelSettingEnabled() {
return FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL);
}
}

View File

@@ -34,7 +34,6 @@ import com.android.settingslib.graph.SignalDrawable;
import com.android.settingslib.mobile.TelephonyIcons;
import com.android.settingslib.wifi.WifiStatusTracker;
import com.android.systemui.R;
import com.android.systemui.flags.FeatureFlags;
import java.io.PrintWriter;
@@ -55,7 +54,7 @@ public class WifiSignalController extends SignalController<WifiState, IconGroup>
WifiManager wifiManager,
ConnectivityManager connectivityManager,
NetworkScoreManager networkScoreManager,
FeatureFlags featureFlags) {
StatusBarFlags statusBarFlags) {
super("WifiSignalController", context, NetworkCapabilities.TRANSPORT_WIFI,
callbackHandler, networkController);
mWifiManager = wifiManager;
@@ -68,7 +67,7 @@ public class WifiSignalController extends SignalController<WifiState, IconGroup>
new WifiTrafficStateCallback());
}
mCurrentState.iconGroup = mLastState.iconGroup = mUnmergedWifiIconGroup;
mProviderModelSetting = featureFlags.isProviderModelSettingEnabled(mContext);
mProviderModelSetting = statusBarFlags.isProviderModelSettingEnabled();
}
@Override

View File

@@ -25,7 +25,6 @@ import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
import android.content.Context;
@@ -33,7 +32,6 @@ import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.util.settings.SecureSettings;
import org.junit.After;
import org.junit.Before;
@@ -50,8 +48,8 @@ import java.io.StringWriter;
* overriding, and should never return any value other than the one provided as the default.
*/
@SmallTest
public class FeatureFlagManagerTest extends SysuiTestCase {
FeatureFlagManager mFeatureFlagManager;
public class FeatureFlagsReleaseTest extends SysuiTestCase {
FeatureFlagsRelease mFeatureFlagsRelease;
@Mock private Context mContext;
@Mock private DumpManager mDumpManager;
@@ -60,7 +58,7 @@ public class FeatureFlagManagerTest extends SysuiTestCase {
public void setup() {
MockitoAnnotations.initMocks(this);
mFeatureFlagManager = new FeatureFlagManager(mDumpManager);
mFeatureFlagsRelease = new FeatureFlagsRelease(mDumpManager);
}
@After
@@ -72,22 +70,22 @@ public class FeatureFlagManagerTest extends SysuiTestCase {
@Test
public void testIsEnabled() {
mFeatureFlagManager.setEnabled(1, true);
mFeatureFlagsRelease.setEnabled(1, true);
// Again, nothing changes.
assertThat(mFeatureFlagManager.isEnabled(1, false)).isFalse();
assertThat(mFeatureFlagsRelease.isEnabled(1, false)).isFalse();
}
@Test
public void testDump() {
// Even if a flag is set before
mFeatureFlagManager.setEnabled(1, true);
mFeatureFlagsRelease.setEnabled(1, true);
// WHEN the flags have been accessed
assertFalse(mFeatureFlagManager.isEnabled(1, false));
assertTrue(mFeatureFlagManager.isEnabled(2, true));
assertFalse(mFeatureFlagsRelease.isEnabled(1, false));
assertTrue(mFeatureFlagsRelease.isEnabled(2, true));
// Even if a flag is set after
mFeatureFlagManager.setEnabled(2, false);
mFeatureFlagsRelease.setEnabled(2, false);
// THEN the dump contains the flags and the default values
String dump = dumpToString();
@@ -98,7 +96,7 @@ public class FeatureFlagManagerTest extends SysuiTestCase {
private String dumpToString() {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
mFeatureFlagManager.dump(mock(FileDescriptor.class), pw, new String[0]);
mFeatureFlagsRelease.dump(mock(FileDescriptor.class), pw, new String[0]);
pw.flush();
String dump = sw.toString();
return dump;

View File

@@ -54,6 +54,7 @@ import com.android.systemui.qs.tileimpl.QSFactoryImpl;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.connectivity.StatusBarFlags;
import com.android.systemui.statusbar.phone.AutoTileManager;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.StatusBar;
@@ -101,6 +102,8 @@ public class QSFragmentTest extends SysuiBaseFragmentTest {
private TileServiceRequestController mTileServiceRequestController;
@Mock
private FeatureFlags mFeatureFlags;
@Mock
private StatusBarFlags mStatusBarFlags;
public QSFragmentTest() {
super(QSFragment.class);
@@ -146,7 +149,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, mFeatureFlags);
mTileServiceRequestControllerBuilder, mFeatureFlags, mStatusBarFlags);
qs.setHost(host);
qs.setListening(true);

View File

@@ -63,6 +63,7 @@ import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.connectivity.StatusBarFlags;
import com.android.systemui.statusbar.phone.AutoTileManager;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarIconController;
@@ -129,6 +130,8 @@ public class QSTileHostTest extends SysuiTestCase {
private TileServiceRequestController mTileServiceRequestController;
@Mock
private FeatureFlags mFeatureFlags;
@Mock
private StatusBarFlags mStatusBarFlags;
private Handler mHandler;
private TestableLooper mLooper;
@@ -149,9 +152,9 @@ public class QSTileHostTest extends SysuiTestCase {
mLooper.getLooper(), mPluginManager, mTunerService, mAutoTiles, mDumpManager,
mBroadcastDispatcher, mStatusBar, mQSLogger, mUiEventLogger, mUserTracker,
mSecureSettings, mCustomTileStatePersister, mTileServiceRequestControllerBuilder,
mFeatureFlags);
mFeatureFlags, mStatusBarFlags);
setUpTileFactory();
when(mFeatureFlags.isProviderModelSettingEnabled(mContext)).thenReturn(false);
when(mStatusBarFlags.isProviderModelSettingEnabled()).thenReturn(false);
}
private void setUpTileFactory() {
@@ -179,13 +182,13 @@ public class QSTileHostTest extends SysuiTestCase {
@Test
public void testLoadTileSpecs_emptySetting() {
List<String> tiles = QSTileHost.loadTileSpecs(mContext, "", mFeatureFlags);
List<String> tiles = QSTileHost.loadTileSpecs(mContext, "", mStatusBarFlags);
assertFalse(tiles.isEmpty());
}
@Test
public void testLoadTileSpecs_nullSetting() {
List<String> tiles = QSTileHost.loadTileSpecs(mContext, null, mFeatureFlags);
List<String> tiles = QSTileHost.loadTileSpecs(mContext, null, mStatusBarFlags);
assertFalse(tiles.isEmpty());
}
@@ -200,7 +203,7 @@ public class QSTileHostTest extends SysuiTestCase {
@Test
public void testRemoveWifiAndCellularWithoutInternet() {
when(mFeatureFlags.isProviderModelSettingEnabled(mContext)).thenReturn(true);
when(mStatusBarFlags.isProviderModelSettingEnabled()).thenReturn(true);
mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "wifi, spec1, cell, spec2");
assertEquals("internet", mQSTileHost.mTileSpecs.get(0));
@@ -210,7 +213,7 @@ public class QSTileHostTest extends SysuiTestCase {
@Test
public void testRemoveWifiAndCellularWithInternet() {
when(mFeatureFlags.isProviderModelSettingEnabled(mContext)).thenReturn(true);
when(mStatusBarFlags.isProviderModelSettingEnabled()).thenReturn(true);
mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "wifi, spec1, cell, spec2, internet");
assertEquals("spec1", mQSTileHost.mTileSpecs.get(0));
@@ -220,7 +223,7 @@ public class QSTileHostTest extends SysuiTestCase {
@Test
public void testRemoveWifiWithoutInternet() {
when(mFeatureFlags.isProviderModelSettingEnabled(mContext)).thenReturn(true);
when(mStatusBarFlags.isProviderModelSettingEnabled()).thenReturn(true);
mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "spec1, wifi, spec2");
assertEquals("spec1", mQSTileHost.mTileSpecs.get(0));
@@ -230,7 +233,7 @@ public class QSTileHostTest extends SysuiTestCase {
@Test
public void testRemoveCellWithInternet() {
when(mFeatureFlags.isProviderModelSettingEnabled(mContext)).thenReturn(true);
when(mStatusBarFlags.isProviderModelSettingEnabled()).thenReturn(true);
mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "spec1, spec2, cell, internet");
assertEquals("spec1", mQSTileHost.mTileSpecs.get(0));
@@ -240,7 +243,7 @@ public class QSTileHostTest extends SysuiTestCase {
@Test
public void testNoWifiNoCellularNoInternet() {
when(mFeatureFlags.isProviderModelSettingEnabled(mContext)).thenReturn(true);
when(mStatusBarFlags.isProviderModelSettingEnabled()).thenReturn(true);
mQSTileHost.onTuningChanged(QSTileHost.TILES_SETTING, "spec1,spec2");
assertEquals("spec1", mQSTileHost.mTileSpecs.get(0));
@@ -380,7 +383,7 @@ public class QSTileHostTest extends SysuiTestCase {
@Test
public void testLoadTileSpec_repeated() {
List<String> specs = QSTileHost.loadTileSpecs(mContext, "spec1,spec1,spec2", mFeatureFlags);
List<String> specs = QSTileHost.loadTileSpecs(mContext, "spec1,spec1,spec2", mStatusBarFlags);
assertEquals(2, specs.size());
assertEquals("spec1", specs.get(0));
@@ -391,7 +394,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", mFeatureFlags);
List<String> specs = QSTileHost.loadTileSpecs(mContext, "default", mStatusBarFlags);
// Remove spurious tiles, like dbg:mem
specs.removeIf(spec -> !"spec1".equals(spec));
@@ -402,7 +405,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", mFeatureFlags);
List<String> specs = QSTileHost.loadTileSpecs(mContext, "default,spec1", mStatusBarFlags);
// Remove spurious tiles, like dbg:mem
specs.removeIf(spec -> !"spec1".equals(spec));
@@ -442,11 +445,12 @@ public class QSTileHostTest extends SysuiTestCase {
UiEventLogger uiEventLogger, UserTracker userTracker,
SecureSettings secureSettings, CustomTileStatePersister customTileStatePersister,
TileServiceRequestController.Builder tileServiceRequestControllerBuilder,
FeatureFlags featureFlags) {
FeatureFlags featureFlags, StatusBarFlags statusBarFlags) {
super(context, iconController, defaultFactory, mainHandler, bgLooper, pluginManager,
tunerService, autoTiles, dumpManager, broadcastDispatcher,
Optional.of(statusBar), qsLogger, uiEventLogger, userTracker, secureSettings,
customTileStatePersister, tileServiceRequestControllerBuilder, featureFlags);
customTileStatePersister, tileServiceRequestControllerBuilder, featureFlags,
statusBarFlags);
}
@Override

View File

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

View File

@@ -51,6 +51,7 @@ import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.qs.tileimpl.QSFactoryImpl;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.statusbar.connectivity.StatusBarFlags;
import com.android.systemui.statusbar.phone.AutoTileManager;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarIconController;
@@ -107,6 +108,8 @@ public class TileServicesTest extends SysuiTestCase {
private TileServiceRequestController mTileServiceRequestController;
@Mock
private FeatureFlags mFeatureFlags;
@Mock
private StatusBarFlags mStatusBarFlags;
@Before
public void setUp() throws Exception {
@@ -134,7 +137,8 @@ public class TileServicesTest extends SysuiTestCase {
mSecureSettings,
mock(CustomTileStatePersister.class),
mTileServiceRequestControllerBuilder,
mFeatureFlags);
mFeatureFlags,
mStatusBarFlags);
mTileService = new TestTileServices(host, Looper.getMainLooper(), mBroadcastDispatcher,
mUserTracker);
}

View File

@@ -127,6 +127,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
protected CarrierConfigTracker mCarrierConfigTracker;
protected FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
protected FeatureFlags mFeatureFlags;
protected StatusBarFlags mStatusBarFlags;
protected int mSubId;
@@ -156,12 +157,10 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
@Before
public void setUp() throws Exception {
mMockingSession = ExtendedMockito.mockitoSession().strictness(Strictness.LENIENT)
.mockStatic(FeatureFlags.class).startMocking();
mFeatureFlags = mock(FeatureFlags.class);
mStatusBarFlags = mock(StatusBarFlags.class);
when(mFeatureFlags.isCombinedStatusBarSignalIconsEnabled()).thenReturn(false);
when(mFeatureFlags.isProviderModelSettingEnabled(mContext)).thenReturn(true);
when(mStatusBarFlags.isProviderModelSettingEnabled()).thenReturn(true);
mInstrumentation = InstrumentationRegistry.getInstrumentation();
Settings.Global.putInt(mContext.getContentResolver(), Global.AIRPLANE_MODE_ON, 0);
@@ -239,6 +238,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
mDemoModeController,
mCarrierConfigTracker,
mFeatureFlags,
mStatusBarFlags,
mock(DumpManager.class)
);
setupNetworkController();
@@ -308,7 +308,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
mock(AccessPointControllerImpl.class),
mock(DataUsageController.class), mMockSubDefaults,
mock(DeviceProvisionedController.class), mMockBd, mDemoModeController,
mCarrierConfigTracker, mFeatureFlags,
mCarrierConfigTracker, mFeatureFlags, mStatusBarFlags,
mock(DumpManager.class));
setupNetworkController();

View File

@@ -130,7 +130,8 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest {
mock(AccessPointControllerImpl.class),
mock(DataUsageController.class), mMockSubDefaults,
mock(DeviceProvisionedController.class), mMockBd, mDemoModeController,
mock(CarrierConfigTracker.class), mFeatureFlags, mock(DumpManager.class));
mock(CarrierConfigTracker.class), mFeatureFlags, mStatusBarFlags,
mock(DumpManager.class));
setupNetworkController();
setupDefaultSignal();

View File

@@ -70,7 +70,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd,
mDemoModeController, mock(CarrierConfigTracker.class), mFeatureFlags,
mock(DumpManager.class));
mStatusBarFlags, mock(DumpManager.class));
setupNetworkController();
verifyLastMobileDataIndicators(false, -1, 0);
@@ -91,7 +91,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd,
mDemoModeController, mock(CarrierConfigTracker.class), mFeatureFlags,
mock(DumpManager.class));
mStatusBarFlags, mock(DumpManager.class));
mNetworkController.registerListeners();
// Wait for the main looper to execute the previous command
@@ -160,7 +160,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd,
mDemoModeController, mock(CarrierConfigTracker.class), mFeatureFlags,
mock(DumpManager.class));
mStatusBarFlags, mock(DumpManager.class));
setupNetworkController();
// No Subscriptions.