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