diff options
author | 2022-03-03 18:42:30 +0000 | |
---|---|---|
committer | 2022-03-03 18:42:30 +0000 | |
commit | 29c90effd20585dd77e7cffa8052ac127eb346c2 (patch) | |
tree | 1edd5ad4af685e237f8fc31f83083023c940ae82 | |
parent | c3270b85fbe65335c693086c3879281af4c36a0b (diff) | |
parent | 5169d5c2223b83989b67a564e2935ae57a56d980 (diff) |
Merge changes from topics "data_retry", "setup_data"
* changes:
Added data retry support
Added setup/tear down data support
-rw-r--r-- | core/java/android/provider/Telephony.java | 17 | ||||
-rw-r--r-- | telephony/java/android/telephony/Annotation.java | 57 | ||||
-rw-r--r-- | telephony/java/android/telephony/CarrierConfigManager.java | 41 | ||||
-rw-r--r-- | telephony/java/android/telephony/DataFailCause.java | 7 | ||||
-rw-r--r-- | telephony/java/android/telephony/data/DataProfile.java | 115 |
5 files changed, 217 insertions, 20 deletions
diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java index 1b2646549dce..b79b3d8083e8 100644 --- a/core/java/android/provider/Telephony.java +++ b/core/java/android/provider/Telephony.java @@ -3584,6 +3584,23 @@ public final class Telephony { "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 23cf5116b2da..e88106cb95fe 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 4f94a6213234..8f957fd6c855 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", @@ -6286,9 +6292,10 @@ 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=internet|enterprise|dun|ims|fota, retry_interval=2000, " - + "backoff=true, maximum_retries=13", - "capabilities=mms|supl|cbs, retry_interval=2000" + "capabilities=mms|supl|cbs, retry_interval=2000", + "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/DataFailCause.java b/telephony/java/android/telephony/DataFailCause.java index 88efe1f6a4a7..56bf3039d209 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<Integer, String> sFailCauseMap; static { sFailCauseMap = new HashMap<>(); diff --git a/telephony/java/android/telephony/data/DataProfile.java b/telephony/java/android/telephony/data/DataProfile.java index 93903d2658cd..c1d16a9aaea7 100644 --- a/telephony/java/android/telephony/data/DataProfile.java +++ b/telephony/java/android/telephony/data/DataProfile.java @@ -18,13 +18,16 @@ 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; 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 +69,13 @@ public final class DataProfile implements Parcelable { private final @Nullable TrafficDescriptor mTrafficDescriptor; - private final boolean mPreferred; + 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; @@ -99,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(); } /** @@ -291,6 +301,16 @@ public final class DataProfile implements Parcelable { } /** + * 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' * APN editor. For one carrier there can be only one profiled preferred. @@ -315,6 +335,94 @@ 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; + } + } + + /** + * 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; @@ -323,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 @@ -333,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<DataProfile> CREATOR = |