1 /* 2 * Copyright (C) 2020 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 package com.android.settingslib.mobile; 17 18 import android.annotation.SuppressLint; 19 import android.content.Context; 20 import android.content.res.Resources; 21 import android.content.res.TypedArray; 22 import android.os.PersistableBundle; 23 import android.telephony.Annotation; 24 import android.telephony.CarrierConfigManager; 25 import android.telephony.SubscriptionInfo; 26 import android.telephony.SubscriptionManager; 27 import android.telephony.TelephonyDisplayInfo; 28 import android.telephony.TelephonyManager; 29 30 import com.android.settingslib.R; 31 import com.android.settingslib.SignalIcon.MobileIconGroup; 32 33 import java.util.HashMap; 34 import java.util.Map; 35 36 /** 37 * Holds the utility functions to create the RAT to MobileIconGroup mappings. 38 */ 39 public class MobileMappings { 40 41 /** 42 * Generates the RAT key from the TelephonyDisplayInfo. 43 */ getIconKey(TelephonyDisplayInfo telephonyDisplayInfo)44 public static String getIconKey(TelephonyDisplayInfo telephonyDisplayInfo) { 45 if (telephonyDisplayInfo.getOverrideNetworkType() 46 == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE) { 47 return toIconKey(telephonyDisplayInfo.getNetworkType()); 48 } else { 49 return toDisplayIconKey(telephonyDisplayInfo.getOverrideNetworkType()); 50 } 51 } 52 53 /** 54 * Converts the networkType into the RAT key. 55 */ toIconKey(@nnotation.NetworkType int networkType)56 public static String toIconKey(@Annotation.NetworkType int networkType) { 57 return Integer.toString(networkType); 58 } 59 60 /** 61 * Converts the displayNetworkType into the RAT key. 62 */ toDisplayIconKey(@nnotation.OverrideNetworkType int displayNetworkType)63 public static String toDisplayIconKey(@Annotation.OverrideNetworkType int displayNetworkType) { 64 switch (displayNetworkType) { 65 case TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA: 66 return toIconKey(TelephonyManager.NETWORK_TYPE_LTE) + "_CA"; 67 case TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO: 68 return toIconKey(TelephonyManager.NETWORK_TYPE_LTE) + "_CA_Plus"; 69 case TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA: 70 return toIconKey(TelephonyManager.NETWORK_TYPE_NR); 71 case TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED: 72 return toIconKey(TelephonyManager.NETWORK_TYPE_NR) + "_Plus"; 73 default: 74 return "unsupported"; 75 } 76 } 77 78 /** 79 * Produce the default MobileIconGroup. 80 */ getDefaultIcons(Config config)81 public static MobileIconGroup getDefaultIcons(Config config) { 82 if (!config.showAtLeast3G) { 83 return TelephonyIcons.G; 84 } else { 85 return TelephonyIcons.THREE_G; 86 } 87 } 88 89 /** 90 * Produce a mapping of data network types to icon groups for simple and quick use in 91 * updateTelephony. 92 */ mapIconSets(Config config)93 public static Map<String, MobileIconGroup> mapIconSets(Config config) { 94 final Map<String, MobileIconGroup> networkToIconLookup = new HashMap<>(); 95 96 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_EVDO_0), 97 TelephonyIcons.THREE_G); 98 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_EVDO_A), 99 TelephonyIcons.THREE_G); 100 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_EVDO_B), 101 TelephonyIcons.THREE_G); 102 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_EHRPD), 103 TelephonyIcons.THREE_G); 104 if (config.show4gFor3g) { 105 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_UMTS), 106 TelephonyIcons.FOUR_G); 107 } else { 108 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_UMTS), 109 TelephonyIcons.THREE_G); 110 } 111 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_TD_SCDMA), 112 TelephonyIcons.THREE_G); 113 114 if (!config.showAtLeast3G) { 115 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_UNKNOWN), 116 TelephonyIcons.UNKNOWN); 117 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_EDGE), 118 TelephonyIcons.E); 119 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_GPRS), 120 TelephonyIcons.G); 121 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_CDMA), 122 TelephonyIcons.ONE_X); 123 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_1xRTT), 124 TelephonyIcons.ONE_X); 125 } else { 126 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_UNKNOWN), 127 TelephonyIcons.THREE_G); 128 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_EDGE), 129 TelephonyIcons.THREE_G); 130 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_GPRS), 131 TelephonyIcons.THREE_G); 132 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_CDMA), 133 TelephonyIcons.THREE_G); 134 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_1xRTT), 135 TelephonyIcons.THREE_G); 136 } 137 138 MobileIconGroup hGroup = TelephonyIcons.THREE_G; 139 MobileIconGroup hPlusGroup = TelephonyIcons.THREE_G; 140 if (config.show4gFor3g) { 141 hGroup = TelephonyIcons.FOUR_G; 142 hPlusGroup = TelephonyIcons.FOUR_G; 143 } else if (config.hspaDataDistinguishable) { 144 hGroup = TelephonyIcons.H; 145 hPlusGroup = TelephonyIcons.H_PLUS; 146 } 147 148 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_HSDPA), hGroup); 149 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_HSUPA), hGroup); 150 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_HSPA), hGroup); 151 networkToIconLookup.put(toIconKey(TelephonyManager.NETWORK_TYPE_HSPAP), hPlusGroup); 152 153 if (config.show4gForLte) { 154 networkToIconLookup.put(toIconKey( 155 TelephonyManager.NETWORK_TYPE_LTE), 156 TelephonyIcons.FOUR_G); 157 if (config.hideLtePlus) { 158 networkToIconLookup.put(toDisplayIconKey( 159 TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA), 160 TelephonyIcons.FOUR_G); 161 } else { 162 networkToIconLookup.put(toDisplayIconKey( 163 TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA), 164 TelephonyIcons.FOUR_G_PLUS); 165 } 166 } else if (config.show4glteForLte) { 167 networkToIconLookup.put(toIconKey( 168 TelephonyManager.NETWORK_TYPE_LTE), 169 TelephonyIcons.FOUR_G_LTE); 170 if (config.hideLtePlus) { 171 networkToIconLookup.put(toDisplayIconKey( 172 TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA), 173 TelephonyIcons.FOUR_G_LTE); 174 } else { 175 networkToIconLookup.put(toDisplayIconKey( 176 TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA), 177 TelephonyIcons.FOUR_G_LTE_PLUS); 178 } 179 } else { 180 networkToIconLookup.put(toIconKey( 181 TelephonyManager.NETWORK_TYPE_LTE), 182 TelephonyIcons.LTE); 183 if (config.hideLtePlus) { 184 networkToIconLookup.put(toDisplayIconKey( 185 TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA), 186 TelephonyIcons.LTE); 187 } else { 188 networkToIconLookup.put(toDisplayIconKey( 189 TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA), 190 TelephonyIcons.LTE_PLUS); 191 } 192 } 193 networkToIconLookup.put(toIconKey( 194 TelephonyManager.NETWORK_TYPE_IWLAN), 195 TelephonyIcons.WFC); 196 networkToIconLookup.put(toDisplayIconKey( 197 TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO), 198 TelephonyIcons.LTE_CA_5G_E); 199 networkToIconLookup.put(toDisplayIconKey( 200 TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA), 201 TelephonyIcons.NR_5G); 202 networkToIconLookup.put( 203 toDisplayIconKey(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED), 204 config.mobileIconGroup5gPlus); 205 networkToIconLookup.put(toIconKey( 206 TelephonyManager.NETWORK_TYPE_NR), 207 TelephonyIcons.NR_5G); 208 return networkToIconLookup; 209 } 210 211 /** 212 * Wrapper class of system configs and Carrier configs. 213 */ 214 public static class Config { 215 public boolean showAtLeast3G = false; 216 public boolean show4gFor3g = false; 217 public boolean alwaysShowCdmaRssi = false; 218 public boolean show4gForLte = false; 219 public boolean show4glteForLte = false; 220 public boolean hideLtePlus = false; 221 public boolean hspaDataDistinguishable; 222 public boolean alwaysShowDataRatIcon = false; 223 public MobileIconGroup mobileIconGroup5gPlus = TelephonyIcons.NR_5G_PLUS; 224 225 /** 226 * Reads the latest configs. 227 */ readConfig(Context context)228 public static Config readConfig(Context context) { 229 Config config = new Config(); 230 Resources res = context.getResources(); 231 232 config.showAtLeast3G = res.getBoolean(R.bool.config_showMin3G); 233 config.alwaysShowCdmaRssi = 234 res.getBoolean(com.android.internal.R.bool.config_alwaysUseCdmaRssi); 235 config.hspaDataDistinguishable = 236 res.getBoolean(R.bool.config_hspa_data_distinguishable); 237 238 CarrierConfigManager configMgr = (CarrierConfigManager) 239 context.getSystemService(Context.CARRIER_CONFIG_SERVICE); 240 // Handle specific carrier config values for the default data SIM 241 int defaultDataSubId = SubscriptionManager.from(context) 242 .getDefaultDataSubscriptionId(); 243 PersistableBundle b = configMgr == null ? null 244 : configMgr.getConfigForSubId(defaultDataSubId); 245 if (b != null) { 246 config.alwaysShowDataRatIcon = b.getBoolean( 247 CarrierConfigManager.KEY_ALWAYS_SHOW_DATA_RAT_ICON_BOOL); 248 config.show4gForLte = b.getBoolean( 249 CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL); 250 config.show4glteForLte = b.getBoolean( 251 CarrierConfigManager.KEY_SHOW_4GLTE_FOR_LTE_DATA_ICON_BOOL); 252 config.show4gFor3g = b.getBoolean( 253 CarrierConfigManager.KEY_SHOW_4G_FOR_3G_DATA_ICON_BOOL); 254 config.hideLtePlus = b.getBoolean( 255 CarrierConfigManager.KEY_HIDE_LTE_PLUS_DATA_ICON_BOOL); 256 } 257 258 SubscriptionManager subscriptionManager = 259 context.getSystemService(SubscriptionManager.class); 260 if (subscriptionManager != null) { 261 SubscriptionInfo subInfo = subscriptionManager.getDefaultDataSubscriptionInfo(); 262 if (subInfo != null) { 263 readMobileIconGroup5gPlus(subInfo.getCarrierId(), res, config); 264 } 265 } 266 return config; 267 } 268 269 @SuppressLint("ResourceType") readMobileIconGroup5gPlus(int carrierId, Resources res, Config config)270 private static void readMobileIconGroup5gPlus(int carrierId, Resources res, Config config) { 271 int networkTypeResId = 0; 272 TypedArray groupArray; 273 try { 274 groupArray = res.obtainTypedArray(R.array.config_override_carrier_5g_plus); 275 } catch (Resources.NotFoundException e) { 276 return; 277 } 278 for (int i = 0; i < groupArray.length() && networkTypeResId == 0; i++) { 279 int groupId = groupArray.getResourceId(i, 0); 280 if (groupId == 0) { 281 continue; 282 } 283 TypedArray carrierArray; 284 try { 285 carrierArray = res.obtainTypedArray(groupId); 286 } catch (Resources.NotFoundException e) { 287 continue; 288 } 289 int groupCarrierId = carrierArray.getInt(0, 0); 290 if (groupCarrierId == carrierId) { 291 networkTypeResId = carrierArray.getResourceId(1, 0); 292 } 293 carrierArray.recycle(); 294 } 295 groupArray.recycle(); 296 297 if (networkTypeResId != 0) { 298 config.mobileIconGroup5gPlus = new MobileIconGroup( 299 TelephonyIcons.NR_5G_PLUS.name, 300 networkTypeResId, 301 TelephonyIcons.NR_5G_PLUS.dataType); 302 } 303 } 304 305 /** 306 * Returns true if this config and the other config are semantically equal. 307 * 308 * Does not override isEquals because existing clients may be relying on the currently 309 * defined equals behavior. 310 */ areEqual(Config other)311 public boolean areEqual(Config other) { 312 return showAtLeast3G == other.showAtLeast3G 313 && show4gFor3g == other.show4gFor3g 314 && alwaysShowCdmaRssi == other.alwaysShowCdmaRssi 315 && show4gForLte == other.show4gForLte 316 && show4glteForLte == other.show4glteForLte 317 && hideLtePlus == other.hideLtePlus 318 && hspaDataDistinguishable == other.hspaDataDistinguishable 319 && alwaysShowDataRatIcon == other.alwaysShowDataRatIcon; 320 } 321 } 322 } 323