Loading src/java/com/android/internal/telephony/RIL.java +4 −2 Original line number Diff line number Diff line Loading @@ -1494,7 +1494,8 @@ public class RIL extends BaseCommands implements CommandsInterface { if (RILJ_LOGD) { riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + ",accessNetworkType=" + accessNetworkType + ",isRoaming=" + ",accessNetworkType=" + AccessNetworkType.toString(accessNetworkType) + ",isRoaming=" + isRoaming + ",allowRoaming=" + allowRoaming + "," + dataProfile + ",addresses=" + addresses + ",dnses=" + dnses); } Loading @@ -1512,7 +1513,8 @@ public class RIL extends BaseCommands implements CommandsInterface { if (RILJ_LOGD) { riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + ",accessNetworkType=" + accessNetworkType + ",isRoaming=" + ",accessNetworkType=" + AccessNetworkType.toString(accessNetworkType) + ",isRoaming=" + isRoaming + ",allowRoaming=" + allowRoaming + "," + dataProfile + ",addresses=" + addresses + ",dnses=" + dnses); } Loading src/java/com/android/internal/telephony/ServiceStateTracker.java +183 −73 Original line number Diff line number Diff line Loading @@ -77,6 +77,7 @@ import android.util.EventLog; import android.util.LocalLog; import android.util.Pair; import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.StatsLog; import android.util.TimestampedValue; Loading Loading @@ -174,10 +175,10 @@ public class ServiceStateTracker extends Handler { private RegistrantList mVoiceRoamingOffRegistrants = new RegistrantList(); private RegistrantList mDataRoamingOnRegistrants = new RegistrantList(); private RegistrantList mDataRoamingOffRegistrants = new RegistrantList(); protected RegistrantList mAttachedRegistrants = new RegistrantList(); protected RegistrantList mDetachedRegistrants = new RegistrantList(); protected SparseArray<RegistrantList> mAttachedRegistrants = new SparseArray<>(); protected SparseArray<RegistrantList> mDetachedRegistrants = new SparseArray(); private RegistrantList mVoiceRegStateOrRatChangedRegistrants = new RegistrantList(); private RegistrantList mDataRegStateOrRatChangedRegistrants = new RegistrantList(); private SparseArray<RegistrantList> mDataRegStateOrRatChangedRegistrants = new SparseArray<>(); private RegistrantList mNetworkAttachedRegistrants = new RegistrantList(); private RegistrantList mNetworkDetachedRegistrants = new RegistrantList(); private RegistrantList mPsRestrictEnabledRegistrants = new RegistrantList(); Loading Loading @@ -573,9 +574,9 @@ public class ServiceStateTracker extends Handler { CarrierServiceStateTracker.CARRIER_EVENT_VOICE_REGISTRATION, null); registerForNetworkDetached(mCSST, CarrierServiceStateTracker.CARRIER_EVENT_VOICE_DEREGISTRATION, null); registerForDataConnectionAttached(mCSST, registerForDataConnectionAttached(TransportType.WWAN, mCSST, CarrierServiceStateTracker.CARRIER_EVENT_DATA_REGISTRATION, null); registerForDataConnectionDetached(mCSST, registerForDataConnectionDetached(TransportType.WWAN, mCSST, CarrierServiceStateTracker.CARRIER_EVENT_DATA_DEREGISTRATION, null); registerForImsCapabilityChanged(mCSST, CarrierServiceStateTracker.CARRIER_EVENT_IMS_CAPABILITIES_CHANGED, null); Loading @@ -602,8 +603,15 @@ public class ServiceStateTracker extends Handler { } // If we are previously in service, we need to notify that we are out of service now. if (mSS != null && mSS.getDataRegState() == ServiceState.STATE_IN_SERVICE) { mDetachedRegistrants.notifyRegistrants(); for (int transport : mTransportManager.getAvailableTransports()) { if (mSS != null) { NetworkRegistrationState nrs = mSS.getNetworkRegistrationState( NetworkRegistrationState.DOMAIN_PS, transport); if (nrs != null && nrs.isInService() && mDetachedRegistrants.get(transport) != null) { mDetachedRegistrants.get(transport).notifyRegistrants(); } } } mSS = new ServiceState(); Loading Loading @@ -672,7 +680,9 @@ public class ServiceStateTracker extends Handler { // Tell everybody that the registration state and RAT have changed. notifyVoiceRegStateRilRadioTechnologyChanged(); notifyDataRegStateRilRadioTechnologyChanged(); for (int transport : mTransportManager.getAvailableTransports()) { notifyDataRegStateRilRadioTechnologyChanged(transport); } } @VisibleForTesting Loading Loading @@ -738,14 +748,24 @@ public class ServiceStateTracker extends Handler { * AsyncResult in msg.obj where AsyncResult#result contains the * new RAT as an Integer Object. */ protected void notifyDataRegStateRilRadioTechnologyChanged() { int rat = mSS.getRilDataRadioTechnology(); int drs = mSS.getDataRegState(); if (DBG) log("notifyDataRegStateRilRadioTechnologyChanged: drs=" + drs + " rat=" + rat); protected void notifyDataRegStateRilRadioTechnologyChanged(int transport) { NetworkRegistrationState nrs = mSS.getNetworkRegistrationState( NetworkRegistrationState.DOMAIN_PS, transport); if (nrs != null) { int rat = ServiceState.networkTypeToRilRadioTechnology( nrs.getAccessNetworkTechnology()); int drs = regCodeToServiceState(nrs.getRegState()); if (DBG) { log("notifyDataRegStateRilRadioTechnologyChanged: drs=" + drs + " rat=" + rat); } RegistrantList registrantList = mDataRegStateOrRatChangedRegistrants.get(transport); if (registrantList != null) { registrantList.notifyResult(new Pair<>(drs, rat)); } } mPhone.setSystemProperty(TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE, ServiceState.rilRadioTechnologyToString(rat)); mDataRegStateOrRatChangedRegistrants.notifyResult(new Pair<Integer, Integer>(drs, rat)); ServiceState.rilRadioTechnologyToString(mSS.getRilDataRadioTechnology())); } /** Loading Loading @@ -2962,16 +2982,48 @@ public class ServiceStateTracker extends Handler { mSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE && mNewSS.getVoiceRegState() != ServiceState.STATE_IN_SERVICE; boolean hasDataAttached = mSS.getDataRegState() != ServiceState.STATE_IN_SERVICE && mNewSS.getDataRegState() == ServiceState.STATE_IN_SERVICE; SparseBooleanArray hasDataAttached = new SparseBooleanArray( mTransportManager.getAvailableTransports().length); SparseBooleanArray hasDataDetached = new SparseBooleanArray( mTransportManager.getAvailableTransports().length); SparseBooleanArray hasRilDataRadioTechnologyChanged = new SparseBooleanArray( mTransportManager.getAvailableTransports().length); SparseBooleanArray hasDataRegStateChanged = new SparseBooleanArray( mTransportManager.getAvailableTransports().length); boolean anyDataRegChanged = false; boolean anyDataRatChanged = false; for (int transport : mTransportManager.getAvailableTransports()) { NetworkRegistrationState oldNrs = mSS.getNetworkRegistrationState( NetworkRegistrationState.DOMAIN_PS, transport); NetworkRegistrationState newNrs = mNewSS.getNetworkRegistrationState( NetworkRegistrationState.DOMAIN_PS, transport); boolean changed = (oldNrs == null || !oldNrs.isInService()) && (newNrs != null && newNrs.isInService()); hasDataAttached.put(transport, changed); changed = (oldNrs != null && oldNrs.isInService()) && (newNrs == null || !newNrs.isInService()); hasDataDetached.put(transport, changed); boolean hasDataDetached = mSS.getDataRegState() == ServiceState.STATE_IN_SERVICE && mNewSS.getDataRegState() != ServiceState.STATE_IN_SERVICE; int oldRAT = oldNrs != null ? oldNrs.getAccessNetworkTechnology() : TelephonyManager.NETWORK_TYPE_UNKNOWN; int newRAT = newNrs != null ? newNrs.getAccessNetworkTechnology() : TelephonyManager.NETWORK_TYPE_UNKNOWN; hasRilDataRadioTechnologyChanged.put(transport, oldRAT != newRAT); if (oldRAT != newRAT) { anyDataRatChanged = true; } boolean hasDataRegStateChanged = mSS.getDataRegState() != mNewSS.getDataRegState(); int oldRegState = oldNrs != null ? oldNrs.getRegState() : NetworkRegistrationState.REG_STATE_UNKNOWN; int newRegState = newNrs != null ? newNrs.getRegState() : NetworkRegistrationState.REG_STATE_UNKNOWN; hasDataRegStateChanged.put(transport, oldRegState != newRegState); if (oldRegState != newRegState) { anyDataRegChanged = true; } } boolean hasVoiceRegStateChanged = mSS.getVoiceRegState() != mNewSS.getVoiceRegState(); Loading Loading @@ -3001,9 +3053,6 @@ public class ServiceStateTracker extends Handler { boolean hasRilVoiceRadioTechnologyChanged = mSS.getRilVoiceRadioTechnology() != mNewSS.getRilVoiceRadioTechnology(); boolean hasRilDataRadioTechnologyChanged = mSS.getRilDataRadioTechnology() != mNewSS.getRilDataRadioTechnology(); boolean hasChanged = !mNewSS.equals(mSS); boolean hasVoiceRoamingOn = !mSS.getVoiceRoaming() && mNewSS.getVoiceRoaming(); Loading Loading @@ -3070,7 +3119,7 @@ public class ServiceStateTracker extends Handler { } // Add an event log when connection state changes if (hasVoiceRegStateChanged || hasDataRegStateChanged) { if (hasVoiceRegStateChanged || anyDataRegChanged) { EventLog.writeEvent(mPhone.isPhoneTypeGsm() ? EventLogTags.GSM_SERVICE_STATE_CHANGE : EventLogTags.CDMA_SERVICE_STATE_CHANGE, mSS.getVoiceRegState(), mSS.getDataRegState(), Loading Loading @@ -3127,19 +3176,13 @@ public class ServiceStateTracker extends Handler { updatePhoneObject(); } TelephonyManager tm = (TelephonyManager) mPhone.getContext().getSystemService(Context.TELEPHONY_SERVICE); if (hasRilDataRadioTechnologyChanged) { TelephonyManager tm = (TelephonyManager) mPhone.getContext().getSystemService( Context.TELEPHONY_SERVICE); if (anyDataRatChanged) { tm.setDataNetworkTypeForPhone(mPhone.getPhoneId(), mSS.getRilDataRadioTechnology()); StatsLog.write(StatsLog.MOBILE_RADIO_TECHNOLOGY_CHANGED, ServiceState.rilRadioTechnologyToNetworkType(mSS.getRilDataRadioTechnology()), mPhone.getPhoneId()); if (ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN == mSS.getRilDataRadioTechnology()) { log("pollStateDone: IWLAN enabled"); } ServiceState.rilRadioTechnologyToNetworkType( mSS.getRilDataRadioTechnology()), mPhone.getPhoneId()); } if (hasRegistered) { Loading @@ -3159,9 +3202,6 @@ public class ServiceStateTracker extends Handler { updateSpnDisplay(); tm.setNetworkOperatorNameForPhone(mPhone.getPhoneId(), mSS.getOperatorAlpha()); String prevOperatorNumeric = tm.getNetworkOperatorForPhone(mPhone.getPhoneId()); String prevCountryIsoCode = tm.getNetworkCountryIso(mPhone.getPhoneId()); String operatorNumeric = mSS.getOperatorNumeric(); if (!mPhone.isPhoneTypeGsm()) { Loading Loading @@ -3213,34 +3253,56 @@ public class ServiceStateTracker extends Handler { TelephonyMetrics.getInstance().writeServiceStateChanged(mPhone.getPhoneId(), mSS); } if (hasDataAttached || has4gHandoff || hasDataDetached || hasRegistered || hasDeregistered) { logAttachChange(); } boolean shouldLogAttachedChange = false; boolean shouldLogRatChange = false; if (hasDataAttached || has4gHandoff) { mAttachedRegistrants.notifyRegistrants(); if (hasRegistered || hasDeregistered) { shouldLogAttachedChange = true; } if (hasDataDetached) { mDetachedRegistrants.notifyRegistrants(); if (has4gHandoff) { mAttachedRegistrants.get(TransportType.WWAN).notifyRegistrants(); shouldLogAttachedChange = true; } if (hasRilDataRadioTechnologyChanged || hasRilVoiceRadioTechnologyChanged) { logRatChange(); if (hasRilVoiceRadioTechnologyChanged) { shouldLogRatChange = true; notifySignalStrength(); } if (hasVoiceRegStateChanged || hasRilVoiceRadioTechnologyChanged) { notifyVoiceRegStateRilRadioTechnologyChanged(); for (int transport : mTransportManager.getAvailableTransports()) { if (hasRilDataRadioTechnologyChanged.get(transport)) { shouldLogRatChange = true; notifySignalStrength(); } if (hasDataRegStateChanged || hasRilDataRadioTechnologyChanged) { notifyDataRegStateRilRadioTechnologyChanged(); if (hasDataRegStateChanged.get(transport) || hasRilDataRadioTechnologyChanged.get(transport)) { notifyDataRegStateRilRadioTechnologyChanged(transport); mPhone.notifyDataConnection(); } if (hasDataAttached.get(transport)) { shouldLogAttachedChange = true; mAttachedRegistrants.get(transport).notifyRegistrants(); } if (hasDataDetached.get(transport)) { shouldLogAttachedChange = true; mDetachedRegistrants.get(transport).notifyRegistrants(); } } if (shouldLogAttachedChange) { logAttachChange(); } if (shouldLogRatChange) { logRatChange(); } if (hasVoiceRegStateChanged || hasRilVoiceRadioTechnologyChanged) { notifyVoiceRegStateRilRadioTechnologyChanged(); } if (hasVoiceRoamingOn || hasVoiceRoamingOff || hasDataRoamingOn || hasDataRoamingOff) { logRoamingChange(); } Loading Loading @@ -4020,38 +4082,72 @@ public class ServiceStateTracker extends Handler { /** * Registration point for transition into DataConnection attached. * @param transport Transport type * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj */ public void registerForDataConnectionAttached(Handler h, int what, Object obj) { public void registerForDataConnectionAttached(int transport, Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mAttachedRegistrants.add(r); if (mAttachedRegistrants.get(transport) == null) { mAttachedRegistrants.put(transport, new RegistrantList()); } mAttachedRegistrants.get(transport).add(r); if (getCurrentDataConnectionState() == ServiceState.STATE_IN_SERVICE) { if (mSS != null) { NetworkRegistrationState netRegState = mSS.getNetworkRegistrationState( NetworkRegistrationState.DOMAIN_PS, transport); if (netRegState == null || netRegState.isInService()) { r.notifyRegistrant(); } } public void unregisterForDataConnectionAttached(Handler h) { mAttachedRegistrants.remove(h); } /** * Unregister for data attached event * * @param transport Transport type * @param h Handler to notify */ public void unregisterForDataConnectionAttached(int transport, Handler h) { if (mAttachedRegistrants.get(transport) != null) { mAttachedRegistrants.get(transport).remove(h); } } /** * Registration point for transition into DataConnection detached. * @param transport Transport type * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj */ public void registerForDataConnectionDetached(Handler h, int what, Object obj) { public void registerForDataConnectionDetached(int transport, Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mDetachedRegistrants.add(r); if (mDetachedRegistrants.get(transport) == null) { mDetachedRegistrants.put(transport, new RegistrantList()); } mDetachedRegistrants.get(transport).add(r); if (getCurrentDataConnectionState() != ServiceState.STATE_IN_SERVICE) { if (mSS != null) { NetworkRegistrationState netRegState = mSS.getNetworkRegistrationState( NetworkRegistrationState.DOMAIN_PS, transport); if (netRegState != null && !netRegState.isInService()) { r.notifyRegistrant(); } } public void unregisterForDataConnectionDetached(Handler h) { mDetachedRegistrants.remove(h); } /** * Unregister for data detatched event * * @param transport Transport type * @param h Handler to notify */ public void unregisterForDataConnectionDetached(int transport, Handler h) { if (mDetachedRegistrants.get(transport) != null) { mDetachedRegistrants.get(transport).remove(h); } } /** Loading @@ -4078,17 +4174,31 @@ public class ServiceStateTracker extends Handler { * new radio technology will be returned AsyncResult#result as an Integer Object. * The AsyncResult will be in the notification Message#obj. * * @param transport Transport * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj */ public void registerForDataRegStateOrRatChanged(Handler h, int what, Object obj) { public void registerForDataRegStateOrRatChanged(int transport, Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mDataRegStateOrRatChangedRegistrants.add(r); notifyDataRegStateRilRadioTechnologyChanged(); if (mDataRegStateOrRatChangedRegistrants.get(transport) == null) { mDataRegStateOrRatChangedRegistrants.put(transport, new RegistrantList()); } mDataRegStateOrRatChangedRegistrants.get(transport).add(r); notifyDataRegStateRilRadioTechnologyChanged(transport); } /** * Unregister for data registration state changed or RAT changed event * * @param transport Transport * @param h The handler */ public void unregisterForDataRegStateOrRatChanged(int transport, Handler h) { if (mDataRegStateOrRatChangedRegistrants.get(transport) != null) { mDataRegStateOrRatChangedRegistrants.get(transport).remove(h); } public void unregisterForDataRegStateOrRatChanged(Handler h) { mDataRegStateOrRatChangedRegistrants.remove(h); } /** Loading src/java/com/android/internal/telephony/TelephonyTester.java +5 −2 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.net.Uri; import android.os.BadParcelableException; import android.os.Build; import android.os.Bundle; import android.telephony.AccessNetworkConstants.TransportType; import android.telephony.Rlog; import android.telephony.ServiceState; import android.telephony.ims.ImsCallProfile; Loading Loading @@ -148,10 +149,12 @@ public class TelephonyTester { if (DBG) log("sIntentReceiver.onReceive: action=" + action); if (action.equals(mPhone.getActionDetached())) { log("simulate detaching"); mPhone.getServiceStateTracker().mDetachedRegistrants.notifyRegistrants(); mPhone.getServiceStateTracker().mDetachedRegistrants.get(TransportType.WWAN) .notifyRegistrants(); } else if (action.equals(mPhone.getActionAttached())) { log("simulate attaching"); mPhone.getServiceStateTracker().mAttachedRegistrants.notifyRegistrants(); mPhone.getServiceStateTracker().mAttachedRegistrants.get(TransportType.WWAN) .notifyRegistrants(); } else if (action.equals(ACTION_TEST_CONFERENCE_EVENT_PACKAGE)) { log("inject simulated conference event package"); handleTestConferenceEventPackage(context, Loading src/java/com/android/internal/telephony/dataconnection/CellularDataService.java +3 −3 Original line number Diff line number Diff line Loading @@ -125,7 +125,7 @@ public class CellularDataService extends DataService { } @Override public void setupDataCall(int radioTechnology, DataProfile dataProfile, boolean isRoaming, public void setupDataCall(int accessNetworkType, DataProfile dataProfile, boolean isRoaming, boolean allowRoaming, int reason, LinkProperties linkProperties, DataServiceCallback callback) { if (DBG) log("setupDataCall " + getSlotId()); Loading @@ -138,8 +138,8 @@ public class CellularDataService extends DataService { mCallbackMap.put(message, callback); } mPhone.mCi.setupDataCall(radioTechnology, dataProfile, isRoaming, allowRoaming, reason, linkProperties, message); mPhone.mCi.setupDataCall(accessNetworkType, dataProfile, isRoaming, allowRoaming, reason, linkProperties, message); } @Override Loading src/java/com/android/internal/telephony/dataconnection/DataConnection.java +4 −2 Original line number Diff line number Diff line Loading @@ -1363,7 +1363,8 @@ public class DataConnection extends StateMachine { if (DBG) log("DcDefaultState: enter"); // Register for DRS or RAT change mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(getHandler(), mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged( mDataServiceManager.getTransportType(), getHandler(), DataConnection.EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED, null); mPhone.getServiceStateTracker().registerForDataRoamingOn(getHandler(), Loading @@ -1379,7 +1380,8 @@ public class DataConnection extends StateMachine { if (DBG) log("DcDefaultState: exit"); // Unregister for DRS or RAT change. mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(getHandler()); mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged( mDataServiceManager.getTransportType(), getHandler()); mPhone.getServiceStateTracker().unregisterForDataRoamingOn(getHandler()); mPhone.getServiceStateTracker().unregisterForDataRoamingOff(getHandler()); Loading Loading
src/java/com/android/internal/telephony/RIL.java +4 −2 Original line number Diff line number Diff line Loading @@ -1494,7 +1494,8 @@ public class RIL extends BaseCommands implements CommandsInterface { if (RILJ_LOGD) { riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + ",accessNetworkType=" + accessNetworkType + ",isRoaming=" + ",accessNetworkType=" + AccessNetworkType.toString(accessNetworkType) + ",isRoaming=" + isRoaming + ",allowRoaming=" + allowRoaming + "," + dataProfile + ",addresses=" + addresses + ",dnses=" + dnses); } Loading @@ -1512,7 +1513,8 @@ public class RIL extends BaseCommands implements CommandsInterface { if (RILJ_LOGD) { riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + ",accessNetworkType=" + accessNetworkType + ",isRoaming=" + ",accessNetworkType=" + AccessNetworkType.toString(accessNetworkType) + ",isRoaming=" + isRoaming + ",allowRoaming=" + allowRoaming + "," + dataProfile + ",addresses=" + addresses + ",dnses=" + dnses); } Loading
src/java/com/android/internal/telephony/ServiceStateTracker.java +183 −73 Original line number Diff line number Diff line Loading @@ -77,6 +77,7 @@ import android.util.EventLog; import android.util.LocalLog; import android.util.Pair; import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.StatsLog; import android.util.TimestampedValue; Loading Loading @@ -174,10 +175,10 @@ public class ServiceStateTracker extends Handler { private RegistrantList mVoiceRoamingOffRegistrants = new RegistrantList(); private RegistrantList mDataRoamingOnRegistrants = new RegistrantList(); private RegistrantList mDataRoamingOffRegistrants = new RegistrantList(); protected RegistrantList mAttachedRegistrants = new RegistrantList(); protected RegistrantList mDetachedRegistrants = new RegistrantList(); protected SparseArray<RegistrantList> mAttachedRegistrants = new SparseArray<>(); protected SparseArray<RegistrantList> mDetachedRegistrants = new SparseArray(); private RegistrantList mVoiceRegStateOrRatChangedRegistrants = new RegistrantList(); private RegistrantList mDataRegStateOrRatChangedRegistrants = new RegistrantList(); private SparseArray<RegistrantList> mDataRegStateOrRatChangedRegistrants = new SparseArray<>(); private RegistrantList mNetworkAttachedRegistrants = new RegistrantList(); private RegistrantList mNetworkDetachedRegistrants = new RegistrantList(); private RegistrantList mPsRestrictEnabledRegistrants = new RegistrantList(); Loading Loading @@ -573,9 +574,9 @@ public class ServiceStateTracker extends Handler { CarrierServiceStateTracker.CARRIER_EVENT_VOICE_REGISTRATION, null); registerForNetworkDetached(mCSST, CarrierServiceStateTracker.CARRIER_EVENT_VOICE_DEREGISTRATION, null); registerForDataConnectionAttached(mCSST, registerForDataConnectionAttached(TransportType.WWAN, mCSST, CarrierServiceStateTracker.CARRIER_EVENT_DATA_REGISTRATION, null); registerForDataConnectionDetached(mCSST, registerForDataConnectionDetached(TransportType.WWAN, mCSST, CarrierServiceStateTracker.CARRIER_EVENT_DATA_DEREGISTRATION, null); registerForImsCapabilityChanged(mCSST, CarrierServiceStateTracker.CARRIER_EVENT_IMS_CAPABILITIES_CHANGED, null); Loading @@ -602,8 +603,15 @@ public class ServiceStateTracker extends Handler { } // If we are previously in service, we need to notify that we are out of service now. if (mSS != null && mSS.getDataRegState() == ServiceState.STATE_IN_SERVICE) { mDetachedRegistrants.notifyRegistrants(); for (int transport : mTransportManager.getAvailableTransports()) { if (mSS != null) { NetworkRegistrationState nrs = mSS.getNetworkRegistrationState( NetworkRegistrationState.DOMAIN_PS, transport); if (nrs != null && nrs.isInService() && mDetachedRegistrants.get(transport) != null) { mDetachedRegistrants.get(transport).notifyRegistrants(); } } } mSS = new ServiceState(); Loading Loading @@ -672,7 +680,9 @@ public class ServiceStateTracker extends Handler { // Tell everybody that the registration state and RAT have changed. notifyVoiceRegStateRilRadioTechnologyChanged(); notifyDataRegStateRilRadioTechnologyChanged(); for (int transport : mTransportManager.getAvailableTransports()) { notifyDataRegStateRilRadioTechnologyChanged(transport); } } @VisibleForTesting Loading Loading @@ -738,14 +748,24 @@ public class ServiceStateTracker extends Handler { * AsyncResult in msg.obj where AsyncResult#result contains the * new RAT as an Integer Object. */ protected void notifyDataRegStateRilRadioTechnologyChanged() { int rat = mSS.getRilDataRadioTechnology(); int drs = mSS.getDataRegState(); if (DBG) log("notifyDataRegStateRilRadioTechnologyChanged: drs=" + drs + " rat=" + rat); protected void notifyDataRegStateRilRadioTechnologyChanged(int transport) { NetworkRegistrationState nrs = mSS.getNetworkRegistrationState( NetworkRegistrationState.DOMAIN_PS, transport); if (nrs != null) { int rat = ServiceState.networkTypeToRilRadioTechnology( nrs.getAccessNetworkTechnology()); int drs = regCodeToServiceState(nrs.getRegState()); if (DBG) { log("notifyDataRegStateRilRadioTechnologyChanged: drs=" + drs + " rat=" + rat); } RegistrantList registrantList = mDataRegStateOrRatChangedRegistrants.get(transport); if (registrantList != null) { registrantList.notifyResult(new Pair<>(drs, rat)); } } mPhone.setSystemProperty(TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE, ServiceState.rilRadioTechnologyToString(rat)); mDataRegStateOrRatChangedRegistrants.notifyResult(new Pair<Integer, Integer>(drs, rat)); ServiceState.rilRadioTechnologyToString(mSS.getRilDataRadioTechnology())); } /** Loading Loading @@ -2962,16 +2982,48 @@ public class ServiceStateTracker extends Handler { mSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE && mNewSS.getVoiceRegState() != ServiceState.STATE_IN_SERVICE; boolean hasDataAttached = mSS.getDataRegState() != ServiceState.STATE_IN_SERVICE && mNewSS.getDataRegState() == ServiceState.STATE_IN_SERVICE; SparseBooleanArray hasDataAttached = new SparseBooleanArray( mTransportManager.getAvailableTransports().length); SparseBooleanArray hasDataDetached = new SparseBooleanArray( mTransportManager.getAvailableTransports().length); SparseBooleanArray hasRilDataRadioTechnologyChanged = new SparseBooleanArray( mTransportManager.getAvailableTransports().length); SparseBooleanArray hasDataRegStateChanged = new SparseBooleanArray( mTransportManager.getAvailableTransports().length); boolean anyDataRegChanged = false; boolean anyDataRatChanged = false; for (int transport : mTransportManager.getAvailableTransports()) { NetworkRegistrationState oldNrs = mSS.getNetworkRegistrationState( NetworkRegistrationState.DOMAIN_PS, transport); NetworkRegistrationState newNrs = mNewSS.getNetworkRegistrationState( NetworkRegistrationState.DOMAIN_PS, transport); boolean changed = (oldNrs == null || !oldNrs.isInService()) && (newNrs != null && newNrs.isInService()); hasDataAttached.put(transport, changed); changed = (oldNrs != null && oldNrs.isInService()) && (newNrs == null || !newNrs.isInService()); hasDataDetached.put(transport, changed); boolean hasDataDetached = mSS.getDataRegState() == ServiceState.STATE_IN_SERVICE && mNewSS.getDataRegState() != ServiceState.STATE_IN_SERVICE; int oldRAT = oldNrs != null ? oldNrs.getAccessNetworkTechnology() : TelephonyManager.NETWORK_TYPE_UNKNOWN; int newRAT = newNrs != null ? newNrs.getAccessNetworkTechnology() : TelephonyManager.NETWORK_TYPE_UNKNOWN; hasRilDataRadioTechnologyChanged.put(transport, oldRAT != newRAT); if (oldRAT != newRAT) { anyDataRatChanged = true; } boolean hasDataRegStateChanged = mSS.getDataRegState() != mNewSS.getDataRegState(); int oldRegState = oldNrs != null ? oldNrs.getRegState() : NetworkRegistrationState.REG_STATE_UNKNOWN; int newRegState = newNrs != null ? newNrs.getRegState() : NetworkRegistrationState.REG_STATE_UNKNOWN; hasDataRegStateChanged.put(transport, oldRegState != newRegState); if (oldRegState != newRegState) { anyDataRegChanged = true; } } boolean hasVoiceRegStateChanged = mSS.getVoiceRegState() != mNewSS.getVoiceRegState(); Loading Loading @@ -3001,9 +3053,6 @@ public class ServiceStateTracker extends Handler { boolean hasRilVoiceRadioTechnologyChanged = mSS.getRilVoiceRadioTechnology() != mNewSS.getRilVoiceRadioTechnology(); boolean hasRilDataRadioTechnologyChanged = mSS.getRilDataRadioTechnology() != mNewSS.getRilDataRadioTechnology(); boolean hasChanged = !mNewSS.equals(mSS); boolean hasVoiceRoamingOn = !mSS.getVoiceRoaming() && mNewSS.getVoiceRoaming(); Loading Loading @@ -3070,7 +3119,7 @@ public class ServiceStateTracker extends Handler { } // Add an event log when connection state changes if (hasVoiceRegStateChanged || hasDataRegStateChanged) { if (hasVoiceRegStateChanged || anyDataRegChanged) { EventLog.writeEvent(mPhone.isPhoneTypeGsm() ? EventLogTags.GSM_SERVICE_STATE_CHANGE : EventLogTags.CDMA_SERVICE_STATE_CHANGE, mSS.getVoiceRegState(), mSS.getDataRegState(), Loading Loading @@ -3127,19 +3176,13 @@ public class ServiceStateTracker extends Handler { updatePhoneObject(); } TelephonyManager tm = (TelephonyManager) mPhone.getContext().getSystemService(Context.TELEPHONY_SERVICE); if (hasRilDataRadioTechnologyChanged) { TelephonyManager tm = (TelephonyManager) mPhone.getContext().getSystemService( Context.TELEPHONY_SERVICE); if (anyDataRatChanged) { tm.setDataNetworkTypeForPhone(mPhone.getPhoneId(), mSS.getRilDataRadioTechnology()); StatsLog.write(StatsLog.MOBILE_RADIO_TECHNOLOGY_CHANGED, ServiceState.rilRadioTechnologyToNetworkType(mSS.getRilDataRadioTechnology()), mPhone.getPhoneId()); if (ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN == mSS.getRilDataRadioTechnology()) { log("pollStateDone: IWLAN enabled"); } ServiceState.rilRadioTechnologyToNetworkType( mSS.getRilDataRadioTechnology()), mPhone.getPhoneId()); } if (hasRegistered) { Loading @@ -3159,9 +3202,6 @@ public class ServiceStateTracker extends Handler { updateSpnDisplay(); tm.setNetworkOperatorNameForPhone(mPhone.getPhoneId(), mSS.getOperatorAlpha()); String prevOperatorNumeric = tm.getNetworkOperatorForPhone(mPhone.getPhoneId()); String prevCountryIsoCode = tm.getNetworkCountryIso(mPhone.getPhoneId()); String operatorNumeric = mSS.getOperatorNumeric(); if (!mPhone.isPhoneTypeGsm()) { Loading Loading @@ -3213,34 +3253,56 @@ public class ServiceStateTracker extends Handler { TelephonyMetrics.getInstance().writeServiceStateChanged(mPhone.getPhoneId(), mSS); } if (hasDataAttached || has4gHandoff || hasDataDetached || hasRegistered || hasDeregistered) { logAttachChange(); } boolean shouldLogAttachedChange = false; boolean shouldLogRatChange = false; if (hasDataAttached || has4gHandoff) { mAttachedRegistrants.notifyRegistrants(); if (hasRegistered || hasDeregistered) { shouldLogAttachedChange = true; } if (hasDataDetached) { mDetachedRegistrants.notifyRegistrants(); if (has4gHandoff) { mAttachedRegistrants.get(TransportType.WWAN).notifyRegistrants(); shouldLogAttachedChange = true; } if (hasRilDataRadioTechnologyChanged || hasRilVoiceRadioTechnologyChanged) { logRatChange(); if (hasRilVoiceRadioTechnologyChanged) { shouldLogRatChange = true; notifySignalStrength(); } if (hasVoiceRegStateChanged || hasRilVoiceRadioTechnologyChanged) { notifyVoiceRegStateRilRadioTechnologyChanged(); for (int transport : mTransportManager.getAvailableTransports()) { if (hasRilDataRadioTechnologyChanged.get(transport)) { shouldLogRatChange = true; notifySignalStrength(); } if (hasDataRegStateChanged || hasRilDataRadioTechnologyChanged) { notifyDataRegStateRilRadioTechnologyChanged(); if (hasDataRegStateChanged.get(transport) || hasRilDataRadioTechnologyChanged.get(transport)) { notifyDataRegStateRilRadioTechnologyChanged(transport); mPhone.notifyDataConnection(); } if (hasDataAttached.get(transport)) { shouldLogAttachedChange = true; mAttachedRegistrants.get(transport).notifyRegistrants(); } if (hasDataDetached.get(transport)) { shouldLogAttachedChange = true; mDetachedRegistrants.get(transport).notifyRegistrants(); } } if (shouldLogAttachedChange) { logAttachChange(); } if (shouldLogRatChange) { logRatChange(); } if (hasVoiceRegStateChanged || hasRilVoiceRadioTechnologyChanged) { notifyVoiceRegStateRilRadioTechnologyChanged(); } if (hasVoiceRoamingOn || hasVoiceRoamingOff || hasDataRoamingOn || hasDataRoamingOff) { logRoamingChange(); } Loading Loading @@ -4020,38 +4082,72 @@ public class ServiceStateTracker extends Handler { /** * Registration point for transition into DataConnection attached. * @param transport Transport type * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj */ public void registerForDataConnectionAttached(Handler h, int what, Object obj) { public void registerForDataConnectionAttached(int transport, Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mAttachedRegistrants.add(r); if (mAttachedRegistrants.get(transport) == null) { mAttachedRegistrants.put(transport, new RegistrantList()); } mAttachedRegistrants.get(transport).add(r); if (getCurrentDataConnectionState() == ServiceState.STATE_IN_SERVICE) { if (mSS != null) { NetworkRegistrationState netRegState = mSS.getNetworkRegistrationState( NetworkRegistrationState.DOMAIN_PS, transport); if (netRegState == null || netRegState.isInService()) { r.notifyRegistrant(); } } public void unregisterForDataConnectionAttached(Handler h) { mAttachedRegistrants.remove(h); } /** * Unregister for data attached event * * @param transport Transport type * @param h Handler to notify */ public void unregisterForDataConnectionAttached(int transport, Handler h) { if (mAttachedRegistrants.get(transport) != null) { mAttachedRegistrants.get(transport).remove(h); } } /** * Registration point for transition into DataConnection detached. * @param transport Transport type * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj */ public void registerForDataConnectionDetached(Handler h, int what, Object obj) { public void registerForDataConnectionDetached(int transport, Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mDetachedRegistrants.add(r); if (mDetachedRegistrants.get(transport) == null) { mDetachedRegistrants.put(transport, new RegistrantList()); } mDetachedRegistrants.get(transport).add(r); if (getCurrentDataConnectionState() != ServiceState.STATE_IN_SERVICE) { if (mSS != null) { NetworkRegistrationState netRegState = mSS.getNetworkRegistrationState( NetworkRegistrationState.DOMAIN_PS, transport); if (netRegState != null && !netRegState.isInService()) { r.notifyRegistrant(); } } public void unregisterForDataConnectionDetached(Handler h) { mDetachedRegistrants.remove(h); } /** * Unregister for data detatched event * * @param transport Transport type * @param h Handler to notify */ public void unregisterForDataConnectionDetached(int transport, Handler h) { if (mDetachedRegistrants.get(transport) != null) { mDetachedRegistrants.get(transport).remove(h); } } /** Loading @@ -4078,17 +4174,31 @@ public class ServiceStateTracker extends Handler { * new radio technology will be returned AsyncResult#result as an Integer Object. * The AsyncResult will be in the notification Message#obj. * * @param transport Transport * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj */ public void registerForDataRegStateOrRatChanged(Handler h, int what, Object obj) { public void registerForDataRegStateOrRatChanged(int transport, Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mDataRegStateOrRatChangedRegistrants.add(r); notifyDataRegStateRilRadioTechnologyChanged(); if (mDataRegStateOrRatChangedRegistrants.get(transport) == null) { mDataRegStateOrRatChangedRegistrants.put(transport, new RegistrantList()); } mDataRegStateOrRatChangedRegistrants.get(transport).add(r); notifyDataRegStateRilRadioTechnologyChanged(transport); } /** * Unregister for data registration state changed or RAT changed event * * @param transport Transport * @param h The handler */ public void unregisterForDataRegStateOrRatChanged(int transport, Handler h) { if (mDataRegStateOrRatChangedRegistrants.get(transport) != null) { mDataRegStateOrRatChangedRegistrants.get(transport).remove(h); } public void unregisterForDataRegStateOrRatChanged(Handler h) { mDataRegStateOrRatChangedRegistrants.remove(h); } /** Loading
src/java/com/android/internal/telephony/TelephonyTester.java +5 −2 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.net.Uri; import android.os.BadParcelableException; import android.os.Build; import android.os.Bundle; import android.telephony.AccessNetworkConstants.TransportType; import android.telephony.Rlog; import android.telephony.ServiceState; import android.telephony.ims.ImsCallProfile; Loading Loading @@ -148,10 +149,12 @@ public class TelephonyTester { if (DBG) log("sIntentReceiver.onReceive: action=" + action); if (action.equals(mPhone.getActionDetached())) { log("simulate detaching"); mPhone.getServiceStateTracker().mDetachedRegistrants.notifyRegistrants(); mPhone.getServiceStateTracker().mDetachedRegistrants.get(TransportType.WWAN) .notifyRegistrants(); } else if (action.equals(mPhone.getActionAttached())) { log("simulate attaching"); mPhone.getServiceStateTracker().mAttachedRegistrants.notifyRegistrants(); mPhone.getServiceStateTracker().mAttachedRegistrants.get(TransportType.WWAN) .notifyRegistrants(); } else if (action.equals(ACTION_TEST_CONFERENCE_EVENT_PACKAGE)) { log("inject simulated conference event package"); handleTestConferenceEventPackage(context, Loading
src/java/com/android/internal/telephony/dataconnection/CellularDataService.java +3 −3 Original line number Diff line number Diff line Loading @@ -125,7 +125,7 @@ public class CellularDataService extends DataService { } @Override public void setupDataCall(int radioTechnology, DataProfile dataProfile, boolean isRoaming, public void setupDataCall(int accessNetworkType, DataProfile dataProfile, boolean isRoaming, boolean allowRoaming, int reason, LinkProperties linkProperties, DataServiceCallback callback) { if (DBG) log("setupDataCall " + getSlotId()); Loading @@ -138,8 +138,8 @@ public class CellularDataService extends DataService { mCallbackMap.put(message, callback); } mPhone.mCi.setupDataCall(radioTechnology, dataProfile, isRoaming, allowRoaming, reason, linkProperties, message); mPhone.mCi.setupDataCall(accessNetworkType, dataProfile, isRoaming, allowRoaming, reason, linkProperties, message); } @Override Loading
src/java/com/android/internal/telephony/dataconnection/DataConnection.java +4 −2 Original line number Diff line number Diff line Loading @@ -1363,7 +1363,8 @@ public class DataConnection extends StateMachine { if (DBG) log("DcDefaultState: enter"); // Register for DRS or RAT change mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(getHandler(), mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged( mDataServiceManager.getTransportType(), getHandler(), DataConnection.EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED, null); mPhone.getServiceStateTracker().registerForDataRoamingOn(getHandler(), Loading @@ -1379,7 +1380,8 @@ public class DataConnection extends StateMachine { if (DBG) log("DcDefaultState: exit"); // Unregister for DRS or RAT change. mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(getHandler()); mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged( mDataServiceManager.getTransportType(), getHandler()); mPhone.getServiceStateTracker().unregisterForDataRoamingOn(getHandler()); mPhone.getServiceStateTracker().unregisterForDataRoamingOff(getHandler()); Loading