From 0281169e6d686185771bcecce12044adecd4a0ab Mon Sep 17 00:00:00 2001 From: chen xu Date: Wed, 3 Oct 2018 19:07:09 -0700 Subject: refactor data/voice roaming states 1. migrate set/get roamingType from ServiceState to NetworkRegState.set/get roamingType 2. migrate set/get roamingStateFromRegstate from ServiceState to NetworkRegState.regState 3. new System API for neworkRegistration.isRoaming(). Bug: 116127096 Test: ServiceStateTest, ServiceStateProviderTest Change-Id: Ib89744089c98713819c8d313240d629ddb77d0bf --- api/system-current.txt | 1 + core/java/android/content/Intent.java | 6 + telephony/java/android/provider/Telephony.java | 1 - .../telephony/NetworkRegistrationState.java | 44 +++++- telephony/java/android/telephony/ServiceState.java | 148 ++++++++++----------- 5 files changed, 116 insertions(+), 84 deletions(-) diff --git a/api/system-current.txt b/api/system-current.txt index fd5aa7b59741..1a1882e6879c 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5095,6 +5095,7 @@ package android.telephony { method public int getRejectCause(); method public int getTransportType(); method public boolean isEmergencyEnabled(); + method public boolean isRoaming(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; field public static final int DOMAIN_CS = 1; // 0x1 diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 0fc55b4a7f09..2b6077040f13 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -3945,6 +3945,12 @@ public class Intent implements Parcelable, Cloneable { @SystemApi public static final String EXTRA_LTE_EARFCN_RSRP_BOOST = "LteEarfcnRsrpBoost"; + /** + * An parcelable extra used with {@link #ACTION_SERVICE_STATE} representing the service state. + * @hide + */ + public static final String EXTRA_SERVICE_STATE = "android.intent.extra.SERVICE_STATE"; + /** * The name of the extra used to define the text to be processed, as a * CharSequence. Note that this may be a styled CharSequence, so you must use diff --git a/telephony/java/android/provider/Telephony.java b/telephony/java/android/provider/Telephony.java index 7e63230b9abc..d48f21b6dfcd 100644 --- a/telephony/java/android/provider/Telephony.java +++ b/telephony/java/android/provider/Telephony.java @@ -3213,7 +3213,6 @@ public final class Telephony { values.put(CDMA_ERI_ICON_INDEX, state.getCdmaEriIconIndex()); values.put(CDMA_ERI_ICON_MODE, state.getCdmaEriIconMode()); values.put(IS_EMERGENCY_ONLY, state.isEmergencyOnly()); - values.put(IS_DATA_ROAMING_FROM_REGISTRATION, state.getDataRoamingFromRegistration()); values.put(IS_USING_CARRIER_AGGREGATION, state.isUsingCarrierAggregation()); return values; } diff --git a/telephony/java/android/telephony/NetworkRegistrationState.java b/telephony/java/android/telephony/NetworkRegistrationState.java index c3931557feb3..b312f8478413 100644 --- a/telephony/java/android/telephony/NetworkRegistrationState.java +++ b/telephony/java/android/telephony/NetworkRegistrationState.java @@ -95,6 +95,13 @@ public class NetworkRegistrationState implements Parcelable { @RegState private final int mRegState; + /** + * Save the {@link ServiceState.RoamingType roaming type}. it can be overridden roaming type + * from resource overlay or carrier config. + */ + @ServiceState.RoamingType + private int mRoamingType; + private final int mAccessNetworkTechnology; private final int mRejectCause; @@ -140,6 +147,8 @@ public class NetworkRegistrationState implements Parcelable { mDomain = domain; mTransportType = transportType; mRegState = regState; + mRoamingType = (regState == REG_STATE_ROAMING) + ? ServiceState.ROAMING_TYPE_UNKNOWN : ServiceState.ROAMING_TYPE_NOT_ROAMING; mAccessNetworkTechnology = accessNetworkTechnology; mRejectCause = rejectCause; mAvailableServices = availableServices; @@ -182,6 +191,7 @@ public class NetworkRegistrationState implements Parcelable { mDomain = source.readInt(); mTransportType = source.readInt(); mRegState = source.readInt(); + mRoamingType = source.readInt(); mAccessNetworkTechnology = source.readInt(); mRejectCause = source.readInt(); mEmergencyOnly = source.readBoolean(); @@ -210,6 +220,31 @@ public class NetworkRegistrationState implements Parcelable { return mRegState; } + /** + * @return {@code true} if registered on roaming network, {@code false} otherwise. + */ + public boolean isRoaming() { + return mRoamingType != ServiceState.ROAMING_TYPE_NOT_ROAMING; + } + + /** + * Set {@link ServiceState.RoamingType roaming type}. This could override + * roaming type based on resource overlay or carrier config. + * @hide + */ + public void setRoamingType(@ServiceState.RoamingType int roamingType) { + mRoamingType = roamingType; + } + + /** + * @return {@link ServiceState.RoamingType roaming type}. This could return + * overridden roaming type based on resource overlay or carrier config. + * @hide + */ + public @ServiceState.RoamingType int getRoamingType() { + return mRoamingType; + } + /** * @return Whether emergency is enabled. */ @@ -280,6 +315,7 @@ public class NetworkRegistrationState implements Parcelable { .append(" domain=").append((mDomain == DOMAIN_CS) ? "CS" : "PS") .append("transportType=").append(mTransportType) .append(" regState=").append(regStateToString(mRegState)) + .append(" roamingType=").append(mRoamingType) .append(" accessNetworkTechnology=") .append(TelephonyManager.getNetworkTypeName(mAccessNetworkTechnology)) .append(" rejectCause=").append(mRejectCause) @@ -293,9 +329,9 @@ public class NetworkRegistrationState implements Parcelable { @Override public int hashCode() { - return Objects.hash(mDomain, mTransportType, mRegState, mAccessNetworkTechnology, - mRejectCause, mEmergencyOnly, mAvailableServices, mCellIdentity, - mVoiceSpecificStates, mDataSpecificStates); + return Objects.hash(mDomain, mTransportType, mRegState, mRoamingType, + mAccessNetworkTechnology, mRejectCause, mEmergencyOnly, mAvailableServices, + mCellIdentity, mVoiceSpecificStates, mDataSpecificStates); } @Override @@ -310,6 +346,7 @@ public class NetworkRegistrationState implements Parcelable { return mDomain == other.mDomain && mTransportType == other.mTransportType && mRegState == other.mRegState + && mRoamingType == other.mRoamingType && mAccessNetworkTechnology == other.mAccessNetworkTechnology && mRejectCause == other.mRejectCause && mEmergencyOnly == other.mEmergencyOnly @@ -325,6 +362,7 @@ public class NetworkRegistrationState implements Parcelable { dest.writeInt(mDomain); dest.writeInt(mTransportType); dest.writeInt(mRegState); + dest.writeInt(mRoamingType); dest.writeInt(mAccessNetworkTechnology); dest.writeInt(mRejectCause); dest.writeBoolean(mEmergencyOnly); diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java index 7469186a5d51..942a8f3dd881 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -20,6 +20,7 @@ import android.annotation.IntDef; import android.annotation.SystemApi; import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; +import android.content.Intent; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -198,6 +199,15 @@ public class ServiceState implements Parcelable { private int mVoiceRegState = STATE_OUT_OF_SERVICE; private int mDataRegState = STATE_OUT_OF_SERVICE; + /** @hide */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(prefix = { "ROAMING_TYPE_" }, value = { + ROAMING_TYPE_NOT_ROAMING, + ROAMING_TYPE_UNKNOWN, + ROAMING_TYPE_DOMESTIC, + ROAMING_TYPE_INTERNATIONAL + }) + public @interface RoamingType {} /** * Roaming type * HOME : in home network @@ -228,8 +238,6 @@ public class ServiceState implements Parcelable { */ public static final int UNKNOWN_ID = -1; - private int mVoiceRoamingType; - private int mDataRoamingType; private String mVoiceOperatorAlphaLong; private String mVoiceOperatorAlphaShort; private String mVoiceOperatorNumeric; @@ -259,8 +267,6 @@ public class ServiceState implements Parcelable { @UnsupportedAppUsage private int mCdmaEriIconMode; - private boolean mIsDataRoamingFromRegistration; - @UnsupportedAppUsage private boolean mIsUsingCarrierAggregation; @@ -332,8 +338,6 @@ public class ServiceState implements Parcelable { protected void copyFrom(ServiceState s) { mVoiceRegState = s.mVoiceRegState; mDataRegState = s.mDataRegState; - mVoiceRoamingType = s.mVoiceRoamingType; - mDataRoamingType = s.mDataRoamingType; mVoiceOperatorAlphaLong = s.mVoiceOperatorAlphaLong; mVoiceOperatorAlphaShort = s.mVoiceOperatorAlphaShort; mVoiceOperatorNumeric = s.mVoiceOperatorNumeric; @@ -351,7 +355,6 @@ public class ServiceState implements Parcelable { mCdmaEriIconIndex = s.mCdmaEriIconIndex; mCdmaEriIconMode = s.mCdmaEriIconMode; mIsEmergencyOnly = s.mIsEmergencyOnly; - mIsDataRoamingFromRegistration = s.mIsDataRoamingFromRegistration; mIsUsingCarrierAggregation = s.mIsUsingCarrierAggregation; mChannelNumber = s.mChannelNumber; mCellBandwidths = s.mCellBandwidths == null ? null : @@ -367,8 +370,6 @@ public class ServiceState implements Parcelable { public ServiceState(Parcel in) { mVoiceRegState = in.readInt(); mDataRegState = in.readInt(); - mVoiceRoamingType = in.readInt(); - mDataRoamingType = in.readInt(); mVoiceOperatorAlphaLong = in.readString(); mVoiceOperatorAlphaShort = in.readString(); mVoiceOperatorNumeric = in.readString(); @@ -386,7 +387,6 @@ public class ServiceState implements Parcelable { mCdmaEriIconIndex = in.readInt(); mCdmaEriIconMode = in.readInt(); mIsEmergencyOnly = in.readInt() != 0; - mIsDataRoamingFromRegistration = in.readInt() != 0; mIsUsingCarrierAggregation = in.readInt() != 0; mLteEarfcnRsrpBoost = in.readInt(); mNetworkRegistrationStates = new ArrayList<>(); @@ -398,8 +398,6 @@ public class ServiceState implements Parcelable { public void writeToParcel(Parcel out, int flags) { out.writeInt(mVoiceRegState); out.writeInt(mDataRegState); - out.writeInt(mVoiceRoamingType); - out.writeInt(mDataRoamingType); out.writeString(mVoiceOperatorAlphaLong); out.writeString(mVoiceOperatorAlphaShort); out.writeString(mVoiceOperatorNumeric); @@ -417,7 +415,6 @@ public class ServiceState implements Parcelable { out.writeInt(mCdmaEriIconIndex); out.writeInt(mCdmaEriIconMode); out.writeInt(mIsEmergencyOnly ? 1 : 0); - out.writeInt(mIsDataRoamingFromRegistration ? 1 : 0); out.writeInt(mIsUsingCarrierAggregation ? 1 : 0); out.writeInt(mLteEarfcnRsrpBoost); out.writeList(mNetworkRegistrationStates); @@ -535,17 +532,21 @@ public class ServiceState implements Parcelable { */ @UnsupportedAppUsage public boolean getVoiceRoaming() { - return mVoiceRoamingType != ROAMING_TYPE_NOT_ROAMING; + return getVoiceRoamingType() != ROAMING_TYPE_NOT_ROAMING; } - /** * Get current voice network roaming type * @return roaming type * @hide */ @UnsupportedAppUsage - public int getVoiceRoamingType() { - return mVoiceRoamingType; + public @RoamingType int getVoiceRoamingType() { + final NetworkRegistrationState regState = getNetworkRegistrationState( + NetworkRegistrationState.DOMAIN_CS, AccessNetworkConstants.TransportType.WWAN); + if (regState != null) { + return regState.getRoamingType(); + } + return ROAMING_TYPE_NOT_ROAMING; } /** @@ -555,19 +556,7 @@ public class ServiceState implements Parcelable { */ @UnsupportedAppUsage public boolean getDataRoaming() { - return mDataRoamingType != ROAMING_TYPE_NOT_ROAMING; - } - - /** - * Set whether data network registration state is roaming - * - * This should only be set to the roaming value received - * once the data registration phase has completed. - * @hide - */ - @UnsupportedAppUsage - public void setDataRoamingFromRegistration(boolean dataRoaming) { - mIsDataRoamingFromRegistration = dataRoaming; + return getDataRoamingType() != ROAMING_TYPE_NOT_ROAMING; } /** @@ -576,7 +565,12 @@ public class ServiceState implements Parcelable { * @hide */ public boolean getDataRoamingFromRegistration() { - return mIsDataRoamingFromRegistration; + final NetworkRegistrationState regState = getNetworkRegistrationState( + NetworkRegistrationState.DOMAIN_PS, AccessNetworkConstants.TransportType.WWAN); + if (regState != null) { + return (regState.getRegState() == NetworkRegistrationState.REG_STATE_ROAMING); + } + return false; } /** @@ -585,8 +579,13 @@ public class ServiceState implements Parcelable { * @hide */ @UnsupportedAppUsage - public int getDataRoamingType() { - return mDataRoamingType; + public @RoamingType int getDataRoamingType() { + final NetworkRegistrationState regState = getNetworkRegistrationState( + NetworkRegistrationState.DOMAIN_PS, AccessNetworkConstants.TransportType.WWAN); + if (regState != null) { + return regState.getRoamingType(); + } + return ROAMING_TYPE_NOT_ROAMING; } /** @@ -759,8 +758,6 @@ public class ServiceState implements Parcelable { return Objects.hash( mVoiceRegState, mDataRegState, - mVoiceRoamingType, - mDataRoamingType, mChannelNumber, mCellBandwidths, mVoiceOperatorAlphaLong, @@ -780,7 +777,6 @@ public class ServiceState implements Parcelable { mCdmaEriIconIndex, mCdmaEriIconMode, mIsEmergencyOnly, - mIsDataRoamingFromRegistration, mIsUsingCarrierAggregation, mLteEarfcnRsrpBoost, mNetworkRegistrationStates); @@ -794,8 +790,6 @@ public class ServiceState implements Parcelable { return (mVoiceRegState == s.mVoiceRegState && mDataRegState == s.mDataRegState && mIsManualNetworkSelection == s.mIsManualNetworkSelection - && mVoiceRoamingType == s.mVoiceRoamingType - && mDataRoamingType == s.mDataRoamingType && mChannelNumber == s.mChannelNumber && Arrays.equals(mCellBandwidths, s.mCellBandwidths) && equalsHandlesNulls(mVoiceOperatorAlphaLong, s.mVoiceOperatorAlphaLong) @@ -813,7 +807,6 @@ public class ServiceState implements Parcelable { && equalsHandlesNulls(mCdmaDefaultRoamingIndicator, s.mCdmaDefaultRoamingIndicator) && mIsEmergencyOnly == s.mIsEmergencyOnly - && mIsDataRoamingFromRegistration == s.mIsDataRoamingFromRegistration && mIsUsingCarrierAggregation == s.mIsUsingCarrierAggregation) && (mNetworkRegistrationStates == null ? s.mNetworkRegistrationStates == null : s.mNetworkRegistrationStates != null && @@ -933,8 +926,6 @@ public class ServiceState implements Parcelable { .append(", mChannelNumber=").append(mChannelNumber) .append(", duplexMode()=").append(getDuplexMode()) .append(", mCellBandwidths=").append(Arrays.toString(mCellBandwidths)) - .append(", mVoiceRoamingType=").append(getRoamingLogString(mVoiceRoamingType)) - .append(", mDataRoamingType=").append(getRoamingLogString(mDataRoamingType)) .append(", mVoiceOperatorAlphaLong=").append(mVoiceOperatorAlphaLong) .append(", mVoiceOperatorAlphaShort=").append(mVoiceOperatorAlphaShort) .append(", mDataOperatorAlphaLong=").append(mDataOperatorAlphaLong) @@ -951,7 +942,6 @@ public class ServiceState implements Parcelable { .append(", mCdmaRoamingIndicator=").append(mCdmaRoamingIndicator) .append(", mCdmaDefaultRoamingIndicator=").append(mCdmaDefaultRoamingIndicator) .append(", mIsEmergencyOnly=").append(mIsEmergencyOnly) - .append(", mIsDataRoamingFromRegistration=").append(mIsDataRoamingFromRegistration) .append(", mIsUsingCarrierAggregation=").append(mIsUsingCarrierAggregation) .append(", mLteEarfcnRsrpBoost=").append(mLteEarfcnRsrpBoost) .append(", mNetworkRegistrationStates=").append(mNetworkRegistrationStates) @@ -962,8 +952,6 @@ public class ServiceState implements Parcelable { if (DBG) Rlog.d(LOG_TAG, "[ServiceState] setNullState=" + state); mVoiceRegState = state; mDataRegState = state; - mVoiceRoamingType = ROAMING_TYPE_NOT_ROAMING; - mDataRoamingType = ROAMING_TYPE_NOT_ROAMING; mChannelNumber = -1; mCellBandwidths = new int[0]; mVoiceOperatorAlphaLong = null; @@ -983,7 +971,6 @@ public class ServiceState implements Parcelable { mCdmaEriIconIndex = -1; mCdmaEriIconMode = -1; mIsEmergencyOnly = false; - mIsDataRoamingFromRegistration = false; mIsUsingCarrierAggregation = false; mLteEarfcnRsrpBoost = 0; mNetworkRegistrationStates = new ArrayList<>(); @@ -1029,32 +1016,50 @@ public class ServiceState implements Parcelable { } public void setRoaming(boolean roaming) { - mVoiceRoamingType = (roaming ? ROAMING_TYPE_UNKNOWN : ROAMING_TYPE_NOT_ROAMING); - mDataRoamingType = mVoiceRoamingType; + setVoiceRoaming(roaming); + setDataRoaming(roaming); } /** @hide */ @UnsupportedAppUsage public void setVoiceRoaming(boolean roaming) { - mVoiceRoamingType = (roaming ? ROAMING_TYPE_UNKNOWN : ROAMING_TYPE_NOT_ROAMING); + setVoiceRoamingType(roaming ? ROAMING_TYPE_UNKNOWN : ROAMING_TYPE_NOT_ROAMING); } /** @hide */ @UnsupportedAppUsage - public void setVoiceRoamingType(int type) { - mVoiceRoamingType = type; + public void setVoiceRoamingType(@RoamingType int type) { + NetworkRegistrationState regState = getNetworkRegistrationState( + NetworkRegistrationState.DOMAIN_CS, AccessNetworkConstants.TransportType.WWAN); + if (regState == null) { + regState = new NetworkRegistrationState( + NetworkRegistrationState.DOMAIN_CS, AccessNetworkConstants.TransportType.WWAN, + ServiceState.ROAMING_TYPE_NOT_ROAMING, TelephonyManager.NETWORK_TYPE_UNKNOWN, 0, + false, null, null); + addNetworkRegistrationState(regState); + } + regState.setRoamingType(type); } /** @hide */ @UnsupportedAppUsage public void setDataRoaming(boolean dataRoaming) { - mDataRoamingType = (dataRoaming ? ROAMING_TYPE_UNKNOWN : ROAMING_TYPE_NOT_ROAMING); + setDataRoamingType(dataRoaming ? ROAMING_TYPE_UNKNOWN : ROAMING_TYPE_NOT_ROAMING); } /** @hide */ @UnsupportedAppUsage - public void setDataRoamingType(int type) { - mDataRoamingType = type; + public void setDataRoamingType(@RoamingType int type) { + NetworkRegistrationState regState = getNetworkRegistrationState( + NetworkRegistrationState.DOMAIN_PS, AccessNetworkConstants.TransportType.WWAN); + if (regState == null) { + regState = new NetworkRegistrationState( + NetworkRegistrationState.DOMAIN_PS, AccessNetworkConstants.TransportType.WWAN, + ServiceState.ROAMING_TYPE_NOT_ROAMING, TelephonyManager.NETWORK_TYPE_UNKNOWN, 0, + false, null, null); + addNetworkRegistrationState(regState); + } + regState.setRoamingType(type); } /** @@ -1166,30 +1171,10 @@ public class ServiceState implements Parcelable { */ @UnsupportedAppUsage private void setFromNotifierBundle(Bundle m) { - mVoiceRegState = m.getInt("voiceRegState"); - mDataRegState = m.getInt("dataRegState"); - mVoiceRoamingType = m.getInt("voiceRoamingType"); - mDataRoamingType = m.getInt("dataRoamingType"); - mVoiceOperatorAlphaLong = m.getString("operator-alpha-long"); - mVoiceOperatorAlphaShort = m.getString("operator-alpha-short"); - mVoiceOperatorNumeric = m.getString("operator-numeric"); - mDataOperatorAlphaLong = m.getString("data-operator-alpha-long"); - mDataOperatorAlphaShort = m.getString("data-operator-alpha-short"); - mDataOperatorNumeric = m.getString("data-operator-numeric"); - mIsManualNetworkSelection = m.getBoolean("manual"); - mRilVoiceRadioTechnology = m.getInt("radioTechnology"); - mRilDataRadioTechnology = m.getInt("dataRadioTechnology"); - mCssIndicator = m.getBoolean("cssIndicator"); - mNetworkId = m.getInt("networkId"); - mSystemId = m.getInt("systemId"); - mCdmaRoamingIndicator = m.getInt("cdmaRoamingIndicator"); - mCdmaDefaultRoamingIndicator = m.getInt("cdmaDefaultRoamingIndicator"); - mIsEmergencyOnly = m.getBoolean("emergencyOnly"); - mIsDataRoamingFromRegistration = m.getBoolean("isDataRoamingFromRegistration"); - mIsUsingCarrierAggregation = m.getBoolean("isUsingCarrierAggregation"); - mLteEarfcnRsrpBoost = m.getInt("LteEarfcnRsrpBoost"); - mChannelNumber = m.getInt("ChannelNumber"); - mCellBandwidths = m.getIntArray("CellBandwidths"); + ServiceState ssFromBundle = m.getParcelable(Intent.EXTRA_SERVICE_STATE); + if (ssFromBundle != null) { + copyFrom(ssFromBundle); + } } /** @@ -1200,10 +1185,13 @@ public class ServiceState implements Parcelable { */ @UnsupportedAppUsage public void fillInNotifierBundle(Bundle m) { + m.putParcelable(Intent.EXTRA_SERVICE_STATE, this); + // serviceState already consists of below entries. + // for backward compatibility, we continue fill in below entries. m.putInt("voiceRegState", mVoiceRegState); m.putInt("dataRegState", mDataRegState); - m.putInt("voiceRoamingType", mVoiceRoamingType); - m.putInt("dataRoamingType", mDataRoamingType); + m.putInt("dataRoamingType", getDataRoamingType()); + m.putInt("voiceRoamingType", getVoiceRoamingType()); m.putString("operator-alpha-long", mVoiceOperatorAlphaLong); m.putString("operator-alpha-short", mVoiceOperatorAlphaShort); m.putString("operator-numeric", mVoiceOperatorNumeric); @@ -1219,7 +1207,7 @@ public class ServiceState implements Parcelable { m.putInt("cdmaRoamingIndicator", mCdmaRoamingIndicator); m.putInt("cdmaDefaultRoamingIndicator", mCdmaDefaultRoamingIndicator); m.putBoolean("emergencyOnly", mIsEmergencyOnly); - m.putBoolean("isDataRoamingFromRegistration", mIsDataRoamingFromRegistration); + m.putBoolean("isDataRoamingFromRegistration", getDataRoamingFromRegistration()); m.putBoolean("isUsingCarrierAggregation", mIsUsingCarrierAggregation); m.putInt("LteEarfcnRsrpBoost", mLteEarfcnRsrpBoost); m.putInt("ChannelNumber", mChannelNumber); -- cgit v1.2.3