blob: 0aa0b4a3dded66b1c27fbee6c2bb6931235f00be [file] [log] [blame]
Jason Monkda68f592015-01-07 10:55:58 -05001/*
2 * Copyright (C) 2015 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 */
16package com.android.systemui.statusbar.policy;
17
18import android.content.Context;
19import android.content.Intent;
20import android.net.NetworkCapabilities;
Jason Monk07b75fe2015-05-14 16:47:03 -040021import android.os.Looper;
Jason Monkda68f592015-01-07 10:55:58 -050022import android.telephony.PhoneStateListener;
23import android.telephony.ServiceState;
24import android.telephony.SignalStrength;
25import android.telephony.SubscriptionInfo;
26import android.telephony.SubscriptionManager;
27import android.telephony.TelephonyManager;
28import android.util.Log;
29import android.util.SparseArray;
30
31import com.android.internal.annotations.VisibleForTesting;
Jason Monkda68f592015-01-07 10:55:58 -050032import com.android.internal.telephony.TelephonyIntents;
33import com.android.internal.telephony.cdma.EriInfo;
34import com.android.systemui.R;
Jason Monk07b75fe2015-05-14 16:47:03 -040035import com.android.systemui.statusbar.policy.NetworkController.IconState;
Jason Monkda68f592015-01-07 10:55:58 -050036import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config;
Jason Monkc6cc6262015-06-11 11:10:15 -040037import com.android.systemui.statusbar.policy.NetworkControllerImpl.SubscriptionDefaults;
Jason Monkda68f592015-01-07 10:55:58 -050038
39import java.io.PrintWriter;
Jason Monk33f8ae72015-05-08 10:45:15 -040040import java.util.BitSet;
Jason Monkda68f592015-01-07 10:55:58 -050041import java.util.Objects;
42
43
44public class MobileSignalController extends SignalController<
45 MobileSignalController.MobileState, MobileSignalController.MobileIconGroup> {
46 private final TelephonyManager mPhone;
Jason Monkc6cc6262015-06-11 11:10:15 -040047 private final SubscriptionDefaults mDefaults;
Jason Monkda68f592015-01-07 10:55:58 -050048 private final String mNetworkNameDefault;
49 private final String mNetworkNameSeparator;
50 @VisibleForTesting
51 final PhoneStateListener mPhoneStateListener;
52 // Save entire info for logging, we only use the id.
53 private final SubscriptionInfo mSubscriptionInfo;
54
55 // @VisibleForDemoMode
56 final SparseArray<MobileIconGroup> mNetworkToIconLookup;
57
58 // Since some pieces of the phone state are interdependent we store it locally,
59 // this could potentially become part of MobileState for simplification/complication
60 // of code.
Jason Monkda68f592015-01-07 10:55:58 -050061 private int mDataNetType = TelephonyManager.NETWORK_TYPE_UNKNOWN;
62 private int mDataState = TelephonyManager.DATA_DISCONNECTED;
63 private ServiceState mServiceState;
64 private SignalStrength mSignalStrength;
65 private MobileIconGroup mDefaultIcons;
66 private Config mConfig;
67
68 // TODO: Reduce number of vars passed in, if we have the NetworkController, probably don't
69 // need listener lists anymore.
70 public MobileSignalController(Context context, Config config, boolean hasMobileData,
Jason Monk07b75fe2015-05-14 16:47:03 -040071 TelephonyManager phone, CallbackHandler callbackHandler,
Jason Monkc6cc6262015-06-11 11:10:15 -040072 NetworkControllerImpl networkController, SubscriptionInfo info,
73 SubscriptionDefaults defaults, Looper receiverLooper) {
Jason Monkda68f592015-01-07 10:55:58 -050074 super("MobileSignalController(" + info.getSubscriptionId() + ")", context,
Jason Monk07b75fe2015-05-14 16:47:03 -040075 NetworkCapabilities.TRANSPORT_CELLULAR, callbackHandler,
Jason Monkda68f592015-01-07 10:55:58 -050076 networkController);
77 mNetworkToIconLookup = new SparseArray<>();
78 mConfig = config;
79 mPhone = phone;
Jason Monkc6cc6262015-06-11 11:10:15 -040080 mDefaults = defaults;
Jason Monkda68f592015-01-07 10:55:58 -050081 mSubscriptionInfo = info;
Jason Monk07b75fe2015-05-14 16:47:03 -040082 mPhoneStateListener = new MobilePhoneStateListener(info.getSubscriptionId(),
83 receiverLooper);
Jason Monkda68f592015-01-07 10:55:58 -050084 mNetworkNameSeparator = getStringIfExists(R.string.status_bar_network_name_separator);
85 mNetworkNameDefault = getStringIfExists(
86 com.android.internal.R.string.lockscreen_carrier_default);
87
88 mapIconSets();
89
90 mLastState.networkName = mCurrentState.networkName = mNetworkNameDefault;
Pavel Zhamaitsiak5504d392015-03-27 09:24:47 -070091 mLastState.networkNameData = mCurrentState.networkNameData = mNetworkNameDefault;
Jason Monkda68f592015-01-07 10:55:58 -050092 mLastState.enabled = mCurrentState.enabled = hasMobileData;
93 mLastState.iconGroup = mCurrentState.iconGroup = mDefaultIcons;
94 // Get initial data sim state.
95 updateDataSim();
96 }
97
98 public void setConfiguration(Config config) {
99 mConfig = config;
100 mapIconSets();
101 updateTelephony();
102 }
103
Jason Monkda68f592015-01-07 10:55:58 -0500104 public int getDataContentDescription() {
105 return getIcons().mDataContentDescription;
106 }
107
Jason Monkda68f592015-01-07 10:55:58 -0500108 public void setAirplaneMode(boolean airplaneMode) {
109 mCurrentState.airplaneMode = airplaneMode;
110 notifyListenersIfNecessary();
111 }
112
Jason Monk33f8ae72015-05-08 10:45:15 -0400113 @Override
114 public void updateConnectivity(BitSet connectedTransports, BitSet validatedTransports) {
115 boolean isValidated = validatedTransports.get(mTransportType);
116 mCurrentState.isDefault = connectedTransports.get(mTransportType);
117 // Only show this as not having connectivity if we are default.
118 mCurrentState.inetCondition = (isValidated || !mCurrentState.isDefault) ? 1 : 0;
119 notifyListenersIfNecessary();
Jason Monkda68f592015-01-07 10:55:58 -0500120 }
121
Andrew Flynna478d702015-04-14 23:33:45 -0400122 public void setCarrierNetworkChangeMode(boolean carrierNetworkChangeMode) {
123 mCurrentState.carrierNetworkChangeMode = carrierNetworkChangeMode;
Andrew Flynn2fdbe122015-06-01 16:34:21 -0400124 updateTelephony();
Andrew Flynna478d702015-04-14 23:33:45 -0400125 }
126
Jason Monkda68f592015-01-07 10:55:58 -0500127 /**
128 * Start listening for phone state changes.
129 */
130 public void registerListener() {
131 mPhone.listen(mPhoneStateListener,
132 PhoneStateListener.LISTEN_SERVICE_STATE
133 | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
134 | PhoneStateListener.LISTEN_CALL_STATE
135 | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
Andrew Flynna478d702015-04-14 23:33:45 -0400136 | PhoneStateListener.LISTEN_DATA_ACTIVITY
137 | PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE);
Jason Monkda68f592015-01-07 10:55:58 -0500138 }
139
140 /**
141 * Stop listening for phone state changes.
142 */
143 public void unregisterListener() {
144 mPhone.listen(mPhoneStateListener, 0);
145 }
146
147 /**
148 * Produce a mapping of data network types to icon groups for simple and quick use in
149 * updateTelephony.
150 */
151 private void mapIconSets() {
152 mNetworkToIconLookup.clear();
153
154 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EVDO_0, TelephonyIcons.THREE_G);
155 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EVDO_A, TelephonyIcons.THREE_G);
156 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EVDO_B, TelephonyIcons.THREE_G);
157 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EHRPD, TelephonyIcons.THREE_G);
158 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_UMTS, TelephonyIcons.THREE_G);
159
160 if (!mConfig.showAtLeast3G) {
161 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_UNKNOWN,
162 TelephonyIcons.UNKNOWN);
163 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EDGE, TelephonyIcons.E);
164 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_CDMA, TelephonyIcons.ONE_X);
165 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_1xRTT, TelephonyIcons.ONE_X);
166
167 mDefaultIcons = TelephonyIcons.G;
168 } else {
169 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_UNKNOWN,
170 TelephonyIcons.THREE_G);
171 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EDGE,
172 TelephonyIcons.THREE_G);
173 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_CDMA,
174 TelephonyIcons.THREE_G);
175 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_1xRTT,
176 TelephonyIcons.THREE_G);
177 mDefaultIcons = TelephonyIcons.THREE_G;
178 }
179
180 MobileIconGroup hGroup = TelephonyIcons.THREE_G;
181 if (mConfig.hspaDataDistinguishable) {
182 hGroup = TelephonyIcons.H;
183 }
184 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSDPA, hGroup);
185 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSUPA, hGroup);
186 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSPA, hGroup);
187 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSPAP, hGroup);
188
189 if (mConfig.show4gForLte) {
190 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE, TelephonyIcons.FOUR_G);
191 } else {
192 mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE, TelephonyIcons.LTE);
193 }
194 }
195
196 @Override
197 public void notifyListeners() {
198 MobileIconGroup icons = getIcons();
199
200 String contentDescription = getStringIfExists(getContentDescription());
201 String dataContentDescription = getStringIfExists(icons.mDataContentDescription);
Jeff Davidson5c7daaf2015-01-27 16:24:32 -0800202
Jason Monk33f8ae72015-05-08 10:45:15 -0400203 // Show icon in QS when we are connected or need to show roaming.
204 boolean showDataIcon = mCurrentState.dataConnected
Jeff Davidson5c7daaf2015-01-27 16:24:32 -0800205 || mCurrentState.iconGroup == TelephonyIcons.ROAMING;
Jason Monk07b75fe2015-05-14 16:47:03 -0400206 IconState statusIcon = new IconState(mCurrentState.enabled && !mCurrentState.airplaneMode,
207 getCurrentIconId(), contentDescription);
208
209 int qsTypeIcon = 0;
210 IconState qsIcon = null;
211 String description = null;
Jason Monkda68f592015-01-07 10:55:58 -0500212 // Only send data sim callbacks to QS.
213 if (mCurrentState.dataSim) {
Jason Monk33f8ae72015-05-08 10:45:15 -0400214 qsTypeIcon = showDataIcon ? icons.mQsDataType : 0;
Jason Monk07b75fe2015-05-14 16:47:03 -0400215 qsIcon = new IconState(mCurrentState.enabled
216 && !mCurrentState.isEmergency, getQsCurrentIconId(), contentDescription);
217 description = mCurrentState.isEmergency ? null : mCurrentState.networkName;
Jason Monkda68f592015-01-07 10:55:58 -0500218 }
Jason Monk07b75fe2015-05-14 16:47:03 -0400219 boolean activityIn = mCurrentState.dataConnected
220 && !mCurrentState.carrierNetworkChangeMode
221 && mCurrentState.activityIn;
222 boolean activityOut = mCurrentState.dataConnected
223 && !mCurrentState.carrierNetworkChangeMode
224 && mCurrentState.activityOut;
Jason Monk33f8ae72015-05-08 10:45:15 -0400225 showDataIcon &= mCurrentState.isDefault;
Jason Monkda68f592015-01-07 10:55:58 -0500226 int typeIcon = showDataIcon ? icons.mDataType : 0;
Andrew Flynn2fdbe122015-06-01 16:34:21 -0400227 mCallbackHandler.setMobileDataIndicators(statusIcon, qsIcon, typeIcon, qsTypeIcon,
228 activityIn, activityOut, dataContentDescription, description, icons.mIsWide,
229 mSubscriptionInfo.getSubscriptionId());
Andrew Flynna478d702015-04-14 23:33:45 -0400230 }
231
Jason Monkda68f592015-01-07 10:55:58 -0500232 @Override
233 protected MobileState cleanState() {
234 return new MobileState();
235 }
236
237 private boolean hasService() {
238 if (mServiceState != null) {
239 // Consider the device to be in service if either voice or data
240 // service is available. Some SIM cards are marketed as data-only
241 // and do not support voice service, and on these SIM cards, we
242 // want to show signal bars for data service as well as the "no
243 // service" or "emergency calls only" text that indicates that voice
244 // is not available.
245 switch (mServiceState.getVoiceRegState()) {
246 case ServiceState.STATE_POWER_OFF:
247 return false;
248 case ServiceState.STATE_OUT_OF_SERVICE:
249 case ServiceState.STATE_EMERGENCY_ONLY:
250 return mServiceState.getDataRegState() == ServiceState.STATE_IN_SERVICE;
251 default:
252 return true;
253 }
254 } else {
255 return false;
256 }
257 }
258
259 private boolean isCdma() {
260 return (mSignalStrength != null) && !mSignalStrength.isGsm();
261 }
262
263 public boolean isEmergencyOnly() {
264 return (mServiceState != null && mServiceState.isEmergencyOnly());
265 }
266
267 private boolean isRoaming() {
268 if (isCdma()) {
269 final int iconMode = mServiceState.getCdmaEriIconMode();
270 return mServiceState.getCdmaEriIconIndex() != EriInfo.ROAMING_INDICATOR_OFF
271 && (iconMode == EriInfo.ROAMING_ICON_MODE_NORMAL
272 || iconMode == EriInfo.ROAMING_ICON_MODE_FLASH);
273 } else {
274 return mServiceState != null && mServiceState.getRoaming();
275 }
276 }
277
Andrew Flynna478d702015-04-14 23:33:45 -0400278 private boolean isCarrierNetworkChangeActive() {
Andrew Flynn55fc8002015-05-29 08:33:46 -0400279 return mCurrentState.carrierNetworkChangeMode;
Andrew Flynna478d702015-04-14 23:33:45 -0400280 }
281
Jason Monkda68f592015-01-07 10:55:58 -0500282 public void handleBroadcast(Intent intent) {
283 String action = intent.getAction();
284 if (action.equals(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION)) {
285 updateNetworkName(intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_SPN, false),
286 intent.getStringExtra(TelephonyIntents.EXTRA_SPN),
Pavel Zhamaitsiak5504d392015-03-27 09:24:47 -0700287 intent.getStringExtra(TelephonyIntents.EXTRA_DATA_SPN),
Jason Monkda68f592015-01-07 10:55:58 -0500288 intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_PLMN, false),
289 intent.getStringExtra(TelephonyIntents.EXTRA_PLMN));
290 notifyListenersIfNecessary();
291 } else if (action.equals(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED)) {
292 updateDataSim();
293 }
294 }
295
296 private void updateDataSim() {
Jason Monkc6cc6262015-06-11 11:10:15 -0400297 int defaultDataSub = mDefaults.getDefaultDataSubId();
Jason Monkda68f592015-01-07 10:55:58 -0500298 if (SubscriptionManager.isValidSubscriptionId(defaultDataSub)) {
299 mCurrentState.dataSim = defaultDataSub == mSubscriptionInfo.getSubscriptionId();
300 } else {
301 // There doesn't seem to be a data sim selected, however if
302 // there isn't a MobileSignalController with dataSim set, then
303 // QS won't get any callbacks and will be blank. Instead
304 // lets just assume we are the data sim (which will basically
305 // show one at random) in QS until one is selected. The user
306 // should pick one soon after, so we shouldn't be in this state
307 // for long.
308 mCurrentState.dataSim = true;
309 }
310 notifyListenersIfNecessary();
311 }
312
313 /**
314 * Updates the network's name based on incoming spn and plmn.
315 */
Pavel Zhamaitsiak5504d392015-03-27 09:24:47 -0700316 void updateNetworkName(boolean showSpn, String spn, String dataSpn,
317 boolean showPlmn, String plmn) {
Jason Monkda68f592015-01-07 10:55:58 -0500318 if (CHATTY) {
Pavel Zhamaitsiak5504d392015-03-27 09:24:47 -0700319 Log.d("CarrierLabel", "updateNetworkName showSpn=" + showSpn
320 + " spn=" + spn + " dataSpn=" + dataSpn
Jason Monkda68f592015-01-07 10:55:58 -0500321 + " showPlmn=" + showPlmn + " plmn=" + plmn);
322 }
323 StringBuilder str = new StringBuilder();
Pavel Zhamaitsiak5504d392015-03-27 09:24:47 -0700324 StringBuilder strData = new StringBuilder();
Jason Monkda68f592015-01-07 10:55:58 -0500325 if (showPlmn && plmn != null) {
326 str.append(plmn);
Pavel Zhamaitsiak5504d392015-03-27 09:24:47 -0700327 strData.append(plmn);
Jason Monkda68f592015-01-07 10:55:58 -0500328 }
329 if (showSpn && spn != null) {
330 if (str.length() != 0) {
331 str.append(mNetworkNameSeparator);
332 }
333 str.append(spn);
334 }
335 if (str.length() != 0) {
336 mCurrentState.networkName = str.toString();
337 } else {
338 mCurrentState.networkName = mNetworkNameDefault;
339 }
Pavel Zhamaitsiak5504d392015-03-27 09:24:47 -0700340 if (showSpn && dataSpn != null) {
341 if (strData.length() != 0) {
342 strData.append(mNetworkNameSeparator);
343 }
344 strData.append(dataSpn);
345 }
346 if (strData.length() != 0) {
347 mCurrentState.networkNameData = strData.toString();
348 } else {
349 mCurrentState.networkNameData = mNetworkNameDefault;
350 }
Jason Monkda68f592015-01-07 10:55:58 -0500351 }
352
353 /**
354 * Updates the current state based on mServiceState, mSignalStrength, mDataNetType,
355 * mDataState, and mSimState. It should be called any time one of these is updated.
356 * This will call listeners if necessary.
357 */
358 private final void updateTelephony() {
359 if (DEBUG) {
360 Log.d(mTag, "updateTelephonySignalStrength: hasService=" + hasService()
361 + " ss=" + mSignalStrength);
362 }
363 mCurrentState.connected = hasService() && mSignalStrength != null;
364 if (mCurrentState.connected) {
365 if (!mSignalStrength.isGsm() && mConfig.alwaysShowCdmaRssi) {
366 mCurrentState.level = mSignalStrength.getCdmaLevel();
367 } else {
368 mCurrentState.level = mSignalStrength.getLevel();
369 }
370 }
371 if (mNetworkToIconLookup.indexOfKey(mDataNetType) >= 0) {
372 mCurrentState.iconGroup = mNetworkToIconLookup.get(mDataNetType);
373 } else {
374 mCurrentState.iconGroup = mDefaultIcons;
375 }
376 mCurrentState.dataConnected = mCurrentState.connected
377 && mDataState == TelephonyManager.DATA_CONNECTED;
378
Andrew Flynna478d702015-04-14 23:33:45 -0400379 if (isCarrierNetworkChangeActive()) {
380 mCurrentState.iconGroup = TelephonyIcons.CARRIER_NETWORK_CHANGE;
381 } else if (isRoaming()) {
Jason Monkda68f592015-01-07 10:55:58 -0500382 mCurrentState.iconGroup = TelephonyIcons.ROAMING;
383 }
384 if (isEmergencyOnly() != mCurrentState.isEmergency) {
385 mCurrentState.isEmergency = isEmergencyOnly();
386 mNetworkController.recalculateEmergency();
387 }
388 // Fill in the network name if we think we have it.
389 if (mCurrentState.networkName == mNetworkNameDefault && mServiceState != null
390 && mServiceState.getOperatorAlphaShort() != null) {
391 mCurrentState.networkName = mServiceState.getOperatorAlphaShort();
392 }
Andrew Flynna478d702015-04-14 23:33:45 -0400393
Jason Monkda68f592015-01-07 10:55:58 -0500394 notifyListenersIfNecessary();
395 }
396
397 @VisibleForTesting
398 void setActivity(int activity) {
399 mCurrentState.activityIn = activity == TelephonyManager.DATA_ACTIVITY_INOUT
400 || activity == TelephonyManager.DATA_ACTIVITY_IN;
401 mCurrentState.activityOut = activity == TelephonyManager.DATA_ACTIVITY_INOUT
402 || activity == TelephonyManager.DATA_ACTIVITY_OUT;
403 notifyListenersIfNecessary();
404 }
405
406 @Override
407 public void dump(PrintWriter pw) {
408 super.dump(pw);
409 pw.println(" mSubscription=" + mSubscriptionInfo + ",");
410 pw.println(" mServiceState=" + mServiceState + ",");
411 pw.println(" mSignalStrength=" + mSignalStrength + ",");
412 pw.println(" mDataState=" + mDataState + ",");
413 pw.println(" mDataNetType=" + mDataNetType + ",");
414 }
415
416 class MobilePhoneStateListener extends PhoneStateListener {
Jason Monk07b75fe2015-05-14 16:47:03 -0400417 public MobilePhoneStateListener(int subId, Looper looper) {
418 super(subId, looper);
Jason Monkda68f592015-01-07 10:55:58 -0500419 }
420
421 @Override
422 public void onSignalStrengthsChanged(SignalStrength signalStrength) {
423 if (DEBUG) {
424 Log.d(mTag, "onSignalStrengthsChanged signalStrength=" + signalStrength +
425 ((signalStrength == null) ? "" : (" level=" + signalStrength.getLevel())));
426 }
427 mSignalStrength = signalStrength;
428 updateTelephony();
429 }
430
431 @Override
432 public void onServiceStateChanged(ServiceState state) {
433 if (DEBUG) {
434 Log.d(mTag, "onServiceStateChanged voiceState=" + state.getVoiceRegState()
435 + " dataState=" + state.getDataRegState());
436 }
437 mServiceState = state;
438 updateTelephony();
439 }
440
441 @Override
442 public void onDataConnectionStateChanged(int state, int networkType) {
443 if (DEBUG) {
444 Log.d(mTag, "onDataConnectionStateChanged: state=" + state
445 + " type=" + networkType);
446 }
447 mDataState = state;
448 mDataNetType = networkType;
449 updateTelephony();
450 }
451
452 @Override
453 public void onDataActivity(int direction) {
454 if (DEBUG) {
455 Log.d(mTag, "onDataActivity: direction=" + direction);
456 }
457 setActivity(direction);
458 }
Andrew Flynna478d702015-04-14 23:33:45 -0400459
460 @Override
461 public void onCarrierNetworkChange(boolean active) {
462 if (DEBUG) {
463 Log.d(mTag, "onCarrierNetworkChange: active=" + active);
464 }
465 mCurrentState.carrierNetworkChangeMode = active;
466
467 updateTelephony();
468 }
Jason Monkda68f592015-01-07 10:55:58 -0500469 };
470
471 static class MobileIconGroup extends SignalController.IconGroup {
472 final int mDataContentDescription; // mContentDescriptionDataType
473 final int mDataType;
474 final boolean mIsWide;
Jason Monk33f8ae72015-05-08 10:45:15 -0400475 final int mQsDataType;
Jason Monkda68f592015-01-07 10:55:58 -0500476
477 public MobileIconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc,
478 int sbNullState, int qsNullState, int sbDiscState, int qsDiscState,
479 int discContentDesc, int dataContentDesc, int dataType, boolean isWide,
Jason Monk33f8ae72015-05-08 10:45:15 -0400480 int qsDataType) {
Andrew Flynn2fdbe122015-06-01 16:34:21 -0400481 super(name, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState, sbDiscState,
482 qsDiscState, discContentDesc);
Jason Monkda68f592015-01-07 10:55:58 -0500483 mDataContentDescription = dataContentDesc;
484 mDataType = dataType;
485 mIsWide = isWide;
486 mQsDataType = qsDataType;
487 }
488 }
489
490 static class MobileState extends SignalController.State {
491 String networkName;
Pavel Zhamaitsiak5504d392015-03-27 09:24:47 -0700492 String networkNameData;
Jason Monkda68f592015-01-07 10:55:58 -0500493 boolean dataSim;
494 boolean dataConnected;
495 boolean isEmergency;
496 boolean airplaneMode;
Andrew Flynna478d702015-04-14 23:33:45 -0400497 boolean carrierNetworkChangeMode;
Jason Monk33f8ae72015-05-08 10:45:15 -0400498 boolean isDefault;
Jason Monkda68f592015-01-07 10:55:58 -0500499
500 @Override
501 public void copyFrom(State s) {
502 super.copyFrom(s);
503 MobileState state = (MobileState) s;
504 dataSim = state.dataSim;
505 networkName = state.networkName;
Pavel Zhamaitsiak5504d392015-03-27 09:24:47 -0700506 networkNameData = state.networkNameData;
Jason Monkda68f592015-01-07 10:55:58 -0500507 dataConnected = state.dataConnected;
Jason Monk33f8ae72015-05-08 10:45:15 -0400508 isDefault = state.isDefault;
Jason Monkda68f592015-01-07 10:55:58 -0500509 isEmergency = state.isEmergency;
510 airplaneMode = state.airplaneMode;
Andrew Flynna478d702015-04-14 23:33:45 -0400511 carrierNetworkChangeMode = state.carrierNetworkChangeMode;
Jason Monkda68f592015-01-07 10:55:58 -0500512 }
513
514 @Override
515 protected void toString(StringBuilder builder) {
516 super.toString(builder);
517 builder.append(',');
518 builder.append("dataSim=").append(dataSim).append(',');
519 builder.append("networkName=").append(networkName).append(',');
Pavel Zhamaitsiak5504d392015-03-27 09:24:47 -0700520 builder.append("networkNameData=").append(networkNameData).append(',');
Jason Monkda68f592015-01-07 10:55:58 -0500521 builder.append("dataConnected=").append(dataConnected).append(',');
Jason Monk33f8ae72015-05-08 10:45:15 -0400522 builder.append("isDefault=").append(isDefault).append(',');
Jason Monkda68f592015-01-07 10:55:58 -0500523 builder.append("isEmergency=").append(isEmergency).append(',');
Andrew Flynna478d702015-04-14 23:33:45 -0400524 builder.append("airplaneMode=").append(airplaneMode).append(',');
525 builder.append("carrierNetworkChangeMode=").append(carrierNetworkChangeMode);
Jason Monkda68f592015-01-07 10:55:58 -0500526 }
527
528 @Override
529 public boolean equals(Object o) {
530 return super.equals(o)
531 && Objects.equals(((MobileState) o).networkName, networkName)
Pavel Zhamaitsiak5504d392015-03-27 09:24:47 -0700532 && Objects.equals(((MobileState) o).networkNameData, networkNameData)
Jason Monkda68f592015-01-07 10:55:58 -0500533 && ((MobileState) o).dataSim == dataSim
534 && ((MobileState) o).dataConnected == dataConnected
535 && ((MobileState) o).isEmergency == isEmergency
536 && ((MobileState) o).airplaneMode == airplaneMode
Andrew Flynna478d702015-04-14 23:33:45 -0400537 && ((MobileState) o).carrierNetworkChangeMode == carrierNetworkChangeMode
Jason Monk33f8ae72015-05-08 10:45:15 -0400538 && ((MobileState) o).isDefault == isDefault;
Jason Monkda68f592015-01-07 10:55:58 -0500539 }
540 }
541}