blob: 9fc1b6f76e775d9dc128081acc7a9373663d4a84 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2006 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
17package android.telephony;
18
Cassied53df962017-12-05 13:34:33 -080019import android.annotation.IntDef;
Jack Yuf2add902018-07-12 15:10:34 -070020import android.annotation.SystemApi;
Jack Yu1b8b3892018-02-22 17:37:38 -080021import android.annotation.TestApi;
Mathew Inwooda8382062018-08-16 17:01:12 +010022import android.annotation.UnsupportedAppUsage;
chen xu02811692018-10-03 19:07:09 -070023import android.content.Intent;
chen xuf513b522018-10-18 16:52:40 -070024import android.os.Build;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080025import android.os.Bundle;
26import android.os.Parcel;
27import android.os.Parcelable;
Jack Yu677cfaa22018-01-31 00:33:20 -080028import android.telephony.AccessNetworkConstants.AccessNetworkType;
Jack Yub4ae4772018-10-02 11:14:38 -070029import android.telephony.NetworkRegistrationState.Domain;
Pengquan Mengbbcd9122018-12-06 17:48:05 -080030import android.telephony.NetworkRegistrationState.NRStatus;
Zoran Jovanovic47495eb2016-11-02 09:56:38 +010031import android.text.TextUtils;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080032
Cassied53df962017-12-05 13:34:33 -080033import java.lang.annotation.Retention;
34import java.lang.annotation.RetentionPolicy;
Jack Yud5f1de12017-12-21 11:00:05 -080035import java.util.ArrayList;
Jack Yu677cfaa22018-01-31 00:33:20 -080036import java.util.Arrays;
Jack Yud5f1de12017-12-21 11:00:05 -080037import java.util.List;
Nathan Haroldb220fde2018-06-27 17:07:52 -070038import java.util.Objects;
Jack Yud5f1de12017-12-21 11:00:05 -080039
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080040/**
41 * Contains phone state and service related information.
42 *
43 * The following phone information is included in returned ServiceState:
44 *
45 * <ul>
46 * <li>Service state: IN_SERVICE, OUT_OF_SERVICE, EMERGENCY_ONLY, POWER_OFF
Eric Schwarzenbach09a77732018-01-18 14:42:00 -080047 * <li>Duplex mode: UNKNOWN, FDD, TDD
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080048 * <li>Roaming indicator
49 * <li>Operator name, short name and numeric id
50 * <li>Network selection mode
51 * </ul>
52 */
53public class ServiceState implements Parcelable {
54
Wink Saville767a6622009-04-02 01:37:02 -070055 static final String LOG_TAG = "PHONE";
Joe Onoratoa102dd02016-02-01 17:48:18 -080056 static final boolean DBG = false;
Jack Yu87f47e92016-01-05 15:50:40 -080057 static final boolean VDBG = false; // STOPSHIP if true
Wink Saville767a6622009-04-02 01:37:02 -070058
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080059 /**
60 * Normal operation condition, the phone is registered
61 * with an operator either in home network or in roaming.
62 */
Yangster4ccebea2018-10-09 17:09:02 -070063 public static final int STATE_IN_SERVICE = TelephonyProtoEnums.SERVICE_STATE_IN_SERVICE; // 0
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080064
65 /**
66 * Phone is not registered with any operator, the phone
67 * can be currently searching a new operator to register to, or not
68 * searching to registration at all, or registration is denied, or radio
69 * signal is not available.
70 */
Yangster4ccebea2018-10-09 17:09:02 -070071 public static final int STATE_OUT_OF_SERVICE =
72 TelephonyProtoEnums.SERVICE_STATE_OUT_OF_SERVICE; // 1
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080073
74 /**
75 * The phone is registered and locked. Only emergency numbers are allowed. {@more}
76 */
Yangster4ccebea2018-10-09 17:09:02 -070077 public static final int STATE_EMERGENCY_ONLY =
78 TelephonyProtoEnums.SERVICE_STATE_EMERGENCY_ONLY; // 2
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080079
80 /**
Jake Hamby390de222010-05-10 18:46:45 -070081 * Radio of telephony is explicitly powered off.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080082 */
Yangster4ccebea2018-10-09 17:09:02 -070083 public static final int STATE_POWER_OFF = TelephonyProtoEnums.SERVICE_STATE_POWER_OFF; // 3
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080084
Eric Schwarzenbach09a77732018-01-18 14:42:00 -080085 /** @hide */
86 @Retention(RetentionPolicy.SOURCE)
Pengquan Meng6aa52132018-11-13 17:06:34 -080087 @IntDef(prefix = "FREQUENCY_RANGE_",
88 value = {FREQUENCY_RANGE_UNKNOWN, FREQUENCY_RANGE_LOW, FREQUENCY_RANGE_MID,
89 FREQUENCY_RANGE_HIGH, FREQUENCY_RANGE_MMWAVE})
90 public @interface FrequencyRange {}
91
92 /**
93 * Indicates frequency range is unknown.
94 * @hide
95 */
96 public static final int FREQUENCY_RANGE_UNKNOWN = -1;
97
98 /**
99 * Indicates the frequency range is below 1GHz.
100 * @hide
101 */
102 public static final int FREQUENCY_RANGE_LOW = 1;
103
104 /**
105 * Indicates the frequency range is between 1GHz to 3GHz.
106 * @hide
107 */
108 public static final int FREQUENCY_RANGE_MID = 2;
109
110 /**
111 * Indicates the frequency range is between 3GHz and 6GHz.
112 * @hide
113 */
114 public static final int FREQUENCY_RANGE_HIGH = 3;
115
116 /**
117 * Indicates the frequency range is above 6GHz (millimeter wave frequency).
118 * @hide
119 */
120 public static final int FREQUENCY_RANGE_MMWAVE = 4;
121
Pengquan Meng27fc25e2018-11-27 16:45:17 -0800122 private static final List<Integer> FREQUENCY_RANGE_ORDER = Arrays.asList(
123 FREQUENCY_RANGE_UNKNOWN,
124 FREQUENCY_RANGE_LOW,
125 FREQUENCY_RANGE_MID,
126 FREQUENCY_RANGE_HIGH,
127 FREQUENCY_RANGE_MMWAVE);
128
Pengquan Meng6aa52132018-11-13 17:06:34 -0800129 /** @hide */
130 @Retention(RetentionPolicy.SOURCE)
131 @IntDef(prefix = "DUPLEX_MODE_",
132 value = {DUPLEX_MODE_UNKNOWN, DUPLEX_MODE_FDD, DUPLEX_MODE_TDD})
Eric Schwarzenbach09a77732018-01-18 14:42:00 -0800133 public @interface DuplexMode {}
134
135 /**
136 * Duplex mode for the phone is unknown.
137 */
138 public static final int DUPLEX_MODE_UNKNOWN = 0;
139
140 /**
141 * Duplex mode for the phone is frequency-division duplexing.
142 */
143 public static final int DUPLEX_MODE_FDD = 1;
144
145 /**
146 * Duplex mode for the phone is time-division duplexing.
147 */
148 public static final int DUPLEX_MODE_TDD = 2;
149
Cassied53df962017-12-05 13:34:33 -0800150 /** @hide */
151 @Retention(RetentionPolicy.SOURCE)
152 @IntDef(prefix = { "RIL_RADIO_TECHNOLOGY_" },
153 value = {
154 RIL_RADIO_TECHNOLOGY_UNKNOWN,
155 RIL_RADIO_TECHNOLOGY_GPRS,
156 RIL_RADIO_TECHNOLOGY_EDGE,
157 RIL_RADIO_TECHNOLOGY_UMTS,
158 RIL_RADIO_TECHNOLOGY_IS95A,
159 RIL_RADIO_TECHNOLOGY_IS95B,
160 RIL_RADIO_TECHNOLOGY_1xRTT,
161 RIL_RADIO_TECHNOLOGY_EVDO_0,
162 RIL_RADIO_TECHNOLOGY_EVDO_A,
163 RIL_RADIO_TECHNOLOGY_HSDPA,
164 RIL_RADIO_TECHNOLOGY_HSUPA,
165 RIL_RADIO_TECHNOLOGY_HSPA,
166 RIL_RADIO_TECHNOLOGY_EVDO_B,
167 RIL_RADIO_TECHNOLOGY_EHRPD,
168 RIL_RADIO_TECHNOLOGY_LTE,
169 RIL_RADIO_TECHNOLOGY_HSPAP,
170 RIL_RADIO_TECHNOLOGY_GSM,
171 RIL_RADIO_TECHNOLOGY_TD_SCDMA,
172 RIL_RADIO_TECHNOLOGY_IWLAN,
173 RIL_RADIO_TECHNOLOGY_LTE_CA})
174 public @interface RilRadioTechnology {}
Wink Saville767a6622009-04-02 01:37:02 -0700175 /**
176 * Available radio technologies for GSM, UMTS and CDMA.
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800177 * Duplicates the constants from hardware/radio/include/ril.h
178 * This should only be used by agents working with the ril. Others
179 * should use the equivalent TelephonyManager.NETWORK_TYPE_*
Wink Saville767a6622009-04-02 01:37:02 -0700180 */
181 /** @hide */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800182 public static final int RIL_RADIO_TECHNOLOGY_UNKNOWN = 0;
Wink Saville767a6622009-04-02 01:37:02 -0700183 /** @hide */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800184 public static final int RIL_RADIO_TECHNOLOGY_GPRS = 1;
Wink Saville767a6622009-04-02 01:37:02 -0700185 /** @hide */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800186 public static final int RIL_RADIO_TECHNOLOGY_EDGE = 2;
Wink Saville767a6622009-04-02 01:37:02 -0700187 /** @hide */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800188 public static final int RIL_RADIO_TECHNOLOGY_UMTS = 3;
Wink Saville767a6622009-04-02 01:37:02 -0700189 /** @hide */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800190 public static final int RIL_RADIO_TECHNOLOGY_IS95A = 4;
Wink Saville767a6622009-04-02 01:37:02 -0700191 /** @hide */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800192 public static final int RIL_RADIO_TECHNOLOGY_IS95B = 5;
Wink Saville767a6622009-04-02 01:37:02 -0700193 /** @hide */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800194 public static final int RIL_RADIO_TECHNOLOGY_1xRTT = 6;
Wink Saville767a6622009-04-02 01:37:02 -0700195 /** @hide */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800196 public static final int RIL_RADIO_TECHNOLOGY_EVDO_0 = 7;
Wink Saville767a6622009-04-02 01:37:02 -0700197 /** @hide */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800198 public static final int RIL_RADIO_TECHNOLOGY_EVDO_A = 8;
Li Zheebe66342009-08-14 19:22:16 +0800199 /** @hide */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800200 public static final int RIL_RADIO_TECHNOLOGY_HSDPA = 9;
Li Zheebe66342009-08-14 19:22:16 +0800201 /** @hide */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800202 public static final int RIL_RADIO_TECHNOLOGY_HSUPA = 10;
Li Zheebe66342009-08-14 19:22:16 +0800203 /** @hide */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800204 public static final int RIL_RADIO_TECHNOLOGY_HSPA = 11;
Naveen Kalla0a5174a2010-04-21 14:48:03 -0700205 /** @hide */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800206 public static final int RIL_RADIO_TECHNOLOGY_EVDO_B = 12;
Wink Saville9d7d6282011-03-12 14:52:01 -0800207 /** @hide */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800208 public static final int RIL_RADIO_TECHNOLOGY_EHRPD = 13;
Wink Saville9d7d6282011-03-12 14:52:01 -0800209 /** @hide */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800210 public static final int RIL_RADIO_TECHNOLOGY_LTE = 14;
Ramesh Sudinif5727612011-03-08 15:51:52 -0600211 /** @hide */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800212 public static final int RIL_RADIO_TECHNOLOGY_HSPAP = 15;
Naveen Kallafc2cbe92011-12-29 15:07:41 -0800213 /**
214 * GSM radio technology only supports voice. It does not support data.
215 * @hide
216 */
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800217 public static final int RIL_RADIO_TECHNOLOGY_GSM = 16;
Etan Cohen6415fba32014-10-02 11:06:23 -0700218 /** @hide */
219 public static final int RIL_RADIO_TECHNOLOGY_TD_SCDMA = 17;
Yashdev Singhbece9262015-02-23 13:04:51 -0800220 /**
221 * IWLAN
222 * @hide
223 */
chen xuf4c5c6e2018-11-18 18:56:00 -0800224 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
Yashdev Singhbece9262015-02-23 13:04:51 -0800225 public static final int RIL_RADIO_TECHNOLOGY_IWLAN = 18;
Jack Yufa530b42016-01-04 10:04:34 -0800226
Ajay Nambi7965fa42015-05-14 18:48:33 -0700227 /**
228 * LTE_CA
229 * @hide
230 */
231 public static final int RIL_RADIO_TECHNOLOGY_LTE_CA = 19;
232
Cassied53df962017-12-05 13:34:33 -0800233 /**
Pengquan Meng56b84672018-11-27 19:32:39 -0800234 * NR(New Radio) 5G.
235 * @hide
Cassied53df962017-12-05 13:34:33 -0800236 */
Pengquan Meng56b84672018-11-27 19:32:39 -0800237 public static final int RIL_RADIO_TECHNOLOGY_NR = 20;
238
239 /**
240 * The number of the radio technologies.
241 */
242 private static final int NEXT_RIL_RADIO_TECHNOLOGY = 21;
Cassied53df962017-12-05 13:34:33 -0800243
Jack Yufa530b42016-01-04 10:04:34 -0800244 /** @hide */
245 public static final int RIL_RADIO_CDMA_TECHNOLOGY_BITMASK =
246 (1 << (RIL_RADIO_TECHNOLOGY_IS95A - 1))
247 | (1 << (RIL_RADIO_TECHNOLOGY_IS95B - 1))
248 | (1 << (RIL_RADIO_TECHNOLOGY_1xRTT - 1))
249 | (1 << (RIL_RADIO_TECHNOLOGY_EVDO_0 - 1))
250 | (1 << (RIL_RADIO_TECHNOLOGY_EVDO_A - 1))
251 | (1 << (RIL_RADIO_TECHNOLOGY_EVDO_B - 1))
252 | (1 << (RIL_RADIO_TECHNOLOGY_EHRPD - 1));
253
Wink Saville0dde2c22012-11-16 08:12:11 -0800254 private int mVoiceRegState = STATE_OUT_OF_SERVICE;
255 private int mDataRegState = STATE_OUT_OF_SERVICE;
Jing Zhaoe6edb162014-07-18 09:34:36 -0500256
chen xu02811692018-10-03 19:07:09 -0700257 /** @hide */
258 @Retention(RetentionPolicy.SOURCE)
259 @IntDef(prefix = { "ROAMING_TYPE_" }, value = {
260 ROAMING_TYPE_NOT_ROAMING,
261 ROAMING_TYPE_UNKNOWN,
262 ROAMING_TYPE_DOMESTIC,
263 ROAMING_TYPE_INTERNATIONAL
264 })
265 public @interface RoamingType {}
chen xue6e2a642018-11-05 15:59:57 -0800266
Jing Zhaoe6edb162014-07-18 09:34:36 -0500267 /**
chen xue6e2a642018-11-05 15:59:57 -0800268 * Not roaming, registered in home network.
Jing Zhaoe6edb162014-07-18 09:34:36 -0500269 * @hide
270 */
chen xue6e2a642018-11-05 15:59:57 -0800271 @SystemApi
Jing Zhaoe6edb162014-07-18 09:34:36 -0500272 public static final int ROAMING_TYPE_NOT_ROAMING = 0;
273 /**
chen xue6e2a642018-11-05 15:59:57 -0800274 * registered in a roaming network, but can not tell if it's domestic or international.
Jing Zhaoe6edb162014-07-18 09:34:36 -0500275 * @hide
276 */
chen xue6e2a642018-11-05 15:59:57 -0800277 @SystemApi
Jing Zhaoe6edb162014-07-18 09:34:36 -0500278 public static final int ROAMING_TYPE_UNKNOWN = 1;
279 /**
chen xue6e2a642018-11-05 15:59:57 -0800280 * registered in a domestic roaming network
Jing Zhaoe6edb162014-07-18 09:34:36 -0500281 * @hide
282 */
chen xue6e2a642018-11-05 15:59:57 -0800283 @SystemApi
Jing Zhaoe6edb162014-07-18 09:34:36 -0500284 public static final int ROAMING_TYPE_DOMESTIC = 2;
285 /**
chen xue6e2a642018-11-05 15:59:57 -0800286 * registered in an international roaming network
Jing Zhaoe6edb162014-07-18 09:34:36 -0500287 * @hide
288 */
chen xue6e2a642018-11-05 15:59:57 -0800289 @SystemApi
Jing Zhaoe6edb162014-07-18 09:34:36 -0500290 public static final int ROAMING_TYPE_INTERNATIONAL = 3;
291
Jack Yu9cd3b7b2018-01-02 15:51:34 -0800292 /**
Jack Yu2661fac2018-03-15 13:51:05 -0700293 * Unknown ID. Could be returned by {@link #getCdmaNetworkId()} or {@link #getCdmaSystemId()}
Jack Yu9cd3b7b2018-01-02 15:51:34 -0800294 */
295 public static final int UNKNOWN_ID = -1;
296
Jing Zhaoe6edb162014-07-18 09:34:36 -0500297 private String mVoiceOperatorAlphaLong;
298 private String mVoiceOperatorAlphaShort;
299 private String mVoiceOperatorNumeric;
300 private String mDataOperatorAlphaLong;
301 private String mDataOperatorAlphaShort;
302 private String mDataOperatorNumeric;
Chen Xu4c0b06d2018-10-22 16:54:39 +0000303 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800304 private boolean mIsManualNetworkSelection;
305
John Wang56c2d2f2010-04-07 08:57:17 -0700306 private boolean mIsEmergencyOnly;
chen xuf513b522018-10-18 16:52:40 -0700307 /**
308 * TODO: remove mRilVoiceRadioTechnology after completely migrate to
309 * {@link TelephonyManager.NetworkType}
310 */
311 @RilRadioTechnology
Wink Saville0dde2c22012-11-16 08:12:11 -0800312 private int mRilVoiceRadioTechnology;
chen xuf513b522018-10-18 16:52:40 -0700313 /**
314 * TODO: remove mRilDataRadioTechnology after completely migrate to
315 * {@link TelephonyManager.NetworkType}
316 */
317 @RilRadioTechnology
Wink Saville0dde2c22012-11-16 08:12:11 -0800318 private int mRilDataRadioTechnology;
319
Mathew Inwood31755f92018-12-20 13:53:36 +0000320 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
Wink Saville767a6622009-04-02 01:37:02 -0700321 private boolean mCssIndicator;
Chen Xu4c0b06d2018-10-22 16:54:39 +0000322 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
Wink Saville767a6622009-04-02 01:37:02 -0700323 private int mNetworkId;
Chen Xu4c0b06d2018-10-22 16:54:39 +0000324 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
Wink Saville767a6622009-04-02 01:37:02 -0700325 private int mSystemId;
Mathew Inwood31755f92018-12-20 13:53:36 +0000326 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
Wink Savillee9b06d72009-05-18 21:47:50 -0700327 private int mCdmaRoamingIndicator;
Mathew Inwood31755f92018-12-20 13:53:36 +0000328 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
Wink Savillee9b06d72009-05-18 21:47:50 -0700329 private int mCdmaDefaultRoamingIndicator;
Mathew Inwood31755f92018-12-20 13:53:36 +0000330 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
Robert Greenwalt98e0b142009-10-08 21:15:52 -0700331 private int mCdmaEriIconIndex;
Mathew Inwood31755f92018-12-20 13:53:36 +0000332 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
Robert Greenwalt98e0b142009-10-08 21:15:52 -0700333 private int mCdmaEriIconMode;
Wink Saville767a6622009-04-02 01:37:02 -0700334
Mathew Inwooda8382062018-08-16 17:01:12 +0100335 @UnsupportedAppUsage
Robert Greenwaltea0d71392016-07-28 18:50:10 -0700336 private boolean mIsUsingCarrierAggregation;
337
Pengquan Meng6aa52132018-11-13 17:06:34 -0800338 @FrequencyRange
339 private int mNrFrequencyRange;
Eric Schwarzenbach09a77732018-01-18 14:42:00 -0800340 private int mChannelNumber;
341 private int[] mCellBandwidths = new int[0];
342
Sooraj Sasindranc5659ca2017-03-08 23:43:17 -0800343 /* EARFCN stands for E-UTRA Absolute Radio Frequency Channel Number,
344 * Reference: 3GPP TS 36.104 5.4.3 */
345 private int mLteEarfcnRsrpBoost = 0;
346
Jack Yud5f1de12017-12-21 11:00:05 -0800347 private List<NetworkRegistrationState> mNetworkRegistrationStates = new ArrayList<>();
348
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800349 /**
Jing Zhaoe6edb162014-07-18 09:34:36 -0500350 * get String description of roaming type
351 * @hide
352 */
353 public static final String getRoamingLogString(int roamingType) {
354 switch (roamingType) {
355 case ROAMING_TYPE_NOT_ROAMING:
356 return "home";
357
358 case ROAMING_TYPE_UNKNOWN:
359 return "roaming";
360
361 case ROAMING_TYPE_DOMESTIC:
362 return "Domestic Roaming";
363
364 case ROAMING_TYPE_INTERNATIONAL:
365 return "International Roaming";
366
367 default:
368 return "UNKNOWN";
369 }
370 }
371
372 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800373 * Create a new ServiceState from a intent notifier Bundle
374 *
375 * This method is used by PhoneStateIntentReceiver and maybe by
376 * external applications.
377 *
378 * @param m Bundle from intent notifier
379 * @return newly created ServiceState
380 * @hide
381 */
Mathew Inwooda8382062018-08-16 17:01:12 +0100382 @UnsupportedAppUsage
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800383 public static ServiceState newFromBundle(Bundle m) {
384 ServiceState ret;
385 ret = new ServiceState();
386 ret.setFromNotifierBundle(m);
387 return ret;
388 }
389
390 /**
391 * Empty constructor
392 */
393 public ServiceState() {
394 }
395
396 /**
397 * Copy constructors
398 *
399 * @param s Source service state
400 */
401 public ServiceState(ServiceState s) {
402 copyFrom(s);
403 }
404
405 protected void copyFrom(ServiceState s) {
Wink Saville0dde2c22012-11-16 08:12:11 -0800406 mVoiceRegState = s.mVoiceRegState;
407 mDataRegState = s.mDataRegState;
Jing Zhaoe6edb162014-07-18 09:34:36 -0500408 mVoiceOperatorAlphaLong = s.mVoiceOperatorAlphaLong;
409 mVoiceOperatorAlphaShort = s.mVoiceOperatorAlphaShort;
410 mVoiceOperatorNumeric = s.mVoiceOperatorNumeric;
411 mDataOperatorAlphaLong = s.mDataOperatorAlphaLong;
412 mDataOperatorAlphaShort = s.mDataOperatorAlphaShort;
413 mDataOperatorNumeric = s.mDataOperatorNumeric;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800414 mIsManualNetworkSelection = s.mIsManualNetworkSelection;
Wink Saville0dde2c22012-11-16 08:12:11 -0800415 mRilVoiceRadioTechnology = s.mRilVoiceRadioTechnology;
416 mRilDataRadioTechnology = s.mRilDataRadioTechnology;
Wink Saville767a6622009-04-02 01:37:02 -0700417 mCssIndicator = s.mCssIndicator;
418 mNetworkId = s.mNetworkId;
419 mSystemId = s.mSystemId;
Wink Savillee9b06d72009-05-18 21:47:50 -0700420 mCdmaRoamingIndicator = s.mCdmaRoamingIndicator;
421 mCdmaDefaultRoamingIndicator = s.mCdmaDefaultRoamingIndicator;
Robert Greenwalt98e0b142009-10-08 21:15:52 -0700422 mCdmaEriIconIndex = s.mCdmaEriIconIndex;
423 mCdmaEriIconMode = s.mCdmaEriIconMode;
John Wang56c2d2f2010-04-07 08:57:17 -0700424 mIsEmergencyOnly = s.mIsEmergencyOnly;
Robert Greenwaltea0d71392016-07-28 18:50:10 -0700425 mIsUsingCarrierAggregation = s.mIsUsingCarrierAggregation;
Jack Yu7d20eae2018-02-22 14:24:16 -0800426 mChannelNumber = s.mChannelNumber;
yifan.bai257be472018-08-21 13:42:58 +0800427 mCellBandwidths = s.mCellBandwidths == null ? null :
428 Arrays.copyOf(s.mCellBandwidths, s.mCellBandwidths.length);
Sooraj Sasindranc5659ca2017-03-08 23:43:17 -0800429 mLteEarfcnRsrpBoost = s.mLteEarfcnRsrpBoost;
yifan.bai257be472018-08-21 13:42:58 +0800430 mNetworkRegistrationStates = s.mNetworkRegistrationStates == null ? null :
431 new ArrayList<>(s.mNetworkRegistrationStates);
Pengquan Meng6aa52132018-11-13 17:06:34 -0800432 mNrFrequencyRange = s.mNrFrequencyRange;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800433 }
434
435 /**
436 * Construct a ServiceState object from the given parcel.
437 */
438 public ServiceState(Parcel in) {
Wink Saville0dde2c22012-11-16 08:12:11 -0800439 mVoiceRegState = in.readInt();
440 mDataRegState = in.readInt();
Jing Zhaoe6edb162014-07-18 09:34:36 -0500441 mVoiceOperatorAlphaLong = in.readString();
442 mVoiceOperatorAlphaShort = in.readString();
443 mVoiceOperatorNumeric = in.readString();
444 mDataOperatorAlphaLong = in.readString();
445 mDataOperatorAlphaShort = in.readString();
446 mDataOperatorNumeric = in.readString();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800447 mIsManualNetworkSelection = in.readInt() != 0;
Wink Saville0dde2c22012-11-16 08:12:11 -0800448 mRilVoiceRadioTechnology = in.readInt();
449 mRilDataRadioTechnology = in.readInt();
Wink Saville767a6622009-04-02 01:37:02 -0700450 mCssIndicator = (in.readInt() != 0);
451 mNetworkId = in.readInt();
452 mSystemId = in.readInt();
Wink Savillee9b06d72009-05-18 21:47:50 -0700453 mCdmaRoamingIndicator = in.readInt();
454 mCdmaDefaultRoamingIndicator = in.readInt();
Robert Greenwalt98e0b142009-10-08 21:15:52 -0700455 mCdmaEriIconIndex = in.readInt();
456 mCdmaEriIconMode = in.readInt();
John Wang56c2d2f2010-04-07 08:57:17 -0700457 mIsEmergencyOnly = in.readInt() != 0;
Robert Greenwaltea0d71392016-07-28 18:50:10 -0700458 mIsUsingCarrierAggregation = in.readInt() != 0;
Sooraj Sasindranc5659ca2017-03-08 23:43:17 -0800459 mLteEarfcnRsrpBoost = in.readInt();
Jack Yud5f1de12017-12-21 11:00:05 -0800460 mNetworkRegistrationStates = new ArrayList<>();
461 in.readList(mNetworkRegistrationStates, NetworkRegistrationState.class.getClassLoader());
Eric Schwarzenbach09a77732018-01-18 14:42:00 -0800462 mChannelNumber = in.readInt();
463 mCellBandwidths = in.createIntArray();
Pengquan Meng6aa52132018-11-13 17:06:34 -0800464 mNrFrequencyRange = in.readInt();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800465 }
466
467 public void writeToParcel(Parcel out, int flags) {
Wink Saville0dde2c22012-11-16 08:12:11 -0800468 out.writeInt(mVoiceRegState);
469 out.writeInt(mDataRegState);
Jing Zhaoe6edb162014-07-18 09:34:36 -0500470 out.writeString(mVoiceOperatorAlphaLong);
471 out.writeString(mVoiceOperatorAlphaShort);
472 out.writeString(mVoiceOperatorNumeric);
473 out.writeString(mDataOperatorAlphaLong);
474 out.writeString(mDataOperatorAlphaShort);
475 out.writeString(mDataOperatorNumeric);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800476 out.writeInt(mIsManualNetworkSelection ? 1 : 0);
Wink Saville0dde2c22012-11-16 08:12:11 -0800477 out.writeInt(mRilVoiceRadioTechnology);
478 out.writeInt(mRilDataRadioTechnology);
Wink Saville767a6622009-04-02 01:37:02 -0700479 out.writeInt(mCssIndicator ? 1 : 0);
480 out.writeInt(mNetworkId);
481 out.writeInt(mSystemId);
Wink Savillee9b06d72009-05-18 21:47:50 -0700482 out.writeInt(mCdmaRoamingIndicator);
483 out.writeInt(mCdmaDefaultRoamingIndicator);
Robert Greenwalt98e0b142009-10-08 21:15:52 -0700484 out.writeInt(mCdmaEriIconIndex);
485 out.writeInt(mCdmaEriIconMode);
John Wang56c2d2f2010-04-07 08:57:17 -0700486 out.writeInt(mIsEmergencyOnly ? 1 : 0);
Robert Greenwaltea0d71392016-07-28 18:50:10 -0700487 out.writeInt(mIsUsingCarrierAggregation ? 1 : 0);
Sooraj Sasindranc5659ca2017-03-08 23:43:17 -0800488 out.writeInt(mLteEarfcnRsrpBoost);
Jack Yud5f1de12017-12-21 11:00:05 -0800489 out.writeList(mNetworkRegistrationStates);
Eric Schwarzenbach09a77732018-01-18 14:42:00 -0800490 out.writeInt(mChannelNumber);
491 out.writeIntArray(mCellBandwidths);
Pengquan Meng6aa52132018-11-13 17:06:34 -0800492 out.writeInt(mNrFrequencyRange);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800493 }
494
495 public int describeContents() {
496 return 0;
497 }
498
Jake Hamby390de222010-05-10 18:46:45 -0700499 public static final Parcelable.Creator<ServiceState> CREATOR =
500 new Parcelable.Creator<ServiceState>() {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800501 public ServiceState createFromParcel(Parcel in) {
502 return new ServiceState(in);
503 }
504
505 public ServiceState[] newArray(int size) {
506 return new ServiceState[size];
507 }
508 };
509
510 /**
Wink Saville0dde2c22012-11-16 08:12:11 -0800511 * Get current voice service state
512 */
513 public int getState() {
514 return getVoiceRegState();
515 }
516
517 /**
518 * Get current voice service state
Wink Savilleb690ac32012-11-14 17:03:01 -0800519 *
Wink Saville69e25222012-11-15 15:16:45 -0800520 * @see #STATE_IN_SERVICE
521 * @see #STATE_OUT_OF_SERVICE
522 * @see #STATE_EMERGENCY_ONLY
523 * @see #STATE_POWER_OFF
Wink Saville0dde2c22012-11-16 08:12:11 -0800524 *
525 * @hide
Wink Savilleb690ac32012-11-14 17:03:01 -0800526 */
Chen Xu4c0b06d2018-10-22 16:54:39 +0000527 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
Wink Saville0dde2c22012-11-16 08:12:11 -0800528 public int getVoiceRegState() {
529 return mVoiceRegState;
530 }
531
532 /**
533 * Get current data service state
534 *
535 * @see #STATE_IN_SERVICE
536 * @see #STATE_OUT_OF_SERVICE
537 * @see #STATE_EMERGENCY_ONLY
538 * @see #STATE_POWER_OFF
539 *
540 * @hide
541 */
Chen Xu4c0b06d2018-10-22 16:54:39 +0000542 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
Wink Saville0dde2c22012-11-16 08:12:11 -0800543 public int getDataRegState() {
544 return mDataRegState;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800545 }
546
547 /**
Eric Schwarzenbach09a77732018-01-18 14:42:00 -0800548 * Get the current duplex mode
549 *
550 * @see #DUPLEX_MODE_UNKNOWN
551 * @see #DUPLEX_MODE_FDD
552 * @see #DUPLEX_MODE_TDD
553 *
554 * @return Current {@code DuplexMode} for the phone
555 */
556 @DuplexMode
557 public int getDuplexMode() {
Eric Schwarzenbach2c1a1772018-03-02 17:47:13 -0800558 // only support LTE duplex mode
559 if (!isLte(mRilDataRadioTechnology)) {
560 return DUPLEX_MODE_UNKNOWN;
561 }
562
563 int band = AccessNetworkUtils.getOperatingBandForEarfcn(mChannelNumber);
564 return AccessNetworkUtils.getDuplexModeForEutranBand(band);
Eric Schwarzenbach09a77732018-01-18 14:42:00 -0800565 }
566
567 /**
568 * Get the channel number of the current primary serving cell, or -1 if unknown
569 *
570 * <p>This is EARFCN for LTE, UARFCN for UMTS, and ARFCN for GSM.
571 *
572 * @return Channel number of primary serving cell
573 */
574 public int getChannelNumber() {
575 return mChannelNumber;
576 }
577
578 /**
579 * Get an array of cell bandwidths (kHz) for the current serving cells
580 *
581 * @return Current serving cell bandwidths
582 */
Eric Schwarzenbach09a77732018-01-18 14:42:00 -0800583 public int[] getCellBandwidths() {
Eric Schwarzenbachc119a862018-03-22 13:49:25 -0700584 return mCellBandwidths == null ? new int[0] : mCellBandwidths;
Eric Schwarzenbach09a77732018-01-18 14:42:00 -0800585 }
586
587 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800588 * Get current roaming indicator of phone
589 * (note: not just decoding from TS 27.007 7.2)
590 *
591 * @return true if TS 27.007 7.2 roaming is true
592 * and ONS is different from SPN
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800593 */
594 public boolean getRoaming() {
Jing Zhaoe6edb162014-07-18 09:34:36 -0500595 return getVoiceRoaming() || getDataRoaming();
596 }
597
598 /**
599 * Get current voice network roaming status
600 * @return roaming status
601 * @hide
602 */
Chen Xu4c0b06d2018-10-22 16:54:39 +0000603 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
Jing Zhaoe6edb162014-07-18 09:34:36 -0500604 public boolean getVoiceRoaming() {
chen xu02811692018-10-03 19:07:09 -0700605 return getVoiceRoamingType() != ROAMING_TYPE_NOT_ROAMING;
Jing Zhaoe6edb162014-07-18 09:34:36 -0500606 }
Jing Zhaoe6edb162014-07-18 09:34:36 -0500607 /**
608 * Get current voice network roaming type
609 * @return roaming type
610 * @hide
611 */
chen xuf4c5c6e2018-11-18 18:56:00 -0800612 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
chen xu02811692018-10-03 19:07:09 -0700613 public @RoamingType int getVoiceRoamingType() {
614 final NetworkRegistrationState regState = getNetworkRegistrationState(
615 NetworkRegistrationState.DOMAIN_CS, AccessNetworkConstants.TransportType.WWAN);
616 if (regState != null) {
617 return regState.getRoamingType();
618 }
619 return ROAMING_TYPE_NOT_ROAMING;
Jing Zhaoe6edb162014-07-18 09:34:36 -0500620 }
621
622 /**
623 * Get current data network roaming type
624 * @return roaming type
625 * @hide
626 */
Chen Xu4c0b06d2018-10-22 16:54:39 +0000627 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
Jing Zhaoe6edb162014-07-18 09:34:36 -0500628 public boolean getDataRoaming() {
chen xu02811692018-10-03 19:07:09 -0700629 return getDataRoamingType() != ROAMING_TYPE_NOT_ROAMING;
Chris Manton1428f432015-08-10 13:32:24 -0700630 }
631
632 /**
633 * Get whether data network registration state is roaming
634 * @return true if registration indicates roaming, false otherwise
635 * @hide
636 */
637 public boolean getDataRoamingFromRegistration() {
chen xu02811692018-10-03 19:07:09 -0700638 final NetworkRegistrationState regState = getNetworkRegistrationState(
639 NetworkRegistrationState.DOMAIN_PS, AccessNetworkConstants.TransportType.WWAN);
640 if (regState != null) {
641 return (regState.getRegState() == NetworkRegistrationState.REG_STATE_ROAMING);
642 }
643 return false;
Chris Manton1428f432015-08-10 13:32:24 -0700644 }
645
646 /**
Jing Zhaoe6edb162014-07-18 09:34:36 -0500647 * Get current data network roaming type
648 * @return roaming type
649 * @hide
650 */
chen xuf4c5c6e2018-11-18 18:56:00 -0800651 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
chen xu02811692018-10-03 19:07:09 -0700652 public @RoamingType int getDataRoamingType() {
653 final NetworkRegistrationState regState = getNetworkRegistrationState(
654 NetworkRegistrationState.DOMAIN_PS, AccessNetworkConstants.TransportType.WWAN);
655 if (regState != null) {
656 return regState.getRoamingType();
657 }
658 return ROAMING_TYPE_NOT_ROAMING;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800659 }
660
Wink Savillee9b06d72009-05-18 21:47:50 -0700661 /**
662 * @hide
663 */
Mathew Inwooda8382062018-08-16 17:01:12 +0100664 @UnsupportedAppUsage
John Wang56c2d2f2010-04-07 08:57:17 -0700665 public boolean isEmergencyOnly() {
666 return mIsEmergencyOnly;
667 }
668
669 /**
670 * @hide
671 */
Mathew Inwooda8382062018-08-16 17:01:12 +0100672 @UnsupportedAppUsage
Wink Savillee9b06d72009-05-18 21:47:50 -0700673 public int getCdmaRoamingIndicator(){
674 return this.mCdmaRoamingIndicator;
675 }
676
677 /**
678 * @hide
679 */
Mathew Inwooda8382062018-08-16 17:01:12 +0100680 @UnsupportedAppUsage
Wink Savillee9b06d72009-05-18 21:47:50 -0700681 public int getCdmaDefaultRoamingIndicator(){
682 return this.mCdmaDefaultRoamingIndicator;
Wink Saville767a6622009-04-02 01:37:02 -0700683 }
684
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800685 /**
Robert Greenwalt98e0b142009-10-08 21:15:52 -0700686 * @hide
687 */
Mathew Inwooda8382062018-08-16 17:01:12 +0100688 @UnsupportedAppUsage
Robert Greenwalt98e0b142009-10-08 21:15:52 -0700689 public int getCdmaEriIconIndex() {
690 return this.mCdmaEriIconIndex;
691 }
692
693 /**
694 * @hide
695 */
Mathew Inwooda8382062018-08-16 17:01:12 +0100696 @UnsupportedAppUsage
Robert Greenwalt98e0b142009-10-08 21:15:52 -0700697 public int getCdmaEriIconMode() {
698 return this.mCdmaEriIconMode;
699 }
700
701 /**
Jake Hamby390de222010-05-10 18:46:45 -0700702 * Get current registered operator name in long alphanumeric format.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800703 *
Jake Hamby390de222010-05-10 18:46:45 -0700704 * In GSM/UMTS, long format can be up to 16 characters long.
705 * In CDMA, returns the ERI text, if set. Otherwise, returns the ONS.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800706 *
707 * @return long name of operator, null if unregistered or unknown
708 */
709 public String getOperatorAlphaLong() {
Jing Zhaoe6edb162014-07-18 09:34:36 -0500710 return mVoiceOperatorAlphaLong;
711 }
712
713 /**
714 * Get current registered voice network operator name in long alphanumeric format.
715 * @return long name of operator
716 * @hide
717 */
Mathew Inwooda8382062018-08-16 17:01:12 +0100718 @UnsupportedAppUsage
Jing Zhaoe6edb162014-07-18 09:34:36 -0500719 public String getVoiceOperatorAlphaLong() {
720 return mVoiceOperatorAlphaLong;
721 }
722
723 /**
724 * Get current registered data network operator name in long alphanumeric format.
725 * @return long name of voice operator
726 * @hide
727 */
728 public String getDataOperatorAlphaLong() {
729 return mDataOperatorAlphaLong;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800730 }
731
732 /**
Jake Hamby390de222010-05-10 18:46:45 -0700733 * Get current registered operator name in short alphanumeric format.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800734 *
Jake Hamby390de222010-05-10 18:46:45 -0700735 * In GSM/UMTS, short format can be up to 8 characters long.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800736 *
737 * @return short name of operator, null if unregistered or unknown
738 */
739 public String getOperatorAlphaShort() {
Jing Zhaoe6edb162014-07-18 09:34:36 -0500740 return mVoiceOperatorAlphaShort;
741 }
742
743 /**
744 * Get current registered voice network operator name in short alphanumeric format.
745 * @return short name of operator, null if unregistered or unknown
746 * @hide
747 */
Mathew Inwooda8382062018-08-16 17:01:12 +0100748 @UnsupportedAppUsage
Jing Zhaoe6edb162014-07-18 09:34:36 -0500749 public String getVoiceOperatorAlphaShort() {
750 return mVoiceOperatorAlphaShort;
751 }
752
753 /**
754 * Get current registered data network operator name in short alphanumeric format.
755 * @return short name of operator, null if unregistered or unknown
756 * @hide
757 */
Mathew Inwooda8382062018-08-16 17:01:12 +0100758 @UnsupportedAppUsage
Jing Zhaoe6edb162014-07-18 09:34:36 -0500759 public String getDataOperatorAlphaShort() {
760 return mDataOperatorAlphaShort;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800761 }
762
763 /**
Zoran Jovanovic47495eb2016-11-02 09:56:38 +0100764 * Get current registered operator name in long alphanumeric format if
765 * available or short otherwise.
766 *
767 * @see #getOperatorAlphaLong
768 * @see #getOperatorAlphaShort
769 *
770 * @return name of operator, null if unregistered or unknown
771 * @hide
772 */
773 public String getOperatorAlpha() {
774 if (TextUtils.isEmpty(mVoiceOperatorAlphaLong)) {
775 return mVoiceOperatorAlphaShort;
776 }
777
778 return mVoiceOperatorAlphaLong;
779 }
780
781 /**
Jake Hamby390de222010-05-10 18:46:45 -0700782 * Get current registered operator numeric id.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800783 *
784 * In GSM/UMTS, numeric format is 3 digit country code plus 2 or 3 digit
Jake Hamby390de222010-05-10 18:46:45 -0700785 * network code.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800786 *
787 * @return numeric format of operator, null if unregistered or unknown
788 */
Jean-Baptiste Querue25863c2010-05-18 11:54:42 -0700789 /*
Jake Hamby390de222010-05-10 18:46:45 -0700790 * The country code can be decoded using
791 * {@link com.android.internal.telephony.MccTable#countryCodeForMcc(int)}.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800792 */
793 public String getOperatorNumeric() {
Jing Zhaoe6edb162014-07-18 09:34:36 -0500794 return mVoiceOperatorNumeric;
795 }
796
797 /**
798 * Get current registered voice network operator numeric id.
799 * @return numeric format of operator, null if unregistered or unknown
800 * @hide
801 */
chen xuf4c5c6e2018-11-18 18:56:00 -0800802 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
Jing Zhaoe6edb162014-07-18 09:34:36 -0500803 public String getVoiceOperatorNumeric() {
804 return mVoiceOperatorNumeric;
805 }
806
807 /**
808 * Get current registered data network operator numeric id.
809 * @return numeric format of operator, null if unregistered or unknown
810 * @hide
811 */
Mathew Inwooda8382062018-08-16 17:01:12 +0100812 @UnsupportedAppUsage
Jing Zhaoe6edb162014-07-18 09:34:36 -0500813 public String getDataOperatorNumeric() {
814 return mDataOperatorNumeric;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800815 }
816
817 /**
Jake Hamby390de222010-05-10 18:46:45 -0700818 * Get current network selection mode.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800819 *
820 * @return true if manual mode, false if automatic mode
821 */
822 public boolean getIsManualSelection() {
823 return mIsManualNetworkSelection;
824 }
825
826 @Override
827 public int hashCode() {
Nathan Haroldb220fde2018-06-27 17:07:52 -0700828 return Objects.hash(
829 mVoiceRegState,
830 mDataRegState,
Nathan Haroldb220fde2018-06-27 17:07:52 -0700831 mChannelNumber,
832 mCellBandwidths,
833 mVoiceOperatorAlphaLong,
834 mVoiceOperatorAlphaShort,
835 mVoiceOperatorNumeric,
836 mDataOperatorAlphaLong,
837 mDataOperatorAlphaShort,
838 mDataOperatorNumeric,
839 mIsManualNetworkSelection,
840 mRilVoiceRadioTechnology,
841 mRilDataRadioTechnology,
842 mCssIndicator,
843 mNetworkId,
844 mSystemId,
845 mCdmaRoamingIndicator,
846 mCdmaDefaultRoamingIndicator,
847 mCdmaEriIconIndex,
848 mCdmaEriIconMode,
849 mIsEmergencyOnly,
Nathan Haroldb220fde2018-06-27 17:07:52 -0700850 mIsUsingCarrierAggregation,
851 mLteEarfcnRsrpBoost,
Pengquan Meng6aa52132018-11-13 17:06:34 -0800852 mNetworkRegistrationStates,
853 mNrFrequencyRange);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800854 }
855
856 @Override
857 public boolean equals (Object o) {
Nathan Harold7ee5f212018-06-27 17:21:17 -0700858 if (!(o instanceof ServiceState)) return false;
859 ServiceState s = (ServiceState) o;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800860
Wink Saville0dde2c22012-11-16 08:12:11 -0800861 return (mVoiceRegState == s.mVoiceRegState
862 && mDataRegState == s.mDataRegState
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800863 && mIsManualNetworkSelection == s.mIsManualNetworkSelection
Eric Schwarzenbach09a77732018-01-18 14:42:00 -0800864 && mChannelNumber == s.mChannelNumber
865 && Arrays.equals(mCellBandwidths, s.mCellBandwidths)
Jing Zhaoe6edb162014-07-18 09:34:36 -0500866 && equalsHandlesNulls(mVoiceOperatorAlphaLong, s.mVoiceOperatorAlphaLong)
867 && equalsHandlesNulls(mVoiceOperatorAlphaShort, s.mVoiceOperatorAlphaShort)
868 && equalsHandlesNulls(mVoiceOperatorNumeric, s.mVoiceOperatorNumeric)
869 && equalsHandlesNulls(mDataOperatorAlphaLong, s.mDataOperatorAlphaLong)
870 && equalsHandlesNulls(mDataOperatorAlphaShort, s.mDataOperatorAlphaShort)
871 && equalsHandlesNulls(mDataOperatorNumeric, s.mDataOperatorNumeric)
Wink Saville0dde2c22012-11-16 08:12:11 -0800872 && equalsHandlesNulls(mRilVoiceRadioTechnology, s.mRilVoiceRadioTechnology)
873 && equalsHandlesNulls(mRilDataRadioTechnology, s.mRilDataRadioTechnology)
Wink Saville767a6622009-04-02 01:37:02 -0700874 && equalsHandlesNulls(mCssIndicator, s.mCssIndicator)
875 && equalsHandlesNulls(mNetworkId, s.mNetworkId)
876 && equalsHandlesNulls(mSystemId, s.mSystemId)
Wink Savillee9b06d72009-05-18 21:47:50 -0700877 && equalsHandlesNulls(mCdmaRoamingIndicator, s.mCdmaRoamingIndicator)
878 && equalsHandlesNulls(mCdmaDefaultRoamingIndicator,
John Wang56c2d2f2010-04-07 08:57:17 -0700879 s.mCdmaDefaultRoamingIndicator)
Chris Manton1428f432015-08-10 13:32:24 -0700880 && mIsEmergencyOnly == s.mIsEmergencyOnly
Jack Yud5f1de12017-12-21 11:00:05 -0800881 && mIsUsingCarrierAggregation == s.mIsUsingCarrierAggregation)
yifan.bai257be472018-08-21 13:42:58 +0800882 && (mNetworkRegistrationStates == null ? s.mNetworkRegistrationStates == null :
883 s.mNetworkRegistrationStates != null &&
Pengquan Meng6aa52132018-11-13 17:06:34 -0800884 mNetworkRegistrationStates.containsAll(s.mNetworkRegistrationStates))
885 && mNrFrequencyRange == s.mNrFrequencyRange;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800886 }
887
Wink Savilledb09b5d2011-06-03 09:06:28 -0700888 /**
889 * Convert radio technology to String
890 *
Jack Yud5f1de12017-12-21 11:00:05 -0800891 * @param rt radioTechnology
Wink Savilledb09b5d2011-06-03 09:06:28 -0700892 * @return String representation of the RAT
893 *
894 * @hide
895 */
Mathew Inwooda8382062018-08-16 17:01:12 +0100896 @UnsupportedAppUsage
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800897 public static String rilRadioTechnologyToString(int rt) {
Wink Savilledb09b5d2011-06-03 09:06:28 -0700898 String rtString;
899
900 switch(rt) {
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800901 case RIL_RADIO_TECHNOLOGY_UNKNOWN:
Wink Savilledb09b5d2011-06-03 09:06:28 -0700902 rtString = "Unknown";
903 break;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800904 case RIL_RADIO_TECHNOLOGY_GPRS:
Wink Savilledb09b5d2011-06-03 09:06:28 -0700905 rtString = "GPRS";
906 break;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800907 case RIL_RADIO_TECHNOLOGY_EDGE:
Wink Savilledb09b5d2011-06-03 09:06:28 -0700908 rtString = "EDGE";
909 break;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800910 case RIL_RADIO_TECHNOLOGY_UMTS:
Wink Savilledb09b5d2011-06-03 09:06:28 -0700911 rtString = "UMTS";
912 break;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800913 case RIL_RADIO_TECHNOLOGY_IS95A:
Wink Savilledb09b5d2011-06-03 09:06:28 -0700914 rtString = "CDMA-IS95A";
915 break;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800916 case RIL_RADIO_TECHNOLOGY_IS95B:
Wink Savilledb09b5d2011-06-03 09:06:28 -0700917 rtString = "CDMA-IS95B";
918 break;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800919 case RIL_RADIO_TECHNOLOGY_1xRTT:
Wink Savilledb09b5d2011-06-03 09:06:28 -0700920 rtString = "1xRTT";
921 break;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800922 case RIL_RADIO_TECHNOLOGY_EVDO_0:
Wink Savilledb09b5d2011-06-03 09:06:28 -0700923 rtString = "EvDo-rev.0";
924 break;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800925 case RIL_RADIO_TECHNOLOGY_EVDO_A:
Wink Savilledb09b5d2011-06-03 09:06:28 -0700926 rtString = "EvDo-rev.A";
927 break;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800928 case RIL_RADIO_TECHNOLOGY_HSDPA:
Wink Savilledb09b5d2011-06-03 09:06:28 -0700929 rtString = "HSDPA";
930 break;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800931 case RIL_RADIO_TECHNOLOGY_HSUPA:
Wink Savilledb09b5d2011-06-03 09:06:28 -0700932 rtString = "HSUPA";
933 break;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800934 case RIL_RADIO_TECHNOLOGY_HSPA:
Wink Savilledb09b5d2011-06-03 09:06:28 -0700935 rtString = "HSPA";
936 break;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800937 case RIL_RADIO_TECHNOLOGY_EVDO_B:
Wink Savilledb09b5d2011-06-03 09:06:28 -0700938 rtString = "EvDo-rev.B";
939 break;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800940 case RIL_RADIO_TECHNOLOGY_EHRPD:
Wink Savilledb09b5d2011-06-03 09:06:28 -0700941 rtString = "eHRPD";
942 break;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800943 case RIL_RADIO_TECHNOLOGY_LTE:
Wink Savilledb09b5d2011-06-03 09:06:28 -0700944 rtString = "LTE";
945 break;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800946 case RIL_RADIO_TECHNOLOGY_HSPAP:
Wink Savilledb09b5d2011-06-03 09:06:28 -0700947 rtString = "HSPAP";
948 break;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800949 case RIL_RADIO_TECHNOLOGY_GSM:
Naveen Kallafc2cbe92011-12-29 15:07:41 -0800950 rtString = "GSM";
951 break;
Yashdev Singhbece9262015-02-23 13:04:51 -0800952 case RIL_RADIO_TECHNOLOGY_IWLAN:
953 rtString = "IWLAN";
954 break;
Sungmin Choi36980862015-08-26 11:05:46 -0700955 case RIL_RADIO_TECHNOLOGY_TD_SCDMA:
956 rtString = "TD-SCDMA";
957 break;
Ajay Nambi7965fa42015-05-14 18:48:33 -0700958 case RIL_RADIO_TECHNOLOGY_LTE_CA:
959 rtString = "LTE_CA";
960 break;
Wink Savilledb09b5d2011-06-03 09:06:28 -0700961 default:
962 rtString = "Unexpected";
Wink Saville599a90c2012-11-27 12:29:13 -0800963 Rlog.w(LOG_TAG, "Unexpected radioTechnology=" + rt);
Wink Savilledb09b5d2011-06-03 09:06:28 -0700964 break;
965 }
Robert Greenwalt1434d7b2012-02-17 13:14:08 -0800966 return rtString;
Wink Savilledb09b5d2011-06-03 09:06:28 -0700967 }
968
Nathan Harold9acfe6f2017-08-02 10:51:47 -0700969 /**
970 * Convert RIL Service State to String
971 *
972 * @param serviceState
973 * @return String representation of the ServiceState
974 *
975 * @hide
976 */
977 public static String rilServiceStateToString(int serviceState) {
978 switch(serviceState) {
979 case STATE_IN_SERVICE:
980 return "IN_SERVICE";
981 case STATE_OUT_OF_SERVICE:
982 return "OUT_OF_SERVICE";
983 case STATE_EMERGENCY_ONLY:
984 return "EMERGENCY_ONLY";
985 case STATE_POWER_OFF:
986 return "POWER_OFF";
987 default:
988 return "UNKNOWN";
989 }
990 }
991
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800992 @Override
993 public String toString() {
Nathan Harold9acfe6f2017-08-02 10:51:47 -0700994 return new StringBuilder().append("{mVoiceRegState=").append(mVoiceRegState)
995 .append("(" + rilServiceStateToString(mVoiceRegState) + ")")
996 .append(", mDataRegState=").append(mDataRegState)
997 .append("(" + rilServiceStateToString(mDataRegState) + ")")
Eric Schwarzenbach09a77732018-01-18 14:42:00 -0800998 .append(", mChannelNumber=").append(mChannelNumber)
Eric Schwarzenbach2c1a1772018-03-02 17:47:13 -0800999 .append(", duplexMode()=").append(getDuplexMode())
Eric Schwarzenbach09a77732018-01-18 14:42:00 -08001000 .append(", mCellBandwidths=").append(Arrays.toString(mCellBandwidths))
Nathan Harold9acfe6f2017-08-02 10:51:47 -07001001 .append(", mVoiceOperatorAlphaLong=").append(mVoiceOperatorAlphaLong)
1002 .append(", mVoiceOperatorAlphaShort=").append(mVoiceOperatorAlphaShort)
1003 .append(", mDataOperatorAlphaLong=").append(mDataOperatorAlphaLong)
1004 .append(", mDataOperatorAlphaShort=").append(mDataOperatorAlphaShort)
1005 .append(", isManualNetworkSelection=").append(mIsManualNetworkSelection)
1006 .append(mIsManualNetworkSelection ? "(manual)" : "(automatic)")
1007 .append(", mRilVoiceRadioTechnology=").append(mRilVoiceRadioTechnology)
1008 .append("(" + rilRadioTechnologyToString(mRilVoiceRadioTechnology) + ")")
1009 .append(", mRilDataRadioTechnology=").append(mRilDataRadioTechnology)
1010 .append("(" + rilRadioTechnologyToString(mRilDataRadioTechnology) + ")")
1011 .append(", mCssIndicator=").append(mCssIndicator ? "supported" : "unsupported")
1012 .append(", mNetworkId=").append(mNetworkId)
1013 .append(", mSystemId=").append(mSystemId)
1014 .append(", mCdmaRoamingIndicator=").append(mCdmaRoamingIndicator)
1015 .append(", mCdmaDefaultRoamingIndicator=").append(mCdmaDefaultRoamingIndicator)
1016 .append(", mIsEmergencyOnly=").append(mIsEmergencyOnly)
Nathan Harold9acfe6f2017-08-02 10:51:47 -07001017 .append(", mIsUsingCarrierAggregation=").append(mIsUsingCarrierAggregation)
1018 .append(", mLteEarfcnRsrpBoost=").append(mLteEarfcnRsrpBoost)
Jack Yud5f1de12017-12-21 11:00:05 -08001019 .append(", mNetworkRegistrationStates=").append(mNetworkRegistrationStates)
Pengquan Meng6aa52132018-11-13 17:06:34 -08001020 .append(", mNrFrequencyRange=").append(mNrFrequencyRange)
Nathan Harold9acfe6f2017-08-02 10:51:47 -07001021 .append("}").toString();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001022 }
1023
Robert Greenwalta2267452011-06-30 12:24:26 -07001024 private void setNullState(int state) {
Wink Saville599a90c2012-11-27 12:29:13 -08001025 if (DBG) Rlog.d(LOG_TAG, "[ServiceState] setNullState=" + state);
Wink Saville0dde2c22012-11-16 08:12:11 -08001026 mVoiceRegState = state;
1027 mDataRegState = state;
Eric Schwarzenbach09a77732018-01-18 14:42:00 -08001028 mChannelNumber = -1;
1029 mCellBandwidths = new int[0];
Jing Zhaoe6edb162014-07-18 09:34:36 -05001030 mVoiceOperatorAlphaLong = null;
1031 mVoiceOperatorAlphaShort = null;
1032 mVoiceOperatorNumeric = null;
1033 mDataOperatorAlphaLong = null;
1034 mDataOperatorAlphaShort = null;
1035 mDataOperatorNumeric = null;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001036 mIsManualNetworkSelection = false;
Wink Saville0dde2c22012-11-16 08:12:11 -08001037 mRilVoiceRadioTechnology = 0;
1038 mRilDataRadioTechnology = 0;
Wink Saville767a6622009-04-02 01:37:02 -07001039 mCssIndicator = false;
1040 mNetworkId = -1;
1041 mSystemId = -1;
Wink Savillee9b06d72009-05-18 21:47:50 -07001042 mCdmaRoamingIndicator = -1;
1043 mCdmaDefaultRoamingIndicator = -1;
Robert Greenwalt98e0b142009-10-08 21:15:52 -07001044 mCdmaEriIconIndex = -1;
1045 mCdmaEriIconMode = -1;
John Wang56c2d2f2010-04-07 08:57:17 -07001046 mIsEmergencyOnly = false;
Robert Greenwaltea0d71392016-07-28 18:50:10 -07001047 mIsUsingCarrierAggregation = false;
Sooraj Sasindranc5659ca2017-03-08 23:43:17 -08001048 mLteEarfcnRsrpBoost = 0;
Jack Yud5f1de12017-12-21 11:00:05 -08001049 mNetworkRegistrationStates = new ArrayList<>();
Pengquan Meng6aa52132018-11-13 17:06:34 -08001050 mNrFrequencyRange = FREQUENCY_RANGE_UNKNOWN;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001051 }
1052
Robert Greenwalta2267452011-06-30 12:24:26 -07001053 public void setStateOutOfService() {
1054 setNullState(STATE_OUT_OF_SERVICE);
1055 }
1056
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001057 public void setStateOff() {
Robert Greenwalta2267452011-06-30 12:24:26 -07001058 setNullState(STATE_POWER_OFF);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001059 }
1060
1061 public void setState(int state) {
Wink Saville0dde2c22012-11-16 08:12:11 -08001062 setVoiceRegState(state);
Wink Saville599a90c2012-11-27 12:29:13 -08001063 if (DBG) Rlog.e(LOG_TAG, "[ServiceState] setState deprecated use setVoiceRegState()");
Wink Saville0dde2c22012-11-16 08:12:11 -08001064 }
1065
1066 /** @hide */
Mathew Inwooda8382062018-08-16 17:01:12 +01001067 @UnsupportedAppUsage
Wink Saville0dde2c22012-11-16 08:12:11 -08001068 public void setVoiceRegState(int state) {
1069 mVoiceRegState = state;
Wink Saville599a90c2012-11-27 12:29:13 -08001070 if (DBG) Rlog.d(LOG_TAG, "[ServiceState] setVoiceRegState=" + mVoiceRegState);
Wink Saville0dde2c22012-11-16 08:12:11 -08001071 }
1072
1073 /** @hide */
Mathew Inwood31755f92018-12-20 13:53:36 +00001074 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
Wink Saville0dde2c22012-11-16 08:12:11 -08001075 public void setDataRegState(int state) {
1076 mDataRegState = state;
Jack Yu87f47e92016-01-05 15:50:40 -08001077 if (VDBG) Rlog.d(LOG_TAG, "[ServiceState] setDataRegState=" + mDataRegState);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001078 }
1079
Eric Schwarzenbach09a77732018-01-18 14:42:00 -08001080 /** @hide */
Malcolm Chena1d5e9f2018-04-03 17:43:30 -07001081 @TestApi
Eric Schwarzenbach09a77732018-01-18 14:42:00 -08001082 public void setCellBandwidths(int[] bandwidths) {
1083 mCellBandwidths = bandwidths;
1084 }
1085
1086 /** @hide */
Malcolm Chena1d5e9f2018-04-03 17:43:30 -07001087 @TestApi
Eric Schwarzenbach09a77732018-01-18 14:42:00 -08001088 public void setChannelNumber(int channelNumber) {
1089 mChannelNumber = channelNumber;
1090 }
1091
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001092 public void setRoaming(boolean roaming) {
chen xu02811692018-10-03 19:07:09 -07001093 setVoiceRoaming(roaming);
1094 setDataRoaming(roaming);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001095 }
1096
Jing Zhaoe6edb162014-07-18 09:34:36 -05001097 /** @hide */
Mathew Inwooda8382062018-08-16 17:01:12 +01001098 @UnsupportedAppUsage
Jing Zhaoe6edb162014-07-18 09:34:36 -05001099 public void setVoiceRoaming(boolean roaming) {
chen xu02811692018-10-03 19:07:09 -07001100 setVoiceRoamingType(roaming ? ROAMING_TYPE_UNKNOWN : ROAMING_TYPE_NOT_ROAMING);
Jing Zhaoe6edb162014-07-18 09:34:36 -05001101 }
1102
1103 /** @hide */
Mathew Inwood31755f92018-12-20 13:53:36 +00001104 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
chen xu02811692018-10-03 19:07:09 -07001105 public void setVoiceRoamingType(@RoamingType int type) {
1106 NetworkRegistrationState regState = getNetworkRegistrationState(
1107 NetworkRegistrationState.DOMAIN_CS, AccessNetworkConstants.TransportType.WWAN);
1108 if (regState == null) {
1109 regState = new NetworkRegistrationState(
1110 NetworkRegistrationState.DOMAIN_CS, AccessNetworkConstants.TransportType.WWAN,
1111 ServiceState.ROAMING_TYPE_NOT_ROAMING, TelephonyManager.NETWORK_TYPE_UNKNOWN, 0,
1112 false, null, null);
1113 addNetworkRegistrationState(regState);
1114 }
1115 regState.setRoamingType(type);
Jing Zhaoe6edb162014-07-18 09:34:36 -05001116 }
1117
1118 /** @hide */
Mathew Inwooda8382062018-08-16 17:01:12 +01001119 @UnsupportedAppUsage
Jing Zhaoe6edb162014-07-18 09:34:36 -05001120 public void setDataRoaming(boolean dataRoaming) {
chen xu02811692018-10-03 19:07:09 -07001121 setDataRoamingType(dataRoaming ? ROAMING_TYPE_UNKNOWN : ROAMING_TYPE_NOT_ROAMING);
Jing Zhaoe6edb162014-07-18 09:34:36 -05001122 }
1123
1124 /** @hide */
Mathew Inwood31755f92018-12-20 13:53:36 +00001125 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
chen xu02811692018-10-03 19:07:09 -07001126 public void setDataRoamingType(@RoamingType int type) {
1127 NetworkRegistrationState regState = getNetworkRegistrationState(
1128 NetworkRegistrationState.DOMAIN_PS, AccessNetworkConstants.TransportType.WWAN);
1129 if (regState == null) {
1130 regState = new NetworkRegistrationState(
1131 NetworkRegistrationState.DOMAIN_PS, AccessNetworkConstants.TransportType.WWAN,
1132 ServiceState.ROAMING_TYPE_NOT_ROAMING, TelephonyManager.NETWORK_TYPE_UNKNOWN, 0,
1133 false, null, null);
1134 addNetworkRegistrationState(regState);
1135 }
1136 regState.setRoamingType(type);
Jing Zhaoe6edb162014-07-18 09:34:36 -05001137 }
John Wang56c2d2f2010-04-07 08:57:17 -07001138
1139 /**
1140 * @hide
1141 */
Mathew Inwood31755f92018-12-20 13:53:36 +00001142 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
John Wang56c2d2f2010-04-07 08:57:17 -07001143 public void setEmergencyOnly(boolean emergencyOnly) {
1144 mIsEmergencyOnly = emergencyOnly;
1145 }
1146
Wink Savillee9b06d72009-05-18 21:47:50 -07001147 /**
1148 * @hide
1149 */
Mathew Inwood31755f92018-12-20 13:53:36 +00001150 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
Wink Savillee9b06d72009-05-18 21:47:50 -07001151 public void setCdmaRoamingIndicator(int roaming) {
1152 this.mCdmaRoamingIndicator = roaming;
1153 }
1154
1155 /**
1156 * @hide
1157 */
Mathew Inwood31755f92018-12-20 13:53:36 +00001158 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
Wink Savillee9b06d72009-05-18 21:47:50 -07001159 public void setCdmaDefaultRoamingIndicator (int roaming) {
1160 this.mCdmaDefaultRoamingIndicator = roaming;
Wink Saville767a6622009-04-02 01:37:02 -07001161 }
1162
Robert Greenwalt98e0b142009-10-08 21:15:52 -07001163 /**
1164 * @hide
1165 */
Mathew Inwood31755f92018-12-20 13:53:36 +00001166 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
Robert Greenwalt98e0b142009-10-08 21:15:52 -07001167 public void setCdmaEriIconIndex(int index) {
1168 this.mCdmaEriIconIndex = index;
1169 }
1170
1171 /**
1172 * @hide
1173 */
Mathew Inwood31755f92018-12-20 13:53:36 +00001174 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
Robert Greenwalt98e0b142009-10-08 21:15:52 -07001175 public void setCdmaEriIconMode(int mode) {
1176 this.mCdmaEriIconMode = mode;
1177 }
1178
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001179 public void setOperatorName(String longName, String shortName, String numeric) {
Jing Zhaoe6edb162014-07-18 09:34:36 -05001180 mVoiceOperatorAlphaLong = longName;
1181 mVoiceOperatorAlphaShort = shortName;
1182 mVoiceOperatorNumeric = numeric;
1183 mDataOperatorAlphaLong = longName;
1184 mDataOperatorAlphaShort = shortName;
1185 mDataOperatorNumeric = numeric;
1186 }
1187
1188 /** @hide */
1189 public void setVoiceOperatorName(String longName, String shortName, String numeric) {
1190 mVoiceOperatorAlphaLong = longName;
1191 mVoiceOperatorAlphaShort = shortName;
1192 mVoiceOperatorNumeric = numeric;
1193 }
1194
1195 /** @hide */
1196 public void setDataOperatorName(String longName, String shortName, String numeric) {
1197 mDataOperatorAlphaLong = longName;
1198 mDataOperatorAlphaShort = shortName;
1199 mDataOperatorNumeric = numeric;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001200 }
1201
Wink Savillee9b06d72009-05-18 21:47:50 -07001202 /**
Jake Hamby390de222010-05-10 18:46:45 -07001203 * In CDMA, mOperatorAlphaLong can be set from the ERI text.
Jack Yu67140302015-12-10 12:27:58 -08001204 * This is done from the GsmCdmaPhone and not from the ServiceStateTracker.
Wink Savillee9b06d72009-05-18 21:47:50 -07001205 *
1206 * @hide
1207 */
Mathew Inwooda8382062018-08-16 17:01:12 +01001208 @UnsupportedAppUsage
Kazuhiro Ondoc91c7f92011-06-02 00:19:49 -05001209 public void setOperatorAlphaLong(String longName) {
Jing Zhaoe6edb162014-07-18 09:34:36 -05001210 mVoiceOperatorAlphaLong = longName;
1211 mDataOperatorAlphaLong = longName;
1212 }
1213
1214 /** @hide */
1215 public void setVoiceOperatorAlphaLong(String longName) {
1216 mVoiceOperatorAlphaLong = longName;
1217 }
1218
1219 /** @hide */
1220 public void setDataOperatorAlphaLong(String longName) {
1221 mDataOperatorAlphaLong = longName;
Wink Savillee9b06d72009-05-18 21:47:50 -07001222 }
1223
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001224 public void setIsManualSelection(boolean isManual) {
1225 mIsManualNetworkSelection = isManual;
1226 }
Wink Saville767a6622009-04-02 01:37:02 -07001227
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001228 /**
Jake Hamby390de222010-05-10 18:46:45 -07001229 * Test whether two objects hold the same data values or both are null.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001230 *
1231 * @param a first obj
1232 * @param b second obj
1233 * @return true if two objects equal or both are null
1234 */
Mathew Inwood31755f92018-12-20 13:53:36 +00001235 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001236 private static boolean equalsHandlesNulls (Object a, Object b) {
1237 return (a == null) ? (b == null) : a.equals (b);
1238 }
1239
1240 /**
Jake Hamby390de222010-05-10 18:46:45 -07001241 * Set ServiceState based on intent notifier map.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001242 *
1243 * @param m intent notifier map
1244 * @hide
1245 */
Mathew Inwooda8382062018-08-16 17:01:12 +01001246 @UnsupportedAppUsage
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001247 private void setFromNotifierBundle(Bundle m) {
chen xu02811692018-10-03 19:07:09 -07001248 ServiceState ssFromBundle = m.getParcelable(Intent.EXTRA_SERVICE_STATE);
1249 if (ssFromBundle != null) {
1250 copyFrom(ssFromBundle);
1251 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001252 }
1253
1254 /**
Jake Hamby390de222010-05-10 18:46:45 -07001255 * Set intent notifier Bundle based on service state.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001256 *
1257 * @param m intent notifier Bundle
1258 * @hide
1259 */
Mathew Inwooda8382062018-08-16 17:01:12 +01001260 @UnsupportedAppUsage
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001261 public void fillInNotifierBundle(Bundle m) {
chen xu02811692018-10-03 19:07:09 -07001262 m.putParcelable(Intent.EXTRA_SERVICE_STATE, this);
1263 // serviceState already consists of below entries.
1264 // for backward compatibility, we continue fill in below entries.
Wink Saville0dde2c22012-11-16 08:12:11 -08001265 m.putInt("voiceRegState", mVoiceRegState);
1266 m.putInt("dataRegState", mDataRegState);
chen xu02811692018-10-03 19:07:09 -07001267 m.putInt("dataRoamingType", getDataRoamingType());
1268 m.putInt("voiceRoamingType", getVoiceRoamingType());
Jing Zhaoe6edb162014-07-18 09:34:36 -05001269 m.putString("operator-alpha-long", mVoiceOperatorAlphaLong);
1270 m.putString("operator-alpha-short", mVoiceOperatorAlphaShort);
1271 m.putString("operator-numeric", mVoiceOperatorNumeric);
1272 m.putString("data-operator-alpha-long", mDataOperatorAlphaLong);
1273 m.putString("data-operator-alpha-short", mDataOperatorAlphaShort);
1274 m.putString("data-operator-numeric", mDataOperatorNumeric);
Tobias Thiererb0800dc2016-04-21 17:51:41 +01001275 m.putBoolean("manual", mIsManualNetworkSelection);
Wink Saville0dde2c22012-11-16 08:12:11 -08001276 m.putInt("radioTechnology", mRilVoiceRadioTechnology);
1277 m.putInt("dataRadioTechnology", mRilDataRadioTechnology);
Wink Saville767a6622009-04-02 01:37:02 -07001278 m.putBoolean("cssIndicator", mCssIndicator);
1279 m.putInt("networkId", mNetworkId);
1280 m.putInt("systemId", mSystemId);
Wink Savillee9b06d72009-05-18 21:47:50 -07001281 m.putInt("cdmaRoamingIndicator", mCdmaRoamingIndicator);
1282 m.putInt("cdmaDefaultRoamingIndicator", mCdmaDefaultRoamingIndicator);
Tobias Thiererb0800dc2016-04-21 17:51:41 +01001283 m.putBoolean("emergencyOnly", mIsEmergencyOnly);
chen xu02811692018-10-03 19:07:09 -07001284 m.putBoolean("isDataRoamingFromRegistration", getDataRoamingFromRegistration());
Dan Willemsen1398e8e2016-07-30 12:48:07 -07001285 m.putBoolean("isUsingCarrierAggregation", mIsUsingCarrierAggregation);
Sooraj Sasindranc5659ca2017-03-08 23:43:17 -08001286 m.putInt("LteEarfcnRsrpBoost", mLteEarfcnRsrpBoost);
Eric Schwarzenbach09a77732018-01-18 14:42:00 -08001287 m.putInt("ChannelNumber", mChannelNumber);
1288 m.putIntArray("CellBandwidths", mCellBandwidths);
Pengquan Meng6aa52132018-11-13 17:06:34 -08001289 m.putInt("mNrFrequencyRange", mNrFrequencyRange);
Wink Saville767a6622009-04-02 01:37:02 -07001290 }
1291
Wink Saville767a6622009-04-02 01:37:02 -07001292 /** @hide */
Malcolm Chena1d5e9f2018-04-03 17:43:30 -07001293 @TestApi
chen xuf513b522018-10-18 16:52:40 -07001294 public void setRilVoiceRadioTechnology(@RilRadioTechnology int rt) {
Robert Greenwaltea0d71392016-07-28 18:50:10 -07001295 if (rt == RIL_RADIO_TECHNOLOGY_LTE_CA) {
1296 rt = RIL_RADIO_TECHNOLOGY_LTE;
1297 }
1298
Wink Saville0dde2c22012-11-16 08:12:11 -08001299 this.mRilVoiceRadioTechnology = rt;
chen xuf513b522018-10-18 16:52:40 -07001300
1301 // sync to network registration state
1302 NetworkRegistrationState regState = getNetworkRegistrationState(
1303 NetworkRegistrationState.DOMAIN_CS, AccessNetworkConstants.TransportType.WWAN);
1304 if (regState == null) {
1305 regState = new NetworkRegistrationState(
1306 NetworkRegistrationState.DOMAIN_CS, AccessNetworkConstants.TransportType.WWAN,
1307 ServiceState.ROAMING_TYPE_NOT_ROAMING, TelephonyManager.NETWORK_TYPE_UNKNOWN,
1308 0, false, null, null);
1309 addNetworkRegistrationState(regState);
1310 }
1311 regState.setAccessNetworkTechnology(
1312 rilRadioTechnologyToNetworkType(mRilVoiceRadioTechnology));
Wink Saville0dde2c22012-11-16 08:12:11 -08001313 }
1314
1315 /** @hide */
Malcolm Chena1d5e9f2018-04-03 17:43:30 -07001316 @TestApi
chen xuf513b522018-10-18 16:52:40 -07001317 public void setRilDataRadioTechnology(@RilRadioTechnology int rt) {
Robert Greenwaltea0d71392016-07-28 18:50:10 -07001318 if (rt == RIL_RADIO_TECHNOLOGY_LTE_CA) {
1319 rt = RIL_RADIO_TECHNOLOGY_LTE;
1320 this.mIsUsingCarrierAggregation = true;
1321 } else {
1322 this.mIsUsingCarrierAggregation = false;
1323 }
Wink Saville0dde2c22012-11-16 08:12:11 -08001324 this.mRilDataRadioTechnology = rt;
Jack Yu87f47e92016-01-05 15:50:40 -08001325 if (VDBG) Rlog.d(LOG_TAG, "[ServiceState] setRilDataRadioTechnology=" +
1326 mRilDataRadioTechnology);
chen xuf513b522018-10-18 16:52:40 -07001327
1328 // sync to network registration state
1329 NetworkRegistrationState regState = getNetworkRegistrationState(
1330 NetworkRegistrationState.DOMAIN_PS, AccessNetworkConstants.TransportType.WWAN);
1331
1332 if (regState == null) {
1333 regState = new NetworkRegistrationState(
1334 NetworkRegistrationState.DOMAIN_PS, AccessNetworkConstants.TransportType.WWAN,
1335 ServiceState.ROAMING_TYPE_NOT_ROAMING, TelephonyManager.NETWORK_TYPE_UNKNOWN,
1336 0, false, null, null);
1337 addNetworkRegistrationState(regState);
1338 }
1339 regState.setAccessNetworkTechnology(
1340 rilRadioTechnologyToNetworkType(mRilDataRadioTechnology));
Wink Saville767a6622009-04-02 01:37:02 -07001341 }
1342
1343 /** @hide */
Robert Greenwaltea0d71392016-07-28 18:50:10 -07001344 public boolean isUsingCarrierAggregation() {
1345 return mIsUsingCarrierAggregation;
1346 }
1347
1348 /** @hide */
1349 public void setIsUsingCarrierAggregation(boolean ca) {
1350 mIsUsingCarrierAggregation = ca;
1351 }
1352
Pengquan Meng6aa52132018-11-13 17:06:34 -08001353 /**
1354 * @return the frequency range of 5G NR.
1355 * @hide
1356 */
1357 public @FrequencyRange int getNrFrequencyRange() {
1358 return mNrFrequencyRange;
1359 }
1360
1361 /**
Pengquan Mengbbcd9122018-12-06 17:48:05 -08001362 * Get the NR 5G status of the mobile data network.
1363 * @return the NR 5G status.
1364 * @hide
1365 */
1366 public @NRStatus int getNrStatus() {
1367 final NetworkRegistrationState regState = getNetworkRegistrationState(
1368 NetworkRegistrationState.DOMAIN_PS, AccessNetworkConstants.TransportType.WWAN);
1369 if (regState == null) return NetworkRegistrationState.NR_STATUS_NONE;
1370 return regState.getNrStatus();
1371 }
1372
1373 /**
Pengquan Meng6aa52132018-11-13 17:06:34 -08001374 * @param nrFrequencyRange the frequency range of 5G NR.
1375 * @hide
1376 */
1377 public void setNrFrequencyRange(@FrequencyRange int nrFrequencyRange) {
1378 mNrFrequencyRange = nrFrequencyRange;
1379 }
1380
Robert Greenwaltea0d71392016-07-28 18:50:10 -07001381 /** @hide */
Sooraj Sasindranc5659ca2017-03-08 23:43:17 -08001382 public int getLteEarfcnRsrpBoost() {
1383 return mLteEarfcnRsrpBoost;
1384 }
1385
1386 /** @hide */
1387 public void setLteEarfcnRsrpBoost(int LteEarfcnRsrpBoost) {
1388 mLteEarfcnRsrpBoost = LteEarfcnRsrpBoost;
1389 }
1390
1391 /** @hide */
Mathew Inwood31755f92018-12-20 13:53:36 +00001392 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
Wink Saville767a6622009-04-02 01:37:02 -07001393 public void setCssIndicator(int css) {
1394 this.mCssIndicator = (css != 0);
1395 }
1396
1397 /** @hide */
Jack Yu1b8b3892018-02-22 17:37:38 -08001398 @TestApi
Jack Yu2661fac2018-03-15 13:51:05 -07001399 public void setCdmaSystemAndNetworkId(int systemId, int networkId) {
Wink Saville767a6622009-04-02 01:37:02 -07001400 this.mSystemId = systemId;
1401 this.mNetworkId = networkId;
1402 }
1403
1404 /** @hide */
Mathew Inwooda8382062018-08-16 17:01:12 +01001405 @UnsupportedAppUsage
Wink Saville0dde2c22012-11-16 08:12:11 -08001406 public int getRilVoiceRadioTechnology() {
1407 return this.mRilVoiceRadioTechnology;
Wink Saville767a6622009-04-02 01:37:02 -07001408 }
Mathias Agopiand13f9aa2012-02-24 19:28:42 -08001409 /** @hide */
Mathew Inwooda8382062018-08-16 17:01:12 +01001410 @UnsupportedAppUsage
Wink Saville0dde2c22012-11-16 08:12:11 -08001411 public int getRilDataRadioTechnology() {
1412 return this.mRilDataRadioTechnology;
1413 }
1414 /**
1415 * @hide
1416 * @Deprecated to be removed Q3 2013 use {@link #getRilDataRadioTechnology} or
1417 * {@link #getRilVoiceRadioTechnology}
1418 */
Mathew Inwooda8382062018-08-16 17:01:12 +01001419 @UnsupportedAppUsage
Mathias Agopiand13f9aa2012-02-24 19:28:42 -08001420 public int getRadioTechnology() {
Wink Saville599a90c2012-11-27 12:29:13 -08001421 Rlog.e(LOG_TAG, "ServiceState.getRadioTechnology() DEPRECATED will be removed *******");
Wink Saville0dde2c22012-11-16 08:12:11 -08001422 return getRilDataRadioTechnology();
Mathias Agopiand13f9aa2012-02-24 19:28:42 -08001423 }
Wink Saville767a6622009-04-02 01:37:02 -07001424
Cassied53df962017-12-05 13:34:33 -08001425 /** @hide */
Pengquan Meng39555932018-12-07 14:41:18 -08001426 public static int rilRadioTechnologyToNetworkType(@RilRadioTechnology int rat) {
1427 switch(rat) {
1428 case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS:
1429 return TelephonyManager.NETWORK_TYPE_GPRS;
1430 case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE:
1431 return TelephonyManager.NETWORK_TYPE_EDGE;
1432 case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS:
1433 return TelephonyManager.NETWORK_TYPE_UMTS;
1434 case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA:
1435 return TelephonyManager.NETWORK_TYPE_HSDPA;
1436 case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA:
1437 return TelephonyManager.NETWORK_TYPE_HSUPA;
1438 case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA:
1439 return TelephonyManager.NETWORK_TYPE_HSPA;
1440 case ServiceState.RIL_RADIO_TECHNOLOGY_IS95A:
1441 case ServiceState.RIL_RADIO_TECHNOLOGY_IS95B:
1442 return TelephonyManager.NETWORK_TYPE_CDMA;
1443 case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT:
1444 return TelephonyManager.NETWORK_TYPE_1xRTT;
1445 case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0:
1446 return TelephonyManager.NETWORK_TYPE_EVDO_0;
1447 case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A:
1448 return TelephonyManager.NETWORK_TYPE_EVDO_A;
1449 case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B:
1450 return TelephonyManager.NETWORK_TYPE_EVDO_B;
1451 case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD:
1452 return TelephonyManager.NETWORK_TYPE_EHRPD;
1453 case ServiceState.RIL_RADIO_TECHNOLOGY_LTE:
1454 return TelephonyManager.NETWORK_TYPE_LTE;
1455 case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP:
1456 return TelephonyManager.NETWORK_TYPE_HSPAP;
1457 case ServiceState.RIL_RADIO_TECHNOLOGY_GSM:
1458 return TelephonyManager.NETWORK_TYPE_GSM;
1459 case ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA:
1460 return TelephonyManager.NETWORK_TYPE_TD_SCDMA;
1461 case ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN:
1462 return TelephonyManager.NETWORK_TYPE_IWLAN;
1463 case ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA:
1464 return TelephonyManager.NETWORK_TYPE_LTE_CA;
1465 case ServiceState.RIL_RADIO_TECHNOLOGY_NR:
1466 return TelephonyManager.NETWORK_TYPE_NR;
1467 default:
1468 return TelephonyManager.NETWORK_TYPE_UNKNOWN;
Robert Greenwalt1434d7b2012-02-17 13:14:08 -08001469 }
1470 }
1471
Wink Saville0dde2c22012-11-16 08:12:11 -08001472 /** @hide */
Jack Yu677cfaa22018-01-31 00:33:20 -08001473 public static int rilRadioTechnologyToAccessNetworkType(@RilRadioTechnology int rt) {
1474 switch(rt) {
1475 case RIL_RADIO_TECHNOLOGY_GPRS:
1476 case RIL_RADIO_TECHNOLOGY_EDGE:
1477 case RIL_RADIO_TECHNOLOGY_GSM:
1478 return AccessNetworkType.GERAN;
1479 case RIL_RADIO_TECHNOLOGY_UMTS:
1480 case RIL_RADIO_TECHNOLOGY_HSDPA:
1481 case RIL_RADIO_TECHNOLOGY_HSPAP:
1482 case RIL_RADIO_TECHNOLOGY_HSUPA:
1483 case RIL_RADIO_TECHNOLOGY_HSPA:
1484 case RIL_RADIO_TECHNOLOGY_TD_SCDMA:
1485 return AccessNetworkType.UTRAN;
1486 case RIL_RADIO_TECHNOLOGY_IS95A:
1487 case RIL_RADIO_TECHNOLOGY_IS95B:
1488 case RIL_RADIO_TECHNOLOGY_1xRTT:
1489 case RIL_RADIO_TECHNOLOGY_EVDO_0:
1490 case RIL_RADIO_TECHNOLOGY_EVDO_A:
1491 case RIL_RADIO_TECHNOLOGY_EVDO_B:
1492 case RIL_RADIO_TECHNOLOGY_EHRPD:
1493 return AccessNetworkType.CDMA2000;
1494 case RIL_RADIO_TECHNOLOGY_LTE:
1495 case RIL_RADIO_TECHNOLOGY_LTE_CA:
1496 return AccessNetworkType.EUTRAN;
1497 case RIL_RADIO_TECHNOLOGY_IWLAN:
1498 return AccessNetworkType.IWLAN;
1499 case RIL_RADIO_TECHNOLOGY_UNKNOWN:
1500 default:
1501 return AccessNetworkType.UNKNOWN;
1502 }
1503 }
1504
1505 /** @hide */
Malcolm Chen0a01c6b2018-01-29 17:09:21 -08001506 public static int networkTypeToRilRadioTechnology(int networkType) {
1507 switch(networkType) {
1508 case TelephonyManager.NETWORK_TYPE_GPRS:
1509 return ServiceState.RIL_RADIO_TECHNOLOGY_GPRS;
1510 case TelephonyManager.NETWORK_TYPE_EDGE:
1511 return ServiceState.RIL_RADIO_TECHNOLOGY_EDGE;
1512 case TelephonyManager.NETWORK_TYPE_UMTS:
1513 return ServiceState.RIL_RADIO_TECHNOLOGY_UMTS;
1514 case TelephonyManager.NETWORK_TYPE_HSDPA:
1515 return ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA;
1516 case TelephonyManager.NETWORK_TYPE_HSUPA:
1517 return ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA;
1518 case TelephonyManager.NETWORK_TYPE_HSPA:
1519 return ServiceState.RIL_RADIO_TECHNOLOGY_HSPA;
1520 case TelephonyManager.NETWORK_TYPE_CDMA:
1521 return ServiceState.RIL_RADIO_TECHNOLOGY_IS95A;
1522 case TelephonyManager.NETWORK_TYPE_1xRTT:
1523 return ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT;
1524 case TelephonyManager.NETWORK_TYPE_EVDO_0:
1525 return ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0;
1526 case TelephonyManager.NETWORK_TYPE_EVDO_A:
1527 return ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A;
1528 case TelephonyManager.NETWORK_TYPE_EVDO_B:
1529 return ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B;
1530 case TelephonyManager.NETWORK_TYPE_EHRPD:
1531 return ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD;
1532 case TelephonyManager.NETWORK_TYPE_LTE:
1533 return ServiceState.RIL_RADIO_TECHNOLOGY_LTE;
1534 case TelephonyManager.NETWORK_TYPE_HSPAP:
1535 return ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP;
1536 case TelephonyManager.NETWORK_TYPE_GSM:
1537 return ServiceState.RIL_RADIO_TECHNOLOGY_GSM;
1538 case TelephonyManager.NETWORK_TYPE_TD_SCDMA:
1539 return ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA;
1540 case TelephonyManager.NETWORK_TYPE_IWLAN:
1541 return ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN;
1542 case TelephonyManager.NETWORK_TYPE_LTE_CA:
1543 return ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA;
1544 default:
1545 return ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN;
1546 }
1547 }
1548
Malcolm Chen0a01c6b2018-01-29 17:09:21 -08001549 /** @hide */
chen xuf513b522018-10-18 16:52:40 -07001550 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
1551 public @TelephonyManager.NetworkType int getDataNetworkType() {
1552 final NetworkRegistrationState regState = getNetworkRegistrationState(
1553 NetworkRegistrationState.DOMAIN_PS, AccessNetworkConstants.TransportType.WWAN);
1554 if (regState != null) {
1555 return regState.getAccessNetworkTechnology();
1556 }
1557 return TelephonyManager.NETWORK_TYPE_UNKNOWN;
Wink Saville0dde2c22012-11-16 08:12:11 -08001558 }
1559
1560 /** @hide */
chen xuf513b522018-10-18 16:52:40 -07001561 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
1562 public @TelephonyManager.NetworkType int getVoiceNetworkType() {
1563 final NetworkRegistrationState regState = getNetworkRegistrationState(
1564 NetworkRegistrationState.DOMAIN_CS, AccessNetworkConstants.TransportType.WWAN);
1565 if (regState != null) {
1566 return regState.getAccessNetworkTechnology();
1567 }
1568 return TelephonyManager.NETWORK_TYPE_UNKNOWN;
Wink Saville0dde2c22012-11-16 08:12:11 -08001569 }
1570
Robert Greenwalt1434d7b2012-02-17 13:14:08 -08001571 /** @hide */
Mathew Inwood31755f92018-12-20 13:53:36 +00001572 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
Wink Saville767a6622009-04-02 01:37:02 -07001573 public int getCssIndicator() {
1574 return this.mCssIndicator ? 1 : 0;
1575 }
1576
Jack Yu9cd3b7b2018-01-02 15:51:34 -08001577 /**
1578 * Get the CDMA NID (Network Identification Number), a number uniquely identifying a network
1579 * within a wireless system. (Defined in 3GPP2 C.S0023 3.4.8)
1580 * @return The CDMA NID or {@link #UNKNOWN_ID} if not available.
1581 */
Jack Yu2661fac2018-03-15 13:51:05 -07001582 public int getCdmaNetworkId() {
Wink Saville767a6622009-04-02 01:37:02 -07001583 return this.mNetworkId;
1584 }
1585
Jack Yu9cd3b7b2018-01-02 15:51:34 -08001586 /**
1587 * Get the CDMA SID (System Identification Number), a number uniquely identifying a wireless
1588 * system. (Defined in 3GPP2 C.S0023 3.4.8)
1589 * @return The CDMA SID or {@link #UNKNOWN_ID} if not available.
1590 */
Jack Yu2661fac2018-03-15 13:51:05 -07001591 public int getCdmaSystemId() {
Wink Saville767a6622009-04-02 01:37:02 -07001592 return this.mSystemId;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001593 }
Naveen Kallafc2cbe92011-12-29 15:07:41 -08001594
1595 /** @hide */
Mathew Inwooda8382062018-08-16 17:01:12 +01001596 @UnsupportedAppUsage
Naveen Kallafc2cbe92011-12-29 15:07:41 -08001597 public static boolean isGsm(int radioTechnology) {
Robert Greenwalt1434d7b2012-02-17 13:14:08 -08001598 return radioTechnology == RIL_RADIO_TECHNOLOGY_GPRS
1599 || radioTechnology == RIL_RADIO_TECHNOLOGY_EDGE
1600 || radioTechnology == RIL_RADIO_TECHNOLOGY_UMTS
1601 || radioTechnology == RIL_RADIO_TECHNOLOGY_HSDPA
1602 || radioTechnology == RIL_RADIO_TECHNOLOGY_HSUPA
1603 || radioTechnology == RIL_RADIO_TECHNOLOGY_HSPA
1604 || radioTechnology == RIL_RADIO_TECHNOLOGY_LTE
1605 || radioTechnology == RIL_RADIO_TECHNOLOGY_HSPAP
Etan Cohen5e5bc4b2014-10-08 17:10:33 -07001606 || radioTechnology == RIL_RADIO_TECHNOLOGY_GSM
Yashdev Singhbece9262015-02-23 13:04:51 -08001607 || radioTechnology == RIL_RADIO_TECHNOLOGY_TD_SCDMA
Ajay Nambi7965fa42015-05-14 18:48:33 -07001608 || radioTechnology == RIL_RADIO_TECHNOLOGY_IWLAN
1609 || radioTechnology == RIL_RADIO_TECHNOLOGY_LTE_CA;
1610
Naveen Kallafc2cbe92011-12-29 15:07:41 -08001611 }
1612
1613 /** @hide */
Mathew Inwooda8382062018-08-16 17:01:12 +01001614 @UnsupportedAppUsage
Naveen Kallafc2cbe92011-12-29 15:07:41 -08001615 public static boolean isCdma(int radioTechnology) {
Robert Greenwalt1434d7b2012-02-17 13:14:08 -08001616 return radioTechnology == RIL_RADIO_TECHNOLOGY_IS95A
1617 || radioTechnology == RIL_RADIO_TECHNOLOGY_IS95B
1618 || radioTechnology == RIL_RADIO_TECHNOLOGY_1xRTT
1619 || radioTechnology == RIL_RADIO_TECHNOLOGY_EVDO_0
1620 || radioTechnology == RIL_RADIO_TECHNOLOGY_EVDO_A
1621 || radioTechnology == RIL_RADIO_TECHNOLOGY_EVDO_B
Etan Cohen5e5bc4b2014-10-08 17:10:33 -07001622 || radioTechnology == RIL_RADIO_TECHNOLOGY_EHRPD;
Naveen Kallafc2cbe92011-12-29 15:07:41 -08001623 }
Etan Cohendcc07362014-09-23 16:03:44 -07001624
Amit Mahajan13a98b62015-02-26 10:46:17 -08001625 /** @hide */
Ajay Nambi7965fa42015-05-14 18:48:33 -07001626 public static boolean isLte(int radioTechnology) {
1627 return radioTechnology == RIL_RADIO_TECHNOLOGY_LTE ||
1628 radioTechnology == RIL_RADIO_TECHNOLOGY_LTE_CA;
1629 }
1630
1631 /** @hide */
Mathew Inwood31755f92018-12-20 13:53:36 +00001632 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
Jack Yufa530b42016-01-04 10:04:34 -08001633 public static boolean bearerBitmapHasCdma(int radioTechnologyBitmap) {
1634 return (RIL_RADIO_CDMA_TECHNOLOGY_BITMASK & radioTechnologyBitmap) != 0;
Amit Mahajan13a98b62015-02-26 10:46:17 -08001635 }
1636
1637 /** @hide */
Mathew Inwooda8382062018-08-16 17:01:12 +01001638 @UnsupportedAppUsage
Amit Mahajan13a98b62015-02-26 10:46:17 -08001639 public static boolean bitmaskHasTech(int bearerBitmask, int radioTech) {
1640 if (bearerBitmask == 0) {
1641 return true;
1642 } else if (radioTech >= 1) {
1643 return ((bearerBitmask & (1 << (radioTech - 1))) != 0);
1644 }
1645 return false;
1646 }
1647
1648 /** @hide */
1649 public static int getBitmaskForTech(int radioTech) {
1650 if (radioTech >= 1) {
1651 return (1 << (radioTech - 1));
1652 }
1653 return 0;
1654 }
1655
1656 /** @hide */
1657 public static int getBitmaskFromString(String bearerList) {
1658 String[] bearers = bearerList.split("\\|");
1659 int bearerBitmask = 0;
1660 for (String bearer : bearers) {
1661 int bearerInt = 0;
1662 try {
1663 bearerInt = Integer.parseInt(bearer.trim());
1664 } catch (NumberFormatException nfe) {
1665 return 0;
1666 }
1667
1668 if (bearerInt == 0) {
1669 return 0;
1670 }
1671
1672 bearerBitmask |= getBitmaskForTech(bearerInt);
1673 }
1674 return bearerBitmask;
1675 }
1676
Cassied53df962017-12-05 13:34:33 -08001677 /** @hide */
1678 public static int convertNetworkTypeBitmaskToBearerBitmask(int networkTypeBitmask) {
1679 if (networkTypeBitmask == 0) {
1680 return 0;
1681 }
1682 int bearerBitmask = 0;
1683 for (int bearerInt = 0; bearerInt < NEXT_RIL_RADIO_TECHNOLOGY; bearerInt++) {
1684 if (bitmaskHasTech(networkTypeBitmask, rilRadioTechnologyToNetworkType(bearerInt))) {
1685 bearerBitmask |= getBitmaskForTech(bearerInt);
1686 }
1687 }
1688 return bearerBitmask;
1689 }
1690
1691 /** @hide */
1692 public static int convertBearerBitmaskToNetworkTypeBitmask(int bearerBitmask) {
1693 if (bearerBitmask == 0) {
1694 return 0;
1695 }
1696 int networkTypeBitmask = 0;
1697 for (int bearerInt = 0; bearerInt < NEXT_RIL_RADIO_TECHNOLOGY; bearerInt++) {
1698 if (bitmaskHasTech(bearerBitmask, bearerInt)) {
1699 networkTypeBitmask |= getBitmaskForTech(rilRadioTechnologyToNetworkType(bearerInt));
1700 }
1701 }
1702 return networkTypeBitmask;
1703 }
1704
Etan Cohendcc07362014-09-23 16:03:44 -07001705 /**
1706 * Returns a merged ServiceState consisting of the base SS with voice settings from the
1707 * voice SS. The voice SS is only used if it is IN_SERVICE (otherwise the base SS is returned).
1708 * @hide
1709 * */
Mathew Inwooda8382062018-08-16 17:01:12 +01001710 @UnsupportedAppUsage
Etan Cohendcc07362014-09-23 16:03:44 -07001711 public static ServiceState mergeServiceStates(ServiceState baseSs, ServiceState voiceSs) {
1712 if (voiceSs.mVoiceRegState != STATE_IN_SERVICE) {
1713 return baseSs;
1714 }
1715
1716 ServiceState newSs = new ServiceState(baseSs);
1717
1718 // voice overrides
1719 newSs.mVoiceRegState = voiceSs.mVoiceRegState;
1720 newSs.mIsEmergencyOnly = false; // only get here if voice is IN_SERVICE
1721
1722 return newSs;
1723 }
Jack Yud5f1de12017-12-21 11:00:05 -08001724
1725 /**
1726 * Get all of the available network registration states.
1727 *
Jack Yub4ae4772018-10-02 11:14:38 -07001728 * @return List of {@link NetworkRegistrationState}
Jack Yud5f1de12017-12-21 11:00:05 -08001729 * @hide
1730 */
Jack Yuf2add902018-07-12 15:10:34 -07001731 @SystemApi
Jack Yud5f1de12017-12-21 11:00:05 -08001732 public List<NetworkRegistrationState> getNetworkRegistrationStates() {
Malcolm Chen574b41a2018-02-13 15:42:58 -08001733 synchronized (mNetworkRegistrationStates) {
1734 return new ArrayList<>(mNetworkRegistrationStates);
1735 }
Jack Yud5f1de12017-12-21 11:00:05 -08001736 }
1737
1738 /**
Jack Yu37a1fc32018-10-02 17:01:51 -07001739 * Get the network registration states for the transport type.
Jack Yud5f1de12017-12-21 11:00:05 -08001740 *
Jack Yub4ae4772018-10-02 11:14:38 -07001741 * @param transportType The {@link AccessNetworkConstants.TransportType transport type}
1742 * @return List of {@link NetworkRegistrationState}
1743 * @hide
1744 *
1745 * @deprecated Use {@link #getNetworkRegistrationStatesFromTransportType(int)}
1746 */
1747 @Deprecated
1748 @SystemApi
1749 public List<NetworkRegistrationState> getNetworkRegistrationStates(int transportType) {
Jack Yu37a1fc32018-10-02 17:01:51 -07001750 return getNetworkRegistrationStatesForTransportType(transportType);
Jack Yub4ae4772018-10-02 11:14:38 -07001751 }
1752
1753 /**
Jack Yu37a1fc32018-10-02 17:01:51 -07001754 * Get the network registration states for the transport type.
Jack Yub4ae4772018-10-02 11:14:38 -07001755 *
1756 * @param transportType The {@link AccessNetworkConstants.TransportType transport type}
1757 * @return List of {@link NetworkRegistrationState}
Jack Yud5f1de12017-12-21 11:00:05 -08001758 * @hide
1759 */
Jack Yuf2add902018-07-12 15:10:34 -07001760 @SystemApi
Jack Yu37a1fc32018-10-02 17:01:51 -07001761 public List<NetworkRegistrationState> getNetworkRegistrationStatesForTransportType(
Jack Yub4ae4772018-10-02 11:14:38 -07001762 int transportType) {
Jack Yud5f1de12017-12-21 11:00:05 -08001763 List<NetworkRegistrationState> list = new ArrayList<>();
Malcolm Chen574b41a2018-02-13 15:42:58 -08001764
1765 synchronized (mNetworkRegistrationStates) {
1766 for (NetworkRegistrationState networkRegistrationState : mNetworkRegistrationStates) {
1767 if (networkRegistrationState.getTransportType() == transportType) {
1768 list.add(networkRegistrationState);
1769 }
Jack Yud5f1de12017-12-21 11:00:05 -08001770 }
1771 }
Malcolm Chen574b41a2018-02-13 15:42:58 -08001772
Jack Yud5f1de12017-12-21 11:00:05 -08001773 return list;
1774 }
1775
1776 /**
Jack Yu37a1fc32018-10-02 17:01:51 -07001777 * Get the network registration states for the network domain.
Jack Yud5f1de12017-12-21 11:00:05 -08001778 *
Jack Yub4ae4772018-10-02 11:14:38 -07001779 * @param domain The network {@link NetworkRegistrationState.Domain domain}
1780 * @return List of {@link NetworkRegistrationState}
Jack Yud5f1de12017-12-21 11:00:05 -08001781 * @hide
1782 */
Jack Yuf2add902018-07-12 15:10:34 -07001783 @SystemApi
Jack Yu37a1fc32018-10-02 17:01:51 -07001784 public List<NetworkRegistrationState> getNetworkRegistrationStatesForDomain(
Jack Yub4ae4772018-10-02 11:14:38 -07001785 @Domain int domain) {
1786 List<NetworkRegistrationState> list = new ArrayList<>();
1787
1788 synchronized (mNetworkRegistrationStates) {
1789 for (NetworkRegistrationState networkRegistrationState : mNetworkRegistrationStates) {
1790 if (networkRegistrationState.getDomain() == domain) {
1791 list.add(networkRegistrationState);
1792 }
1793 }
1794 }
1795
1796 return list;
1797 }
1798
1799 /**
Jack Yu37a1fc32018-10-02 17:01:51 -07001800 * Get the network registration state for the transport type and network domain.
Jack Yub4ae4772018-10-02 11:14:38 -07001801 *
1802 * @param domain The network {@link NetworkRegistrationState.Domain domain}
1803 * @param transportType The {@link AccessNetworkConstants.TransportType transport type}
1804 * @return The matching {@link NetworkRegistrationState}
1805 * @hide
1806 *
1807 * @deprecated Use {@link #getNetworkRegistrationState(int, int)}
1808 */
1809 @Deprecated
1810 @SystemApi
1811 public NetworkRegistrationState getNetworkRegistrationStates(@Domain int domain,
1812 int transportType) {
1813 return getNetworkRegistrationState(domain, transportType);
1814 }
1815
1816 /**
Jack Yu37a1fc32018-10-02 17:01:51 -07001817 * Get the network registration state for the transport type and network domain.
Jack Yub4ae4772018-10-02 11:14:38 -07001818 *
1819 * @param domain The network {@link NetworkRegistrationState.Domain domain}
1820 * @param transportType The {@link AccessNetworkConstants.TransportType transport type}
1821 * @return The matching {@link NetworkRegistrationState}
1822 * @hide
1823 *
1824 */
1825 @SystemApi
1826 public NetworkRegistrationState getNetworkRegistrationState(@Domain int domain,
1827 int transportType) {
Malcolm Chen574b41a2018-02-13 15:42:58 -08001828 synchronized (mNetworkRegistrationStates) {
1829 for (NetworkRegistrationState networkRegistrationState : mNetworkRegistrationStates) {
1830 if (networkRegistrationState.getTransportType() == transportType
1831 && networkRegistrationState.getDomain() == domain) {
1832 return networkRegistrationState;
1833 }
Jack Yud5f1de12017-12-21 11:00:05 -08001834 }
1835 }
Malcolm Chen574b41a2018-02-13 15:42:58 -08001836
Jack Yud5f1de12017-12-21 11:00:05 -08001837 return null;
1838 }
Malcolm Chen574b41a2018-02-13 15:42:58 -08001839
1840 /**
1841 * @hide
1842 */
1843 public void addNetworkRegistrationState(NetworkRegistrationState regState) {
1844 if (regState == null) return;
1845
1846 synchronized (mNetworkRegistrationStates) {
1847 for (int i = 0; i < mNetworkRegistrationStates.size(); i++) {
1848 NetworkRegistrationState curRegState = mNetworkRegistrationStates.get(i);
1849 if (curRegState.getTransportType() == regState.getTransportType()
1850 && curRegState.getDomain() == regState.getDomain()) {
1851 mNetworkRegistrationStates.remove(i);
1852 break;
1853 }
1854 }
1855
1856 mNetworkRegistrationStates.add(regState);
1857 }
1858 }
Pengquan Meng27fc25e2018-11-27 16:45:17 -08001859
1860 /**
1861 * @hide
1862 */
1863 public static final int getBetterNRFrequencyRange(int range1, int range2) {
1864 return FREQUENCY_RANGE_ORDER.indexOf(range1) > FREQUENCY_RANGE_ORDER.indexOf(range2)
1865 ? range1
1866 : range2;
1867 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001868}