diff options
Diffstat (limited to 'src/java/com/android/internal/telephony/data/DataConfigManager.java')
-rw-r--r-- | src/java/com/android/internal/telephony/data/DataConfigManager.java | 69 |
1 files changed, 58 insertions, 11 deletions
diff --git a/src/java/com/android/internal/telephony/data/DataConfigManager.java b/src/java/com/android/internal/telephony/data/DataConfigManager.java index f7fe4ad0f8..ea7b1da2a8 100644 --- a/src/java/com/android/internal/telephony/data/DataConfigManager.java +++ b/src/java/com/android/internal/telephony/data/DataConfigManager.java @@ -31,6 +31,7 @@ import android.telephony.Annotation.ApnType; import android.telephony.Annotation.NetCapability; import android.telephony.Annotation.NetworkType; import android.telephony.CarrierConfigManager; +import android.telephony.NetworkRegistrationInfo; import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SubscriptionManager; @@ -46,6 +47,7 @@ import com.android.internal.telephony.Phone; import com.android.internal.telephony.data.DataNetworkController.HandoverRule; import com.android.internal.telephony.data.DataRetryManager.DataHandoverRetryRule; import com.android.internal.telephony.data.DataRetryManager.DataSetupRetryRule; +import com.android.internal.telephony.flags.FeatureFlags; import com.android.telephony.Rlog; import java.io.FileDescriptor; @@ -213,8 +215,8 @@ public class DataConfigManager extends Handler { "anomaly_network_handover_timeout"; /** DeviceConfig key of anomaly report: True for enabling APN config invalidity detection */ private static final String KEY_ANOMALY_APN_CONFIG_ENABLED = "anomaly_apn_config_enabled"; - /** Invalid auto data switch score. */ - private static final int INVALID_AUTO_DATA_SWITCH_SCORE = -1; + /** Placeholder indicating missing Auto data switch score config, meaning out of service. */ + private static final int OUT_OF_SERVICE_AUTO_DATA_SWITCH_SCORE = 0; /** Anomaly report thresholds for frequent setup data call failure. */ private EventFrequency mSetupDataCallAnomalyReportThreshold; @@ -259,6 +261,7 @@ public class DataConfigManager extends Handler { private @NonNull final Phone mPhone; private @NonNull final String mLogTag; + @NonNull private final FeatureFlags mFeatureFlags; private @NonNull final CarrierConfigManager mCarrierConfigManager; private @NonNull PersistableBundle mCarrierConfig = null; private @NonNull Resources mResources = null; @@ -295,6 +298,9 @@ public class DataConfigManager extends Handler { private @NonNull final List<HandoverRule> mHandoverRuleList = new ArrayList<>(); /** {@code True} keep IMS network in case of moving to non VOPS area; {@code false} otherwise.*/ private boolean mShouldKeepNetworkUpInNonVops = false; + /** The set of network types that enable VOPS even in non VOPS area. */ + @NonNull private final @CarrierConfigManager.Ims.NetworkType List<Integer> + mEnabledVopsNetworkTypesInNonVops = new ArrayList<>(); /** * A map of network types to the estimated downlink values by signal strength 0 - 4 for that * network type @@ -309,9 +315,11 @@ public class DataConfigManager extends Handler { * @param looper The looper to be used by the handler. Currently the handler thread is the * phone process's main thread. */ - public DataConfigManager(@NonNull Phone phone, @NonNull Looper looper) { + public DataConfigManager(@NonNull Phone phone, @NonNull Looper looper, + @NonNull FeatureFlags featureFlags) { super(looper); mPhone = phone; + mFeatureFlags = featureFlags; mLogTag = "DCM-" + mPhone.getPhoneId(); log("DataConfigManager created."); @@ -326,7 +334,7 @@ public class DataConfigManager extends Handler { // Register for device config update DeviceConfig.addOnPropertiesChangedListener( - DeviceConfig.NAMESPACE_TELEPHONY, this::post, + DeviceConfig.NAMESPACE_TELEPHONY, Runnable::run, properties -> { if (TextUtils.equals(DeviceConfig.NAMESPACE_TELEPHONY, properties.getNamespace())) { @@ -590,10 +598,20 @@ public class DataConfigManager extends Handler { */ public @NonNull @NetCapability Set<Integer> getMeteredNetworkCapabilities(boolean isRoaming) { Set<Integer> meteredApnTypes = isRoaming ? mRoamingMeteredApnTypes : mMeteredApnTypes; - return meteredApnTypes.stream() + Set<Integer> meteredCapabilities = meteredApnTypes.stream() .map(DataUtils::apnTypeToNetworkCapability) .filter(cap -> cap >= 0) - .collect(Collectors.toUnmodifiableSet()); + .collect(Collectors.toSet()); + + // Consumer slices are the slices that are allowed to be accessed by regular application to + // get better performance. They should be metered. This can be turned into configurations in + // the future. + if (mFeatureFlags.meteredEmbbUrlcc()) { + meteredCapabilities.add(NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_BANDWIDTH); + meteredCapabilities.add(NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_LATENCY); + } + + return Collections.unmodifiableSet(meteredCapabilities); } /** @@ -666,6 +684,11 @@ public class DataConfigManager extends Handler { synchronized (this) { mShouldKeepNetworkUpInNonVops = mCarrierConfig.getBoolean(CarrierConfigManager .Ims.KEY_KEEP_PDN_UP_IN_NO_VOPS_BOOL); + int[] allowedNetworkTypes = mCarrierConfig.getIntArray( + CarrierConfigManager.Ims.KEY_IMS_PDN_ENABLED_IN_NO_VOPS_SUPPORT_INT_ARRAY); + if (allowedNetworkTypes != null) { + Arrays.stream(allowedNetworkTypes).forEach(mEnabledVopsNetworkTypesInNonVops::add); + } } } @@ -684,9 +707,29 @@ public class DataConfigManager extends Handler { return Collections.unmodifiableSet(mCapabilitiesExemptFromSingleDataList); } - /** {@code True} keep IMS network in case of moving to non VOPS area; {@code false} otherwise.*/ - public boolean shouldKeepNetworkUpInNonVops() { - return mShouldKeepNetworkUpInNonVops; + /** + * @param regState The modem reported data registration state. + * @return {@code true} if should keep IMS network in case of moving to non VOPS area. + */ + public boolean shouldKeepNetworkUpInNonVops(@NetworkRegistrationInfo.RegistrationState + int regState) { + return mShouldKeepNetworkUpInNonVops || allowBringUpNetworkInNonVops(regState); + } + + /** + * @param regState The modem reported data registration state. + * @return {@code true} if allow bring up IMS network in case of moving to non VOPS area. + */ + public boolean allowBringUpNetworkInNonVops(@NetworkRegistrationInfo.RegistrationState + int regState) { + if (!mFeatureFlags.allowMmtelInNonVops()) return false; + int networkType = -1; + if (regState == NetworkRegistrationInfo.REGISTRATION_STATE_HOME) { + networkType = CarrierConfigManager.Ims.NETWORK_TYPE_HOME; + } else if (regState == NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING) { + networkType = CarrierConfigManager.Ims.NETWORK_TYPE_ROAMING; + } + return mEnabledVopsNetworkTypesInNonVops.contains(networkType); } /** {@code True} requires ping test to pass on the target slot before switching to it.*/ @@ -941,6 +984,7 @@ public class DataConfigManager extends Handler { DATA_CONFIG_NETWORK_TYPE_EHRPD, DATA_CONFIG_NETWORK_TYPE_IDEN, DATA_CONFIG_NETWORK_TYPE_LTE, + DATA_CONFIG_NETWORK_TYPE_LTE_CA, DATA_CONFIG_NETWORK_TYPE_HSPAP, DATA_CONFIG_NETWORK_TYPE_GSM, DATA_CONFIG_NETWORK_TYPE_TD_SCDMA, @@ -978,12 +1022,14 @@ public class DataConfigManager extends Handler { * @param displayInfo The displayed network info. * @param signalStrength The signal strength. * @return Score base on network type and signal strength to inform auto data switch decision. + * The min score is {@link #OUT_OF_SERVICE_AUTO_DATA_SWITCH_SCORE} indicating missing config. */ public int getAutoDataSwitchScore(@NonNull TelephonyDisplayInfo displayInfo, @NonNull SignalStrength signalStrength) { int[] scores = mAutoDataSwitchNetworkTypeSignalMap.get( getDataConfigNetworkType(displayInfo)); - return scores != null ? scores[signalStrength.getLevel()] : INVALID_AUTO_DATA_SWITCH_SCORE; + return scores != null ? scores[signalStrength.getLevel()] + : OUT_OF_SERVICE_AUTO_DATA_SWITCH_SCORE; } /** @@ -1421,7 +1467,8 @@ public class DataConfigManager extends Handler { pw.println("Capabilities exempt from single PDN=" + mCapabilitiesExemptFromSingleDataList .stream().map(DataUtils::networkCapabilityToString) .collect(Collectors.joining(","))); - pw.println("mShouldKeepNetworkUpInNoVops=" + mShouldKeepNetworkUpInNonVops); + pw.println("mShouldKeepNetworkUpInNonVops=" + mShouldKeepNetworkUpInNonVops); + pw.println("mEnabledVopsNetworkTypesInNonVops=" + mEnabledVopsNetworkTypesInNonVops); pw.println("isPingTestBeforeAutoDataSwitchRequired=" + isPingTestBeforeAutoDataSwitchRequired()); pw.println("Unmetered network types=" + String.join(",", mUnmeteredNetworkTypes)); |