From 02e42be6ec6920c9bd521d4cda9e0dc816209fa5 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Mon, 8 Nov 2021 15:09:29 -0500 Subject: [PATCH] Convert FeatureFlags to interface. Rename FeatureFlagManager version to FeatureFlagsDebug and FeatureFlagsRelease, implementing the FeatureFlags interface. Bug: 203548827 Test: manual Change-Id: I4b78757a5e7ee3d5ee06f9124e2b8f670e611d4f --- .../com/android/systemui/flags/FlagsModule.kt | 17 +++-- .../com/android/systemui/flags/FlagsModule.kt | 6 +- .../systemui/dagger/SystemUIModule.java | 9 --- .../android/systemui/flags/FeatureFlags.java | 64 ++++++------------- .../systemui/flags/FeatureFlagsDebug.java} | 4 +- .../systemui/flags/FeatureFlagsRelease.java} | 4 +- .../src/com/android/systemui/flags/Flags.java | 2 +- .../com/android/systemui/qs/QSTileHost.java | 16 +++-- .../qs/customize/TileQueryHelper.java | 8 ++- .../connectivity/MobileSignalController.java | 5 +- .../connectivity/NetworkControllerImpl.java | 14 ++-- .../connectivity/StatusBarFlags.java | 42 ++++++++++++ .../connectivity/WifiSignalController.java | 5 +- ...Test.java => FeatureFlagsReleaseTest.java} | 22 +++---- .../android/systemui/qs/QSFragmentTest.java | 5 +- .../android/systemui/qs/QSTileHostTest.java | 32 ++++++---- .../qs/customize/TileQueryHelperTest.java | 7 +- .../qs/external/TileServicesTest.java | 6 +- .../NetworkControllerBaseTest.java | 10 +-- .../NetworkControllerDataTest.java | 3 +- .../NetworkControllerSignalTest.java | 6 +- 21 files changed, 165 insertions(+), 122 deletions(-) rename packages/SystemUI/{src-debug/com/android/systemui/flags/FeatureFlagManager.java => src/com/android/systemui/flags/FeatureFlagsDebug.java} (98%) rename packages/SystemUI/{src-release/com/android/systemui/flags/FeatureFlagManager.java => src/com/android/systemui/flags/FeatureFlagsRelease.java} (94%) create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/connectivity/StatusBarFlags.java rename packages/SystemUI/tests/src/com/android/systemui/flags/{FeatureFlagManagerTest.java => FeatureFlagsReleaseTest.java} (79%) diff --git a/packages/SystemUI/src-debug/com/android/systemui/flags/FlagsModule.kt b/packages/SystemUI/src-debug/com/android/systemui/flags/FlagsModule.kt index bee4d7d3b411b..10ceee90a173a 100644 --- a/packages/SystemUI/src-debug/com/android/systemui/flags/FlagsModule.kt +++ b/packages/SystemUI/src-debug/com/android/systemui/flags/FlagsModule.kt @@ -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) + } } } \ No newline at end of file diff --git a/packages/SystemUI/src-release/com/android/systemui/flags/FlagsModule.kt b/packages/SystemUI/src-release/com/android/systemui/flags/FlagsModule.kt index 7647135bd7fdc..ab9e01eebaf78 100644 --- a/packages/SystemUI/src-release/com/android/systemui/flags/FlagsModule.kt +++ b/packages/SystemUI/src-release/com/android/systemui/flags/FlagsModule.kt @@ -16,7 +16,11 @@ package com.android.systemui.flags +import dagger.Binds import dagger.Module @Module -object FlagsModule \ No newline at end of file +abstract class FlagsModule { + @Binds + abstract fun bindsFeatureFlagRelease(impl: FeatureFlagsRelease): FeatureFlags +} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index 383c442ad1380..b7ab4faaade90 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -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(); diff --git a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java index f8bdaf60a1032..87a1e85b4cbe9 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java +++ b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java @@ -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); } } diff --git a/packages/SystemUI/src-debug/com/android/systemui/flags/FeatureFlagManager.java b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java similarity index 98% rename from packages/SystemUI/src-debug/com/android/systemui/flags/FeatureFlagManager.java rename to packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java index acfa3c84a4baf..05a3198d74d9e 100644 --- a/packages/SystemUI/src-debug/com/android/systemui/flags/FeatureFlagManager.java +++ b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java @@ -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 mBooleanFlagCache = new HashMap<>(); @Inject - public FeatureFlagManager( + public FeatureFlagsDebug( FlagManager flagManager, Context context, SecureSettings secureSettings, diff --git a/packages/SystemUI/src-release/com/android/systemui/flags/FeatureFlagManager.java b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsRelease.java similarity index 94% rename from packages/SystemUI/src-release/com/android/systemui/flags/FeatureFlagManager.java rename to packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsRelease.java index 0934b32a71e43..a726b867c8ee6 100644 --- a/packages/SystemUI/src-release/com/android/systemui/flags/FeatureFlagManager.java +++ b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsRelease.java @@ -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); } diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.java b/packages/SystemUI/src/com/android/systemui/flags/Flags.java index c60e09889b15d..a1413f9e1b744 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.java +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.java @@ -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); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java index af191a10a9e43..c648e9b092d2f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java @@ -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, 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, 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, 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, D if (newValue == null && UserManager.isDeviceInDemoMode(mContext)) { newValue = mContext.getResources().getString(R.string.quick_settings_tiles_retail_mode); } - final List tileSpecs = loadTileSpecs(mContext, newValue, mFeatureFlags); + final List 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, 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, D private void changeTileSpecs(Predicate> changeFunction) { final String setting = mSecureSettings.getStringForUser(TILES_SETTING, mCurrentUser); - final List tileSpecs = loadTileSpecs(mContext, setting, mFeatureFlags); + final List tileSpecs = loadTileSpecs(mContext, setting, mStatusBarFlags); if (changeFunction.test(tileSpecs)) { saveTilesToSettings(tileSpecs); } @@ -503,7 +507,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener, D } protected static List 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, 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 diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java index eef3b4586443c..6b042d9d3260b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java @@ -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 tilesToAdd = new ArrayList<>(); - if (mFeatureFlags.isProviderModelSettingEnabled(mContext)) { + if (mStatusBarFlags.isProviderModelSettingEnabled()) { possibleTiles.remove("cell"); possibleTiles.remove("wifi"); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java index 82e1cf877afe9..01c0cc81ead2e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java @@ -192,7 +192,8 @@ public class MobileSignalController extends SignalController 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; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/StatusBarFlags.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/StatusBarFlags.java new file mode 100644 index 0000000000000..0bb846e6855aa --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/StatusBarFlags.java @@ -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); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java index b5d36373fcf74..f8f7b7f8f83a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java @@ -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 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 new WifiTrafficStateCallback()); } mCurrentState.iconGroup = mLastState.iconGroup = mUnmergedWifiIconGroup; - mProviderModelSetting = featureFlags.isProviderModelSettingEnabled(mContext); + mProviderModelSetting = statusBarFlags.isProviderModelSettingEnabled(); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsReleaseTest.java similarity index 79% rename from packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagManagerTest.java rename to packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsReleaseTest.java index 634763866d028..e3cd324df58c1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsReleaseTest.java @@ -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; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java index 047ff0377c227..c1562c1e72668 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java @@ -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); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java index ce369359031d3..913b1d74b76af 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java @@ -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 tiles = QSTileHost.loadTileSpecs(mContext, "", mFeatureFlags); + List tiles = QSTileHost.loadTileSpecs(mContext, "", mStatusBarFlags); assertFalse(tiles.isEmpty()); } @Test public void testLoadTileSpecs_nullSetting() { - List tiles = QSTileHost.loadTileSpecs(mContext, null, mFeatureFlags); + List 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 specs = QSTileHost.loadTileSpecs(mContext, "spec1,spec1,spec2", mFeatureFlags); + List 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 specs = QSTileHost.loadTileSpecs(mContext, "default", mFeatureFlags); + List 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 specs = QSTileHost.loadTileSpecs(mContext, "default,spec1", mFeatureFlags); + List 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 diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java index 05db1eb0ed2bf..b8cd535ff373f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java @@ -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> 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); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java index e756b7d0918c6..29b3b86018bbc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java @@ -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); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java index 344d6f469a17c..ce82fadc003ef 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java @@ -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(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java index 12f8282c7aa0b..0ed4243ef9de1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java @@ -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(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java index 73eddd166f882..64da14179f7e7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java @@ -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.