Loading src/java/com/android/internal/telephony/SubscriptionController.java +1 −1 Original line number Diff line number Diff line Loading @@ -72,7 +72,7 @@ import android.util.Log; import com.android.ims.ImsManager; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.IccCardConstants.State; import com.android.internal.telephony.dataconnection.DataEnabledOverride; import com.android.internal.telephony.data.DataEnabledOverride; import com.android.internal.telephony.metrics.TelephonyMetrics; import com.android.internal.telephony.uicc.IccUtils; import com.android.internal.telephony.uicc.UiccCard; Loading src/java/com/android/internal/telephony/data/DataConfigManager.java +2 −0 Original line number Diff line number Diff line Loading @@ -398,6 +398,7 @@ public class DataConfigManager extends Handler { * @return The metered APN types when connected to a home network */ public @NonNull @ApnType List<Integer> getMeteredApnTypes() { // TODO: return as set instead of list return Collections.unmodifiableList(mMeteredApnTypes); } Loading @@ -405,6 +406,7 @@ public class DataConfigManager extends Handler { * @return The metered APN types when roaming */ public @NonNull @ApnType List<Integer> getMeteredApnTypesWhenRoaming() { // TODO: return as set instead of list return Collections.unmodifiableList(mRoamingMeteredApnTypes); } Loading src/java/com/android/internal/telephony/dataconnection/DataEnabledOverride.java→src/java/com/android/internal/telephony/data/DataEnabledOverride.java +3 −3 Original line number Diff line number Diff line /* * Copyright 2019 The Android Open Source Project * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. Loading @@ -14,7 +14,7 @@ * limitations under the License. */ package com.android.internal.telephony.dataconnection; package com.android.internal.telephony.data; import android.annotation.IntDef; import android.annotation.NonNull; Loading @@ -31,7 +31,7 @@ import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.SubscriptionController; import com.android.internal.telephony.dataconnection.DataEnabledOverride.OverrideConditions.Condition; import com.android.internal.telephony.data.DataEnabledOverride.OverrideConditions.Condition; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; Loading src/java/com/android/internal/telephony/data/DataEvaluation.java +9 −2 Original line number Diff line number Diff line Loading @@ -179,13 +179,14 @@ public class DataEvaluation { DATA_RESTRICTED_CHANGED, /** Network capabilities changed. The unsatisfied requests might have chances to attach. */ DATA_NETWORK_CAPABILITIES_CHANGED, /** When emergency call started or ended. */ EMERGENCY_CALL_CHANGED, } /** Disallowed reasons. There could be multiple reasons if data connection is not allowed. */ public enum DataDisallowedReason { // Soft failure reasons. A soft reason means that in certain conditions, data is still // allowed. Normally those reasons are due to users settings. /** Data is disabled by the user or policy. */ DATA_DISABLED(false), /** Data roaming is disabled by the user. */ Loading Loading @@ -214,7 +215,9 @@ public class DataEvaluation { /** Unable to find a suitable data profile. */ NO_SUITABLE_DATA_PROFILE(true), /** Current data network type not allowed. */ DATA_NETWORK_TYPE_NOT_ALLOWED(true); DATA_NETWORK_TYPE_NOT_ALLOWED(true), /** Device is currently in an emergency call. */ EMERGENCY_CALL(true); private final boolean mIsHardReason; Loading Loading @@ -257,6 +260,10 @@ public class DataEvaluation { * the user enables or disables data. */ UNMETERED_USAGE, /** * The network request supports MMS and MMS is always allowed. */ MMS_REQUEST, /** * The network request is restricted (i.e. Only privilege apps can access the network.) */ Loading src/java/com/android/internal/telephony/data/DataNetworkController.java +104 −24 Original line number Diff line number Diff line Loading @@ -161,6 +161,9 @@ public class DataNetworkController extends Handler { /** Event for registering all events. */ private static final int EVENT_REGISTER_ALL_EVENTS = 19; /** Event for emergency call started or ended. */ private static final int EVENT_EMERGENCY_CALL_CHANGED = 20; /** The supported IMS features. This is for IMS graceful tear down support. */ private static final Collection<Integer> SUPPORTED_IMS_FEATURES = List.of(ImsFeature.FEATURE_MMTEL, ImsFeature.FEATURE_RCS); Loading Loading @@ -615,7 +618,7 @@ public class DataNetworkController extends Handler { DataEvaluationReason.DATA_ENABLED_CHANGED)); } @Override public void onRoamingEnabledChanged(boolean enabled) { public void onDataRoamingEnabledChanged(boolean enabled) { // If data roaming is enabled by the user, evaluate the unsatisfied network // requests and then attempt to setup data networks to satisfy them. // If data roaming is disabled, evaluate the existing data networks and Loading Loading @@ -677,6 +680,7 @@ public class DataNetworkController extends Handler { EVENT_PS_RESTRICT_ENABLED, null); mPhone.getServiceStateTracker().registerForPsRestrictedDisabled(this, EVENT_PS_RESTRICT_DISABLED, null); mPhone.registerForEmergencyCallToggle(this, EVENT_EMERGENCY_CALL_CHANGED, null); mDataServiceManagers.get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .registerForServiceBindingChanged(this, EVENT_DATA_SERVICE_BINDING_CHANGED); Loading Loading @@ -781,6 +785,15 @@ public class DataNetworkController extends Handler { case EVENT_SERVICE_STATE_CHANGED: onServiceStateChanged(); break; case EVENT_EMERGENCY_CALL_CHANGED: if (mPhone.isInEcm()) { sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS, DataEvaluationReason.EMERGENCY_CALL_CHANGED)); } else { sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS, DataEvaluationReason.EMERGENCY_CALL_CHANGED)); } break; default: loge("Unexpected event " + msg.what); } Loading Loading @@ -974,11 +987,10 @@ public class DataNetworkController extends Handler { evaluation.addDataDisallowedReason(DataDisallowedReason.DEFAULT_DATA_UNSELECTED); } // TODO: Support data roaming check /*if (mServiceState.getDataRoaming() && !mDataSettingManager.isDataRoamingEnabled()) { // Check if data roaming is disabled. if (mServiceState.getDataRoaming() && !mDataSettingsManager.isDataRoamingEnabled()) { evaluation.addDataDisallowedReason(DataDisallowedReason.ROAMING_DISABLED); }*/ } // Check if data is restricted by the network. if (mPsRestricted) { Loading Loading @@ -1011,15 +1023,59 @@ public class DataNetworkController extends Handler { evaluation.addDataDisallowedReason(DataDisallowedReason.NO_SUITABLE_DATA_PROFILE); } // TODO: Support data enabled/disabled check // Check if data is disabled int[] apnTypes = Arrays.stream(networkRequest.getApnTypesCapabilities()) .map(DataUtils::networkCapabilityToApnType).toArray(); int apnType = 0; for (int apn : apnTypes) { apnType |= apn; } if (apnType == 0 ? !mDataSettingsManager.isDataEnabled() : !mDataSettingsManager.isDataEnabled(apnType)) { evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_DISABLED); } // TODO: Handle restricted request // TODO: Handle unmetered request // Check if device is CDMA and is currently in ECBM if (mPhone.isInEcm() && mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) { evaluation.addDataDisallowedReason(DataDisallowedReason.EMERGENCY_CALL); } if (!evaluation.isDataAllowed()) { // TODO: Add more soft disallowed reason bypass support. } else { // Check whether to allow data in certain situations if data is disallowed for soft reasons if (evaluation.isDataAllowed()) { evaluation.addDataAllowedReason(DataAllowedReason.NORMAL); } else if (!evaluation.containsHardDisallowedReasons()) { // Check if request is MMS and MMS is always allowed if (networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS) && mDataSettingsManager.isMmsAlwaysAllowed()) { evaluation.addDataAllowedReason(DataAllowedReason.MMS_REQUEST); } // Check if request is unmetered (WiFi or unmetered APN) if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { evaluation.addDataAllowedReason(DataAllowedReason.UNMETERED_USAGE); } else if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) { List<Integer> meteredApns = mServiceState.getDataRoaming() ? mDataConfigManager.getMeteredApnTypesWhenRoaming() : mDataConfigManager.getMeteredApnTypes(); boolean unmetered = !meteredApns.isEmpty() && apnTypes.length != 0; for (int apn : apnTypes) { if (meteredApns.contains(apn)) { unmetered = false; break; } } if (unmetered) { evaluation.addDataAllowedReason(DataAllowedReason.UNMETERED_USAGE); } } // Check if request is restricted if (!networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) { evaluation.addDataAllowedReason(DataAllowedReason.RESTRICTED_REQUEST); } } if (evaluation.isDataAllowed()) { evaluation.setCandidateDataProfile(dataProfile); } Loading Loading @@ -1109,8 +1165,22 @@ public class DataNetworkController extends Handler { evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_RESTRICTED_BY_NETWORK); } // TODO: Add data enabled check after DataSettingsManager is available. // TODO: Add data roaming check after DataSettingsManager is available. // Check if device is CDMA and is currently in ECBM if (mPhone.isInEcm() && mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) { evaluation.addDataDisallowedReason(DataDisallowedReason.EMERGENCY_CALL); } // Check if data is disabled boolean dataDisabled = false; if (!mDataSettingsManager.isDataEnabled()) { dataDisabled = true; } // Check if data roaming is disabled if (mPhone.getServiceState().getDataRoaming() && !mDataSettingsManager.isDataRoamingEnabled()) { evaluation.addDataDisallowedReason(DataDisallowedReason.ROAMING_DISABLED); } // Check if current data network type is allowed by the data profile. Use the lingering // network type. Some data network is allowed to create on certain RATs, but can linger Loading @@ -1118,17 +1188,27 @@ public class DataNetworkController extends Handler { // extend its life cycle to 3G. int networkType = getDataNetworkType(dataNetwork.getTransport()); DataProfile dataProfile = dataNetwork.getDataProfile(); if (dataProfile.getApnSetting() != null if (dataProfile.getApnSetting() != null) { // Check if data is disabled for the APN type dataDisabled = !mDataSettingsManager.isDataEnabled( dataProfile.getApnSetting().getApnTypeBitmask()); // Sometimes network temporarily OOS and network type becomes UNKNOWN. We don't // tear down network in that case. && networkType != TelephonyManager.NETWORK_TYPE_UNKNOWN if (networkType != TelephonyManager.NETWORK_TYPE_UNKNOWN && !dataProfile.getApnSetting().canSupportLingeringNetworkType(networkType)) { log("networkType=" + TelephonyManager.getNetworkTypeName(networkType) + ", networkTypeBitmask=" + dataProfile.getApnSetting().getNetworkTypeBitmask() + ", lingeringNetworkTypeBitmask=" + dataProfile.getApnSetting().getLingeringNetworkTypeBitmask()); evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_NETWORK_TYPE_NOT_ALLOWED); evaluation.addDataDisallowedReason( DataDisallowedReason.DATA_NETWORK_TYPE_NOT_ALLOWED); } } if (dataDisabled) { evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_DISABLED); } if (evaluation.isDataAllowed()) { Loading Loading
src/java/com/android/internal/telephony/SubscriptionController.java +1 −1 Original line number Diff line number Diff line Loading @@ -72,7 +72,7 @@ import android.util.Log; import com.android.ims.ImsManager; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.IccCardConstants.State; import com.android.internal.telephony.dataconnection.DataEnabledOverride; import com.android.internal.telephony.data.DataEnabledOverride; import com.android.internal.telephony.metrics.TelephonyMetrics; import com.android.internal.telephony.uicc.IccUtils; import com.android.internal.telephony.uicc.UiccCard; Loading
src/java/com/android/internal/telephony/data/DataConfigManager.java +2 −0 Original line number Diff line number Diff line Loading @@ -398,6 +398,7 @@ public class DataConfigManager extends Handler { * @return The metered APN types when connected to a home network */ public @NonNull @ApnType List<Integer> getMeteredApnTypes() { // TODO: return as set instead of list return Collections.unmodifiableList(mMeteredApnTypes); } Loading @@ -405,6 +406,7 @@ public class DataConfigManager extends Handler { * @return The metered APN types when roaming */ public @NonNull @ApnType List<Integer> getMeteredApnTypesWhenRoaming() { // TODO: return as set instead of list return Collections.unmodifiableList(mRoamingMeteredApnTypes); } Loading
src/java/com/android/internal/telephony/dataconnection/DataEnabledOverride.java→src/java/com/android/internal/telephony/data/DataEnabledOverride.java +3 −3 Original line number Diff line number Diff line /* * Copyright 2019 The Android Open Source Project * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. Loading @@ -14,7 +14,7 @@ * limitations under the License. */ package com.android.internal.telephony.dataconnection; package com.android.internal.telephony.data; import android.annotation.IntDef; import android.annotation.NonNull; Loading @@ -31,7 +31,7 @@ import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.SubscriptionController; import com.android.internal.telephony.dataconnection.DataEnabledOverride.OverrideConditions.Condition; import com.android.internal.telephony.data.DataEnabledOverride.OverrideConditions.Condition; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; Loading
src/java/com/android/internal/telephony/data/DataEvaluation.java +9 −2 Original line number Diff line number Diff line Loading @@ -179,13 +179,14 @@ public class DataEvaluation { DATA_RESTRICTED_CHANGED, /** Network capabilities changed. The unsatisfied requests might have chances to attach. */ DATA_NETWORK_CAPABILITIES_CHANGED, /** When emergency call started or ended. */ EMERGENCY_CALL_CHANGED, } /** Disallowed reasons. There could be multiple reasons if data connection is not allowed. */ public enum DataDisallowedReason { // Soft failure reasons. A soft reason means that in certain conditions, data is still // allowed. Normally those reasons are due to users settings. /** Data is disabled by the user or policy. */ DATA_DISABLED(false), /** Data roaming is disabled by the user. */ Loading Loading @@ -214,7 +215,9 @@ public class DataEvaluation { /** Unable to find a suitable data profile. */ NO_SUITABLE_DATA_PROFILE(true), /** Current data network type not allowed. */ DATA_NETWORK_TYPE_NOT_ALLOWED(true); DATA_NETWORK_TYPE_NOT_ALLOWED(true), /** Device is currently in an emergency call. */ EMERGENCY_CALL(true); private final boolean mIsHardReason; Loading Loading @@ -257,6 +260,10 @@ public class DataEvaluation { * the user enables or disables data. */ UNMETERED_USAGE, /** * The network request supports MMS and MMS is always allowed. */ MMS_REQUEST, /** * The network request is restricted (i.e. Only privilege apps can access the network.) */ Loading
src/java/com/android/internal/telephony/data/DataNetworkController.java +104 −24 Original line number Diff line number Diff line Loading @@ -161,6 +161,9 @@ public class DataNetworkController extends Handler { /** Event for registering all events. */ private static final int EVENT_REGISTER_ALL_EVENTS = 19; /** Event for emergency call started or ended. */ private static final int EVENT_EMERGENCY_CALL_CHANGED = 20; /** The supported IMS features. This is for IMS graceful tear down support. */ private static final Collection<Integer> SUPPORTED_IMS_FEATURES = List.of(ImsFeature.FEATURE_MMTEL, ImsFeature.FEATURE_RCS); Loading Loading @@ -615,7 +618,7 @@ public class DataNetworkController extends Handler { DataEvaluationReason.DATA_ENABLED_CHANGED)); } @Override public void onRoamingEnabledChanged(boolean enabled) { public void onDataRoamingEnabledChanged(boolean enabled) { // If data roaming is enabled by the user, evaluate the unsatisfied network // requests and then attempt to setup data networks to satisfy them. // If data roaming is disabled, evaluate the existing data networks and Loading Loading @@ -677,6 +680,7 @@ public class DataNetworkController extends Handler { EVENT_PS_RESTRICT_ENABLED, null); mPhone.getServiceStateTracker().registerForPsRestrictedDisabled(this, EVENT_PS_RESTRICT_DISABLED, null); mPhone.registerForEmergencyCallToggle(this, EVENT_EMERGENCY_CALL_CHANGED, null); mDataServiceManagers.get(AccessNetworkConstants.TRANSPORT_TYPE_WWAN) .registerForServiceBindingChanged(this, EVENT_DATA_SERVICE_BINDING_CHANGED); Loading Loading @@ -781,6 +785,15 @@ public class DataNetworkController extends Handler { case EVENT_SERVICE_STATE_CHANGED: onServiceStateChanged(); break; case EVENT_EMERGENCY_CALL_CHANGED: if (mPhone.isInEcm()) { sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS, DataEvaluationReason.EMERGENCY_CALL_CHANGED)); } else { sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS, DataEvaluationReason.EMERGENCY_CALL_CHANGED)); } break; default: loge("Unexpected event " + msg.what); } Loading Loading @@ -974,11 +987,10 @@ public class DataNetworkController extends Handler { evaluation.addDataDisallowedReason(DataDisallowedReason.DEFAULT_DATA_UNSELECTED); } // TODO: Support data roaming check /*if (mServiceState.getDataRoaming() && !mDataSettingManager.isDataRoamingEnabled()) { // Check if data roaming is disabled. if (mServiceState.getDataRoaming() && !mDataSettingsManager.isDataRoamingEnabled()) { evaluation.addDataDisallowedReason(DataDisallowedReason.ROAMING_DISABLED); }*/ } // Check if data is restricted by the network. if (mPsRestricted) { Loading Loading @@ -1011,15 +1023,59 @@ public class DataNetworkController extends Handler { evaluation.addDataDisallowedReason(DataDisallowedReason.NO_SUITABLE_DATA_PROFILE); } // TODO: Support data enabled/disabled check // Check if data is disabled int[] apnTypes = Arrays.stream(networkRequest.getApnTypesCapabilities()) .map(DataUtils::networkCapabilityToApnType).toArray(); int apnType = 0; for (int apn : apnTypes) { apnType |= apn; } if (apnType == 0 ? !mDataSettingsManager.isDataEnabled() : !mDataSettingsManager.isDataEnabled(apnType)) { evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_DISABLED); } // TODO: Handle restricted request // TODO: Handle unmetered request // Check if device is CDMA and is currently in ECBM if (mPhone.isInEcm() && mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) { evaluation.addDataDisallowedReason(DataDisallowedReason.EMERGENCY_CALL); } if (!evaluation.isDataAllowed()) { // TODO: Add more soft disallowed reason bypass support. } else { // Check whether to allow data in certain situations if data is disallowed for soft reasons if (evaluation.isDataAllowed()) { evaluation.addDataAllowedReason(DataAllowedReason.NORMAL); } else if (!evaluation.containsHardDisallowedReasons()) { // Check if request is MMS and MMS is always allowed if (networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS) && mDataSettingsManager.isMmsAlwaysAllowed()) { evaluation.addDataAllowedReason(DataAllowedReason.MMS_REQUEST); } // Check if request is unmetered (WiFi or unmetered APN) if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { evaluation.addDataAllowedReason(DataAllowedReason.UNMETERED_USAGE); } else if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) { List<Integer> meteredApns = mServiceState.getDataRoaming() ? mDataConfigManager.getMeteredApnTypesWhenRoaming() : mDataConfigManager.getMeteredApnTypes(); boolean unmetered = !meteredApns.isEmpty() && apnTypes.length != 0; for (int apn : apnTypes) { if (meteredApns.contains(apn)) { unmetered = false; break; } } if (unmetered) { evaluation.addDataAllowedReason(DataAllowedReason.UNMETERED_USAGE); } } // Check if request is restricted if (!networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) { evaluation.addDataAllowedReason(DataAllowedReason.RESTRICTED_REQUEST); } } if (evaluation.isDataAllowed()) { evaluation.setCandidateDataProfile(dataProfile); } Loading Loading @@ -1109,8 +1165,22 @@ public class DataNetworkController extends Handler { evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_RESTRICTED_BY_NETWORK); } // TODO: Add data enabled check after DataSettingsManager is available. // TODO: Add data roaming check after DataSettingsManager is available. // Check if device is CDMA and is currently in ECBM if (mPhone.isInEcm() && mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) { evaluation.addDataDisallowedReason(DataDisallowedReason.EMERGENCY_CALL); } // Check if data is disabled boolean dataDisabled = false; if (!mDataSettingsManager.isDataEnabled()) { dataDisabled = true; } // Check if data roaming is disabled if (mPhone.getServiceState().getDataRoaming() && !mDataSettingsManager.isDataRoamingEnabled()) { evaluation.addDataDisallowedReason(DataDisallowedReason.ROAMING_DISABLED); } // Check if current data network type is allowed by the data profile. Use the lingering // network type. Some data network is allowed to create on certain RATs, but can linger Loading @@ -1118,17 +1188,27 @@ public class DataNetworkController extends Handler { // extend its life cycle to 3G. int networkType = getDataNetworkType(dataNetwork.getTransport()); DataProfile dataProfile = dataNetwork.getDataProfile(); if (dataProfile.getApnSetting() != null if (dataProfile.getApnSetting() != null) { // Check if data is disabled for the APN type dataDisabled = !mDataSettingsManager.isDataEnabled( dataProfile.getApnSetting().getApnTypeBitmask()); // Sometimes network temporarily OOS and network type becomes UNKNOWN. We don't // tear down network in that case. && networkType != TelephonyManager.NETWORK_TYPE_UNKNOWN if (networkType != TelephonyManager.NETWORK_TYPE_UNKNOWN && !dataProfile.getApnSetting().canSupportLingeringNetworkType(networkType)) { log("networkType=" + TelephonyManager.getNetworkTypeName(networkType) + ", networkTypeBitmask=" + dataProfile.getApnSetting().getNetworkTypeBitmask() + ", lingeringNetworkTypeBitmask=" + dataProfile.getApnSetting().getLingeringNetworkTypeBitmask()); evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_NETWORK_TYPE_NOT_ALLOWED); evaluation.addDataDisallowedReason( DataDisallowedReason.DATA_NETWORK_TYPE_NOT_ALLOWED); } } if (dataDisabled) { evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_DISABLED); } if (evaluation.isDataAllowed()) { Loading