MobileSignalController.java revision 1a95c86281bc9c2c187b3f4df19d2805595b6f26
1da68f596282e60bee832dff07cc96bf64bd15939Jason Monk/* 2da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * Copyright (C) 2015 The Android Open Source Project 3da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * 4da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); 5da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * you may not use this file except in compliance with the License. 6da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * You may obtain a copy of the License at 7da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * 8da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * http://www.apache.org/licenses/LICENSE-2.0 9da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * 10da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * Unless required by applicable law or agreed to in writing, software 11da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * distributed under the License is distributed on an "AS IS" BASIS, 12da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * See the License for the specific language governing permissions and 14da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * limitations under the License. 15da68f596282e60bee832dff07cc96bf64bd15939Jason Monk */ 16da68f596282e60bee832dff07cc96bf64bd15939Jason Monkpackage com.android.systemui.statusbar.policy; 17da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 18da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport android.content.Context; 19da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport android.content.Intent; 20da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport android.net.NetworkCapabilities; 2107b75fe65dcb5b8add8246654c65f95f1191933eJason Monkimport android.os.Looper; 22da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport android.telephony.PhoneStateListener; 23da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport android.telephony.ServiceState; 24da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport android.telephony.SignalStrength; 25da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport android.telephony.SubscriptionInfo; 26da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport android.telephony.SubscriptionManager; 27da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport android.telephony.TelephonyManager; 2893fb68fdce8f0d28eaa77704e4b00933260b83ddJason Monkimport android.text.TextUtils; 29da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport android.util.Log; 30da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport android.util.SparseArray; 31da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 32da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport com.android.internal.annotations.VisibleForTesting; 33da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport com.android.internal.telephony.TelephonyIntents; 34da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport com.android.internal.telephony.cdma.EriInfo; 35da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport com.android.systemui.R; 3607b75fe65dcb5b8add8246654c65f95f1191933eJason Monkimport com.android.systemui.statusbar.policy.NetworkController.IconState; 37da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport com.android.systemui.statusbar.policy.NetworkControllerImpl.Config; 38c6cc6266c9325f180b1a073f733fdf0a64e9286fJason Monkimport com.android.systemui.statusbar.policy.NetworkControllerImpl.SubscriptionDefaults; 39da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 40da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport java.io.PrintWriter; 4133f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monkimport java.util.BitSet; 42da68f596282e60bee832dff07cc96bf64bd15939Jason Monkimport java.util.Objects; 43da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 44da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 45da68f596282e60bee832dff07cc96bf64bd15939Jason Monkpublic class MobileSignalController extends SignalController< 46da68f596282e60bee832dff07cc96bf64bd15939Jason Monk MobileSignalController.MobileState, MobileSignalController.MobileIconGroup> { 47da68f596282e60bee832dff07cc96bf64bd15939Jason Monk private final TelephonyManager mPhone; 48c6cc6266c9325f180b1a073f733fdf0a64e9286fJason Monk private final SubscriptionDefaults mDefaults; 49da68f596282e60bee832dff07cc96bf64bd15939Jason Monk private final String mNetworkNameDefault; 50da68f596282e60bee832dff07cc96bf64bd15939Jason Monk private final String mNetworkNameSeparator; 51da68f596282e60bee832dff07cc96bf64bd15939Jason Monk @VisibleForTesting 52da68f596282e60bee832dff07cc96bf64bd15939Jason Monk final PhoneStateListener mPhoneStateListener; 53da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // Save entire info for logging, we only use the id. 5466845a36c9eeca5296a2bf86793a5d6bedac1b36Jason Monk final SubscriptionInfo mSubscriptionInfo; 55da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 56da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // @VisibleForDemoMode 57da68f596282e60bee832dff07cc96bf64bd15939Jason Monk final SparseArray<MobileIconGroup> mNetworkToIconLookup; 58da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 59da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // Since some pieces of the phone state are interdependent we store it locally, 60da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // this could potentially become part of MobileState for simplification/complication 61da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // of code. 62da68f596282e60bee832dff07cc96bf64bd15939Jason Monk private int mDataNetType = TelephonyManager.NETWORK_TYPE_UNKNOWN; 63da68f596282e60bee832dff07cc96bf64bd15939Jason Monk private int mDataState = TelephonyManager.DATA_DISCONNECTED; 64da68f596282e60bee832dff07cc96bf64bd15939Jason Monk private ServiceState mServiceState; 65da68f596282e60bee832dff07cc96bf64bd15939Jason Monk private SignalStrength mSignalStrength; 66da68f596282e60bee832dff07cc96bf64bd15939Jason Monk private MobileIconGroup mDefaultIcons; 67da68f596282e60bee832dff07cc96bf64bd15939Jason Monk private Config mConfig; 68da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 69da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // TODO: Reduce number of vars passed in, if we have the NetworkController, probably don't 70da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // need listener lists anymore. 71da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public MobileSignalController(Context context, Config config, boolean hasMobileData, 7207b75fe65dcb5b8add8246654c65f95f1191933eJason Monk TelephonyManager phone, CallbackHandler callbackHandler, 73c6cc6266c9325f180b1a073f733fdf0a64e9286fJason Monk NetworkControllerImpl networkController, SubscriptionInfo info, 74c6cc6266c9325f180b1a073f733fdf0a64e9286fJason Monk SubscriptionDefaults defaults, Looper receiverLooper) { 75da68f596282e60bee832dff07cc96bf64bd15939Jason Monk super("MobileSignalController(" + info.getSubscriptionId() + ")", context, 7607b75fe65dcb5b8add8246654c65f95f1191933eJason Monk NetworkCapabilities.TRANSPORT_CELLULAR, callbackHandler, 77da68f596282e60bee832dff07cc96bf64bd15939Jason Monk networkController); 78da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup = new SparseArray<>(); 79da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mConfig = config; 80da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mPhone = phone; 81c6cc6266c9325f180b1a073f733fdf0a64e9286fJason Monk mDefaults = defaults; 82da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mSubscriptionInfo = info; 8307b75fe65dcb5b8add8246654c65f95f1191933eJason Monk mPhoneStateListener = new MobilePhoneStateListener(info.getSubscriptionId(), 8407b75fe65dcb5b8add8246654c65f95f1191933eJason Monk receiverLooper); 85da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkNameSeparator = getStringIfExists(R.string.status_bar_network_name_separator); 86da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkNameDefault = getStringIfExists( 87da68f596282e60bee832dff07cc96bf64bd15939Jason Monk com.android.internal.R.string.lockscreen_carrier_default); 88da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 89da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mapIconSets(); 90da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 9100aa9d4427cd6ca00edcbc1b7915bc22ac580d6aJason Monk String networkName = info.getCarrierName() != null ? info.getCarrierName().toString() 9200aa9d4427cd6ca00edcbc1b7915bc22ac580d6aJason Monk : mNetworkNameDefault; 9300aa9d4427cd6ca00edcbc1b7915bc22ac580d6aJason Monk mLastState.networkName = mCurrentState.networkName = networkName; 9400aa9d4427cd6ca00edcbc1b7915bc22ac580d6aJason Monk mLastState.networkNameData = mCurrentState.networkNameData = networkName; 95da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mLastState.enabled = mCurrentState.enabled = hasMobileData; 96da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mLastState.iconGroup = mCurrentState.iconGroup = mDefaultIcons; 97da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // Get initial data sim state. 98da68f596282e60bee832dff07cc96bf64bd15939Jason Monk updateDataSim(); 99da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 100da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 101da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public void setConfiguration(Config config) { 102da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mConfig = config; 103da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mapIconSets(); 104da68f596282e60bee832dff07cc96bf64bd15939Jason Monk updateTelephony(); 105da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 106da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 107da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public int getDataContentDescription() { 108da68f596282e60bee832dff07cc96bf64bd15939Jason Monk return getIcons().mDataContentDescription; 109da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 110da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 111da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public void setAirplaneMode(boolean airplaneMode) { 112da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mCurrentState.airplaneMode = airplaneMode; 113da68f596282e60bee832dff07cc96bf64bd15939Jason Monk notifyListenersIfNecessary(); 114da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 115da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 11633f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monk @Override 11733f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monk public void updateConnectivity(BitSet connectedTransports, BitSet validatedTransports) { 11833f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monk boolean isValidated = validatedTransports.get(mTransportType); 11933f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monk mCurrentState.isDefault = connectedTransports.get(mTransportType); 12033f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monk // Only show this as not having connectivity if we are default. 12133f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monk mCurrentState.inetCondition = (isValidated || !mCurrentState.isDefault) ? 1 : 0; 12233f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monk notifyListenersIfNecessary(); 123da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 124da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 125a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn public void setCarrierNetworkChangeMode(boolean carrierNetworkChangeMode) { 126a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn mCurrentState.carrierNetworkChangeMode = carrierNetworkChangeMode; 1272fdbe128209f02725c645f29bff941efe865da56Andrew Flynn updateTelephony(); 128a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn } 129a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn 130da68f596282e60bee832dff07cc96bf64bd15939Jason Monk /** 131da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * Start listening for phone state changes. 132da68f596282e60bee832dff07cc96bf64bd15939Jason Monk */ 133da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public void registerListener() { 134da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mPhone.listen(mPhoneStateListener, 135da68f596282e60bee832dff07cc96bf64bd15939Jason Monk PhoneStateListener.LISTEN_SERVICE_STATE 136da68f596282e60bee832dff07cc96bf64bd15939Jason Monk | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS 137da68f596282e60bee832dff07cc96bf64bd15939Jason Monk | PhoneStateListener.LISTEN_CALL_STATE 138da68f596282e60bee832dff07cc96bf64bd15939Jason Monk | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE 139a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn | PhoneStateListener.LISTEN_DATA_ACTIVITY 140a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn | PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE); 141da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 142da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 143da68f596282e60bee832dff07cc96bf64bd15939Jason Monk /** 144da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * Stop listening for phone state changes. 145da68f596282e60bee832dff07cc96bf64bd15939Jason Monk */ 146da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public void unregisterListener() { 147da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mPhone.listen(mPhoneStateListener, 0); 148da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 149da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 150da68f596282e60bee832dff07cc96bf64bd15939Jason Monk /** 151da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * Produce a mapping of data network types to icon groups for simple and quick use in 152da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * updateTelephony. 153da68f596282e60bee832dff07cc96bf64bd15939Jason Monk */ 154da68f596282e60bee832dff07cc96bf64bd15939Jason Monk private void mapIconSets() { 155da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.clear(); 156da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 157da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EVDO_0, TelephonyIcons.THREE_G); 158da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EVDO_A, TelephonyIcons.THREE_G); 159da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EVDO_B, TelephonyIcons.THREE_G); 160da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EHRPD, TelephonyIcons.THREE_G); 161da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_UMTS, TelephonyIcons.THREE_G); 162da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 163da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (!mConfig.showAtLeast3G) { 164da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_UNKNOWN, 165da68f596282e60bee832dff07cc96bf64bd15939Jason Monk TelephonyIcons.UNKNOWN); 166da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EDGE, TelephonyIcons.E); 167da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_CDMA, TelephonyIcons.ONE_X); 168da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_1xRTT, TelephonyIcons.ONE_X); 169da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 170da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mDefaultIcons = TelephonyIcons.G; 171da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } else { 172da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_UNKNOWN, 173da68f596282e60bee832dff07cc96bf64bd15939Jason Monk TelephonyIcons.THREE_G); 174da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EDGE, 175da68f596282e60bee832dff07cc96bf64bd15939Jason Monk TelephonyIcons.THREE_G); 176da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_CDMA, 177da68f596282e60bee832dff07cc96bf64bd15939Jason Monk TelephonyIcons.THREE_G); 178da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_1xRTT, 179da68f596282e60bee832dff07cc96bf64bd15939Jason Monk TelephonyIcons.THREE_G); 180da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mDefaultIcons = TelephonyIcons.THREE_G; 181da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 182da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 183da68f596282e60bee832dff07cc96bf64bd15939Jason Monk MobileIconGroup hGroup = TelephonyIcons.THREE_G; 184da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (mConfig.hspaDataDistinguishable) { 185da68f596282e60bee832dff07cc96bf64bd15939Jason Monk hGroup = TelephonyIcons.H; 186da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 187da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSDPA, hGroup); 188da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSUPA, hGroup); 189da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSPA, hGroup); 190da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSPAP, hGroup); 191da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 192da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (mConfig.show4gForLte) { 193da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE, TelephonyIcons.FOUR_G); 194da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } else { 195da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE, TelephonyIcons.LTE); 196da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 1977150d7fa357e00b2904ff3bcf9e06a1014bfbb39Jason Monk mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_IWLAN, TelephonyIcons.WFC); 198da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 199da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 200da68f596282e60bee832dff07cc96bf64bd15939Jason Monk @Override 201da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public void notifyListeners() { 202da68f596282e60bee832dff07cc96bf64bd15939Jason Monk MobileIconGroup icons = getIcons(); 203da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 204da68f596282e60bee832dff07cc96bf64bd15939Jason Monk String contentDescription = getStringIfExists(getContentDescription()); 205da68f596282e60bee832dff07cc96bf64bd15939Jason Monk String dataContentDescription = getStringIfExists(icons.mDataContentDescription); 2065c7daaf7763f4c1fc3eb44430d1b2e5bf11130e1Jeff Davidson 20733f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monk // Show icon in QS when we are connected or need to show roaming. 20833f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monk boolean showDataIcon = mCurrentState.dataConnected 2091a95c86281bc9c2c187b3f4df19d2805595b6f26Jason Monk || mCurrentState.iconGroup == TelephonyIcons.ROAMING 2101a95c86281bc9c2c187b3f4df19d2805595b6f26Jason Monk || mCurrentState.iconGroup == TelephonyIcons.DATA_DISABLED; 21107b75fe65dcb5b8add8246654c65f95f1191933eJason Monk IconState statusIcon = new IconState(mCurrentState.enabled && !mCurrentState.airplaneMode, 21207b75fe65dcb5b8add8246654c65f95f1191933eJason Monk getCurrentIconId(), contentDescription); 21307b75fe65dcb5b8add8246654c65f95f1191933eJason Monk 21407b75fe65dcb5b8add8246654c65f95f1191933eJason Monk int qsTypeIcon = 0; 21507b75fe65dcb5b8add8246654c65f95f1191933eJason Monk IconState qsIcon = null; 21607b75fe65dcb5b8add8246654c65f95f1191933eJason Monk String description = null; 217da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // Only send data sim callbacks to QS. 218da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (mCurrentState.dataSim) { 21933f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monk qsTypeIcon = showDataIcon ? icons.mQsDataType : 0; 22007b75fe65dcb5b8add8246654c65f95f1191933eJason Monk qsIcon = new IconState(mCurrentState.enabled 22107b75fe65dcb5b8add8246654c65f95f1191933eJason Monk && !mCurrentState.isEmergency, getQsCurrentIconId(), contentDescription); 22207b75fe65dcb5b8add8246654c65f95f1191933eJason Monk description = mCurrentState.isEmergency ? null : mCurrentState.networkName; 223da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 22407b75fe65dcb5b8add8246654c65f95f1191933eJason Monk boolean activityIn = mCurrentState.dataConnected 22507b75fe65dcb5b8add8246654c65f95f1191933eJason Monk && !mCurrentState.carrierNetworkChangeMode 22607b75fe65dcb5b8add8246654c65f95f1191933eJason Monk && mCurrentState.activityIn; 22707b75fe65dcb5b8add8246654c65f95f1191933eJason Monk boolean activityOut = mCurrentState.dataConnected 22807b75fe65dcb5b8add8246654c65f95f1191933eJason Monk && !mCurrentState.carrierNetworkChangeMode 22907b75fe65dcb5b8add8246654c65f95f1191933eJason Monk && mCurrentState.activityOut; 23061633f18611731d7011facbfe3d14f3ec83d86a3Jason Monk showDataIcon &= mCurrentState.isDefault 2311a95c86281bc9c2c187b3f4df19d2805595b6f26Jason Monk || mCurrentState.iconGroup == TelephonyIcons.ROAMING 2321a95c86281bc9c2c187b3f4df19d2805595b6f26Jason Monk || mCurrentState.iconGroup == TelephonyIcons.DATA_DISABLED; 233da68f596282e60bee832dff07cc96bf64bd15939Jason Monk int typeIcon = showDataIcon ? icons.mDataType : 0; 2342fdbe128209f02725c645f29bff941efe865da56Andrew Flynn mCallbackHandler.setMobileDataIndicators(statusIcon, qsIcon, typeIcon, qsTypeIcon, 2352fdbe128209f02725c645f29bff941efe865da56Andrew Flynn activityIn, activityOut, dataContentDescription, description, icons.mIsWide, 2362fdbe128209f02725c645f29bff941efe865da56Andrew Flynn mSubscriptionInfo.getSubscriptionId()); 237a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn } 238a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn 239da68f596282e60bee832dff07cc96bf64bd15939Jason Monk @Override 240da68f596282e60bee832dff07cc96bf64bd15939Jason Monk protected MobileState cleanState() { 241da68f596282e60bee832dff07cc96bf64bd15939Jason Monk return new MobileState(); 242da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 243da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 244da68f596282e60bee832dff07cc96bf64bd15939Jason Monk private boolean hasService() { 245da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (mServiceState != null) { 246da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // Consider the device to be in service if either voice or data 247da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // service is available. Some SIM cards are marketed as data-only 248da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // and do not support voice service, and on these SIM cards, we 249da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // want to show signal bars for data service as well as the "no 250da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // service" or "emergency calls only" text that indicates that voice 251da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // is not available. 252da68f596282e60bee832dff07cc96bf64bd15939Jason Monk switch (mServiceState.getVoiceRegState()) { 253da68f596282e60bee832dff07cc96bf64bd15939Jason Monk case ServiceState.STATE_POWER_OFF: 254da68f596282e60bee832dff07cc96bf64bd15939Jason Monk return false; 255da68f596282e60bee832dff07cc96bf64bd15939Jason Monk case ServiceState.STATE_OUT_OF_SERVICE: 256da68f596282e60bee832dff07cc96bf64bd15939Jason Monk case ServiceState.STATE_EMERGENCY_ONLY: 257da68f596282e60bee832dff07cc96bf64bd15939Jason Monk return mServiceState.getDataRegState() == ServiceState.STATE_IN_SERVICE; 258da68f596282e60bee832dff07cc96bf64bd15939Jason Monk default: 259da68f596282e60bee832dff07cc96bf64bd15939Jason Monk return true; 260da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 261da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } else { 262da68f596282e60bee832dff07cc96bf64bd15939Jason Monk return false; 263da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 264da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 265da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 266da68f596282e60bee832dff07cc96bf64bd15939Jason Monk private boolean isCdma() { 267da68f596282e60bee832dff07cc96bf64bd15939Jason Monk return (mSignalStrength != null) && !mSignalStrength.isGsm(); 268da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 269da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 270da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public boolean isEmergencyOnly() { 271da68f596282e60bee832dff07cc96bf64bd15939Jason Monk return (mServiceState != null && mServiceState.isEmergencyOnly()); 272da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 273da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 274da68f596282e60bee832dff07cc96bf64bd15939Jason Monk private boolean isRoaming() { 275da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (isCdma()) { 276da68f596282e60bee832dff07cc96bf64bd15939Jason Monk final int iconMode = mServiceState.getCdmaEriIconMode(); 277da68f596282e60bee832dff07cc96bf64bd15939Jason Monk return mServiceState.getCdmaEriIconIndex() != EriInfo.ROAMING_INDICATOR_OFF 278da68f596282e60bee832dff07cc96bf64bd15939Jason Monk && (iconMode == EriInfo.ROAMING_ICON_MODE_NORMAL 279da68f596282e60bee832dff07cc96bf64bd15939Jason Monk || iconMode == EriInfo.ROAMING_ICON_MODE_FLASH); 280da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } else { 281da68f596282e60bee832dff07cc96bf64bd15939Jason Monk return mServiceState != null && mServiceState.getRoaming(); 282da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 283da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 284da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 285a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn private boolean isCarrierNetworkChangeActive() { 28655fc8004ad1896da615fd08caca87d1b393d085cAndrew Flynn return mCurrentState.carrierNetworkChangeMode; 287a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn } 288a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn 289da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public void handleBroadcast(Intent intent) { 290da68f596282e60bee832dff07cc96bf64bd15939Jason Monk String action = intent.getAction(); 291da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (action.equals(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION)) { 292da68f596282e60bee832dff07cc96bf64bd15939Jason Monk updateNetworkName(intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_SPN, false), 293da68f596282e60bee832dff07cc96bf64bd15939Jason Monk intent.getStringExtra(TelephonyIntents.EXTRA_SPN), 2945504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak intent.getStringExtra(TelephonyIntents.EXTRA_DATA_SPN), 295da68f596282e60bee832dff07cc96bf64bd15939Jason Monk intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_PLMN, false), 296da68f596282e60bee832dff07cc96bf64bd15939Jason Monk intent.getStringExtra(TelephonyIntents.EXTRA_PLMN)); 297da68f596282e60bee832dff07cc96bf64bd15939Jason Monk notifyListenersIfNecessary(); 298da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } else if (action.equals(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED)) { 299da68f596282e60bee832dff07cc96bf64bd15939Jason Monk updateDataSim(); 3008fcab35828144e27a32a95ed9bd83e4f6d83ac21Jason Monk notifyListenersIfNecessary(); 301da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 302da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 303da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 304da68f596282e60bee832dff07cc96bf64bd15939Jason Monk private void updateDataSim() { 305c6cc6266c9325f180b1a073f733fdf0a64e9286fJason Monk int defaultDataSub = mDefaults.getDefaultDataSubId(); 306da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (SubscriptionManager.isValidSubscriptionId(defaultDataSub)) { 307da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mCurrentState.dataSim = defaultDataSub == mSubscriptionInfo.getSubscriptionId(); 308da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } else { 309da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // There doesn't seem to be a data sim selected, however if 310da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // there isn't a MobileSignalController with dataSim set, then 311da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // QS won't get any callbacks and will be blank. Instead 312da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // lets just assume we are the data sim (which will basically 313da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // show one at random) in QS until one is selected. The user 314da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // should pick one soon after, so we shouldn't be in this state 315da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // for long. 316da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mCurrentState.dataSim = true; 317da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 318da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 319da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 320da68f596282e60bee832dff07cc96bf64bd15939Jason Monk /** 321da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * Updates the network's name based on incoming spn and plmn. 322da68f596282e60bee832dff07cc96bf64bd15939Jason Monk */ 3235504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak void updateNetworkName(boolean showSpn, String spn, String dataSpn, 3245504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak boolean showPlmn, String plmn) { 325da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (CHATTY) { 3265504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak Log.d("CarrierLabel", "updateNetworkName showSpn=" + showSpn 3275504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak + " spn=" + spn + " dataSpn=" + dataSpn 328da68f596282e60bee832dff07cc96bf64bd15939Jason Monk + " showPlmn=" + showPlmn + " plmn=" + plmn); 329da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 330da68f596282e60bee832dff07cc96bf64bd15939Jason Monk StringBuilder str = new StringBuilder(); 3315504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak StringBuilder strData = new StringBuilder(); 332da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (showPlmn && plmn != null) { 333da68f596282e60bee832dff07cc96bf64bd15939Jason Monk str.append(plmn); 3345504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak strData.append(plmn); 335da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 336da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (showSpn && spn != null) { 337da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (str.length() != 0) { 338da68f596282e60bee832dff07cc96bf64bd15939Jason Monk str.append(mNetworkNameSeparator); 339da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 340da68f596282e60bee832dff07cc96bf64bd15939Jason Monk str.append(spn); 341da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 342da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (str.length() != 0) { 343da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mCurrentState.networkName = str.toString(); 344da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } else { 345da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mCurrentState.networkName = mNetworkNameDefault; 346da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 3475504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak if (showSpn && dataSpn != null) { 3485504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak if (strData.length() != 0) { 3495504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak strData.append(mNetworkNameSeparator); 3505504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak } 3515504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak strData.append(dataSpn); 3525504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak } 3535504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak if (strData.length() != 0) { 3545504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak mCurrentState.networkNameData = strData.toString(); 3555504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak } else { 3565504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak mCurrentState.networkNameData = mNetworkNameDefault; 3575504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak } 358da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 359da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 360da68f596282e60bee832dff07cc96bf64bd15939Jason Monk /** 361da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * Updates the current state based on mServiceState, mSignalStrength, mDataNetType, 362da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * mDataState, and mSimState. It should be called any time one of these is updated. 363da68f596282e60bee832dff07cc96bf64bd15939Jason Monk * This will call listeners if necessary. 364da68f596282e60bee832dff07cc96bf64bd15939Jason Monk */ 365da68f596282e60bee832dff07cc96bf64bd15939Jason Monk private final void updateTelephony() { 366da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (DEBUG) { 367da68f596282e60bee832dff07cc96bf64bd15939Jason Monk Log.d(mTag, "updateTelephonySignalStrength: hasService=" + hasService() 368da68f596282e60bee832dff07cc96bf64bd15939Jason Monk + " ss=" + mSignalStrength); 369da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 370da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mCurrentState.connected = hasService() && mSignalStrength != null; 371da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (mCurrentState.connected) { 372da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (!mSignalStrength.isGsm() && mConfig.alwaysShowCdmaRssi) { 373da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mCurrentState.level = mSignalStrength.getCdmaLevel(); 374da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } else { 375da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mCurrentState.level = mSignalStrength.getLevel(); 376da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 377da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 378da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (mNetworkToIconLookup.indexOfKey(mDataNetType) >= 0) { 379da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mCurrentState.iconGroup = mNetworkToIconLookup.get(mDataNetType); 380da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } else { 381da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mCurrentState.iconGroup = mDefaultIcons; 382da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 383da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mCurrentState.dataConnected = mCurrentState.connected 384da68f596282e60bee832dff07cc96bf64bd15939Jason Monk && mDataState == TelephonyManager.DATA_CONNECTED; 385da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 386a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn if (isCarrierNetworkChangeActive()) { 387a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn mCurrentState.iconGroup = TelephonyIcons.CARRIER_NETWORK_CHANGE; 388a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn } else if (isRoaming()) { 389da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mCurrentState.iconGroup = TelephonyIcons.ROAMING; 3901a95c86281bc9c2c187b3f4df19d2805595b6f26Jason Monk } else if (isDataDisabled()) { 3911a95c86281bc9c2c187b3f4df19d2805595b6f26Jason Monk mCurrentState.iconGroup = TelephonyIcons.DATA_DISABLED; 392da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 393da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (isEmergencyOnly() != mCurrentState.isEmergency) { 394da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mCurrentState.isEmergency = isEmergencyOnly(); 395da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mNetworkController.recalculateEmergency(); 396da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 397da68f596282e60bee832dff07cc96bf64bd15939Jason Monk // Fill in the network name if we think we have it. 398da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (mCurrentState.networkName == mNetworkNameDefault && mServiceState != null 39993fb68fdce8f0d28eaa77704e4b00933260b83ddJason Monk && !TextUtils.isEmpty(mServiceState.getOperatorAlphaShort())) { 400da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mCurrentState.networkName = mServiceState.getOperatorAlphaShort(); 401da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 402a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn 403da68f596282e60bee832dff07cc96bf64bd15939Jason Monk notifyListenersIfNecessary(); 404da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 405da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 4061a95c86281bc9c2c187b3f4df19d2805595b6f26Jason Monk private boolean isDataDisabled() { 4071a95c86281bc9c2c187b3f4df19d2805595b6f26Jason Monk return !mPhone.getDataEnabled(mSubscriptionInfo.getSubscriptionId()); 4081a95c86281bc9c2c187b3f4df19d2805595b6f26Jason Monk } 4091a95c86281bc9c2c187b3f4df19d2805595b6f26Jason Monk 410da68f596282e60bee832dff07cc96bf64bd15939Jason Monk @VisibleForTesting 411da68f596282e60bee832dff07cc96bf64bd15939Jason Monk void setActivity(int activity) { 412da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mCurrentState.activityIn = activity == TelephonyManager.DATA_ACTIVITY_INOUT 413da68f596282e60bee832dff07cc96bf64bd15939Jason Monk || activity == TelephonyManager.DATA_ACTIVITY_IN; 414da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mCurrentState.activityOut = activity == TelephonyManager.DATA_ACTIVITY_INOUT 415da68f596282e60bee832dff07cc96bf64bd15939Jason Monk || activity == TelephonyManager.DATA_ACTIVITY_OUT; 416da68f596282e60bee832dff07cc96bf64bd15939Jason Monk notifyListenersIfNecessary(); 417da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 418da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 419da68f596282e60bee832dff07cc96bf64bd15939Jason Monk @Override 420da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public void dump(PrintWriter pw) { 421da68f596282e60bee832dff07cc96bf64bd15939Jason Monk super.dump(pw); 422da68f596282e60bee832dff07cc96bf64bd15939Jason Monk pw.println(" mSubscription=" + mSubscriptionInfo + ","); 423da68f596282e60bee832dff07cc96bf64bd15939Jason Monk pw.println(" mServiceState=" + mServiceState + ","); 424da68f596282e60bee832dff07cc96bf64bd15939Jason Monk pw.println(" mSignalStrength=" + mSignalStrength + ","); 425da68f596282e60bee832dff07cc96bf64bd15939Jason Monk pw.println(" mDataState=" + mDataState + ","); 426da68f596282e60bee832dff07cc96bf64bd15939Jason Monk pw.println(" mDataNetType=" + mDataNetType + ","); 427da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 428da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 429da68f596282e60bee832dff07cc96bf64bd15939Jason Monk class MobilePhoneStateListener extends PhoneStateListener { 43007b75fe65dcb5b8add8246654c65f95f1191933eJason Monk public MobilePhoneStateListener(int subId, Looper looper) { 43107b75fe65dcb5b8add8246654c65f95f1191933eJason Monk super(subId, looper); 432da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 433da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 434da68f596282e60bee832dff07cc96bf64bd15939Jason Monk @Override 435da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public void onSignalStrengthsChanged(SignalStrength signalStrength) { 436da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (DEBUG) { 437da68f596282e60bee832dff07cc96bf64bd15939Jason Monk Log.d(mTag, "onSignalStrengthsChanged signalStrength=" + signalStrength + 438da68f596282e60bee832dff07cc96bf64bd15939Jason Monk ((signalStrength == null) ? "" : (" level=" + signalStrength.getLevel()))); 439da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 440da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mSignalStrength = signalStrength; 441da68f596282e60bee832dff07cc96bf64bd15939Jason Monk updateTelephony(); 442da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 443da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 444da68f596282e60bee832dff07cc96bf64bd15939Jason Monk @Override 445da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public void onServiceStateChanged(ServiceState state) { 446da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (DEBUG) { 447da68f596282e60bee832dff07cc96bf64bd15939Jason Monk Log.d(mTag, "onServiceStateChanged voiceState=" + state.getVoiceRegState() 448da68f596282e60bee832dff07cc96bf64bd15939Jason Monk + " dataState=" + state.getDataRegState()); 449da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 450da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mServiceState = state; 45167b2c16a9a9060d37888bdab4dfadd384a76e9d7Jason Monk mDataNetType = state.getDataNetworkType(); 452da68f596282e60bee832dff07cc96bf64bd15939Jason Monk updateTelephony(); 453da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 454da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 455da68f596282e60bee832dff07cc96bf64bd15939Jason Monk @Override 456da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public void onDataConnectionStateChanged(int state, int networkType) { 457da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (DEBUG) { 458da68f596282e60bee832dff07cc96bf64bd15939Jason Monk Log.d(mTag, "onDataConnectionStateChanged: state=" + state 459da68f596282e60bee832dff07cc96bf64bd15939Jason Monk + " type=" + networkType); 460da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 461da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mDataState = state; 462da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mDataNetType = networkType; 463da68f596282e60bee832dff07cc96bf64bd15939Jason Monk updateTelephony(); 464da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 465da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 466da68f596282e60bee832dff07cc96bf64bd15939Jason Monk @Override 467da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public void onDataActivity(int direction) { 468da68f596282e60bee832dff07cc96bf64bd15939Jason Monk if (DEBUG) { 469da68f596282e60bee832dff07cc96bf64bd15939Jason Monk Log.d(mTag, "onDataActivity: direction=" + direction); 470da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 471da68f596282e60bee832dff07cc96bf64bd15939Jason Monk setActivity(direction); 472da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 473a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn 474a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn @Override 475a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn public void onCarrierNetworkChange(boolean active) { 476a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn if (DEBUG) { 477a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn Log.d(mTag, "onCarrierNetworkChange: active=" + active); 478a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn } 479a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn mCurrentState.carrierNetworkChangeMode = active; 480a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn 481a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn updateTelephony(); 482a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn } 483da68f596282e60bee832dff07cc96bf64bd15939Jason Monk }; 484da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 485da68f596282e60bee832dff07cc96bf64bd15939Jason Monk static class MobileIconGroup extends SignalController.IconGroup { 486da68f596282e60bee832dff07cc96bf64bd15939Jason Monk final int mDataContentDescription; // mContentDescriptionDataType 487da68f596282e60bee832dff07cc96bf64bd15939Jason Monk final int mDataType; 488da68f596282e60bee832dff07cc96bf64bd15939Jason Monk final boolean mIsWide; 48933f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monk final int mQsDataType; 490da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 491da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public MobileIconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc, 492da68f596282e60bee832dff07cc96bf64bd15939Jason Monk int sbNullState, int qsNullState, int sbDiscState, int qsDiscState, 493da68f596282e60bee832dff07cc96bf64bd15939Jason Monk int discContentDesc, int dataContentDesc, int dataType, boolean isWide, 49433f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monk int qsDataType) { 4952fdbe128209f02725c645f29bff941efe865da56Andrew Flynn super(name, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState, sbDiscState, 4962fdbe128209f02725c645f29bff941efe865da56Andrew Flynn qsDiscState, discContentDesc); 497da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mDataContentDescription = dataContentDesc; 498da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mDataType = dataType; 499da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mIsWide = isWide; 500da68f596282e60bee832dff07cc96bf64bd15939Jason Monk mQsDataType = qsDataType; 501da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 502da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 503da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 504da68f596282e60bee832dff07cc96bf64bd15939Jason Monk static class MobileState extends SignalController.State { 505da68f596282e60bee832dff07cc96bf64bd15939Jason Monk String networkName; 5065504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak String networkNameData; 507da68f596282e60bee832dff07cc96bf64bd15939Jason Monk boolean dataSim; 508da68f596282e60bee832dff07cc96bf64bd15939Jason Monk boolean dataConnected; 509da68f596282e60bee832dff07cc96bf64bd15939Jason Monk boolean isEmergency; 510da68f596282e60bee832dff07cc96bf64bd15939Jason Monk boolean airplaneMode; 511a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn boolean carrierNetworkChangeMode; 51233f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monk boolean isDefault; 513da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 514da68f596282e60bee832dff07cc96bf64bd15939Jason Monk @Override 515da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public void copyFrom(State s) { 516da68f596282e60bee832dff07cc96bf64bd15939Jason Monk super.copyFrom(s); 517da68f596282e60bee832dff07cc96bf64bd15939Jason Monk MobileState state = (MobileState) s; 518da68f596282e60bee832dff07cc96bf64bd15939Jason Monk dataSim = state.dataSim; 519da68f596282e60bee832dff07cc96bf64bd15939Jason Monk networkName = state.networkName; 5205504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak networkNameData = state.networkNameData; 521da68f596282e60bee832dff07cc96bf64bd15939Jason Monk dataConnected = state.dataConnected; 52233f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monk isDefault = state.isDefault; 523da68f596282e60bee832dff07cc96bf64bd15939Jason Monk isEmergency = state.isEmergency; 524da68f596282e60bee832dff07cc96bf64bd15939Jason Monk airplaneMode = state.airplaneMode; 525a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn carrierNetworkChangeMode = state.carrierNetworkChangeMode; 526da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 527da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 528da68f596282e60bee832dff07cc96bf64bd15939Jason Monk @Override 529da68f596282e60bee832dff07cc96bf64bd15939Jason Monk protected void toString(StringBuilder builder) { 530da68f596282e60bee832dff07cc96bf64bd15939Jason Monk super.toString(builder); 531da68f596282e60bee832dff07cc96bf64bd15939Jason Monk builder.append(','); 532da68f596282e60bee832dff07cc96bf64bd15939Jason Monk builder.append("dataSim=").append(dataSim).append(','); 533da68f596282e60bee832dff07cc96bf64bd15939Jason Monk builder.append("networkName=").append(networkName).append(','); 5345504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak builder.append("networkNameData=").append(networkNameData).append(','); 535da68f596282e60bee832dff07cc96bf64bd15939Jason Monk builder.append("dataConnected=").append(dataConnected).append(','); 53633f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monk builder.append("isDefault=").append(isDefault).append(','); 537da68f596282e60bee832dff07cc96bf64bd15939Jason Monk builder.append("isEmergency=").append(isEmergency).append(','); 538a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn builder.append("airplaneMode=").append(airplaneMode).append(','); 539a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn builder.append("carrierNetworkChangeMode=").append(carrierNetworkChangeMode); 540da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 541da68f596282e60bee832dff07cc96bf64bd15939Jason Monk 542da68f596282e60bee832dff07cc96bf64bd15939Jason Monk @Override 543da68f596282e60bee832dff07cc96bf64bd15939Jason Monk public boolean equals(Object o) { 544da68f596282e60bee832dff07cc96bf64bd15939Jason Monk return super.equals(o) 545da68f596282e60bee832dff07cc96bf64bd15939Jason Monk && Objects.equals(((MobileState) o).networkName, networkName) 5465504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak && Objects.equals(((MobileState) o).networkNameData, networkNameData) 547da68f596282e60bee832dff07cc96bf64bd15939Jason Monk && ((MobileState) o).dataSim == dataSim 548da68f596282e60bee832dff07cc96bf64bd15939Jason Monk && ((MobileState) o).dataConnected == dataConnected 549da68f596282e60bee832dff07cc96bf64bd15939Jason Monk && ((MobileState) o).isEmergency == isEmergency 550da68f596282e60bee832dff07cc96bf64bd15939Jason Monk && ((MobileState) o).airplaneMode == airplaneMode 551a478d70a68696380acbd4a9739dfaaebff61c728Andrew Flynn && ((MobileState) o).carrierNetworkChangeMode == carrierNetworkChangeMode 55233f8ae7543fbf7d94266f0f1621ec873aa2542f1Jason Monk && ((MobileState) o).isDefault == isDefault; 553da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 554da68f596282e60bee832dff07cc96bf64bd15939Jason Monk } 555da68f596282e60bee832dff07cc96bf64bd15939Jason Monk} 556