• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.util;
18 
19 import android.content.BroadcastReceiver;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.content.IntentFilter;
23 import android.os.PersistableBundle;
24 import android.telephony.CarrierConfigManager;
25 import android.telephony.SubscriptionManager;
26 import android.util.ArraySet;
27 import android.util.SparseBooleanArray;
28 
29 import androidx.annotation.NonNull;
30 import androidx.annotation.Nullable;
31 
32 import com.android.internal.telephony.TelephonyIntents;
33 import com.android.systemui.broadcast.BroadcastDispatcher;
34 import com.android.systemui.dagger.SysUISingleton;
35 import com.android.systemui.statusbar.policy.CallbackController;
36 
37 import java.util.Set;
38 
39 import javax.inject.Inject;
40 
41 /**
42  * Tracks CarrierConfigs for each subId, as well as the default configuration. CarrierConfigurations
43  * do not trigger a device configuration event, so any UI that relies on carrier configurations must
44  * register with the tracker to get proper updates.
45  *
46  * The tracker also listens for `TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED`
47  *
48  * @see CarrierConfigChangedListener to listen for updates
49  */
50 @SysUISingleton
51 public class CarrierConfigTracker
52         extends BroadcastReceiver
53         implements CallbackController<CarrierConfigTracker.CarrierConfigChangedListener> {
54     private final SparseBooleanArray mCallStrengthConfigs = new SparseBooleanArray();
55     private final SparseBooleanArray mNoCallingConfigs = new SparseBooleanArray();
56     private final SparseBooleanArray mCarrierProvisionsWifiMergedNetworks =
57             new SparseBooleanArray();
58     private final SparseBooleanArray mShowOperatorNameConfigs = new SparseBooleanArray();
59     private final CarrierConfigManager mCarrierConfigManager;
60     private final Set<CarrierConfigChangedListener> mListeners = new ArraySet<>();
61     private final Set<DefaultDataSubscriptionChangedListener> mDataListeners =
62             new ArraySet<>();
63     private boolean mDefaultCarrierProvisionsWifiMergedNetworksLoaded;
64     private boolean mDefaultCarrierProvisionsWifiMergedNetworks;
65     private boolean mDefaultShowOperatorNameConfigLoaded;
66     private boolean mDefaultShowOperatorNameConfig;
67     private boolean mDefaultAlwaysShowPrimarySignalBarInOpportunisticNetworkConfigLoaded;
68     private boolean mDefaultAlwaysShowPrimarySignalBarInOpportunisticNetworkConfig;
69 
70     @Inject
CarrierConfigTracker( @ullable CarrierConfigManager carrierConfigManager, BroadcastDispatcher broadcastDispatcher)71     public CarrierConfigTracker(
72             @Nullable CarrierConfigManager carrierConfigManager,
73             BroadcastDispatcher broadcastDispatcher) {
74         mCarrierConfigManager = carrierConfigManager;
75         IntentFilter filter = new IntentFilter();
76         filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
77         filter.addAction(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED);
78         broadcastDispatcher.registerReceiver(this, filter);
79     }
80 
81     @Override
onReceive(Context context, Intent intent)82     public void onReceive(Context context, Intent intent) {
83         String action = intent.getAction();
84         if (CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED.equals(action)) {
85             updateFromNewCarrierConfig(intent);
86         } else if (TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED.equals(action)) {
87             updateDefaultDataSubscription(intent);
88         }
89     }
90 
updateFromNewCarrierConfig(Intent intent)91     private void updateFromNewCarrierConfig(Intent intent) {
92         final int subId = intent.getIntExtra(
93                 CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX,
94                 SubscriptionManager.INVALID_SUBSCRIPTION_ID);
95         if (mCarrierConfigManager == null) {
96             return;
97         }
98         if (!SubscriptionManager.isValidSubscriptionId(subId)) {
99             return;
100         }
101 
102         final PersistableBundle config = mCarrierConfigManager.getConfigForSubId(subId);
103         if (config == null) {
104             return;
105         }
106 
107         synchronized (mCallStrengthConfigs) {
108             mCallStrengthConfigs.put(subId, config.getBoolean(
109                     CarrierConfigManager.KEY_DISPLAY_CALL_STRENGTH_INDICATOR_BOOL));
110         }
111         synchronized (mNoCallingConfigs) {
112             mNoCallingConfigs.put(subId, config.getBoolean(
113                     CarrierConfigManager.KEY_USE_IP_FOR_CALLING_INDICATOR_BOOL));
114         }
115         synchronized (mCarrierProvisionsWifiMergedNetworks) {
116             mCarrierProvisionsWifiMergedNetworks.put(subId, config.getBoolean(
117                     CarrierConfigManager.KEY_CARRIER_PROVISIONS_WIFI_MERGED_NETWORKS_BOOL));
118         }
119         synchronized (mShowOperatorNameConfigs) {
120             mShowOperatorNameConfigs.put(subId, config.getBoolean(
121                     CarrierConfigManager.KEY_SHOW_OPERATOR_NAME_IN_STATUSBAR_BOOL));
122         }
123 
124         notifyCarrierConfigChanged();
125     }
126 
updateDefaultDataSubscription(Intent intent)127     private void updateDefaultDataSubscription(Intent intent) {
128         int subId = intent.getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, -1);
129         notifyDefaultDataSubscriptionChanged(subId);
130     }
131 
notifyCarrierConfigChanged()132     private void notifyCarrierConfigChanged() {
133         for (CarrierConfigChangedListener l : mListeners) {
134             l.onCarrierConfigChanged();
135         }
136     }
137 
notifyDefaultDataSubscriptionChanged(int subId)138     private void notifyDefaultDataSubscriptionChanged(int subId) {
139         for (DefaultDataSubscriptionChangedListener l : mDataListeners) {
140             l.onDefaultSubscriptionChanged(subId);
141         }
142     }
143 
144     /**
145      * Returns the KEY_CARRIER_PROVISIONS_WIFI_MERGED_NETWORKS_BOOL value for the given subId.
146      */
getCarrierProvisionsWifiMergedNetworksBool(int subId)147     public boolean getCarrierProvisionsWifiMergedNetworksBool(int subId) {
148         synchronized (mCarrierProvisionsWifiMergedNetworks) {
149             if (mCarrierProvisionsWifiMergedNetworks.indexOfKey(subId) >= 0) {
150                 return mCarrierProvisionsWifiMergedNetworks.get(subId);
151             }
152         }
153         if (!mDefaultCarrierProvisionsWifiMergedNetworksLoaded) {
154             mDefaultCarrierProvisionsWifiMergedNetworks =
155                     CarrierConfigManager.getDefaultConfig().getBoolean(
156                             CarrierConfigManager.KEY_CARRIER_PROVISIONS_WIFI_MERGED_NETWORKS_BOOL);
157             mDefaultCarrierProvisionsWifiMergedNetworksLoaded = true;
158         }
159         return mDefaultCarrierProvisionsWifiMergedNetworks;
160     }
161 
162     /**
163      * Returns the KEY_SHOW_OPERATOR_NAME_IN_STATUSBAR_BOOL value for the default config
164      */
getShowOperatorNameInStatusBarConfigDefault()165     public boolean getShowOperatorNameInStatusBarConfigDefault() {
166         if (!mDefaultShowOperatorNameConfigLoaded) {
167             mDefaultShowOperatorNameConfig = CarrierConfigManager.getDefaultConfig().getBoolean(
168                     CarrierConfigManager.KEY_SHOW_OPERATOR_NAME_IN_STATUSBAR_BOOL);
169             mDefaultShowOperatorNameConfigLoaded = true;
170         }
171 
172         return mDefaultShowOperatorNameConfig;
173     }
174 
175     /**
176      * Returns KEY_ALWAYS_SHOW_PRIMARY_SIGNAL_BAR_IN_OPPORTUNISTIC_NETWORK_BOOLEAN value for
177      * the default carrier config.
178      */
getAlwaysShowPrimarySignalBarInOpportunisticNetworkDefault()179     public boolean getAlwaysShowPrimarySignalBarInOpportunisticNetworkDefault() {
180         if (!mDefaultAlwaysShowPrimarySignalBarInOpportunisticNetworkConfigLoaded) {
181             mDefaultAlwaysShowPrimarySignalBarInOpportunisticNetworkConfig = CarrierConfigManager
182                     .getDefaultConfig().getBoolean(CarrierConfigManager
183                             .KEY_ALWAYS_SHOW_PRIMARY_SIGNAL_BAR_IN_OPPORTUNISTIC_NETWORK_BOOLEAN
184                     );
185             mDefaultAlwaysShowPrimarySignalBarInOpportunisticNetworkConfigLoaded = true;
186         }
187 
188         return mDefaultAlwaysShowPrimarySignalBarInOpportunisticNetworkConfig;
189     }
190 
191     /**
192      * Returns the KEY_SHOW_OPERATOR_NAME_IN_STATUSBAR_BOOL value for the given subId, or the
193      * default value if no override exists
194      *
195      * @param subId the subscription id for which to query the config
196      */
getShowOperatorNameInStatusBarConfig(int subId)197     public boolean getShowOperatorNameInStatusBarConfig(int subId) {
198         if (mShowOperatorNameConfigs.indexOfKey(subId) >= 0) {
199             return mShowOperatorNameConfigs.get(subId);
200         } else {
201             return getShowOperatorNameInStatusBarConfigDefault();
202         }
203     }
204 
205     @Override
addCallback(@onNull CarrierConfigChangedListener listener)206     public void addCallback(@NonNull CarrierConfigChangedListener listener) {
207         mListeners.add(listener);
208     }
209 
210     @Override
removeCallback(@onNull CarrierConfigChangedListener listener)211     public void removeCallback(@NonNull CarrierConfigChangedListener listener) {
212         mListeners.remove(listener);
213     }
214 
215     /** */
addDefaultDataSubscriptionChangedListener( @onNull DefaultDataSubscriptionChangedListener listener)216     public void addDefaultDataSubscriptionChangedListener(
217             @NonNull DefaultDataSubscriptionChangedListener listener) {
218         mDataListeners.add(listener);
219     }
220 
221     /** */
removeDataSubscriptionChangedListener( DefaultDataSubscriptionChangedListener listener)222     public void removeDataSubscriptionChangedListener(
223             DefaultDataSubscriptionChangedListener listener) {
224         mDataListeners.remove(listener);
225     }
226 
227     /**
228      * Called when carrier config changes
229      */
230     public interface CarrierConfigChangedListener {
231         /** */
onCarrierConfigChanged()232         void onCarrierConfigChanged();
233     }
234 
235     /**
236      * Called when the default data subscription changes. Listeners may want to query
237      * subId-dependent configuration values when this event happens
238      */
239     public interface DefaultDataSubscriptionChangedListener {
240         /**
241          * @param subId the new default data subscription id per
242          * {@link SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX}
243          */
onDefaultSubscriptionChanged(int subId)244         void onDefaultSubscriptionChanged(int subId);
245     }
246 }
247