Merge "APIs for 5G slicing" am: 08b9f41364
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1593931 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: I4d2a9cd1442a1bd0f194d5bb2b17f98c3f29e747
This commit is contained in:
@@ -39648,6 +39648,7 @@ package android.telephony {
|
||||
field public static final int ACTIVATION_REJECT_GGSN = 30; // 0x1e
|
||||
field public static final int ACTIVATION_REJECT_UNSPECIFIED = 31; // 0x1f
|
||||
field public static final int ACTIVE_PDP_CONTEXT_MAX_NUMBER_REACHED = 65; // 0x41
|
||||
field public static final int ALL_MATCHING_RULES_FAILED = 2254; // 0x8ce
|
||||
field public static final int APN_DISABLED = 2045; // 0x7fd
|
||||
field public static final int APN_DISALLOWED_ON_ROAMING = 2059; // 0x80b
|
||||
field public static final int APN_MISMATCH = 2054; // 0x806
|
||||
@@ -39797,6 +39798,7 @@ package android.telephony {
|
||||
field public static final int LTE_NAS_SERVICE_REQUEST_FAILED = 2117; // 0x845
|
||||
field public static final int LTE_THROTTLING_NOT_REQUIRED = 2127; // 0x84f
|
||||
field public static final int MAC_FAILURE = 2183; // 0x887
|
||||
field public static final int MATCH_ALL_RULE_NOT_ALLOWED = 2253; // 0x8cd
|
||||
field public static final int MAXIMIUM_NSAPIS_EXCEEDED = 2157; // 0x86d
|
||||
field public static final int MAXINUM_SIZE_OF_L2_MESSAGE_EXCEEDED = 2166; // 0x876
|
||||
field public static final int MAX_ACCESS_PROBE = 2079; // 0x81f
|
||||
|
||||
@@ -10439,6 +10439,7 @@ package android.telephony.data {
|
||||
method public long getRetryDurationMillis();
|
||||
method @Nullable public android.telephony.data.SliceInfo getSliceInfo();
|
||||
method @Deprecated public int getSuggestedRetryTime();
|
||||
method @NonNull public java.util.List<android.telephony.data.TrafficDescriptor> getTrafficDescriptors();
|
||||
method public void writeToParcel(android.os.Parcel, int);
|
||||
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.data.DataCallResponse> CREATOR;
|
||||
field public static final int HANDOVER_FAILURE_MODE_DO_FALLBACK = 1; // 0x1
|
||||
@@ -10474,6 +10475,7 @@ package android.telephony.data {
|
||||
method @NonNull public android.telephony.data.DataCallResponse.Builder setRetryDurationMillis(long);
|
||||
method @NonNull public android.telephony.data.DataCallResponse.Builder setSliceInfo(@Nullable android.telephony.data.SliceInfo);
|
||||
method @Deprecated @NonNull public android.telephony.data.DataCallResponse.Builder setSuggestedRetryTime(int);
|
||||
method @NonNull public android.telephony.data.DataCallResponse.Builder setTrafficDescriptors(@NonNull java.util.List<android.telephony.data.TrafficDescriptor>);
|
||||
}
|
||||
|
||||
public final class DataProfile implements android.os.Parcelable {
|
||||
@@ -10545,7 +10547,7 @@ package android.telephony.data {
|
||||
method public void setDataProfile(@NonNull java.util.List<android.telephony.data.DataProfile>, boolean, @NonNull android.telephony.data.DataServiceCallback);
|
||||
method public void setInitialAttachApn(@NonNull android.telephony.data.DataProfile, boolean, @NonNull android.telephony.data.DataServiceCallback);
|
||||
method public void setupDataCall(int, @NonNull android.telephony.data.DataProfile, boolean, boolean, int, @Nullable android.net.LinkProperties, @NonNull android.telephony.data.DataServiceCallback);
|
||||
method public void setupDataCall(int, @NonNull android.telephony.data.DataProfile, boolean, boolean, int, @Nullable android.net.LinkProperties, @IntRange(from=0, to=15) int, @Nullable android.telephony.data.SliceInfo, @NonNull android.telephony.data.DataServiceCallback);
|
||||
method public void setupDataCall(int, @NonNull android.telephony.data.DataProfile, boolean, boolean, int, @Nullable android.net.LinkProperties, @IntRange(from=0, to=15) int, @Nullable android.telephony.data.SliceInfo, @Nullable android.telephony.data.TrafficDescriptor, boolean, @NonNull android.telephony.data.DataServiceCallback);
|
||||
method public void startHandover(int, @NonNull android.telephony.data.DataServiceCallback);
|
||||
}
|
||||
|
||||
@@ -10647,6 +10649,15 @@ package android.telephony.data {
|
||||
method @NonNull public android.telephony.data.ThrottleStatus.Builder setTransportType(int);
|
||||
}
|
||||
|
||||
public final class TrafficDescriptor implements android.os.Parcelable {
|
||||
ctor public TrafficDescriptor(@Nullable String, @Nullable String);
|
||||
method public int describeContents();
|
||||
method @Nullable public String getDnn();
|
||||
method @Nullable public String getOsAppId();
|
||||
method public void writeToParcel(@NonNull android.os.Parcel, int);
|
||||
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.data.TrafficDescriptor> CREATOR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
package android.telephony.euicc {
|
||||
|
||||
@@ -302,6 +302,7 @@ package android.net {
|
||||
field public static final int NET_CAPABILITY_CBS = 5; // 0x5
|
||||
field public static final int NET_CAPABILITY_DUN = 2; // 0x2
|
||||
field public static final int NET_CAPABILITY_EIMS = 10; // 0xa
|
||||
field public static final int NET_CAPABILITY_ENTERPRISE = 29; // 0x1d
|
||||
field public static final int NET_CAPABILITY_FOREGROUND = 19; // 0x13
|
||||
field public static final int NET_CAPABILITY_FOTA = 3; // 0x3
|
||||
field public static final int NET_CAPABILITY_IA = 7; // 0x7
|
||||
|
||||
@@ -205,6 +205,7 @@ public final class NetworkCapabilities implements Parcelable {
|
||||
NET_CAPABILITY_OEM_PRIVATE,
|
||||
NET_CAPABILITY_VEHICLE_INTERNAL,
|
||||
NET_CAPABILITY_NOT_VCN_MANAGED,
|
||||
NET_CAPABILITY_ENTERPRISE,
|
||||
})
|
||||
public @interface NetCapability { }
|
||||
|
||||
@@ -415,8 +416,17 @@ public final class NetworkCapabilities implements Parcelable {
|
||||
@SystemApi
|
||||
public static final int NET_CAPABILITY_NOT_VCN_MANAGED = 28;
|
||||
|
||||
/**
|
||||
* Indicates that this network is intended for enterprise use.
|
||||
* <p>
|
||||
* 5G URSP rules may indicate that all data should use a connection dedicated for enterprise
|
||||
* use. If the enterprise capability is requested, all enterprise traffic will be routed over
|
||||
* the connection with this capability.
|
||||
*/
|
||||
public static final int NET_CAPABILITY_ENTERPRISE = 29;
|
||||
|
||||
private static final int MIN_NET_CAPABILITY = NET_CAPABILITY_MMS;
|
||||
private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_NOT_VCN_MANAGED;
|
||||
private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_ENTERPRISE;
|
||||
|
||||
/**
|
||||
* Network capabilities that are expected to be mutable, i.e., can change while a particular
|
||||
@@ -474,7 +484,8 @@ public final class NetworkCapabilities implements Parcelable {
|
||||
| (1 << NET_CAPABILITY_MCX)
|
||||
| (1 << NET_CAPABILITY_RCS)
|
||||
| (1 << NET_CAPABILITY_VEHICLE_INTERNAL)
|
||||
| (1 << NET_CAPABILITY_XCAP);
|
||||
| (1 << NET_CAPABILITY_XCAP)
|
||||
| (1 << NET_CAPABILITY_ENTERPRISE);
|
||||
|
||||
/**
|
||||
* Capabilities that force network to be restricted.
|
||||
@@ -2028,8 +2039,9 @@ public final class NetworkCapabilities implements Parcelable {
|
||||
case NET_CAPABILITY_PARTIAL_CONNECTIVITY: return "PARTIAL_CONNECTIVITY";
|
||||
case NET_CAPABILITY_TEMPORARILY_NOT_METERED: return "TEMPORARILY_NOT_METERED";
|
||||
case NET_CAPABILITY_OEM_PRIVATE: return "OEM_PRIVATE";
|
||||
case NET_CAPABILITY_VEHICLE_INTERNAL: return "NET_CAPABILITY_VEHICLE_INTERNAL";
|
||||
case NET_CAPABILITY_VEHICLE_INTERNAL: return "VEHICLE_INTERNAL";
|
||||
case NET_CAPABILITY_NOT_VCN_MANAGED: return "NOT_VCN_MANAGED";
|
||||
case NET_CAPABILITY_ENTERPRISE: return "ENTERPRISE";
|
||||
default: return Integer.toString(capability);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,6 +111,7 @@ public class Annotation {
|
||||
public @interface NetworkType {
|
||||
}
|
||||
|
||||
// TODO(b/180542000): remove and replace references with @ApnSetting.ApnType
|
||||
@IntDef(flag = true, prefix = {"TYPE_"}, value = {
|
||||
ApnSetting.TYPE_DEFAULT,
|
||||
ApnSetting.TYPE_MMS,
|
||||
@@ -124,6 +125,7 @@ public class Annotation {
|
||||
ApnSetting.TYPE_EMERGENCY,
|
||||
ApnSetting.TYPE_MCX,
|
||||
ApnSetting.TYPE_XCAP,
|
||||
// ApnSetting.TYPE_ENTERPRISE
|
||||
})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface ApnType {
|
||||
|
||||
@@ -4710,7 +4710,7 @@ public class CarrierConfigManager {
|
||||
sDefaults.putStringArray(KEY_MISSED_INCOMING_CALL_SMS_ORIGINATOR_STRING_ARRAY,
|
||||
new String[0]);
|
||||
sDefaults.putStringArray(KEY_APN_PRIORITY_STRING_ARRAY, new String[] {
|
||||
"default:0", "mms:2", "supl:2", "dun:2", "hipri:3", "fota:2",
|
||||
"default:0", "enterprise:1", "mms:2", "supl:2", "dun:2", "hipri:3", "fota:2",
|
||||
"ims:2", "cbs:2", "ia:2", "emergency:2", "mcx:3", "xcap:3"
|
||||
});
|
||||
sDefaults.putStringArray(KEY_MISSED_INCOMING_CALL_SMS_PATTERN_STRING_ARRAY, new String[0]);
|
||||
|
||||
@@ -917,6 +917,10 @@ public final class DataFailCause {
|
||||
public static final int HANDOFF_PREFERENCE_CHANGED = 0x8CB;
|
||||
/** Data call fail due to the slice not being allowed for the data call. */
|
||||
public static final int SLICE_REJECTED = 0x8CC;
|
||||
/** No matching rule available for the request, and match-all rule is not allowed for it. */
|
||||
public static final int MATCH_ALL_RULE_NOT_ALLOWED = 0x8CD;
|
||||
/** If connection failed for all matching URSP rules. */
|
||||
public static final int ALL_MATCHING_RULES_FAILED = 0x8CE;
|
||||
|
||||
//IKE error notifications message as specified in 3GPP TS 24.302 (Section 8.1.2.2).
|
||||
|
||||
|
||||
@@ -28,8 +28,6 @@ import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.provider.Telephony;
|
||||
import android.provider.Telephony.Carriers;
|
||||
import android.telephony.Annotation;
|
||||
import android.telephony.Annotation.ApnType;
|
||||
import android.telephony.Annotation.NetworkType;
|
||||
import android.telephony.ServiceState;
|
||||
import android.telephony.TelephonyManager;
|
||||
@@ -116,6 +114,31 @@ public class ApnSetting implements Parcelable {
|
||||
public static final int TYPE_MCX = ApnTypes.MCX;
|
||||
/** APN type for XCAP. */
|
||||
public static final int TYPE_XCAP = ApnTypes.XCAP;
|
||||
/**
|
||||
* APN type for ENTERPRISE.
|
||||
* @hide
|
||||
*/
|
||||
public static final int TYPE_ENTERPRISE = TYPE_XCAP << 1;
|
||||
|
||||
/** @hide */
|
||||
@IntDef(flag = true, prefix = {"TYPE_"}, value = {
|
||||
TYPE_DEFAULT,
|
||||
TYPE_MMS,
|
||||
TYPE_SUPL,
|
||||
TYPE_DUN,
|
||||
TYPE_HIPRI,
|
||||
TYPE_FOTA,
|
||||
TYPE_IMS,
|
||||
TYPE_CBS,
|
||||
TYPE_IA,
|
||||
TYPE_EMERGENCY,
|
||||
TYPE_MCX,
|
||||
TYPE_XCAP,
|
||||
TYPE_ENTERPRISE,
|
||||
})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface ApnType {
|
||||
}
|
||||
|
||||
// Possible values for authentication types.
|
||||
/** No authentication type. */
|
||||
@@ -151,6 +174,7 @@ public class ApnSetting implements Parcelable {
|
||||
TYPE_MMS_STRING,
|
||||
TYPE_SUPL_STRING,
|
||||
TYPE_XCAP_STRING,
|
||||
TYPE_ENTERPRISE_STRING,
|
||||
}, prefix = "TYPE_", suffix = "_STRING")
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface ApnTypeString {}
|
||||
@@ -291,6 +315,12 @@ public class ApnSetting implements Parcelable {
|
||||
@SystemApi
|
||||
public static final String TYPE_XCAP_STRING = "xcap";
|
||||
|
||||
/**
|
||||
* APN type for ENTERPRISE traffic.
|
||||
* @hide
|
||||
*/
|
||||
public static final String TYPE_ENTERPRISE_STRING = "enterprise";
|
||||
|
||||
|
||||
/** @hide */
|
||||
@IntDef(prefix = { "AUTH_TYPE_" }, value = {
|
||||
@@ -370,6 +400,7 @@ public class ApnSetting implements Parcelable {
|
||||
APN_TYPE_STRING_MAP.put(TYPE_EMERGENCY_STRING, TYPE_EMERGENCY);
|
||||
APN_TYPE_STRING_MAP.put(TYPE_MCX_STRING, TYPE_MCX);
|
||||
APN_TYPE_STRING_MAP.put(TYPE_XCAP_STRING, TYPE_XCAP);
|
||||
APN_TYPE_STRING_MAP.put(TYPE_ENTERPRISE_STRING, TYPE_ENTERPRISE);
|
||||
|
||||
APN_TYPE_INT_MAP = new ArrayMap<>();
|
||||
APN_TYPE_INT_MAP.put(TYPE_DEFAULT, TYPE_DEFAULT_STRING);
|
||||
@@ -384,6 +415,7 @@ public class ApnSetting implements Parcelable {
|
||||
APN_TYPE_INT_MAP.put(TYPE_EMERGENCY, TYPE_EMERGENCY_STRING);
|
||||
APN_TYPE_INT_MAP.put(TYPE_MCX, TYPE_MCX_STRING);
|
||||
APN_TYPE_INT_MAP.put(TYPE_XCAP, TYPE_XCAP_STRING);
|
||||
APN_TYPE_INT_MAP.put(TYPE_ENTERPRISE, TYPE_ENTERPRISE_STRING);
|
||||
|
||||
PROTOCOL_STRING_MAP = new ArrayMap<>();
|
||||
PROTOCOL_STRING_MAP.put("IP", PROTOCOL_IP);
|
||||
@@ -1490,7 +1522,7 @@ public class ApnSetting implements Parcelable {
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public static @NonNull @ApnTypeString String getApnTypeString(@Annotation.ApnType int apnType) {
|
||||
public static @NonNull @ApnTypeString String getApnTypeString(@ApnType int apnType) {
|
||||
if (apnType == TYPE_ALL) {
|
||||
return "*";
|
||||
}
|
||||
@@ -1503,7 +1535,7 @@ public class ApnSetting implements Parcelable {
|
||||
* when provided with an invalid int for compatibility purposes.
|
||||
* @hide
|
||||
*/
|
||||
public static @NonNull String getApnTypeStringInternal(@Annotation.ApnType int apnType) {
|
||||
public static @NonNull String getApnTypeStringInternal(@ApnType int apnType) {
|
||||
String result = getApnTypeString(apnType);
|
||||
return TextUtils.isEmpty(result) ? "Unknown" : result;
|
||||
}
|
||||
@@ -1517,7 +1549,7 @@ public class ApnSetting implements Parcelable {
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public static @Annotation.ApnType int getApnTypeInt(@NonNull @ApnTypeString String apnType) {
|
||||
public static @ApnType int getApnTypeInt(@NonNull @ApnTypeString String apnType) {
|
||||
return APN_TYPE_STRING_MAP.getOrDefault(apnType.toLowerCase(), 0);
|
||||
}
|
||||
|
||||
@@ -2162,7 +2194,7 @@ public class ApnSetting implements Parcelable {
|
||||
public ApnSetting build() {
|
||||
if ((mApnTypeBitmask & (TYPE_DEFAULT | TYPE_MMS | TYPE_SUPL | TYPE_DUN | TYPE_HIPRI
|
||||
| TYPE_FOTA | TYPE_IMS | TYPE_CBS | TYPE_IA | TYPE_EMERGENCY | TYPE_MCX
|
||||
| TYPE_XCAP)) == 0
|
||||
| TYPE_XCAP | TYPE_ENTERPRISE)) == 0
|
||||
|| TextUtils.isEmpty(mApnName) || TextUtils.isEmpty(mEntryName)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -138,6 +138,7 @@ public final class DataCallResponse implements Parcelable {
|
||||
private final Qos mDefaultQos;
|
||||
private final List<QosBearerSession> mQosBearerSessions;
|
||||
private final SliceInfo mSliceInfo;
|
||||
private final List<TrafficDescriptor> mTrafficDescriptors;
|
||||
|
||||
/**
|
||||
* @param cause Data call fail cause. {@link DataFailCause#NONE} indicates no error.
|
||||
@@ -189,6 +190,7 @@ public final class DataCallResponse implements Parcelable {
|
||||
mDefaultQos = null;
|
||||
mQosBearerSessions = new ArrayList<>();
|
||||
mSliceInfo = null;
|
||||
mTrafficDescriptors = new ArrayList<>();
|
||||
}
|
||||
|
||||
private DataCallResponse(@DataFailureCause int cause, long suggestedRetryTime, int id,
|
||||
@@ -198,7 +200,7 @@ public final class DataCallResponse implements Parcelable {
|
||||
@Nullable List<InetAddress> pcscfAddresses, int mtu, int mtuV4, int mtuV6,
|
||||
@HandoverFailureMode int handoverFailureMode, int pduSessionId,
|
||||
@Nullable Qos defaultQos, @Nullable List<QosBearerSession> qosBearerSessions,
|
||||
@Nullable SliceInfo sliceInfo) {
|
||||
@Nullable SliceInfo sliceInfo, @Nullable List<TrafficDescriptor> trafficDescriptors) {
|
||||
mCause = cause;
|
||||
mSuggestedRetryTime = suggestedRetryTime;
|
||||
mId = id;
|
||||
@@ -219,8 +221,11 @@ public final class DataCallResponse implements Parcelable {
|
||||
mHandoverFailureMode = handoverFailureMode;
|
||||
mPduSessionId = pduSessionId;
|
||||
mDefaultQos = defaultQos;
|
||||
mQosBearerSessions = qosBearerSessions;
|
||||
mQosBearerSessions = (qosBearerSessions == null)
|
||||
? new ArrayList<>() : new ArrayList<>(qosBearerSessions);
|
||||
mSliceInfo = sliceInfo;
|
||||
mTrafficDescriptors = (trafficDescriptors == null)
|
||||
? new ArrayList<>() : new ArrayList<>(trafficDescriptors);
|
||||
}
|
||||
|
||||
/** @hide */
|
||||
@@ -249,6 +254,8 @@ public final class DataCallResponse implements Parcelable {
|
||||
mQosBearerSessions = new ArrayList<>();
|
||||
source.readList(mQosBearerSessions, QosBearerSession.class.getClassLoader());
|
||||
mSliceInfo = source.readParcelable(SliceInfo.class.getClassLoader());
|
||||
mTrafficDescriptors = new ArrayList<>();
|
||||
source.readList(mTrafficDescriptors, TrafficDescriptor.class.getClassLoader());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -380,7 +387,6 @@ public final class DataCallResponse implements Parcelable {
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
|
||||
@Nullable
|
||||
public Qos getDefaultQos() {
|
||||
return mDefaultQos;
|
||||
@@ -405,6 +411,14 @@ public final class DataCallResponse implements Parcelable {
|
||||
return mSliceInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The traffic descriptors related to this data connection.
|
||||
*/
|
||||
@NonNull
|
||||
public List<TrafficDescriptor> getTrafficDescriptors() {
|
||||
return mTrafficDescriptors;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString() {
|
||||
@@ -428,6 +442,7 @@ public final class DataCallResponse implements Parcelable {
|
||||
.append(" defaultQos=").append(mDefaultQos)
|
||||
.append(" qosBearerSessions=").append(mQosBearerSessions)
|
||||
.append(" sliceInfo=").append(mSliceInfo)
|
||||
.append(" trafficDescriptors=").append(mTrafficDescriptors)
|
||||
.append("}");
|
||||
return sb.toString();
|
||||
}
|
||||
@@ -442,15 +457,22 @@ public final class DataCallResponse implements Parcelable {
|
||||
|
||||
DataCallResponse other = (DataCallResponse) o;
|
||||
|
||||
final boolean isQosSame = (mDefaultQos == null || other.mDefaultQos == null) ?
|
||||
mDefaultQos == other.mDefaultQos :
|
||||
mDefaultQos.equals(other.mDefaultQos);
|
||||
final boolean isQosSame = (mDefaultQos == null || other.mDefaultQos == null)
|
||||
? mDefaultQos == other.mDefaultQos
|
||||
: mDefaultQos.equals(other.mDefaultQos);
|
||||
|
||||
final boolean isQosBearerSessionsSame = (mQosBearerSessions == null || mQosBearerSessions == null) ?
|
||||
mQosBearerSessions == other.mQosBearerSessions :
|
||||
mQosBearerSessions.size() == other.mQosBearerSessions.size()
|
||||
final boolean isQosBearerSessionsSame =
|
||||
(mQosBearerSessions == null || other.mQosBearerSessions == null)
|
||||
? mQosBearerSessions == other.mQosBearerSessions
|
||||
: mQosBearerSessions.size() == other.mQosBearerSessions.size()
|
||||
&& mQosBearerSessions.containsAll(other.mQosBearerSessions);
|
||||
|
||||
final boolean isTrafficDescriptorsSame =
|
||||
(mTrafficDescriptors == null || other.mTrafficDescriptors == null)
|
||||
? mTrafficDescriptors == other.mTrafficDescriptors
|
||||
: mTrafficDescriptors.size() == other.mTrafficDescriptors.size()
|
||||
&& mTrafficDescriptors.containsAll(other.mTrafficDescriptors);
|
||||
|
||||
return mCause == other.mCause
|
||||
&& mSuggestedRetryTime == other.mSuggestedRetryTime
|
||||
&& mId == other.mId
|
||||
@@ -472,7 +494,8 @@ public final class DataCallResponse implements Parcelable {
|
||||
&& mPduSessionId == other.mPduSessionId
|
||||
&& isQosSame
|
||||
&& isQosBearerSessionsSame
|
||||
&& Objects.equals(mSliceInfo, other.mSliceInfo);
|
||||
&& Objects.equals(mSliceInfo, other.mSliceInfo)
|
||||
&& isTrafficDescriptorsSame;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -480,7 +503,7 @@ public final class DataCallResponse implements Parcelable {
|
||||
return Objects.hash(mCause, mSuggestedRetryTime, mId, mLinkStatus, mProtocolType,
|
||||
mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses, mPcscfAddresses,
|
||||
mMtu, mMtuV4, mMtuV6, mHandoverFailureMode, mPduSessionId, mDefaultQos,
|
||||
mQosBearerSessions, mSliceInfo);
|
||||
mQosBearerSessions, mSliceInfo, mTrafficDescriptors);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -512,6 +535,7 @@ public final class DataCallResponse implements Parcelable {
|
||||
}
|
||||
dest.writeList(mQosBearerSessions);
|
||||
dest.writeParcelable(mSliceInfo, flags);
|
||||
dest.writeList(mTrafficDescriptors);
|
||||
}
|
||||
|
||||
public static final @android.annotation.NonNull Parcelable.Creator<DataCallResponse> CREATOR =
|
||||
@@ -597,6 +621,8 @@ public final class DataCallResponse implements Parcelable {
|
||||
|
||||
private SliceInfo mSliceInfo;
|
||||
|
||||
private List<TrafficDescriptor> mTrafficDescriptors = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Default constructor for Builder.
|
||||
*/
|
||||
@@ -835,6 +861,24 @@ public final class DataCallResponse implements Parcelable {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* The traffic descriptors for this data connection, as defined in 3GPP TS 24.526
|
||||
* Section 5.2. They are used for URSP traffic matching as described in 3GPP TS 24.526
|
||||
* Section 4.2.2. They includes an optional DNN, which, if present, must be used for traffic
|
||||
* matching; it does not specify the end point to be used for the data call. The end point
|
||||
* is specified by {@link DataProfile}, which must be used as the end point if one is not
|
||||
* specified through URSP rules.
|
||||
*
|
||||
* @param trafficDescriptors the traffic descriptors for the data call.
|
||||
*
|
||||
* @return The same instance of the builder.
|
||||
*/
|
||||
public @NonNull Builder setTrafficDescriptors(
|
||||
@NonNull List<TrafficDescriptor> trafficDescriptors) {
|
||||
mTrafficDescriptors = trafficDescriptors;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the DataCallResponse.
|
||||
*
|
||||
@@ -844,7 +888,7 @@ public final class DataCallResponse implements Parcelable {
|
||||
return new DataCallResponse(mCause, mSuggestedRetryTime, mId, mLinkStatus,
|
||||
mProtocolType, mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses,
|
||||
mPcscfAddresses, mMtu, mMtuV4, mMtuV6, mHandoverFailureMode, mPduSessionId,
|
||||
mDefaultQos, mQosBearerSessions, mSliceInfo);
|
||||
mDefaultQos, mQosBearerSessions, mSliceInfo, mTrafficDescriptors);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -200,6 +200,17 @@ public abstract class DataService extends Service {
|
||||
* handover is occurring from EPDG to 5G. If the slice passed is rejected, then
|
||||
* {@link DataCallResponse#getCause()} is
|
||||
* {@link android.telephony.DataFailCause#SLICE_REJECTED}.
|
||||
* @param trafficDescriptor {@link TrafficDescriptor} for which data connection needs to be
|
||||
* established. It is used for URSP traffic matching as described in 3GPP TS 24.526
|
||||
* Section 4.2.2. It includes an optional DNN which, if present, must be used for
|
||||
* traffic matching; it does not specify the end point to be used for the data call.
|
||||
* @param matchAllRuleAllowed Indicates if using default match-all URSP rule for this
|
||||
* request is allowed. If false, this request must not use the match-all URSP rule
|
||||
* and if a non-match-all rule is not found (or if URSP rules are not available) then
|
||||
* {@link DataCallResponse#getCause()} is
|
||||
* {@link android.telephony.DataFailCause#MATCH_ALL_RULE_NOT_ALLOWED}. This is needed
|
||||
* as some requests need to have a hard failure if the intention cannot be met,
|
||||
* for example, a zero-rating slice.
|
||||
* @param callback The result callback for this request.
|
||||
*/
|
||||
public void setupDataCall(int accessNetworkType, @NonNull DataProfile dataProfile,
|
||||
@@ -207,6 +218,7 @@ public abstract class DataService extends Service {
|
||||
@SetupDataReason int reason,
|
||||
@Nullable LinkProperties linkProperties,
|
||||
@IntRange(from = 0, to = 15) int pduSessionId, @Nullable SliceInfo sliceInfo,
|
||||
@Nullable TrafficDescriptor trafficDescriptor, boolean matchAllRuleAllowed,
|
||||
@NonNull DataServiceCallback callback) {
|
||||
/* Call the old version since the new version isn't supported */
|
||||
setupDataCall(accessNetworkType, dataProfile, isRoaming, allowRoaming, reason,
|
||||
@@ -399,10 +411,13 @@ public abstract class DataService extends Service {
|
||||
public final LinkProperties linkProperties;
|
||||
public final int pduSessionId;
|
||||
public final SliceInfo sliceInfo;
|
||||
public final TrafficDescriptor trafficDescriptor;
|
||||
public final boolean matchAllRuleAllowed;
|
||||
public final IDataServiceCallback callback;
|
||||
SetupDataCallRequest(int accessNetworkType, DataProfile dataProfile, boolean isRoaming,
|
||||
boolean allowRoaming, int reason, LinkProperties linkProperties,
|
||||
int pduSessionId, SliceInfo sliceInfo, IDataServiceCallback callback) {
|
||||
boolean allowRoaming, int reason, LinkProperties linkProperties, int pduSessionId,
|
||||
SliceInfo sliceInfo, TrafficDescriptor trafficDescriptor,
|
||||
boolean matchAllRuleAllowed, IDataServiceCallback callback) {
|
||||
this.accessNetworkType = accessNetworkType;
|
||||
this.dataProfile = dataProfile;
|
||||
this.isRoaming = isRoaming;
|
||||
@@ -411,6 +426,8 @@ public abstract class DataService extends Service {
|
||||
this.reason = reason;
|
||||
this.pduSessionId = pduSessionId;
|
||||
this.sliceInfo = sliceInfo;
|
||||
this.trafficDescriptor = trafficDescriptor;
|
||||
this.matchAllRuleAllowed = matchAllRuleAllowed;
|
||||
this.callback = callback;
|
||||
}
|
||||
}
|
||||
@@ -521,7 +538,8 @@ public abstract class DataService extends Service {
|
||||
setupDataCallRequest.dataProfile, setupDataCallRequest.isRoaming,
|
||||
setupDataCallRequest.allowRoaming, setupDataCallRequest.reason,
|
||||
setupDataCallRequest.linkProperties, setupDataCallRequest.pduSessionId,
|
||||
setupDataCallRequest.sliceInfo,
|
||||
setupDataCallRequest.sliceInfo, setupDataCallRequest.trafficDescriptor,
|
||||
setupDataCallRequest.matchAllRuleAllowed,
|
||||
(setupDataCallRequest.callback != null)
|
||||
? new DataServiceCallback(setupDataCallRequest.callback)
|
||||
: null);
|
||||
@@ -686,11 +704,12 @@ public abstract class DataService extends Service {
|
||||
public void setupDataCall(int slotIndex, int accessNetworkType, DataProfile dataProfile,
|
||||
boolean isRoaming, boolean allowRoaming, int reason,
|
||||
LinkProperties linkProperties, int pduSessionId, SliceInfo sliceInfo,
|
||||
TrafficDescriptor trafficDescriptor, boolean matchAllRuleAllowed,
|
||||
IDataServiceCallback callback) {
|
||||
mHandler.obtainMessage(DATA_SERVICE_REQUEST_SETUP_DATA_CALL, slotIndex, 0,
|
||||
new SetupDataCallRequest(accessNetworkType, dataProfile, isRoaming,
|
||||
allowRoaming, reason, linkProperties, pduSessionId, sliceInfo,
|
||||
callback))
|
||||
trafficDescriptor, matchAllRuleAllowed, callback))
|
||||
.sendToTarget();
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ import android.net.LinkProperties;
|
||||
import android.telephony.data.DataProfile;
|
||||
import android.telephony.data.IDataServiceCallback;
|
||||
import android.telephony.data.SliceInfo;
|
||||
import android.telephony.data.TrafficDescriptor;
|
||||
|
||||
/**
|
||||
* {@hide}
|
||||
@@ -30,7 +31,9 @@ oneway interface IDataService
|
||||
void removeDataServiceProvider(int slotId);
|
||||
void setupDataCall(int slotId, int accessNetwork, in DataProfile dataProfile, boolean isRoaming,
|
||||
boolean allowRoaming, int reason, in LinkProperties linkProperties,
|
||||
int pduSessionId, in SliceInfo sliceInfo, IDataServiceCallback callback);
|
||||
int pduSessionId, in SliceInfo sliceInfo,
|
||||
in TrafficDescriptor trafficDescriptor, boolean matchAllRuleAllowed,
|
||||
IDataServiceCallback callback);
|
||||
void deactivateDataCall(int slotId, int cid, int reason, IDataServiceCallback callback);
|
||||
void setInitialAttachApn(int slotId, in DataProfile dataProfile, boolean isRoaming,
|
||||
IDataServiceCallback callback);
|
||||
|
||||
20
telephony/java/android/telephony/data/TrafficDescriptor.aidl
Normal file
20
telephony/java/android/telephony/data/TrafficDescriptor.aidl
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/** @hide */
|
||||
package android.telephony.data;
|
||||
|
||||
parcelable TrafficDescriptor;
|
||||
111
telephony/java/android/telephony/data/TrafficDescriptor.java
Normal file
111
telephony/java/android/telephony/data/TrafficDescriptor.java
Normal file
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
* 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package android.telephony.data;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.annotation.SystemApi;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* A traffic descriptor, as defined in 3GPP TS 24.526 Section 5.2. It is used for URSP traffic
|
||||
* matching as described in 3GPP TS 24.526 Section 4.2.2. It includes an optional DNN, which,
|
||||
* if present, must be used for traffic matching; it does not specify the end point to be used for
|
||||
* the data call.
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public final class TrafficDescriptor implements Parcelable {
|
||||
private final String mDnn;
|
||||
private final String mOsAppId;
|
||||
|
||||
private TrafficDescriptor(@NonNull Parcel in) {
|
||||
mDnn = in.readString();
|
||||
mOsAppId = in.readString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a traffic descriptor, as defined in 3GPP TS 24.526 Section 5.2
|
||||
* @param dnn optional DNN, which must be used for traffic matching, if present
|
||||
* @param osAppId OsId + osAppId of the traffic descriptor
|
||||
*/
|
||||
public TrafficDescriptor(@Nullable String dnn, @Nullable String osAppId) {
|
||||
mDnn = dnn;
|
||||
mOsAppId = osAppId;
|
||||
}
|
||||
|
||||
/**
|
||||
* DNN stands for Data Network Name and represents an APN as defined in 3GPP TS 23.003.
|
||||
* @return the DNN of this traffic descriptor.
|
||||
*/
|
||||
public @Nullable String getDnn() {
|
||||
return mDnn;
|
||||
}
|
||||
|
||||
/**
|
||||
* OsAppId represents the OsId + OsAppId as defined in 3GPP TS 24.526 Section 5.2.
|
||||
* @return the OS App ID of this traffic descriptor.
|
||||
*/
|
||||
public @Nullable String getOsAppId() {
|
||||
return mOsAppId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@NonNull @Override
|
||||
public String toString() {
|
||||
return "TrafficDescriptor={mDnn=" + mDnn + ", mOsAppId=" + mOsAppId + "}";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(@NonNull Parcel dest, int flags) {
|
||||
dest.writeString(mDnn);
|
||||
dest.writeString(mOsAppId);
|
||||
}
|
||||
|
||||
public static final @NonNull Parcelable.Creator<TrafficDescriptor> CREATOR =
|
||||
new Parcelable.Creator<TrafficDescriptor>() {
|
||||
@Override
|
||||
public @NonNull TrafficDescriptor createFromParcel(@NonNull Parcel source) {
|
||||
return new TrafficDescriptor(source);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull TrafficDescriptor[] newArray(int size) {
|
||||
return new TrafficDescriptor[size];
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public boolean equals(@Nullable Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
TrafficDescriptor that = (TrafficDescriptor) o;
|
||||
return Objects.equals(mDnn, that.mDnn) && Objects.equals(mOsAppId, that.mOsAppId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(mDnn, mOsAppId);
|
||||
}
|
||||
}
|
||||
@@ -126,6 +126,7 @@ public class PhoneConstants {
|
||||
* connections.<br/>
|
||||
* APN_TYPE_ALL is a special type to indicate that this APN entry can
|
||||
* service all data connections.
|
||||
* TODO: remove these and use the reference to ApnSetting.TYPE_XXX_STRING instead
|
||||
*/
|
||||
public static final String APN_TYPE_ALL = ApnSetting.TYPE_ALL_STRING;
|
||||
/** APN type for default data traffic */
|
||||
@@ -153,20 +154,8 @@ public class PhoneConstants {
|
||||
public static final String APN_TYPE_MCX = ApnSetting.TYPE_MCX_STRING;
|
||||
/** APN type for XCAP */
|
||||
public static final String APN_TYPE_XCAP = ApnSetting.TYPE_XCAP_STRING;
|
||||
/** Array of all APN types */
|
||||
public static final String[] APN_TYPES = {APN_TYPE_DEFAULT,
|
||||
APN_TYPE_MMS,
|
||||
APN_TYPE_SUPL,
|
||||
APN_TYPE_DUN,
|
||||
APN_TYPE_HIPRI,
|
||||
APN_TYPE_FOTA,
|
||||
APN_TYPE_IMS,
|
||||
APN_TYPE_CBS,
|
||||
APN_TYPE_IA,
|
||||
APN_TYPE_EMERGENCY,
|
||||
APN_TYPE_MCX,
|
||||
APN_TYPE_XCAP,
|
||||
};
|
||||
// /** APN type for enterprise */
|
||||
// public static final String APN_TYPE_ENTERPRISE = ApnSetting.TYPE_ENTERPRISE_STRING;
|
||||
|
||||
public static final int RIL_CARD_MAX_APPS = 8;
|
||||
|
||||
|
||||
@@ -53,6 +53,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_CBS;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_EIMS;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_ENTERPRISE;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_FOREGROUND;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_FOTA;
|
||||
import static android.net.NetworkCapabilities.NET_CAPABILITY_IA;
|
||||
@@ -2798,7 +2799,8 @@ public class ConnectivityServiceTest {
|
||||
if (capability == NET_CAPABILITY_CBS || capability == NET_CAPABILITY_DUN ||
|
||||
capability == NET_CAPABILITY_EIMS || capability == NET_CAPABILITY_FOTA ||
|
||||
capability == NET_CAPABILITY_IA || capability == NET_CAPABILITY_IMS ||
|
||||
capability == NET_CAPABILITY_RCS || capability == NET_CAPABILITY_XCAP) {
|
||||
capability == NET_CAPABILITY_RCS || capability == NET_CAPABILITY_XCAP
|
||||
|| capability == NET_CAPABILITY_ENTERPRISE) {
|
||||
assertFalse(nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED));
|
||||
} else {
|
||||
assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED));
|
||||
@@ -2901,6 +2903,7 @@ public class ConnectivityServiceTest {
|
||||
tryNetworkFactoryRequests(NET_CAPABILITY_IA);
|
||||
tryNetworkFactoryRequests(NET_CAPABILITY_RCS);
|
||||
tryNetworkFactoryRequests(NET_CAPABILITY_XCAP);
|
||||
tryNetworkFactoryRequests(NET_CAPABILITY_ENTERPRISE);
|
||||
tryNetworkFactoryRequests(NET_CAPABILITY_EIMS);
|
||||
tryNetworkFactoryRequests(NET_CAPABILITY_NOT_METERED);
|
||||
tryNetworkFactoryRequests(NET_CAPABILITY_INTERNET);
|
||||
|
||||
Reference in New Issue
Block a user