From 8cf8788c033b2d3c276930e0134cda1935ff5b1a Mon Sep 17 00:00:00 2001 From: Jack Yu Date: Sun, 17 Oct 2021 18:15:32 -0700 Subject: [PATCH 1/2] Added setup/tear down data support 1. Added setup data network support. 2. Hook validation status down to data stall recovery manager. 3. Prelimanary changes before removing TransportManager. 4. Added tear down network support. 5. Added initial attach APN support. 6. Added set data profiles at modem support. Bug: 196597630 Test: atest DataNetworkControllerTest DataProfileManagerTest DataProfileTest DataNetworkTest Merged-In: I837606d9e91339c66f2e2cff1a3a76d1029750c6 Change-Id: Ia620c19ef29f832b89d49faeef5235c25a162089 --- core/java/android/provider/Telephony.java | 17 ++++ .../java/android/telephony/Annotation.java | 57 +++++++++++++ .../telephony/CarrierConfigManager.java | 2 +- .../java/android/telephony/DataFailCause.java | 7 ++ .../android/telephony/data/DataProfile.java | 84 ++++++++++++++++++- 5 files changed, 165 insertions(+), 2 deletions(-) diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java index 1b2646549dcea..b79b3d8083e84 100644 --- a/core/java/android/provider/Telephony.java +++ b/core/java/android/provider/Telephony.java @@ -3583,6 +3583,23 @@ public final class Telephony { public static final Uri ENFORCE_MANAGED_URI = Uri.parse( "content://telephony/carriers/enforce_managed"); + /** + * The {@code content://} style URL for the perferred APN used for internet. + * + * @hide + */ + public static final Uri PREFERRED_APN_URI = Uri.parse( + "content://telephony/carriers/preferapn/subId/"); + + /** + * The {@code content://} style URL for the perferred APN set id. + * + * @hide + */ + public static final Uri PREFERRED_APN_SET_URI = Uri.parse( + "content://telephony/carriers/preferapnset/subId/"); + + /** * The column name for ENFORCE_MANAGED_URI, indicates whether DPC-owned APNs are enforced. * @hide diff --git a/telephony/java/android/telephony/Annotation.java b/telephony/java/android/telephony/Annotation.java index 23cf5116b2da7..e88106cb95fe4 100644 --- a/telephony/java/android/telephony/Annotation.java +++ b/telephony/java/android/telephony/Annotation.java @@ -1,6 +1,8 @@ package android.telephony; import android.annotation.IntDef; +import android.net.NetworkAgent; +import android.net.NetworkCapabilities; import android.telecom.Connection; import android.telephony.data.ApnSetting; @@ -664,4 +666,59 @@ public class Annotation { TelephonyManager.THERMAL_MITIGATION_RESULT_INVALID_STATE, TelephonyManager.THERMAL_MITIGATION_RESULT_UNKNOWN_ERROR}) public @interface ThermalMitigationResult {} + + /** + * Per Android API guideline 8.15, annotation can't be public APIs. So duplicate + * android.net.NetworkCapabilities.NetCapability here. Must update here when new capabilities + * are added in {@link NetworkCapabilities}. + */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(prefix = { "NET_CAPABILITY_" }, value = { + NetworkCapabilities.NET_CAPABILITY_MMS, + NetworkCapabilities.NET_CAPABILITY_SUPL, + NetworkCapabilities.NET_CAPABILITY_DUN, + NetworkCapabilities.NET_CAPABILITY_FOTA, + NetworkCapabilities.NET_CAPABILITY_IMS, + NetworkCapabilities.NET_CAPABILITY_CBS, + NetworkCapabilities.NET_CAPABILITY_WIFI_P2P, + NetworkCapabilities.NET_CAPABILITY_IA, + NetworkCapabilities.NET_CAPABILITY_RCS, + NetworkCapabilities.NET_CAPABILITY_XCAP, + NetworkCapabilities.NET_CAPABILITY_EIMS, + NetworkCapabilities.NET_CAPABILITY_NOT_METERED, + NetworkCapabilities.NET_CAPABILITY_INTERNET, + NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED, + NetworkCapabilities.NET_CAPABILITY_TRUSTED, + NetworkCapabilities.NET_CAPABILITY_NOT_VPN, + NetworkCapabilities.NET_CAPABILITY_VALIDATED, + NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL, + NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, + NetworkCapabilities.NET_CAPABILITY_FOREGROUND, + NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED, + NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED, + NetworkCapabilities.NET_CAPABILITY_OEM_PAID, + NetworkCapabilities.NET_CAPABILITY_MCX, + NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY, + NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED, + NetworkCapabilities.NET_CAPABILITY_OEM_PRIVATE, + NetworkCapabilities.NET_CAPABILITY_VEHICLE_INTERNAL, + NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED, + NetworkCapabilities.NET_CAPABILITY_ENTERPRISE, + NetworkCapabilities.NET_CAPABILITY_VSIM, + NetworkCapabilities.NET_CAPABILITY_BIP, + NetworkCapabilities.NET_CAPABILITY_HEAD_UNIT, + }) + public @interface NetCapability { } + + /** + * Per Android API guideline 8.15, annotation can't be public APIs. So duplicate + * android.net.NetworkAgent.ValidationStatus here. Must update here when new validation status + * are added in {@link NetworkAgent}. + */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(prefix = { "VALIDATION_STATUS_" }, value = { + NetworkAgent.VALIDATION_STATUS_VALID, + NetworkAgent.VALIDATION_STATUS_NOT_VALID + }) + public @interface ValidationStatus {} } diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 4f94a62132348..946c01c2c554b 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -6286,9 +6286,9 @@ public class CarrierConfigManager { "capabilities=eims, retry_interval=1000, maximum_retries=20", "fail_causes=8|27|28|29|30|32|33|35|50|51|111|-5|-6|65537|65538|-3|2253|" + "2254, maximum_retries=0", // No retry for those causes + "capabilities=mms|supl|cbs, retry_interval=2000", "capabilities=internet|enterprise|dun|ims|fota, retry_interval=2000, " + "backoff=true, maximum_retries=13", - "capabilities=mms|supl|cbs, retry_interval=2000" }); sDefaults.putStringArray(KEY_MISSED_INCOMING_CALL_SMS_PATTERN_STRING_ARRAY, new String[0]); sDefaults.putBoolean(KEY_DISABLE_DUN_APN_WHILE_ROAMING_WITH_PRESET_APN_BOOL, false); diff --git a/telephony/java/android/telephony/DataFailCause.java b/telephony/java/android/telephony/DataFailCause.java index 88efe1f6a4a7f..56bf3039d209a 100644 --- a/telephony/java/android/telephony/DataFailCause.java +++ b/telephony/java/android/telephony/DataFailCause.java @@ -1076,6 +1076,13 @@ public final class DataFailCause { */ public static final int SERVICE_TEMPORARILY_UNAVAILABLE = 0x10009; + /** + * The request is not supported by the vendor. + * + * @hide + */ + public static final int REQUEST_NOT_SUPPORTED = 0x1000A; + private static final Map sFailCauseMap; static { sFailCauseMap = new HashMap<>(); diff --git a/telephony/java/android/telephony/data/DataProfile.java b/telephony/java/android/telephony/data/DataProfile.java index 93903d2658cd1..43ad982f2e1ee 100644 --- a/telephony/java/android/telephony/data/DataProfile.java +++ b/telephony/java/android/telephony/data/DataProfile.java @@ -22,9 +22,11 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; +import android.net.NetworkCapabilities; import android.os.Parcel; import android.os.Parcelable; import android.telephony.Annotation.ApnType; +import android.telephony.Annotation.NetCapability; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager.NetworkTypeBitMask; import android.telephony.data.ApnSetting.AuthType; @@ -66,7 +68,7 @@ public final class DataProfile implements Parcelable { private final @Nullable TrafficDescriptor mTrafficDescriptor; - private final boolean mPreferred; + private boolean mPreferred; private DataProfile(@NonNull Builder builder) { mApnSetting = builder.mApnSetting; @@ -290,6 +292,16 @@ public final class DataProfile implements Parcelable { return false; } + /** + * Set the preferred flag for the data profile. + * + * @param preferred {@code true} if this data profile is preferred for internet. + * @hide + */ + public void setPreferred(boolean preferred) { + mPreferred = preferred; + } + /** * @return {@code true} if this data profile was used to bring up the last default * (i.e internet) data connection successfully, or the one chosen by the user in Settings' @@ -315,6 +327,76 @@ public final class DataProfile implements Parcelable { return mTrafficDescriptor; } + /** + * Check if this data profile can satisfy certain network capabilities + * + * @param networkCapabilities The network capabilities. Note that the non-APN-type capabilities + * will be ignored. + * + * @return {@code true} if this data profile can satisfy the given network capabilities. + * @hide + */ + public boolean canSatisfy(@NonNull @NetCapability int[] networkCapabilities) { + if (mApnSetting != null) { + for (int netCap : networkCapabilities) { + if (!canSatisfy(netCap)) { + return false; + } + } + return true; + } + return false; + } + + /** + * Check if this data profile can satisfy a certain network capability. + * + * @param networkCapability The network capability. Note that the non-APN-type capability + * will always be satisfied. + * @return {@code true} if this data profile can satisfy the given network capability. + * @hide + */ + public boolean canSatisfy(@NetCapability int networkCapability) { + return mApnSetting != null && mApnSetting.canHandleType( + networkCapabilityToApnType(networkCapability)); + } + + /** + * Convert network capability into APN type. + * + * @param networkCapability Network capability. + * @return APN type. + * @hide + */ + private static @ApnType int networkCapabilityToApnType(@NetCapability int networkCapability) { + switch (networkCapability) { + case NetworkCapabilities.NET_CAPABILITY_MMS: + return ApnSetting.TYPE_MMS; + case NetworkCapabilities.NET_CAPABILITY_SUPL: + return ApnSetting.TYPE_SUPL; + case NetworkCapabilities.NET_CAPABILITY_DUN: + return ApnSetting.TYPE_DUN; + case NetworkCapabilities.NET_CAPABILITY_FOTA: + return ApnSetting.TYPE_FOTA; + case NetworkCapabilities.NET_CAPABILITY_IMS: + return ApnSetting.TYPE_IMS; + case NetworkCapabilities.NET_CAPABILITY_CBS: + return ApnSetting.TYPE_CBS; + case NetworkCapabilities.NET_CAPABILITY_XCAP: + return ApnSetting.TYPE_XCAP; + case NetworkCapabilities.NET_CAPABILITY_EIMS: + return ApnSetting.TYPE_EMERGENCY; + case NetworkCapabilities.NET_CAPABILITY_INTERNET: + return ApnSetting.TYPE_DEFAULT; + case NetworkCapabilities.NET_CAPABILITY_MCX: + return ApnSetting.TYPE_MCX; + case NetworkCapabilities.NET_CAPABILITY_IA: + return ApnSetting.TYPE_IA; + default: + return ApnSetting.TYPE_NONE; + } + } + @Override public int describeContents() { return 0; From 5169d5c2223b83989b67a564e2935ae57a56d980 Mon Sep 17 00:00:00 2001 From: Jack Yu Date: Sat, 20 Nov 2021 13:15:59 -0800 Subject: [PATCH 2/2] Added data retry support 1. Support multiple retry interval. 2. Completed data retry manager. 3. Used Google Truth for data unit tests. Test: Manual & atest DataRetryManagerTest Bug: 196597630 Merged-In: I04cadac100040054d449892df50e30dc77954082 Change-Id: I04cadac100040054d449892df50e30dc77954082 --- .../telephony/CarrierConfigManager.java | 39 +++++++++++-------- .../android/telephony/data/DataProfile.java | 31 ++++++++++++++- 2 files changed, 52 insertions(+), 18 deletions(-) diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 946c01c2c554b..8f957fd6c855a 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -5465,13 +5465,11 @@ public class CarrierConfigManager { public static final String KEY_APN_PRIORITY_STRING_ARRAY = "apn_priority_string_array"; /** - * Network capability priority for determine the satisfy order in telephony. This is used when - * the network only allows single PDN. The priority is from the lowest 0 to the highest 100. - * The long-lived network request usually has the lowest priority. This allows other short-lived - * requests like MMS requests to be established. Emergency request always has the highest - * priority. + * Network capability priority for determine the satisfy order in telephony. The priority is + * from the lowest 0 to the highest 100. The long-lived network shall have the lowest priority. + * This allows other short-lived requests like MMS requests to be established. Emergency request + * always has the highest priority. * - * // TODO: Remove KEY_APN_PRIORITY_STRING_ARRAY * @hide */ public static final String KEY_TELEPHONY_NETWORK_CAPABILITY_PRIORITIES_STRING_ARRAY = @@ -5481,17 +5479,17 @@ public class CarrierConfigManager { * Defines the rules for data retry. * * The syntax of the retry rule: - * 1. Retry based on {@link NetworkCapabilities} - * "capabilities=[netCaps1|netCaps2|...], [retry_interval=x], [backoff=[true|false]], - * [maximum_retries=y]" + * 1. Retry based on {@link NetworkCapabilities}. Note that only APN-type network capabilities + * are supported. + * "capabilities=[netCaps1|netCaps2|...], [retry_interval=n1|n2|n3|n4...], [maximum_retries=n]" * * 2. Retry based on {@link DataFailCause} - * "fail_causes=[cause1|cause2|cause3|...], [retry_interval=x], [backoff=[true|false]], - * [maximum_retries=y]" + * "fail_causes=[cause1|cause2|cause3|..], [retry_interval=n1|n2|n3|n4...], [maximum_retries=n]" * - * 3. Retry based on {@link NetworkCapabilities} and {@link DataFailCause} + * 3. Retry based on {@link NetworkCapabilities} and {@link DataFailCause}. Note that only + * APN-type network capabilities are supported. * "capabilities=[netCaps1|netCaps2|...], fail_causes=[cause1|cause2|cause3|...], - * [retry_interval=x], [backoff=[true|false]], [maximum_retries=y]" + * [retry_interval=n1|n2|n3|n4...], [maximum_retries=n]" * * For example, * "capabilities=eims, retry_interval=1000, maximum_retries=20" means if the attached @@ -5500,7 +5498,12 @@ public class CarrierConfigManager { * * "fail_causes=8|27|28|29|30|32|33|35|50|51|111|-5|-6|65537|65538|-3|2253|2254 * , maximum_retries=0" means for those fail causes, never retry with timers. Note that - * when environment changes, retry can still happens. + * when environment changes, retry can still happen. + * + * "capabilities=internet|enterprise|dun|ims|fota, retry_interval=2500|3000|" + * "5000|10000|15000|20000|40000|60000|120000|240000|600000|1200000|1800000" + * "1800000, maximum_retries=20" means for those capabilities, retry happens in 2.5s, 3s, 5s, + * 10s, 15s, 20s, 40s, 1m, 2m, 4m, 10m, 20m, 30m, 30m, 30m, until reaching 20 retries. * * // TODO: remove KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS * @hide @@ -6276,6 +6279,9 @@ public class CarrierConfigManager { "enterprise:0", "default:1", "mms:2", "supl:2", "dun:2", "hipri:3", "fota:2", "ims:2", "cbs:2", "ia:2", "emergency:2", "mcx:3", "xcap:3" }); + + // Do not modify the priority unless you know what you are doing. This will have significant + // impacts on the order of data network setup. sDefaults.putStringArray( KEY_TELEPHONY_NETWORK_CAPABILITY_PRIORITIES_STRING_ARRAY, new String[] { "eims:90", "supl:80", "mms:70", "xcap:70", "cbs:50", "mcx:50", "fota:50", @@ -6287,8 +6293,9 @@ public class CarrierConfigManager { "fail_causes=8|27|28|29|30|32|33|35|50|51|111|-5|-6|65537|65538|-3|2253|" + "2254, maximum_retries=0", // No retry for those causes "capabilities=mms|supl|cbs, retry_interval=2000", - "capabilities=internet|enterprise|dun|ims|fota, retry_interval=2000, " - + "backoff=true, maximum_retries=13", + "capabilities=internet|enterprise|dun|ims|fota, retry_interval=2500|3000|" + + "5000|10000|15000|20000|40000|60000|120000|240000|" + + "600000|1200000|1800000, maximum_retries=20" }); sDefaults.putStringArray(KEY_MISSED_INCOMING_CALL_SMS_PATTERN_STRING_ARRAY, new String[0]); sDefaults.putBoolean(KEY_DISABLE_DUN_APN_WHILE_ROAMING_WITH_PRESET_APN_BOOL, false); diff --git a/telephony/java/android/telephony/data/DataProfile.java b/telephony/java/android/telephony/data/DataProfile.java index 43ad982f2e1ee..c1d16a9aaea7f 100644 --- a/telephony/java/android/telephony/data/DataProfile.java +++ b/telephony/java/android/telephony/data/DataProfile.java @@ -18,6 +18,7 @@ package android.telephony.data; import static android.telephony.data.ApnSetting.ProtocolType; +import android.annotation.ElapsedRealtimeLong; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -70,6 +71,12 @@ public final class DataProfile implements Parcelable { private boolean mPreferred; + /** + * The last timestamp of this data profile being used for data network setup. Never add this + * to {@link #equals(Object)} and {@link #hashCode()}. + */ + private @ElapsedRealtimeLong long mSetupTimestamp; + private DataProfile(@NonNull Builder builder) { mApnSetting = builder.mApnSetting; mTrafficDescriptor = builder.mTrafficDescriptor; @@ -101,6 +108,7 @@ public final class DataProfile implements Parcelable { mApnSetting = source.readParcelable(ApnSetting.class.getClassLoader()); mTrafficDescriptor = source.readParcelable(TrafficDescriptor.class.getClassLoader()); mPreferred = source.readBoolean(); + mSetupTimestamp = source.readLong(); } /** @@ -397,6 +405,24 @@ public final class DataProfile implements Parcelable { } } + /** + * Set the timestamp of this data profile being used for data network setup. + * + * @hide + */ + public void setLastSetupTimestamp(@ElapsedRealtimeLong long timestamp) { + mSetupTimestamp = timestamp; + } + + /** + * @return the timestamp of this data profile being used for data network setup. + * + * @hide + */ + public @ElapsedRealtimeLong long getLastSetupTimestamp() { + return mSetupTimestamp; + } + @Override public int describeContents() { return 0; @@ -405,8 +431,8 @@ public final class DataProfile implements Parcelable { @NonNull @Override public String toString() { - return "DataProfile=" + mApnSetting + ", " + mTrafficDescriptor + ", preferred=" - + mPreferred; + return "[DataProfile=" + mApnSetting + ", " + mTrafficDescriptor + ", preferred=" + + mPreferred + "]"; } @Override @@ -415,6 +441,7 @@ public final class DataProfile implements Parcelable { dest.writeParcelable(mApnSetting, flags); dest.writeParcelable(mTrafficDescriptor, flags); dest.writeBoolean(mPreferred); + dest.writeLong(mSetupTimestamp); } public static final @android.annotation.NonNull Parcelable.Creator CREATOR =