Loading src/java/com/android/internal/telephony/DefaultPhoneNotifier.java +1 −1 Original line number Diff line number Diff line Loading @@ -173,7 +173,7 @@ public class DefaultPhoneNotifier implements PhoneNotifier { networkCapabilities = sender.getNetworkCapabilities(apnType); } ServiceState ss = sender.getServiceState(); if (ss != null) roaming = ss.getRoaming(); if (ss != null) roaming = ss.getDataRoaming(); try { if (mRegistry != null) { Loading src/java/com/android/internal/telephony/ServiceStateTracker.java +100 −14 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.os.Message; import android.os.Registrant; import android.os.RegistrantList; import android.os.SystemClock; import android.os.SystemProperties; import android.telephony.CellInfo; import android.telephony.Rlog; import android.telephony.ServiceState; Loading Loading @@ -103,8 +104,10 @@ public abstract class ServiceStateTracker extends Handler { */ protected boolean mDontPollSignalStrength = false; protected RegistrantList mRoamingOnRegistrants = new RegistrantList(); protected RegistrantList mRoamingOffRegistrants = new RegistrantList(); protected RegistrantList mVoiceRoamingOnRegistrants = new RegistrantList(); protected RegistrantList mVoiceRoamingOffRegistrants = new RegistrantList(); protected RegistrantList mDataRoamingOnRegistrants = new RegistrantList(); protected RegistrantList mDataRoamingOffRegistrants = new RegistrantList(); protected RegistrantList mAttachedRegistrants = new RegistrantList(); protected RegistrantList mDetachedRegistrants = new RegistrantList(); protected RegistrantList mDataRegStateOrRatChangedRegistrants = new RegistrantList(); Loading Loading @@ -334,45 +337,87 @@ public abstract class ServiceStateTracker extends Handler { } /** * Registration point for combined roaming on * Registration point for combined roaming on of mobile voice * combined roaming is true when roaming is true and ONS differs SPN * * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj */ public void registerForRoamingOn(Handler h, int what, Object obj) { public void registerForVoiceRoamingOn(Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mRoamingOnRegistrants.add(r); mVoiceRoamingOnRegistrants.add(r); if (mSS.getRoaming()) { if (mSS.getVoiceRoaming()) { r.notifyRegistrant(); } } public void unregisterForRoamingOn(Handler h) { mRoamingOnRegistrants.remove(h); public void unregisterForVoiceRoamingOn(Handler h) { mVoiceRoamingOnRegistrants.remove(h); } /** * Registration point for combined roaming off * Registration point for roaming off of mobile voice * combined roaming is true when roaming is true and ONS differs SPN * * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj */ public void registerForRoamingOff(Handler h, int what, Object obj) { public void registerForVoiceRoamingOff(Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mRoamingOffRegistrants.add(r); mVoiceRoamingOffRegistrants.add(r); if (!mSS.getRoaming()) { if (!mSS.getVoiceRoaming()) { r.notifyRegistrant(); } } public void unregisterForRoamingOff(Handler h) { mRoamingOffRegistrants.remove(h); public void unregisterForVoiceRoamingOff(Handler h) { mVoiceRoamingOffRegistrants.remove(h); } /** * Registration point for combined roaming on of mobile data * combined roaming is true when roaming is true and ONS differs SPN * * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj */ public void registerForDataRoamingOn(Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mDataRoamingOnRegistrants.add(r); if (mSS.getDataRoaming()) { r.notifyRegistrant(); } } public void unregisterForDataRoamingOn(Handler h) { mDataRoamingOnRegistrants.remove(h); } /** * Registration point for roaming off of mobile data * combined roaming is true when roaming is true and ONS differs SPN * * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj */ public void registerForDataRoamingOff(Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mDataRoamingOffRegistrants.add(r); if (!mSS.getDataRoaming()) { r.notifyRegistrant(); } } public void unregisterForDataRoamingOff(Handler h) { mDataRoamingOffRegistrants.remove(h); } /** Loading Loading @@ -887,4 +932,45 @@ public abstract class ServiceStateTracker extends Handler { MccTable.updateMccMncConfiguration(context, newOp, true); } } /** * Check ISO country by MCC to see if phone is roaming in same registered country */ protected boolean inSameCountry(String operatorNumeric) { if (TextUtils.isEmpty(operatorNumeric) || (operatorNumeric.length() < 5)) { // Not a valid network return false; } final String homeNumeric = getHomeOperatorNumeric(); if (TextUtils.isEmpty(homeNumeric) || (homeNumeric.length() < 5)) { // Not a valid SIM MCC return false; } boolean inSameCountry = true; final String networkMCC = operatorNumeric.substring(0, 3); final String homeMCC = homeNumeric.substring(0, 3); final String networkCountry = MccTable.countryCodeForMcc(Integer.parseInt(networkMCC)); final String homeCountry = MccTable.countryCodeForMcc(Integer.parseInt(homeMCC)); if (networkCountry.isEmpty() || homeCountry.isEmpty()) { // Not a valid country return false; } inSameCountry = homeCountry.equals(networkCountry); if (inSameCountry) { return inSameCountry; } // special same country cases if ("us".equals(homeCountry) && "vi".equals(networkCountry)) { inSameCountry = true; } else if ("vi".equals(homeCountry) && "us".equals(networkCountry)) { inSameCountry = true; } return inSameCountry; } protected abstract void setRoamingType(ServiceState currentServiceState); protected String getHomeOperatorNumeric() { return SystemProperties.get(TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, ""); } } src/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java +27 −9 Original line number Diff line number Diff line Loading @@ -241,6 +241,8 @@ public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker { mNewSS.setRilDataRadioTechnology(type); int dataRegState = regCodeToServiceState(regState); mNewSS.setDataRegState(dataRegState); // voice roaming state in done while handling EVENT_POLL_STATE_REGISTRATION_CDMA mNewSS.setDataRoaming(regCodeIsRoaming(regState)); if (DBG) { log("handlPollStateResultMessage: CdmaLteSST setDataRegState=" + dataRegState + " regState=" + regState Loading Loading @@ -328,9 +330,13 @@ public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker { boolean hasChanged = !mNewSS.equals(mSS); boolean hasRoamingOn = !mSS.getRoaming() && mNewSS.getRoaming(); boolean hasVoiceRoamingOn = !mSS.getVoiceRoaming() && mNewSS.getVoiceRoaming(); boolean hasRoamingOff = mSS.getRoaming() && !mNewSS.getRoaming(); boolean hasVoiceRoamingOff = mSS.getVoiceRoaming() && !mNewSS.getVoiceRoaming(); boolean hasDataRoamingOn = !mSS.getDataRoaming() && mNewSS.getDataRoaming(); boolean hasDataRoamingOff = mSS.getDataRoaming() && !mNewSS.getDataRoaming(); boolean hasLocationChanged = !mNewCellLoc.equals(mCellLoc); Loading Loading @@ -361,8 +367,10 @@ public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker { + " hasVoiceRadioTechnologyChanged= " + hasVoiceRadioTechnologyChanged + " hasDataRadioTechnologyChanged=" + hasDataRadioTechnologyChanged + " hasChanged=" + hasChanged + " hasRoamingOn=" + hasRoamingOn + " hasRoamingOff=" + hasRoamingOff + " hasVoiceRoamingOn=" + hasVoiceRoamingOn + " hasVoiceRoamingOff=" + hasVoiceRoamingOff + " hasDataRoamingOn=" + hasDataRoamingOn + " hasDataRoamingOff=" + hasDataRoamingOff + " hasLocationChanged=" + hasLocationChanged + " has4gHandoff = " + has4gHandoff + " hasMultiApnSupport=" + hasMultiApnSupport Loading Loading @@ -487,9 +495,11 @@ public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker { } mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING, mSS.getRoaming() ? "true" : "false"); (mSS.getVoiceRoaming() || mSS.getDataRoaming()) ? "true" : "false"); updateSpnDisplay(); setRoamingType(mSS); log("Broadcasting ServiceState : " + mSS); mPhone.notifyServiceStateChanged(mSS); } Loading @@ -506,12 +516,20 @@ public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker { mPhone.notifyDataConnection(null); } if (hasRoamingOn) { mRoamingOnRegistrants.notifyRegistrants(); if (hasVoiceRoamingOn) { mVoiceRoamingOnRegistrants.notifyRegistrants(); } if (hasVoiceRoamingOff) { mVoiceRoamingOffRegistrants.notifyRegistrants(); } if (hasDataRoamingOn) { mDataRoamingOnRegistrants.notifyRegistrants(); } if (hasRoamingOff) { mRoamingOffRegistrants.notifyRegistrants(); if (hasDataRoamingOff) { mDataRoamingOffRegistrants.notifyRegistrants(); } if (hasLocationChanged) { Loading src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java +115 −18 Original line number Diff line number Diff line Loading @@ -98,7 +98,6 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { private int mNitzUpdateDiff = SystemProperties.getInt("ro.nitz_update_diff", NITZ_UPDATE_DIFF_DEFAULT); private boolean mCdmaRoaming = false; private int mRoamingIndicator; private boolean mIsInPrl; private int mDefaultRoamingIndicator; Loading Loading @@ -633,6 +632,7 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { int dataRegState = regCodeToServiceState(regState); mNewSS.setDataRegState(dataRegState); mNewSS.setRilDataRadioTechnology(dataRadioTechnology); mNewSS.setDataRoaming(regCodeIsRoaming(regState)); if (DBG) { log("handlPollStateResultMessage: cdma setDataRegState=" + dataRegState + " regState=" + regState Loading Loading @@ -715,8 +715,9 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { // When registration state is roaming and TSB58 // roaming indicator is not in the carrier-specified // list of ERIs for home system, mCdmaRoaming is true. mCdmaRoaming = boolean cdmaRoaming = regCodeIsRoaming(registrationState) && !isRoamIndForHomeSystem(states[10]); mNewSS.setVoiceRoaming(cdmaRoaming); mNewSS.setState (regCodeToServiceState(registrationState)); mNewSS.setRilVoiceRadioTechnology(radioTechnology); Loading Loading @@ -836,9 +837,14 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { // Setting SS Roaming (general) if (mIsSubscriptionFromRuim) { mNewSS.setRoaming(isRoamingBetweenOperators(mCdmaRoaming, mNewSS)); } else { mNewSS.setRoaming(mCdmaRoaming); mNewSS.setVoiceRoaming(isRoamingBetweenOperators(mNewSS.getVoiceRoaming(), mNewSS)); } // For CDMA, voice and data should have the same roaming status final boolean isVoiceInService = (mNewSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE); final int dataRegType = mNewSS.getRilDataRadioTechnology(); if (isVoiceInService && ServiceState.isCdma(dataRegType)) { mNewSS.setDataRoaming(mNewSS.getVoiceRoaming()); } // Setting SS CdmaRoamingIndicator and CdmaDefaultRoamingIndicator Loading Loading @@ -890,7 +896,9 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { if (DBG) { log("Set CDMA Roaming Indicator to: " + mNewSS.getCdmaRoamingIndicator() + ". mCdmaRoaming = " + mCdmaRoaming + ", isPrlLoaded = " + isPrlLoaded + ". voiceRoaming = " + mNewSS.getVoiceRoaming() + ". dataRoaming = " + mNewSS.getDataRoaming() + ", isPrlLoaded = " + isPrlLoaded + ". namMatch = " + namMatch + " , mIsInPrl = " + mIsInPrl + ", mRoamingIndicator = " + mRoamingIndicator + ", mDefaultRoamingIndicator= " + mDefaultRoamingIndicator); Loading @@ -900,6 +908,80 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { } /** * Set both voice and data roaming type, * judging from the roaming indicator * or ISO country of SIM VS network. */ protected void setRoamingType(ServiceState currentServiceState) { final boolean isVoiceInService = (currentServiceState.getVoiceRegState() == ServiceState.STATE_IN_SERVICE); if (isVoiceInService) { if (currentServiceState.getVoiceRoaming()) { // some carrier defines international roaming by indicator int[] intRoamingIndicators = mPhone.getContext().getResources().getIntArray( com.android.internal.R.array.config_cdma_international_roaming_indicators); if ((intRoamingIndicators != null) && (intRoamingIndicators.length > 0)) { // It's domestic roaming at least now currentServiceState.setVoiceRoamingType(ServiceState.ROAMING_TYPE_DOMESTIC); int curRoamingIndicator = currentServiceState.getCdmaRoamingIndicator(); for (int i = 0; i < intRoamingIndicators.length; i++) { if (curRoamingIndicator == intRoamingIndicators[i]) { currentServiceState.setVoiceRoamingType( ServiceState.ROAMING_TYPE_INTERNATIONAL); break; } } } else { // check roaming type by MCC if (inSameCountry(currentServiceState.getVoiceOperatorNumeric())) { currentServiceState.setVoiceRoamingType( ServiceState.ROAMING_TYPE_DOMESTIC); } else { currentServiceState.setVoiceRoamingType( ServiceState.ROAMING_TYPE_INTERNATIONAL); } } } else { currentServiceState.setVoiceRoamingType(ServiceState.ROAMING_TYPE_NOT_ROAMING); } } final boolean isDataInService = (currentServiceState.getDataRegState() == ServiceState.STATE_IN_SERVICE); final int dataRegType = currentServiceState.getRilDataRadioTechnology(); if (isDataInService) { if (!currentServiceState.getDataRoaming()) { currentServiceState.setDataRoamingType(ServiceState.ROAMING_TYPE_NOT_ROAMING); } else if (ServiceState.isCdma(dataRegType)) { if (isVoiceInService) { // CDMA data should have the same state as voice currentServiceState.setDataRoamingType(currentServiceState .getVoiceRoamingType()); } else { // we can not decide CDMA data roaming type without voice // set it as same as last time currentServiceState.setDataRoamingType(ServiceState.ROAMING_TYPE_UNKNOWN); } } else { // take it as 3GPP roaming if (inSameCountry(currentServiceState.getDataOperatorNumeric())) { currentServiceState.setDataRoamingType(ServiceState.ROAMING_TYPE_DOMESTIC); } else { currentServiceState.setDataRoamingType( ServiceState.ROAMING_TYPE_INTERNATIONAL); } } } } protected String getHomeOperatorNumeric() { final String cdmaNumeric = SystemProperties.get(CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC, ""); final String simNumeric = SystemProperties.get( TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, cdmaNumeric); return simNumeric; } protected void setSignalStrengthDefaultValues() { mSignalStrength = new SignalStrength( false); } Loading Loading @@ -1023,7 +1105,8 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { if (DBG) log("pollStateDone: cdma oldSS=[" + mSS + "] newSS=[" + mNewSS + "]"); if (Build.IS_DEBUGGABLE && SystemProperties.getBoolean(PROP_FORCE_ROAMING, false)) { mNewSS.setRoaming(true); mNewSS.setVoiceRoaming(true); mNewSS.setDataRoaming(true); } useDataRegStateForDataOnlyDevices(); Loading Loading @@ -1055,9 +1138,13 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { boolean hasChanged = !mNewSS.equals(mSS); boolean hasRoamingOn = !mSS.getRoaming() && mNewSS.getRoaming(); boolean hasVoiceRoamingOn = !mSS.getVoiceRoaming() && mNewSS.getVoiceRoaming(); boolean hasVoiceRoamingOff = mSS.getVoiceRoaming() && !mNewSS.getVoiceRoaming(); boolean hasRoamingOff = mSS.getRoaming() && !mNewSS.getRoaming(); boolean hasDataRoamingOn = !mSS.getDataRoaming() && mNewSS.getDataRoaming(); boolean hasDataRoamingOff = mSS.getDataRoaming() && !mNewSS.getDataRoaming(); boolean hasLocationChanged = !mNewCellLoc.equals(mCellLoc); Loading Loading @@ -1156,9 +1243,12 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { } mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING, mSS.getRoaming() ? "true" : "false"); (mSS.getVoiceRoaming() || mSS.getDataRoaming()) ? "true" : "false"); updateSpnDisplay(); // set roaming type setRoamingType(mSS); log("Broadcasting ServiceState : " + mSS); mPhone.notifyServiceStateChanged(mSS); } Loading @@ -1175,12 +1265,20 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { mPhone.notifyDataConnection(null); } if (hasRoamingOn) { mRoamingOnRegistrants.notifyRegistrants(); if (hasVoiceRoamingOn) { mVoiceRoamingOnRegistrants.notifyRegistrants(); } if (hasVoiceRoamingOff) { mVoiceRoamingOffRegistrants.notifyRegistrants(); } if (hasDataRoamingOn) { mDataRoamingOnRegistrants.notifyRegistrants(); } if (hasRoamingOff) { mRoamingOffRegistrants.notifyRegistrants(); if (hasDataRoamingOff) { mDataRoamingOffRegistrants.notifyRegistrants(); } if (hasLocationChanged) { Loading Loading @@ -1349,7 +1447,7 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { * code is registration state 0-5 from TS 27.007 7.2 * returns true if registered roam, false otherwise */ private boolean protected boolean regCodeIsRoaming (int code) { // 5 is "in service -- roam" return 5 == code; Loading Loading @@ -1395,8 +1493,8 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { // NOTE: in case of RUIM we should completely ignore the ERI data file and // mOperatorAlphaLong is set from RIL_REQUEST_OPERATOR response 0 (alpha ONS) String onsl = s.getOperatorAlphaLong(); String onss = s.getOperatorAlphaShort(); String onsl = s.getVoiceOperatorAlphaLong(); String onss = s.getVoiceOperatorAlphaShort(); boolean equalsOnsl = onsl != null && spn.equals(onsl); boolean equalsOnss = onss != null && spn.equals(onss); Loading Loading @@ -1892,7 +1990,6 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { pw.println(" mCellLoc=" + mCellLoc); pw.println(" mNewCellLoc=" + mNewCellLoc); pw.println(" mCurrentOtaspMode=" + mCurrentOtaspMode); pw.println(" mCdmaRoaming=" + mCdmaRoaming); pw.println(" mRoamingIndicator=" + mRoamingIndicator); pw.println(" mIsInPrl=" + mIsInPrl); pw.println(" mDefaultRoamingIndicator=" + mDefaultRoamingIndicator); Loading src/java/com/android/internal/telephony/dataconnection/DataConnection.java +6 −6 Original line number Diff line number Diff line Loading @@ -422,7 +422,7 @@ public final class DataConnection extends StateMachine { int networkType = ss.getDataNetworkType(); mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_MOBILE, networkType, NETWORK_TYPE, TelephonyManager.getNetworkTypeName(networkType)); mNetworkInfo.setRoaming(ss.getRoaming()); mNetworkInfo.setRoaming(ss.getDataRoaming()); mNetworkInfo.setIsAvailable(true); addState(mDefaultState); Loading Loading @@ -546,7 +546,7 @@ public final class DataConnection extends StateMachine { } String protocol; if (mPhone.getServiceState().getRoaming()) { if (mPhone.getServiceState().getDataRoaming()) { protocol = mApnSetting.roamingProtocol; } else { protocol = mApnSetting.protocol; Loading Loading @@ -1045,9 +1045,9 @@ public final class DataConnection extends StateMachine { mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(getHandler(), DataConnection.EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED, null); mPhone.getServiceStateTracker().registerForRoamingOn(getHandler(), mPhone.getServiceStateTracker().registerForDataRoamingOn(getHandler(), DataConnection.EVENT_DATA_CONNECTION_ROAM_ON, null); mPhone.getServiceStateTracker().registerForRoamingOff(getHandler(), mPhone.getServiceStateTracker().registerForDataRoamingOff(getHandler(), DataConnection.EVENT_DATA_CONNECTION_ROAM_OFF, null); // Add ourselves to the list of data connections Loading @@ -1060,8 +1060,8 @@ public final class DataConnection extends StateMachine { // Unregister for DRS or RAT change. mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(getHandler()); mPhone.getServiceStateTracker().unregisterForRoamingOn(getHandler()); mPhone.getServiceStateTracker().unregisterForRoamingOff(getHandler()); mPhone.getServiceStateTracker().unregisterForDataRoamingOn(getHandler()); mPhone.getServiceStateTracker().unregisterForDataRoamingOff(getHandler()); // Remove ourselves from the DC lists mDcController.removeDc(DataConnection.this); Loading Loading
src/java/com/android/internal/telephony/DefaultPhoneNotifier.java +1 −1 Original line number Diff line number Diff line Loading @@ -173,7 +173,7 @@ public class DefaultPhoneNotifier implements PhoneNotifier { networkCapabilities = sender.getNetworkCapabilities(apnType); } ServiceState ss = sender.getServiceState(); if (ss != null) roaming = ss.getRoaming(); if (ss != null) roaming = ss.getDataRoaming(); try { if (mRegistry != null) { Loading
src/java/com/android/internal/telephony/ServiceStateTracker.java +100 −14 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.os.Message; import android.os.Registrant; import android.os.RegistrantList; import android.os.SystemClock; import android.os.SystemProperties; import android.telephony.CellInfo; import android.telephony.Rlog; import android.telephony.ServiceState; Loading Loading @@ -103,8 +104,10 @@ public abstract class ServiceStateTracker extends Handler { */ protected boolean mDontPollSignalStrength = false; protected RegistrantList mRoamingOnRegistrants = new RegistrantList(); protected RegistrantList mRoamingOffRegistrants = new RegistrantList(); protected RegistrantList mVoiceRoamingOnRegistrants = new RegistrantList(); protected RegistrantList mVoiceRoamingOffRegistrants = new RegistrantList(); protected RegistrantList mDataRoamingOnRegistrants = new RegistrantList(); protected RegistrantList mDataRoamingOffRegistrants = new RegistrantList(); protected RegistrantList mAttachedRegistrants = new RegistrantList(); protected RegistrantList mDetachedRegistrants = new RegistrantList(); protected RegistrantList mDataRegStateOrRatChangedRegistrants = new RegistrantList(); Loading Loading @@ -334,45 +337,87 @@ public abstract class ServiceStateTracker extends Handler { } /** * Registration point for combined roaming on * Registration point for combined roaming on of mobile voice * combined roaming is true when roaming is true and ONS differs SPN * * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj */ public void registerForRoamingOn(Handler h, int what, Object obj) { public void registerForVoiceRoamingOn(Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mRoamingOnRegistrants.add(r); mVoiceRoamingOnRegistrants.add(r); if (mSS.getRoaming()) { if (mSS.getVoiceRoaming()) { r.notifyRegistrant(); } } public void unregisterForRoamingOn(Handler h) { mRoamingOnRegistrants.remove(h); public void unregisterForVoiceRoamingOn(Handler h) { mVoiceRoamingOnRegistrants.remove(h); } /** * Registration point for combined roaming off * Registration point for roaming off of mobile voice * combined roaming is true when roaming is true and ONS differs SPN * * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj */ public void registerForRoamingOff(Handler h, int what, Object obj) { public void registerForVoiceRoamingOff(Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mRoamingOffRegistrants.add(r); mVoiceRoamingOffRegistrants.add(r); if (!mSS.getRoaming()) { if (!mSS.getVoiceRoaming()) { r.notifyRegistrant(); } } public void unregisterForRoamingOff(Handler h) { mRoamingOffRegistrants.remove(h); public void unregisterForVoiceRoamingOff(Handler h) { mVoiceRoamingOffRegistrants.remove(h); } /** * Registration point for combined roaming on of mobile data * combined roaming is true when roaming is true and ONS differs SPN * * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj */ public void registerForDataRoamingOn(Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mDataRoamingOnRegistrants.add(r); if (mSS.getDataRoaming()) { r.notifyRegistrant(); } } public void unregisterForDataRoamingOn(Handler h) { mDataRoamingOnRegistrants.remove(h); } /** * Registration point for roaming off of mobile data * combined roaming is true when roaming is true and ONS differs SPN * * @param h handler to notify * @param what what code of message when delivered * @param obj placed in Message.obj */ public void registerForDataRoamingOff(Handler h, int what, Object obj) { Registrant r = new Registrant(h, what, obj); mDataRoamingOffRegistrants.add(r); if (!mSS.getDataRoaming()) { r.notifyRegistrant(); } } public void unregisterForDataRoamingOff(Handler h) { mDataRoamingOffRegistrants.remove(h); } /** Loading Loading @@ -887,4 +932,45 @@ public abstract class ServiceStateTracker extends Handler { MccTable.updateMccMncConfiguration(context, newOp, true); } } /** * Check ISO country by MCC to see if phone is roaming in same registered country */ protected boolean inSameCountry(String operatorNumeric) { if (TextUtils.isEmpty(operatorNumeric) || (operatorNumeric.length() < 5)) { // Not a valid network return false; } final String homeNumeric = getHomeOperatorNumeric(); if (TextUtils.isEmpty(homeNumeric) || (homeNumeric.length() < 5)) { // Not a valid SIM MCC return false; } boolean inSameCountry = true; final String networkMCC = operatorNumeric.substring(0, 3); final String homeMCC = homeNumeric.substring(0, 3); final String networkCountry = MccTable.countryCodeForMcc(Integer.parseInt(networkMCC)); final String homeCountry = MccTable.countryCodeForMcc(Integer.parseInt(homeMCC)); if (networkCountry.isEmpty() || homeCountry.isEmpty()) { // Not a valid country return false; } inSameCountry = homeCountry.equals(networkCountry); if (inSameCountry) { return inSameCountry; } // special same country cases if ("us".equals(homeCountry) && "vi".equals(networkCountry)) { inSameCountry = true; } else if ("vi".equals(homeCountry) && "us".equals(networkCountry)) { inSameCountry = true; } return inSameCountry; } protected abstract void setRoamingType(ServiceState currentServiceState); protected String getHomeOperatorNumeric() { return SystemProperties.get(TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, ""); } }
src/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java +27 −9 Original line number Diff line number Diff line Loading @@ -241,6 +241,8 @@ public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker { mNewSS.setRilDataRadioTechnology(type); int dataRegState = regCodeToServiceState(regState); mNewSS.setDataRegState(dataRegState); // voice roaming state in done while handling EVENT_POLL_STATE_REGISTRATION_CDMA mNewSS.setDataRoaming(regCodeIsRoaming(regState)); if (DBG) { log("handlPollStateResultMessage: CdmaLteSST setDataRegState=" + dataRegState + " regState=" + regState Loading Loading @@ -328,9 +330,13 @@ public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker { boolean hasChanged = !mNewSS.equals(mSS); boolean hasRoamingOn = !mSS.getRoaming() && mNewSS.getRoaming(); boolean hasVoiceRoamingOn = !mSS.getVoiceRoaming() && mNewSS.getVoiceRoaming(); boolean hasRoamingOff = mSS.getRoaming() && !mNewSS.getRoaming(); boolean hasVoiceRoamingOff = mSS.getVoiceRoaming() && !mNewSS.getVoiceRoaming(); boolean hasDataRoamingOn = !mSS.getDataRoaming() && mNewSS.getDataRoaming(); boolean hasDataRoamingOff = mSS.getDataRoaming() && !mNewSS.getDataRoaming(); boolean hasLocationChanged = !mNewCellLoc.equals(mCellLoc); Loading Loading @@ -361,8 +367,10 @@ public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker { + " hasVoiceRadioTechnologyChanged= " + hasVoiceRadioTechnologyChanged + " hasDataRadioTechnologyChanged=" + hasDataRadioTechnologyChanged + " hasChanged=" + hasChanged + " hasRoamingOn=" + hasRoamingOn + " hasRoamingOff=" + hasRoamingOff + " hasVoiceRoamingOn=" + hasVoiceRoamingOn + " hasVoiceRoamingOff=" + hasVoiceRoamingOff + " hasDataRoamingOn=" + hasDataRoamingOn + " hasDataRoamingOff=" + hasDataRoamingOff + " hasLocationChanged=" + hasLocationChanged + " has4gHandoff = " + has4gHandoff + " hasMultiApnSupport=" + hasMultiApnSupport Loading Loading @@ -487,9 +495,11 @@ public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker { } mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING, mSS.getRoaming() ? "true" : "false"); (mSS.getVoiceRoaming() || mSS.getDataRoaming()) ? "true" : "false"); updateSpnDisplay(); setRoamingType(mSS); log("Broadcasting ServiceState : " + mSS); mPhone.notifyServiceStateChanged(mSS); } Loading @@ -506,12 +516,20 @@ public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker { mPhone.notifyDataConnection(null); } if (hasRoamingOn) { mRoamingOnRegistrants.notifyRegistrants(); if (hasVoiceRoamingOn) { mVoiceRoamingOnRegistrants.notifyRegistrants(); } if (hasVoiceRoamingOff) { mVoiceRoamingOffRegistrants.notifyRegistrants(); } if (hasDataRoamingOn) { mDataRoamingOnRegistrants.notifyRegistrants(); } if (hasRoamingOff) { mRoamingOffRegistrants.notifyRegistrants(); if (hasDataRoamingOff) { mDataRoamingOffRegistrants.notifyRegistrants(); } if (hasLocationChanged) { Loading
src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java +115 −18 Original line number Diff line number Diff line Loading @@ -98,7 +98,6 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { private int mNitzUpdateDiff = SystemProperties.getInt("ro.nitz_update_diff", NITZ_UPDATE_DIFF_DEFAULT); private boolean mCdmaRoaming = false; private int mRoamingIndicator; private boolean mIsInPrl; private int mDefaultRoamingIndicator; Loading Loading @@ -633,6 +632,7 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { int dataRegState = regCodeToServiceState(regState); mNewSS.setDataRegState(dataRegState); mNewSS.setRilDataRadioTechnology(dataRadioTechnology); mNewSS.setDataRoaming(regCodeIsRoaming(regState)); if (DBG) { log("handlPollStateResultMessage: cdma setDataRegState=" + dataRegState + " regState=" + regState Loading Loading @@ -715,8 +715,9 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { // When registration state is roaming and TSB58 // roaming indicator is not in the carrier-specified // list of ERIs for home system, mCdmaRoaming is true. mCdmaRoaming = boolean cdmaRoaming = regCodeIsRoaming(registrationState) && !isRoamIndForHomeSystem(states[10]); mNewSS.setVoiceRoaming(cdmaRoaming); mNewSS.setState (regCodeToServiceState(registrationState)); mNewSS.setRilVoiceRadioTechnology(radioTechnology); Loading Loading @@ -836,9 +837,14 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { // Setting SS Roaming (general) if (mIsSubscriptionFromRuim) { mNewSS.setRoaming(isRoamingBetweenOperators(mCdmaRoaming, mNewSS)); } else { mNewSS.setRoaming(mCdmaRoaming); mNewSS.setVoiceRoaming(isRoamingBetweenOperators(mNewSS.getVoiceRoaming(), mNewSS)); } // For CDMA, voice and data should have the same roaming status final boolean isVoiceInService = (mNewSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE); final int dataRegType = mNewSS.getRilDataRadioTechnology(); if (isVoiceInService && ServiceState.isCdma(dataRegType)) { mNewSS.setDataRoaming(mNewSS.getVoiceRoaming()); } // Setting SS CdmaRoamingIndicator and CdmaDefaultRoamingIndicator Loading Loading @@ -890,7 +896,9 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { if (DBG) { log("Set CDMA Roaming Indicator to: " + mNewSS.getCdmaRoamingIndicator() + ". mCdmaRoaming = " + mCdmaRoaming + ", isPrlLoaded = " + isPrlLoaded + ". voiceRoaming = " + mNewSS.getVoiceRoaming() + ". dataRoaming = " + mNewSS.getDataRoaming() + ", isPrlLoaded = " + isPrlLoaded + ". namMatch = " + namMatch + " , mIsInPrl = " + mIsInPrl + ", mRoamingIndicator = " + mRoamingIndicator + ", mDefaultRoamingIndicator= " + mDefaultRoamingIndicator); Loading @@ -900,6 +908,80 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { } /** * Set both voice and data roaming type, * judging from the roaming indicator * or ISO country of SIM VS network. */ protected void setRoamingType(ServiceState currentServiceState) { final boolean isVoiceInService = (currentServiceState.getVoiceRegState() == ServiceState.STATE_IN_SERVICE); if (isVoiceInService) { if (currentServiceState.getVoiceRoaming()) { // some carrier defines international roaming by indicator int[] intRoamingIndicators = mPhone.getContext().getResources().getIntArray( com.android.internal.R.array.config_cdma_international_roaming_indicators); if ((intRoamingIndicators != null) && (intRoamingIndicators.length > 0)) { // It's domestic roaming at least now currentServiceState.setVoiceRoamingType(ServiceState.ROAMING_TYPE_DOMESTIC); int curRoamingIndicator = currentServiceState.getCdmaRoamingIndicator(); for (int i = 0; i < intRoamingIndicators.length; i++) { if (curRoamingIndicator == intRoamingIndicators[i]) { currentServiceState.setVoiceRoamingType( ServiceState.ROAMING_TYPE_INTERNATIONAL); break; } } } else { // check roaming type by MCC if (inSameCountry(currentServiceState.getVoiceOperatorNumeric())) { currentServiceState.setVoiceRoamingType( ServiceState.ROAMING_TYPE_DOMESTIC); } else { currentServiceState.setVoiceRoamingType( ServiceState.ROAMING_TYPE_INTERNATIONAL); } } } else { currentServiceState.setVoiceRoamingType(ServiceState.ROAMING_TYPE_NOT_ROAMING); } } final boolean isDataInService = (currentServiceState.getDataRegState() == ServiceState.STATE_IN_SERVICE); final int dataRegType = currentServiceState.getRilDataRadioTechnology(); if (isDataInService) { if (!currentServiceState.getDataRoaming()) { currentServiceState.setDataRoamingType(ServiceState.ROAMING_TYPE_NOT_ROAMING); } else if (ServiceState.isCdma(dataRegType)) { if (isVoiceInService) { // CDMA data should have the same state as voice currentServiceState.setDataRoamingType(currentServiceState .getVoiceRoamingType()); } else { // we can not decide CDMA data roaming type without voice // set it as same as last time currentServiceState.setDataRoamingType(ServiceState.ROAMING_TYPE_UNKNOWN); } } else { // take it as 3GPP roaming if (inSameCountry(currentServiceState.getDataOperatorNumeric())) { currentServiceState.setDataRoamingType(ServiceState.ROAMING_TYPE_DOMESTIC); } else { currentServiceState.setDataRoamingType( ServiceState.ROAMING_TYPE_INTERNATIONAL); } } } } protected String getHomeOperatorNumeric() { final String cdmaNumeric = SystemProperties.get(CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC, ""); final String simNumeric = SystemProperties.get( TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, cdmaNumeric); return simNumeric; } protected void setSignalStrengthDefaultValues() { mSignalStrength = new SignalStrength( false); } Loading Loading @@ -1023,7 +1105,8 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { if (DBG) log("pollStateDone: cdma oldSS=[" + mSS + "] newSS=[" + mNewSS + "]"); if (Build.IS_DEBUGGABLE && SystemProperties.getBoolean(PROP_FORCE_ROAMING, false)) { mNewSS.setRoaming(true); mNewSS.setVoiceRoaming(true); mNewSS.setDataRoaming(true); } useDataRegStateForDataOnlyDevices(); Loading Loading @@ -1055,9 +1138,13 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { boolean hasChanged = !mNewSS.equals(mSS); boolean hasRoamingOn = !mSS.getRoaming() && mNewSS.getRoaming(); boolean hasVoiceRoamingOn = !mSS.getVoiceRoaming() && mNewSS.getVoiceRoaming(); boolean hasVoiceRoamingOff = mSS.getVoiceRoaming() && !mNewSS.getVoiceRoaming(); boolean hasRoamingOff = mSS.getRoaming() && !mNewSS.getRoaming(); boolean hasDataRoamingOn = !mSS.getDataRoaming() && mNewSS.getDataRoaming(); boolean hasDataRoamingOff = mSS.getDataRoaming() && !mNewSS.getDataRoaming(); boolean hasLocationChanged = !mNewCellLoc.equals(mCellLoc); Loading Loading @@ -1156,9 +1243,12 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { } mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING, mSS.getRoaming() ? "true" : "false"); (mSS.getVoiceRoaming() || mSS.getDataRoaming()) ? "true" : "false"); updateSpnDisplay(); // set roaming type setRoamingType(mSS); log("Broadcasting ServiceState : " + mSS); mPhone.notifyServiceStateChanged(mSS); } Loading @@ -1175,12 +1265,20 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { mPhone.notifyDataConnection(null); } if (hasRoamingOn) { mRoamingOnRegistrants.notifyRegistrants(); if (hasVoiceRoamingOn) { mVoiceRoamingOnRegistrants.notifyRegistrants(); } if (hasVoiceRoamingOff) { mVoiceRoamingOffRegistrants.notifyRegistrants(); } if (hasDataRoamingOn) { mDataRoamingOnRegistrants.notifyRegistrants(); } if (hasRoamingOff) { mRoamingOffRegistrants.notifyRegistrants(); if (hasDataRoamingOff) { mDataRoamingOffRegistrants.notifyRegistrants(); } if (hasLocationChanged) { Loading Loading @@ -1349,7 +1447,7 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { * code is registration state 0-5 from TS 27.007 7.2 * returns true if registered roam, false otherwise */ private boolean protected boolean regCodeIsRoaming (int code) { // 5 is "in service -- roam" return 5 == code; Loading Loading @@ -1395,8 +1493,8 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { // NOTE: in case of RUIM we should completely ignore the ERI data file and // mOperatorAlphaLong is set from RIL_REQUEST_OPERATOR response 0 (alpha ONS) String onsl = s.getOperatorAlphaLong(); String onss = s.getOperatorAlphaShort(); String onsl = s.getVoiceOperatorAlphaLong(); String onss = s.getVoiceOperatorAlphaShort(); boolean equalsOnsl = onsl != null && spn.equals(onsl); boolean equalsOnss = onss != null && spn.equals(onss); Loading Loading @@ -1892,7 +1990,6 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { pw.println(" mCellLoc=" + mCellLoc); pw.println(" mNewCellLoc=" + mNewCellLoc); pw.println(" mCurrentOtaspMode=" + mCurrentOtaspMode); pw.println(" mCdmaRoaming=" + mCdmaRoaming); pw.println(" mRoamingIndicator=" + mRoamingIndicator); pw.println(" mIsInPrl=" + mIsInPrl); pw.println(" mDefaultRoamingIndicator=" + mDefaultRoamingIndicator); Loading
src/java/com/android/internal/telephony/dataconnection/DataConnection.java +6 −6 Original line number Diff line number Diff line Loading @@ -422,7 +422,7 @@ public final class DataConnection extends StateMachine { int networkType = ss.getDataNetworkType(); mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_MOBILE, networkType, NETWORK_TYPE, TelephonyManager.getNetworkTypeName(networkType)); mNetworkInfo.setRoaming(ss.getRoaming()); mNetworkInfo.setRoaming(ss.getDataRoaming()); mNetworkInfo.setIsAvailable(true); addState(mDefaultState); Loading Loading @@ -546,7 +546,7 @@ public final class DataConnection extends StateMachine { } String protocol; if (mPhone.getServiceState().getRoaming()) { if (mPhone.getServiceState().getDataRoaming()) { protocol = mApnSetting.roamingProtocol; } else { protocol = mApnSetting.protocol; Loading Loading @@ -1045,9 +1045,9 @@ public final class DataConnection extends StateMachine { mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(getHandler(), DataConnection.EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED, null); mPhone.getServiceStateTracker().registerForRoamingOn(getHandler(), mPhone.getServiceStateTracker().registerForDataRoamingOn(getHandler(), DataConnection.EVENT_DATA_CONNECTION_ROAM_ON, null); mPhone.getServiceStateTracker().registerForRoamingOff(getHandler(), mPhone.getServiceStateTracker().registerForDataRoamingOff(getHandler(), DataConnection.EVENT_DATA_CONNECTION_ROAM_OFF, null); // Add ourselves to the list of data connections Loading @@ -1060,8 +1060,8 @@ public final class DataConnection extends StateMachine { // Unregister for DRS or RAT change. mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(getHandler()); mPhone.getServiceStateTracker().unregisterForRoamingOn(getHandler()); mPhone.getServiceStateTracker().unregisterForRoamingOff(getHandler()); mPhone.getServiceStateTracker().unregisterForDataRoamingOn(getHandler()); mPhone.getServiceStateTracker().unregisterForDataRoamingOff(getHandler()); // Remove ourselves from the DC lists mDcController.removeDc(DataConnection.this); Loading