1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.systemui.flags; 18 19 import android.content.Context; 20 import android.util.FeatureFlagUtils; 21 import android.util.Log; 22 import android.widget.Toast; 23 24 import com.android.systemui.dagger.SysUISingleton; 25 26 import javax.inject.Inject; 27 28 /** 29 * Class to manage simple DeviceConfig-based feature flags. 30 * 31 * See {@link Flags} for instructions on defining new flags. 32 */ 33 @SysUISingleton 34 public class FeatureFlags { 35 private final FlagReader mFlagReader; 36 private final Context mContext; 37 38 @Inject FeatureFlags(FlagReader flagReader, Context context)39 public FeatureFlags(FlagReader flagReader, Context context) { 40 mFlagReader = flagReader; 41 mContext = context; 42 } 43 44 /** 45 * @param flag The {@link BooleanFlag} of interest. 46 * @return The value of the flag. 47 */ isEnabled(BooleanFlag flag)48 public boolean isEnabled(BooleanFlag flag) { 49 return mFlagReader.isEnabled(flag); 50 } 51 assertLegacyPipelineEnabled()52 public void assertLegacyPipelineEnabled() { 53 if (isNewNotifPipelineRenderingEnabled()) { 54 throw new IllegalStateException("Old pipeline code running w/ new pipeline enabled"); 55 } 56 } 57 checkLegacyPipelineEnabled()58 public boolean checkLegacyPipelineEnabled() { 59 if (!isNewNotifPipelineRenderingEnabled()) { 60 return true; 61 } 62 Log.d("NotifPipeline", "Old pipeline code running w/ new pipeline enabled", 63 new Exception()); 64 Toast.makeText(mContext, "Old pipeline code running!", Toast.LENGTH_SHORT).show(); 65 return false; 66 } 67 isNewNotifPipelineEnabled()68 public boolean isNewNotifPipelineEnabled() { 69 return isEnabled(Flags.NEW_NOTIFICATION_PIPELINE); 70 } 71 isNewNotifPipelineRenderingEnabled()72 public boolean isNewNotifPipelineRenderingEnabled() { 73 return isEnabled(Flags.NEW_NOTIFICATION_PIPELINE_RENDERING); 74 } 75 76 /** */ useNewLockscreenAnimations()77 public boolean useNewLockscreenAnimations() { 78 return isEnabled(Flags.LOCKSCREEN_ANIMATIONS); 79 } 80 isPeopleTileEnabled()81 public boolean isPeopleTileEnabled() { 82 return isEnabled(Flags.PEOPLE_TILE); 83 } 84 isMonetEnabled()85 public boolean isMonetEnabled() { 86 return isEnabled(Flags.MONET); 87 } 88 isPMLiteEnabled()89 public boolean isPMLiteEnabled() { 90 return isEnabled(Flags.POWER_MENU_LITE); 91 } 92 isChargingRippleEnabled()93 public boolean isChargingRippleEnabled() { 94 return isEnabled(Flags.CHARGING_RIPPLE); 95 } 96 isOngoingCallStatusBarChipEnabled()97 public boolean isOngoingCallStatusBarChipEnabled() { 98 return isEnabled(Flags.ONGOING_CALL_STATUS_BAR_CHIP); 99 } 100 isOngoingCallInImmersiveEnabled()101 public boolean isOngoingCallInImmersiveEnabled() { 102 return isOngoingCallStatusBarChipEnabled() && isEnabled(Flags.ONGOING_CALL_IN_IMMERSIVE); 103 } 104 isOngoingCallInImmersiveChipTapEnabled()105 public boolean isOngoingCallInImmersiveChipTapEnabled() { 106 return isOngoingCallInImmersiveEnabled() 107 && isEnabled(Flags.ONGOING_CALL_IN_IMMERSIVE_CHIP_TAP); 108 } 109 isSmartspaceEnabled()110 public boolean isSmartspaceEnabled() { 111 return isEnabled(Flags.SMARTSPACE); 112 } 113 isSmartspaceDedupingEnabled()114 public boolean isSmartspaceDedupingEnabled() { 115 return isSmartspaceEnabled() && isEnabled(Flags.SMARTSPACE_DEDUPING); 116 } 117 isNewKeyguardSwipeAnimationEnabled()118 public boolean isNewKeyguardSwipeAnimationEnabled() { 119 return isEnabled(Flags.NEW_UNLOCK_SWIPE_ANIMATION); 120 } 121 isSmartSpaceSharedElementTransitionEnabled()122 public boolean isSmartSpaceSharedElementTransitionEnabled() { 123 return isEnabled(Flags.SMARTSPACE_SHARED_ELEMENT_TRANSITION_ENABLED); 124 } 125 126 /** Whether or not to use the provider model behavior for the status bar icons */ isCombinedStatusBarSignalIconsEnabled()127 public boolean isCombinedStatusBarSignalIconsEnabled() { 128 return isEnabled(Flags.COMBINED_STATUS_BAR_SIGNAL_ICONS); 129 } 130 131 /** System setting for provider model behavior */ isProviderModelSettingEnabled()132 public boolean isProviderModelSettingEnabled() { 133 return FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL); 134 } 135 136 /** 137 * Use the new version of the user switcher 138 */ useNewUserSwitcher()139 public boolean useNewUserSwitcher() { 140 return isEnabled(Flags.NEW_USER_SWITCHER); 141 } 142 143 /** 144 * Use the new single view QS headers 145 */ useCombinedQSHeaders()146 public boolean useCombinedQSHeaders() { 147 return isEnabled(Flags.COMBINED_QS_HEADERS); 148 } 149 150 /** static method for the system setting */ isProviderModelSettingEnabled(Context context)151 public static boolean isProviderModelSettingEnabled(Context context) { 152 return FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL); 153 } 154 } 155