• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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