Loading src/java/com/android/internal/telephony/data/DataConfigManager.java +10 −0 Original line number Diff line number Diff line Loading @@ -658,6 +658,15 @@ public class DataConfigManager extends Handler { .config_wlan_data_service_conn_persistence_on_restart); } /** * @return {@code true} if tearing down IMS data network should be delayed until the voice call * ends. */ public boolean isImsDelayTearDownEnabled() { return mCarrierConfig.getBoolean( CarrierConfigManager.KEY_DELAY_IMS_TEAR_DOWN_UNTIL_CALL_END_BOOL); } /** * @return The bandwidth estimation source. */ Loading Loading @@ -929,6 +938,7 @@ public class DataConfigManager extends Handler { + shouldPersistIwlanDataNetworksWhenDataServiceRestarted()); pw.println("Bandwidth estimation source=" + mResources.getString( com.android.internal.R.string.config_bandwidthEstimateSource)); pw.println("isDelayTearDownImsEnabled=" + isImsDelayTearDownEnabled()); pw.decreaseIndent(); } } src/java/com/android/internal/telephony/data/DataEvaluation.java +3 −1 Original line number Diff line number Diff line Loading @@ -257,7 +257,9 @@ public class DataEvaluation { /** Handover is not allowed by policy. */ NOT_ALLOWED_BY_POLICY(true), /** Data network is not in the right state. */ ILLEGAL_STATE(true); ILLEGAL_STATE(true), /** VoPS is not supported by the network. */ VOPS_NOT_SUPPORTED(true); private final boolean mIsHardReason; Loading src/java/com/android/internal/telephony/data/DataNetwork.java +60 −27 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ import android.telephony.Annotation.NetCapability; import android.telephony.Annotation.NetworkType; import android.telephony.Annotation.ValidationStatus; import android.telephony.DataFailCause; import android.telephony.DataSpecificRegistrationInfo; import android.telephony.LinkCapacityEstimate; import android.telephony.NetworkRegistrationInfo; import android.telephony.PcoData; Loading Loading @@ -226,6 +227,7 @@ public class DataNetwork extends StateMachine { TEAR_DOWN_REASON_HANDOVER_FAILED, TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED, TEAR_DOWN_REASON_VCN_REQUESTED, TEAR_DOWN_REASON_VOPS_NOT_SUPPORTED, }) public @interface TearDownReason {} Loading Loading @@ -274,6 +276,9 @@ public class DataNetwork extends StateMachine { /** Data network tear down due to VCN service requested. */ public static final int TEAR_DOWN_REASON_VCN_REQUESTED = 15; /** Data network tear down due to VOPS no longer supported. */ public static final int TEAR_DOWN_REASON_VOPS_NOT_SUPPORTED = 16; @IntDef(prefix = {"BANDWIDTH_SOURCE_"}, value = { BANDWIDTH_SOURCE_UNKNOWN, Loading Loading @@ -770,22 +775,14 @@ public class DataNetwork extends StateMachine { public void enter() { logv("Registering all events."); mDataConfigManager.registerForConfigUpdate(getHandler(), EVENT_DATA_CONFIG_UPDATED); mDataServiceManagers.get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .registerForDataCallListChanged(getHandler(), EVENT_DATA_STATE_CHANGED); if (!mAccessNetworksManager.isInLegacyMode()) { mDataServiceManagers.get(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) mPhone.getDisplayInfoController().registerForTelephonyDisplayInfoChanged( getHandler(), EVENT_DISPLAY_INFO_CHANGED, null); for (int transport : mAccessNetworksManager.getAvailableTransports()) { mDataServiceManagers.get(transport) .registerForDataCallListChanged(getHandler(), EVENT_DATA_STATE_CHANGED); mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged( AccessNetworkConstants.TRANSPORT_TYPE_WLAN, getHandler(), EVENT_SERVICE_STATE_CHANGED, AccessNetworkConstants.TRANSPORT_TYPE_WLAN); transport, getHandler(), EVENT_SERVICE_STATE_CHANGED, transport); } mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged( AccessNetworkConstants.TRANSPORT_TYPE_WWAN, getHandler(), EVENT_SERVICE_STATE_CHANGED, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); mPhone.getDisplayInfoController().registerForTelephonyDisplayInfoChanged( getHandler(), EVENT_DISPLAY_INFO_CHANGED, null); // Only add symmetric code here, for example, registering and unregistering. // DefaultState.enter() is the starting point in the life cycle of the DataNetwork, Loading @@ -796,19 +793,14 @@ public class DataNetwork extends StateMachine { @Override public void exit() { logv("Unregistering all events."); mPhone.getDisplayInfoController().unregisterForTelephonyDisplayInfoChanged( getHandler()); mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged( AccessNetworkConstants.TRANSPORT_TYPE_WWAN, getHandler()); if (!mAccessNetworksManager.isInLegacyMode()) { mDataServiceManagers.get(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) for (int transport : mAccessNetworksManager.getAvailableTransports()) { mDataServiceManagers.get(transport) .unregisterForDataCallListChanged(getHandler()); mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged( AccessNetworkConstants.TRANSPORT_TYPE_WLAN, getHandler()); transport, getHandler()); } mDataServiceManagers.get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .unregisterForDataCallListChanged(getHandler()); mPhone.getDisplayInfoController().unregisterForTelephonyDisplayInfoChanged( getHandler()); mDataConfigManager.unregisterForConfigUpdate(getHandler()); } Loading Loading @@ -1339,6 +1331,35 @@ public class DataNetwork extends StateMachine { .forEach(builder::addCapability); } // If voice call is on-going, do not change MMTEL capability, which is a immutable // capability. Changing it will result in re-recreating network agent below, and the voice // call will drop. Whether tearing down an IMS network or not when VoPS is lost if (mPhone.getImsPhone() != null && mPhone.getImsPhone().getCallTracker().getState() != PhoneConstants.State.IDLE && mNetworkCapabilities != null && mNetworkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL)) { // Previous capability has MMTEL, so add it again. builder.addCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL); } else { // Always add MMTEL capability on IMS network unless network explicitly indicates VoPS // not supported. if (mDataProfile.canSatisfy(NetworkCapabilities.NET_CAPABILITY_IMS)) { builder.addCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL); if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) { NetworkRegistrationInfo nri = mPhone.getServiceStateTracker().getServiceState() .getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); if (nri != null) { DataSpecificRegistrationInfo dsri = nri.getDataSpecificInfo(); // Check if VoPS is supported by the network. if (dsri != null && dsri.getVopsSupportInfo() != null && !dsri.getVopsSupportInfo().isVopsSupported()) { builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL); } } } } } // Extract network capabilities from the traffic descriptor. for (TrafficDescriptor trafficDescriptor : mTrafficDescriptors) { try { Loading Loading @@ -1443,12 +1464,13 @@ public class DataNetwork extends StateMachine { mNetworkCapabilities = nc; mNetworkAgent = createNetworkAgent(); mNetworkAgent.markConnected(); } } else { // Now we need to inform connectivity service and data network controller // about the capabilities changed. mNetworkCapabilities = nc; mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities); } removeUnsatisfiedNetworkRequests(); mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback .onNetworkCapabilitiesChanged(DataNetwork.this)); Loading Loading @@ -1810,6 +1832,15 @@ public class DataNetwork extends StateMachine { private void onTearDown(@TearDownReason int reason) { logl("onTearDown: reason=" + tearDownReasonToString(reason)); if (mDataConfigManager.isImsDelayTearDownEnabled() && mNetworkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS) && reason == TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED && mPhone.getImsPhone() != null && mPhone.getImsPhone().getCallTracker().getState() != PhoneConstants.State.IDLE) { logl("onTearDown: Delay IMS tear down until call ends."); return; } // TODO: Need to support DataService.REQUEST_REASON_SHUTDOWN mDataServiceManagers.get(mTransport).deactivateDataCall(mCid.get(mTransport), DataService.REQUEST_REASON_NORMAL, null); Loading Loading @@ -2475,6 +2506,8 @@ public class DataNetwork extends StateMachine { return "TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED"; case TEAR_DOWN_REASON_VCN_REQUESTED: return "TEAR_DOWN_REASON_VCN_REQUESTED"; case TEAR_DOWN_REASON_VOPS_NOT_SUPPORTED: return "TEAR_DOWN_REASON_VOPS_NOT_SUPPORTED"; default: return "UNKNOWN(" + reason + ")"; } Loading src/java/com/android/internal/telephony/data/DataNetworkController.java +78 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ import android.telephony.Annotation.NetworkType; import android.telephony.Annotation.ValidationStatus; import android.telephony.CarrierConfigManager; import android.telephony.DataFailCause; import android.telephony.DataSpecificRegistrationInfo; import android.telephony.NetworkRegistrationInfo; import android.telephony.NetworkRegistrationInfo.RegistrationState; import android.telephony.PcoData; Loading Loading @@ -897,6 +898,10 @@ public class DataNetworkController extends Handler { onRemoveNetworkRequest((TelephonyNetworkRequest) msg.obj); break; case EVENT_VOICE_CALL_ENDED: // In some cases we need to tear down network after call ends. For example, when // delay IMS tear down until call ends is turned on. sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS, DataEvaluationReason.VOICE_CALL_ENDED)); sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS, DataEvaluationReason.VOICE_CALL_ENDED)); break; Loading Loading @@ -1182,6 +1187,20 @@ public class DataNetworkController extends Handler { DataDisallowedReason.CONCURRENT_VOICE_DATA_NOT_ALLOWED); } // Check VoPS support if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN && networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL)) { NetworkRegistrationInfo nri = mServiceState.getNetworkRegistrationInfo( NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); if (nri != null) { DataSpecificRegistrationInfo dsri = nri.getDataSpecificInfo(); if (dsri != null && dsri.getVopsSupportInfo() != null && !dsri.getVopsSupportInfo().isVopsSupported()) { evaluation.addDataDisallowedReason(DataDisallowedReason.VOPS_NOT_SUPPORTED); } } } // Check if default data is selected. if (!SubscriptionManager.isValidSubscriptionId( SubscriptionManager.getDefaultDataSubscriptionId())) { Loading Loading @@ -1366,6 +1385,35 @@ public class DataNetworkController extends Handler { evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_RESTRICTED_BY_NETWORK); } boolean delayImsTearDown = false; if (mDataConfigManager.isImsDelayTearDownEnabled() && dataNetwork.getNetworkCapabilities() .hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS) && mPhone.getImsPhone() != null && mPhone.getImsPhone().getCallTracker().getState() != PhoneConstants.State.IDLE) { // Some carriers requires delay tearing down IMS network until the call ends even if // VoPS bit is lost. log("Ignore VoPS bit and delay IMS tear down until call ends."); delayImsTearDown = true; } // Check VoPS support (except for the case that we want to delay IMS tear down until the // voice call ends. if (!delayImsTearDown && dataNetwork.getTransport() == AccessNetworkConstants.TRANSPORT_TYPE_WWAN && dataNetwork.getNetworkCapabilities().hasCapability( NetworkCapabilities.NET_CAPABILITY_MMTEL)) { NetworkRegistrationInfo nri = mServiceState.getNetworkRegistrationInfo( NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); if (nri != null) { DataSpecificRegistrationInfo dsri = nri.getDataSpecificInfo(); if (dsri != null && dsri.getVopsSupportInfo() != null && !dsri.getVopsSupportInfo().isVopsSupported()) { evaluation.addDataDisallowedReason(DataDisallowedReason.VOPS_NOT_SUPPORTED); } } } // Check if device is CDMA and is currently in ECBM if (mPhone.isInEcm() && mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) { evaluation.addDataDisallowedReason(DataDisallowedReason.EMERGENCY_CALL); Loading Loading @@ -1569,6 +1617,8 @@ public class DataNetworkController extends Handler { return DataNetwork.TEAR_DOWN_REASON_DATA_SERVICE_NOT_READY; case DATA_NETWORK_TYPE_NOT_ALLOWED: return DataNetwork.TEAR_DOWN_REASON_RAT_NOT_ALLOWED; case VOPS_NOT_SUPPORTED: return DataNetwork.TEAR_DOWN_REASON_VOPS_NOT_SUPPORTED; } } return 0; Loading Loading @@ -2420,6 +2470,20 @@ public class DataNetworkController extends Handler { return true; } DataSpecificRegistrationInfo oldDsri = oldNri.getDataSpecificInfo(); DataSpecificRegistrationInfo newDsri = newNri.getDataSpecificInfo(); if (newDsri == null) return false; if ((oldDsri == null || oldDsri.getVopsSupportInfo() == null || oldDsri.getVopsSupportInfo().isVopsSupported()) && (newDsri.getVopsSupportInfo() != null && !newDsri.getVopsSupportInfo() .isVopsSupported())) { // If previously VoPS was supported (or does not exist), and now the network reports // VoPS not supported, we should evaluate existing data networks to see if they need // to be torn down. return true; } return false; } Loading @@ -2445,6 +2509,20 @@ public class DataNetworkController extends Handler { return true; } DataSpecificRegistrationInfo oldDsri = oldNri.getDataSpecificInfo(); DataSpecificRegistrationInfo newDsri = newNri.getDataSpecificInfo(); if (oldDsri == null) return false; if ((newDsri == null || newDsri.getVopsSupportInfo() == null || newDsri.getVopsSupportInfo().isVopsSupported()) && (oldDsri.getVopsSupportInfo() != null && !oldDsri.getVopsSupportInfo() .isVopsSupported())) { // If previously VoPS was not supported, and now the network reports // VoPS supported (or does not report), we should evaluate the unsatisfied network // request to see if the can be satisfied again. return true; } return false; } Loading tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java +172 −19 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
src/java/com/android/internal/telephony/data/DataConfigManager.java +10 −0 Original line number Diff line number Diff line Loading @@ -658,6 +658,15 @@ public class DataConfigManager extends Handler { .config_wlan_data_service_conn_persistence_on_restart); } /** * @return {@code true} if tearing down IMS data network should be delayed until the voice call * ends. */ public boolean isImsDelayTearDownEnabled() { return mCarrierConfig.getBoolean( CarrierConfigManager.KEY_DELAY_IMS_TEAR_DOWN_UNTIL_CALL_END_BOOL); } /** * @return The bandwidth estimation source. */ Loading Loading @@ -929,6 +938,7 @@ public class DataConfigManager extends Handler { + shouldPersistIwlanDataNetworksWhenDataServiceRestarted()); pw.println("Bandwidth estimation source=" + mResources.getString( com.android.internal.R.string.config_bandwidthEstimateSource)); pw.println("isDelayTearDownImsEnabled=" + isImsDelayTearDownEnabled()); pw.decreaseIndent(); } }
src/java/com/android/internal/telephony/data/DataEvaluation.java +3 −1 Original line number Diff line number Diff line Loading @@ -257,7 +257,9 @@ public class DataEvaluation { /** Handover is not allowed by policy. */ NOT_ALLOWED_BY_POLICY(true), /** Data network is not in the right state. */ ILLEGAL_STATE(true); ILLEGAL_STATE(true), /** VoPS is not supported by the network. */ VOPS_NOT_SUPPORTED(true); private final boolean mIsHardReason; Loading
src/java/com/android/internal/telephony/data/DataNetwork.java +60 −27 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ import android.telephony.Annotation.NetCapability; import android.telephony.Annotation.NetworkType; import android.telephony.Annotation.ValidationStatus; import android.telephony.DataFailCause; import android.telephony.DataSpecificRegistrationInfo; import android.telephony.LinkCapacityEstimate; import android.telephony.NetworkRegistrationInfo; import android.telephony.PcoData; Loading Loading @@ -226,6 +227,7 @@ public class DataNetwork extends StateMachine { TEAR_DOWN_REASON_HANDOVER_FAILED, TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED, TEAR_DOWN_REASON_VCN_REQUESTED, TEAR_DOWN_REASON_VOPS_NOT_SUPPORTED, }) public @interface TearDownReason {} Loading Loading @@ -274,6 +276,9 @@ public class DataNetwork extends StateMachine { /** Data network tear down due to VCN service requested. */ public static final int TEAR_DOWN_REASON_VCN_REQUESTED = 15; /** Data network tear down due to VOPS no longer supported. */ public static final int TEAR_DOWN_REASON_VOPS_NOT_SUPPORTED = 16; @IntDef(prefix = {"BANDWIDTH_SOURCE_"}, value = { BANDWIDTH_SOURCE_UNKNOWN, Loading Loading @@ -770,22 +775,14 @@ public class DataNetwork extends StateMachine { public void enter() { logv("Registering all events."); mDataConfigManager.registerForConfigUpdate(getHandler(), EVENT_DATA_CONFIG_UPDATED); mDataServiceManagers.get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .registerForDataCallListChanged(getHandler(), EVENT_DATA_STATE_CHANGED); if (!mAccessNetworksManager.isInLegacyMode()) { mDataServiceManagers.get(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) mPhone.getDisplayInfoController().registerForTelephonyDisplayInfoChanged( getHandler(), EVENT_DISPLAY_INFO_CHANGED, null); for (int transport : mAccessNetworksManager.getAvailableTransports()) { mDataServiceManagers.get(transport) .registerForDataCallListChanged(getHandler(), EVENT_DATA_STATE_CHANGED); mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged( AccessNetworkConstants.TRANSPORT_TYPE_WLAN, getHandler(), EVENT_SERVICE_STATE_CHANGED, AccessNetworkConstants.TRANSPORT_TYPE_WLAN); transport, getHandler(), EVENT_SERVICE_STATE_CHANGED, transport); } mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged( AccessNetworkConstants.TRANSPORT_TYPE_WWAN, getHandler(), EVENT_SERVICE_STATE_CHANGED, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); mPhone.getDisplayInfoController().registerForTelephonyDisplayInfoChanged( getHandler(), EVENT_DISPLAY_INFO_CHANGED, null); // Only add symmetric code here, for example, registering and unregistering. // DefaultState.enter() is the starting point in the life cycle of the DataNetwork, Loading @@ -796,19 +793,14 @@ public class DataNetwork extends StateMachine { @Override public void exit() { logv("Unregistering all events."); mPhone.getDisplayInfoController().unregisterForTelephonyDisplayInfoChanged( getHandler()); mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged( AccessNetworkConstants.TRANSPORT_TYPE_WWAN, getHandler()); if (!mAccessNetworksManager.isInLegacyMode()) { mDataServiceManagers.get(AccessNetworkConstants.TRANSPORT_TYPE_WLAN) for (int transport : mAccessNetworksManager.getAvailableTransports()) { mDataServiceManagers.get(transport) .unregisterForDataCallListChanged(getHandler()); mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged( AccessNetworkConstants.TRANSPORT_TYPE_WLAN, getHandler()); transport, getHandler()); } mDataServiceManagers.get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .unregisterForDataCallListChanged(getHandler()); mPhone.getDisplayInfoController().unregisterForTelephonyDisplayInfoChanged( getHandler()); mDataConfigManager.unregisterForConfigUpdate(getHandler()); } Loading Loading @@ -1339,6 +1331,35 @@ public class DataNetwork extends StateMachine { .forEach(builder::addCapability); } // If voice call is on-going, do not change MMTEL capability, which is a immutable // capability. Changing it will result in re-recreating network agent below, and the voice // call will drop. Whether tearing down an IMS network or not when VoPS is lost if (mPhone.getImsPhone() != null && mPhone.getImsPhone().getCallTracker().getState() != PhoneConstants.State.IDLE && mNetworkCapabilities != null && mNetworkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL)) { // Previous capability has MMTEL, so add it again. builder.addCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL); } else { // Always add MMTEL capability on IMS network unless network explicitly indicates VoPS // not supported. if (mDataProfile.canSatisfy(NetworkCapabilities.NET_CAPABILITY_IMS)) { builder.addCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL); if (mTransport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) { NetworkRegistrationInfo nri = mPhone.getServiceStateTracker().getServiceState() .getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); if (nri != null) { DataSpecificRegistrationInfo dsri = nri.getDataSpecificInfo(); // Check if VoPS is supported by the network. if (dsri != null && dsri.getVopsSupportInfo() != null && !dsri.getVopsSupportInfo().isVopsSupported()) { builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL); } } } } } // Extract network capabilities from the traffic descriptor. for (TrafficDescriptor trafficDescriptor : mTrafficDescriptors) { try { Loading Loading @@ -1443,12 +1464,13 @@ public class DataNetwork extends StateMachine { mNetworkCapabilities = nc; mNetworkAgent = createNetworkAgent(); mNetworkAgent.markConnected(); } } else { // Now we need to inform connectivity service and data network controller // about the capabilities changed. mNetworkCapabilities = nc; mNetworkAgent.sendNetworkCapabilities(mNetworkCapabilities); } removeUnsatisfiedNetworkRequests(); mDataNetworkCallback.invokeFromExecutor(() -> mDataNetworkCallback .onNetworkCapabilitiesChanged(DataNetwork.this)); Loading Loading @@ -1810,6 +1832,15 @@ public class DataNetwork extends StateMachine { private void onTearDown(@TearDownReason int reason) { logl("onTearDown: reason=" + tearDownReasonToString(reason)); if (mDataConfigManager.isImsDelayTearDownEnabled() && mNetworkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS) && reason == TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED && mPhone.getImsPhone() != null && mPhone.getImsPhone().getCallTracker().getState() != PhoneConstants.State.IDLE) { logl("onTearDown: Delay IMS tear down until call ends."); return; } // TODO: Need to support DataService.REQUEST_REASON_SHUTDOWN mDataServiceManagers.get(mTransport).deactivateDataCall(mCid.get(mTransport), DataService.REQUEST_REASON_NORMAL, null); Loading Loading @@ -2475,6 +2506,8 @@ public class DataNetwork extends StateMachine { return "TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED"; case TEAR_DOWN_REASON_VCN_REQUESTED: return "TEAR_DOWN_REASON_VCN_REQUESTED"; case TEAR_DOWN_REASON_VOPS_NOT_SUPPORTED: return "TEAR_DOWN_REASON_VOPS_NOT_SUPPORTED"; default: return "UNKNOWN(" + reason + ")"; } Loading
src/java/com/android/internal/telephony/data/DataNetworkController.java +78 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ import android.telephony.Annotation.NetworkType; import android.telephony.Annotation.ValidationStatus; import android.telephony.CarrierConfigManager; import android.telephony.DataFailCause; import android.telephony.DataSpecificRegistrationInfo; import android.telephony.NetworkRegistrationInfo; import android.telephony.NetworkRegistrationInfo.RegistrationState; import android.telephony.PcoData; Loading Loading @@ -897,6 +898,10 @@ public class DataNetworkController extends Handler { onRemoveNetworkRequest((TelephonyNetworkRequest) msg.obj); break; case EVENT_VOICE_CALL_ENDED: // In some cases we need to tear down network after call ends. For example, when // delay IMS tear down until call ends is turned on. sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS, DataEvaluationReason.VOICE_CALL_ENDED)); sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS, DataEvaluationReason.VOICE_CALL_ENDED)); break; Loading Loading @@ -1182,6 +1187,20 @@ public class DataNetworkController extends Handler { DataDisallowedReason.CONCURRENT_VOICE_DATA_NOT_ALLOWED); } // Check VoPS support if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN && networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMTEL)) { NetworkRegistrationInfo nri = mServiceState.getNetworkRegistrationInfo( NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); if (nri != null) { DataSpecificRegistrationInfo dsri = nri.getDataSpecificInfo(); if (dsri != null && dsri.getVopsSupportInfo() != null && !dsri.getVopsSupportInfo().isVopsSupported()) { evaluation.addDataDisallowedReason(DataDisallowedReason.VOPS_NOT_SUPPORTED); } } } // Check if default data is selected. if (!SubscriptionManager.isValidSubscriptionId( SubscriptionManager.getDefaultDataSubscriptionId())) { Loading Loading @@ -1366,6 +1385,35 @@ public class DataNetworkController extends Handler { evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_RESTRICTED_BY_NETWORK); } boolean delayImsTearDown = false; if (mDataConfigManager.isImsDelayTearDownEnabled() && dataNetwork.getNetworkCapabilities() .hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS) && mPhone.getImsPhone() != null && mPhone.getImsPhone().getCallTracker().getState() != PhoneConstants.State.IDLE) { // Some carriers requires delay tearing down IMS network until the call ends even if // VoPS bit is lost. log("Ignore VoPS bit and delay IMS tear down until call ends."); delayImsTearDown = true; } // Check VoPS support (except for the case that we want to delay IMS tear down until the // voice call ends. if (!delayImsTearDown && dataNetwork.getTransport() == AccessNetworkConstants.TRANSPORT_TYPE_WWAN && dataNetwork.getNetworkCapabilities().hasCapability( NetworkCapabilities.NET_CAPABILITY_MMTEL)) { NetworkRegistrationInfo nri = mServiceState.getNetworkRegistrationInfo( NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); if (nri != null) { DataSpecificRegistrationInfo dsri = nri.getDataSpecificInfo(); if (dsri != null && dsri.getVopsSupportInfo() != null && !dsri.getVopsSupportInfo().isVopsSupported()) { evaluation.addDataDisallowedReason(DataDisallowedReason.VOPS_NOT_SUPPORTED); } } } // Check if device is CDMA and is currently in ECBM if (mPhone.isInEcm() && mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) { evaluation.addDataDisallowedReason(DataDisallowedReason.EMERGENCY_CALL); Loading Loading @@ -1569,6 +1617,8 @@ public class DataNetworkController extends Handler { return DataNetwork.TEAR_DOWN_REASON_DATA_SERVICE_NOT_READY; case DATA_NETWORK_TYPE_NOT_ALLOWED: return DataNetwork.TEAR_DOWN_REASON_RAT_NOT_ALLOWED; case VOPS_NOT_SUPPORTED: return DataNetwork.TEAR_DOWN_REASON_VOPS_NOT_SUPPORTED; } } return 0; Loading Loading @@ -2420,6 +2470,20 @@ public class DataNetworkController extends Handler { return true; } DataSpecificRegistrationInfo oldDsri = oldNri.getDataSpecificInfo(); DataSpecificRegistrationInfo newDsri = newNri.getDataSpecificInfo(); if (newDsri == null) return false; if ((oldDsri == null || oldDsri.getVopsSupportInfo() == null || oldDsri.getVopsSupportInfo().isVopsSupported()) && (newDsri.getVopsSupportInfo() != null && !newDsri.getVopsSupportInfo() .isVopsSupported())) { // If previously VoPS was supported (or does not exist), and now the network reports // VoPS not supported, we should evaluate existing data networks to see if they need // to be torn down. return true; } return false; } Loading @@ -2445,6 +2509,20 @@ public class DataNetworkController extends Handler { return true; } DataSpecificRegistrationInfo oldDsri = oldNri.getDataSpecificInfo(); DataSpecificRegistrationInfo newDsri = newNri.getDataSpecificInfo(); if (oldDsri == null) return false; if ((newDsri == null || newDsri.getVopsSupportInfo() == null || newDsri.getVopsSupportInfo().isVopsSupported()) && (oldDsri.getVopsSupportInfo() != null && !oldDsri.getVopsSupportInfo() .isVopsSupported())) { // If previously VoPS was not supported, and now the network reports // VoPS supported (or does not report), we should evaluate the unsatisfied network // request to see if the can be satisfied again. return true; } return false; } Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java +172 −19 File changed.Preview size limit exceeded, changes collapsed. Show changes