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