1 /*
2 * Copyright (C) 2014 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 android.telephony;
18 
19 import android.os.Parcel;
20 import android.os.Parcelable;
21 
22 import com.android.internal.telephony.RILConstants;
23 
24 /**
25  * Object to indicate the phone radio type and access technology.
26  *
27  * @hide
28  */
29 public class RadioAccessFamily implements Parcelable {
30 
31     // Radio Access Family
32     public static final int RAF_UNKNOWN = (1 <<  ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN);
33     public static final int RAF_GPRS = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GPRS);
34     public static final int RAF_EDGE = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EDGE);
35     public static final int RAF_UMTS = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_UMTS);
36     public static final int RAF_IS95A = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IS95A);
37     public static final int RAF_IS95B = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IS95B);
38     public static final int RAF_1xRTT = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT);
39     public static final int RAF_EVDO_0 = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0);
40     public static final int RAF_EVDO_A = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A);
41     public static final int RAF_HSDPA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA);
42     public static final int RAF_HSUPA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA);
43     public static final int RAF_HSPA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPA);
44     public static final int RAF_EVDO_B = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B);
45     public static final int RAF_EHRPD = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD);
46     public static final int RAF_LTE = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_LTE);
47     public static final int RAF_HSPAP = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP);
48     public static final int RAF_GSM = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GSM);
49     public static final int RAF_TD_SCDMA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA);
50 
51     // Grouping of RAFs
52     private static final int GSM = RAF_GSM | RAF_GPRS | RAF_EDGE;
53     private static final int HS = RAF_HSUPA | RAF_HSDPA | RAF_HSPA | RAF_HSPAP;
54     private static final int CDMA = RAF_IS95A | RAF_IS95B | RAF_1xRTT;
55     private static final int EVDO = RAF_EVDO_0 | RAF_EVDO_A | RAF_EVDO_B | RAF_EHRPD;
56     private static final int WCDMA = HS | RAF_UMTS;
57 
58     /* Phone ID of phone */
59     private int mPhoneId;
60 
61     /* Radio Access Family */
62     private int mRadioAccessFamily;
63 
64     /**
65      * Constructor.
66      *
67      * @param phoneId the phone ID
68      * @param radioAccessFamily the phone radio access family defined
69      *        in RadioAccessFamily. It's a bit mask value to represent
70      *        the support type.
71      */
RadioAccessFamily(int phoneId, int radioAccessFamily)72     public RadioAccessFamily(int phoneId, int radioAccessFamily) {
73         mPhoneId = phoneId;
74         mRadioAccessFamily = radioAccessFamily;
75     }
76 
77     /**
78      * Get phone ID.
79      *
80      * @return phone ID
81      */
getPhoneId()82     public int getPhoneId() {
83         return mPhoneId;
84     }
85 
86     /**
87      * get radio access family.
88      *
89      * @return radio access family
90      */
getRadioAccessFamily()91     public int getRadioAccessFamily() {
92         return mRadioAccessFamily;
93     }
94 
95     @Override
toString()96     public String toString() {
97         String ret = "{ mPhoneId = " + mPhoneId
98                 + ", mRadioAccessFamily = " + mRadioAccessFamily
99                 + "}";
100         return ret;
101     }
102 
103     /**
104      * Implement the Parcelable interface.
105      *
106      * @return describe content
107      */
108     @Override
describeContents()109     public int describeContents() {
110         return 0;
111     }
112 
113     /**
114      * Implement the Parcelable interface.
115      *
116      * @param outParcel The Parcel in which the object should be written.
117      * @param flags Additional flags about how the object should be written.
118      */
119     @Override
writeToParcel(Parcel outParcel, int flags)120     public void writeToParcel(Parcel outParcel, int flags) {
121         outParcel.writeInt(mPhoneId);
122         outParcel.writeInt(mRadioAccessFamily);
123     }
124 
125     /**
126      * Implement the Parcelable interface.
127      */
128     public static final Creator<RadioAccessFamily> CREATOR =
129             new Creator<RadioAccessFamily>() {
130 
131         @Override
132         public RadioAccessFamily createFromParcel(Parcel in) {
133             int phoneId = in.readInt();
134             int radioAccessFamily = in.readInt();
135 
136             return new RadioAccessFamily(phoneId, radioAccessFamily);
137         }
138 
139         @Override
140         public RadioAccessFamily[] newArray(int size) {
141             return new RadioAccessFamily[size];
142         }
143     };
144 
getRafFromNetworkType(int type)145     public static int getRafFromNetworkType(int type) {
146         int raf;
147 
148         switch (type) {
149             case RILConstants.NETWORK_MODE_WCDMA_PREF:
150                 raf = GSM | WCDMA;
151                 break;
152             case RILConstants.NETWORK_MODE_GSM_ONLY:
153                 raf = GSM;
154                 break;
155             case RILConstants.NETWORK_MODE_WCDMA_ONLY:
156                 raf = WCDMA;
157                 break;
158             case RILConstants.NETWORK_MODE_GSM_UMTS:
159                 raf = GSM | WCDMA;
160                 break;
161             case RILConstants.NETWORK_MODE_CDMA:
162                 raf = CDMA | EVDO;
163                 break;
164             case RILConstants.NETWORK_MODE_LTE_CDMA_EVDO:
165                 raf = RAF_LTE | CDMA | EVDO;
166                 break;
167             case RILConstants.NETWORK_MODE_LTE_GSM_WCDMA:
168                 raf = RAF_LTE | GSM | WCDMA;
169                 break;
170             case RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA:
171                 raf = RAF_LTE | CDMA | EVDO | GSM | WCDMA;
172                 break;
173             case RILConstants.NETWORK_MODE_LTE_ONLY:
174                 raf = RAF_LTE;
175                 break;
176             case RILConstants.NETWORK_MODE_LTE_WCDMA:
177                 raf = RAF_LTE | WCDMA;
178                 break;
179             case RILConstants.NETWORK_MODE_CDMA_NO_EVDO:
180                 raf = CDMA;
181                 break;
182             case RILConstants.NETWORK_MODE_EVDO_NO_CDMA:
183                 raf = EVDO;
184                 break;
185             case RILConstants.NETWORK_MODE_GLOBAL:
186                 raf = GSM | WCDMA | CDMA | EVDO;
187                 break;
188             case RILConstants.NETWORK_MODE_TDSCDMA_ONLY:
189                 raf = RAF_TD_SCDMA;
190                 break;
191             case RILConstants.NETWORK_MODE_TDSCDMA_WCDMA:
192                 raf = RAF_TD_SCDMA | WCDMA;
193                 break;
194             case RILConstants.NETWORK_MODE_LTE_TDSCDMA:
195                 raf = RAF_LTE | RAF_TD_SCDMA;
196                 break;
197             case RILConstants.NETWORK_MODE_TDSCDMA_GSM:
198                 raf = RAF_TD_SCDMA | GSM;
199                 break;
200             case RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM:
201                 raf = RAF_LTE | RAF_TD_SCDMA | GSM;
202                 break;
203             case RILConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA:
204                 raf = RAF_TD_SCDMA | GSM | WCDMA;
205                 break;
206             case RILConstants.NETWORK_MODE_LTE_TDSCDMA_WCDMA:
207                 raf = RAF_LTE | RAF_TD_SCDMA | WCDMA;
208                 break;
209             case RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA:
210                 raf = RAF_LTE | RAF_TD_SCDMA | GSM | WCDMA;
211                 break;
212             case RILConstants.NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
213                 raf = RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA;
214                 break;
215             case RILConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
216                 raf = RAF_LTE | RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA;
217                 break;
218             default:
219                 raf = RAF_UNKNOWN;
220                 break;
221         }
222 
223         return raf;
224     }
225 
226     /**
227      * if the raf includes ANY bit set for a group
228      * adjust it to contain ALL the bits for that group
229      */
getAdjustedRaf(int raf)230     private static int getAdjustedRaf(int raf) {
231         raf = ((GSM & raf) > 0) ? (GSM | raf) : raf;
232         raf = ((WCDMA & raf) > 0) ? (WCDMA | raf) : raf;
233         raf = ((CDMA & raf) > 0) ? (CDMA | raf) : raf;
234         raf = ((EVDO & raf) > 0) ? (EVDO | raf) : raf;
235 
236         return raf;
237     }
238 
getNetworkTypeFromRaf(int raf)239     public static int getNetworkTypeFromRaf(int raf) {
240         int type;
241 
242         raf = getAdjustedRaf(raf);
243 
244         switch (raf) {
245             case (GSM | WCDMA):
246                 type = RILConstants.NETWORK_MODE_WCDMA_PREF;
247                 break;
248             case GSM:
249                 type = RILConstants.NETWORK_MODE_GSM_ONLY;
250                 break;
251             case WCDMA:
252                 type = RILConstants.NETWORK_MODE_WCDMA_ONLY;
253                 break;
254             case (CDMA | EVDO):
255                 type = RILConstants.NETWORK_MODE_CDMA;
256                 break;
257             case (RAF_LTE | CDMA | EVDO):
258                 type = RILConstants.NETWORK_MODE_LTE_CDMA_EVDO;
259                 break;
260             case (RAF_LTE | GSM | WCDMA):
261                 type = RILConstants.NETWORK_MODE_LTE_GSM_WCDMA;
262                 break;
263             case (RAF_LTE | CDMA | EVDO | GSM | WCDMA):
264                 type = RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA;
265                 break;
266             case RAF_LTE:
267                 type = RILConstants.NETWORK_MODE_LTE_ONLY;
268                 break;
269             case (RAF_LTE | WCDMA):
270                 type = RILConstants.NETWORK_MODE_LTE_WCDMA;
271                 break;
272             case CDMA:
273                 type = RILConstants.NETWORK_MODE_CDMA_NO_EVDO;
274                 break;
275             case EVDO:
276                 type = RILConstants.NETWORK_MODE_EVDO_NO_CDMA;
277                 break;
278             case (GSM | WCDMA | CDMA | EVDO):
279                 type = RILConstants.NETWORK_MODE_GLOBAL;
280                 break;
281             case RAF_TD_SCDMA:
282                 type = RILConstants.NETWORK_MODE_TDSCDMA_ONLY;
283                 break;
284             case (RAF_TD_SCDMA | WCDMA):
285                 type = RILConstants.NETWORK_MODE_TDSCDMA_WCDMA;
286                 break;
287             case (RAF_LTE | RAF_TD_SCDMA):
288                 type = RILConstants.NETWORK_MODE_LTE_TDSCDMA;
289                 break;
290             case (RAF_TD_SCDMA | GSM):
291                 type = RILConstants.NETWORK_MODE_TDSCDMA_GSM;
292                 break;
293             case (RAF_LTE | RAF_TD_SCDMA | GSM):
294                 type = RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM;
295                 break;
296             case (RAF_TD_SCDMA | GSM | WCDMA):
297                 type = RILConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA;
298                 break;
299             case (RAF_LTE | RAF_TD_SCDMA | WCDMA):
300                 type = RILConstants.NETWORK_MODE_LTE_TDSCDMA_WCDMA;
301                 break;
302             case (RAF_LTE | RAF_TD_SCDMA | GSM | WCDMA):
303                 type = RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA;
304                 break;
305             case (RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA):
306                 type = RILConstants.NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA;
307                 break;
308             case (RAF_LTE | RAF_TD_SCDMA | RAF_LTE | CDMA | EVDO | GSM | WCDMA):
309                 type = RILConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA;
310                 break;
311             default:
312                 type = RILConstants.PREFERRED_NETWORK_MODE ;
313                 break;
314         }
315 
316         return type;
317     }
318 
singleRafTypeFromString(String rafString)319     public static int singleRafTypeFromString(String rafString) {
320         switch (rafString) {
321             case "GPRS":    return RAF_GPRS;
322             case "EDGE":    return RAF_EDGE;
323             case "UMTS":    return RAF_UMTS;
324             case "IS95A":   return RAF_IS95A;
325             case "IS95B":   return RAF_IS95B;
326             case "1XRTT":   return RAF_1xRTT;
327             case "EVDO_0":  return RAF_EVDO_0;
328             case "EVDO_A":  return RAF_EVDO_A;
329             case "HSDPA":   return RAF_HSDPA;
330             case "HSUPA":   return RAF_HSUPA;
331             case "HSPA":    return RAF_HSPA;
332             case "EVDO_B":  return RAF_EVDO_B;
333             case "EHRPD":   return RAF_EHRPD;
334             case "LTE":     return RAF_LTE;
335             case "HSPAP":   return RAF_HSPAP;
336             case "GSM":     return RAF_GSM;
337             case "TD_SCDMA":return RAF_TD_SCDMA;
338             case "HS":      return HS;
339             case "CDMA":    return CDMA;
340             case "EVDO":    return EVDO;
341             case "WCDMA":   return WCDMA;
342             default:        return RAF_UNKNOWN;
343         }
344     }
345 
rafTypeFromString(String rafList)346     public static int rafTypeFromString(String rafList) {
347         rafList = rafList.toUpperCase();
348         String[] rafs = rafList.split("\\|");
349         int result = 0;
350         for(String raf : rafs) {
351             int rafType = singleRafTypeFromString(raf.trim());
352             if (rafType == RAF_UNKNOWN) return rafType;
353             result |= rafType;
354         }
355         return result;
356     }
357 }
358