Merge "Add S-NSSAI" am: d7d4b0ca85

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1560540

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I7ae9b7dad9d7fb8f4f883bbf23f63e041a534200
This commit is contained in:
Daniel Bright
2021-01-27 19:03:39 +00:00
committed by Automerger Merge Worker
8 changed files with 453 additions and 14 deletions

View File

@@ -40272,6 +40272,7 @@ package android.telephony {
field public static final int SERVICE_OPTION_OUT_OF_ORDER = 34; // 0x22 field public static final int SERVICE_OPTION_OUT_OF_ORDER = 34; // 0x22
field public static final int SIGNAL_LOST = -3; // 0xfffffffd field public static final int SIGNAL_LOST = -3; // 0xfffffffd
field public static final int SIM_CARD_CHANGED = 2043; // 0x7fb field public static final int SIM_CARD_CHANGED = 2043; // 0x7fb
field public static final int SLICE_REJECTED = 2252; // 0x8cc
field public static final int SYNCHRONIZATION_FAILURE = 2184; // 0x888 field public static final int SYNCHRONIZATION_FAILURE = 2184; // 0x888
field public static final int TEST_LOOPBACK_REGULAR_DEACTIVATION = 2196; // 0x894 field public static final int TEST_LOOPBACK_REGULAR_DEACTIVATION = 2196; // 0x894
field public static final int TETHERED_CALL_ACTIVE = -6; // 0xfffffffa field public static final int TETHERED_CALL_ACTIVE = -6; // 0xfffffffa

View File

@@ -10713,6 +10713,7 @@ package android.telephony.data {
method public int getPduSessionId(); method public int getPduSessionId();
method public int getProtocolType(); method public int getProtocolType();
method public long getRetryDurationMillis(); method public long getRetryDurationMillis();
method @Nullable public android.telephony.data.SliceInfo getSliceInfo();
method @Deprecated public int getSuggestedRetryTime(); method @Deprecated public int getSuggestedRetryTime();
method public void writeToParcel(android.os.Parcel, int); method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.data.DataCallResponse> CREATOR; field @NonNull public static final android.os.Parcelable.Creator<android.telephony.data.DataCallResponse> CREATOR;
@@ -10747,6 +10748,7 @@ package android.telephony.data {
method @NonNull public android.telephony.data.DataCallResponse.Builder setPduSessionId(int); method @NonNull public android.telephony.data.DataCallResponse.Builder setPduSessionId(int);
method @NonNull public android.telephony.data.DataCallResponse.Builder setProtocolType(int); method @NonNull public android.telephony.data.DataCallResponse.Builder setProtocolType(int);
method @NonNull public android.telephony.data.DataCallResponse.Builder setRetryDurationMillis(long); 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 @Deprecated @NonNull public android.telephony.data.DataCallResponse.Builder setSuggestedRetryTime(int);
} }
@@ -10819,7 +10821,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 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 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, @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, @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 startHandover(int, @NonNull android.telephony.data.DataServiceCallback); method public void startHandover(int, @NonNull android.telephony.data.DataServiceCallback);
} }
@@ -10867,6 +10869,32 @@ package android.telephony.data {
method public final void updateQualifiedNetworkTypes(int, @NonNull java.util.List<java.lang.Integer>); method public final void updateQualifiedNetworkTypes(int, @NonNull java.util.List<java.lang.Integer>);
} }
public final class SliceInfo implements android.os.Parcelable {
method public int describeContents();
method @IntRange(from=android.telephony.data.SliceInfo.MIN_SLICE_DIFFERENTIATOR, to=android.telephony.data.SliceInfo.MAX_SLICE_DIFFERENTIATOR) public int getMappedHplmnSliceDifferentiator();
method public int getMappedHplmnSliceServiceType();
method @IntRange(from=android.telephony.data.SliceInfo.MIN_SLICE_DIFFERENTIATOR, to=android.telephony.data.SliceInfo.MAX_SLICE_DIFFERENTIATOR) public int getSliceDifferentiator();
method public int getSliceServiceType();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.data.SliceInfo> CREATOR;
field public static final int MAX_SLICE_DIFFERENTIATOR = 16777214; // 0xfffffe
field public static final int MIN_SLICE_DIFFERENTIATOR = -1; // 0xffffffff
field public static final int SLICE_DIFFERENTIATOR_NO_SLICE = -1; // 0xffffffff
field public static final int SLICE_SERVICE_TYPE_EMBB = 1; // 0x1
field public static final int SLICE_SERVICE_TYPE_MIOT = 3; // 0x3
field public static final int SLICE_SERVICE_TYPE_NONE = 0; // 0x0
field public static final int SLICE_SERVICE_TYPE_URLLC = 2; // 0x2
}
public static final class SliceInfo.Builder {
ctor public SliceInfo.Builder();
method @NonNull public android.telephony.data.SliceInfo build();
method @NonNull public android.telephony.data.SliceInfo.Builder setMappedHplmnSliceDifferentiator(@IntRange(from=android.telephony.data.SliceInfo.MIN_SLICE_DIFFERENTIATOR, to=android.telephony.data.SliceInfo.MAX_SLICE_DIFFERENTIATOR) int);
method @NonNull public android.telephony.data.SliceInfo.Builder setMappedHplmnSliceServiceType(int);
method @NonNull public android.telephony.data.SliceInfo.Builder setSliceDifferentiator(@IntRange(from=android.telephony.data.SliceInfo.MIN_SLICE_DIFFERENTIATOR, to=android.telephony.data.SliceInfo.MAX_SLICE_DIFFERENTIATOR) int);
method @NonNull public android.telephony.data.SliceInfo.Builder setSliceServiceType(int);
}
} }
package android.telephony.euicc { package android.telephony.euicc {

View File

@@ -915,6 +915,8 @@ public final class DataFailCause {
public static final int IPV6_PREFIX_UNAVAILABLE = 0x8CA; public static final int IPV6_PREFIX_UNAVAILABLE = 0x8CA;
/** System preference change back to SRAT during handoff */ /** System preference change back to SRAT during handoff */
public static final int HANDOFF_PREFERENCE_CHANGED = 0x8CB; 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;
//IKE error notifications message as specified in 3GPP TS 24.302 (Section 8.1.2.2). //IKE error notifications message as specified in 3GPP TS 24.302 (Section 8.1.2.2).
@@ -985,7 +987,7 @@ public final class DataFailCause {
* the authentication failed. * the authentication failed.
*/ */
public static final int IWLAN_IKEV2_AUTH_FAILURE = 0x4001; public static final int IWLAN_IKEV2_AUTH_FAILURE = 0x4001;
/** IKE message timeout, tunnel setup failed due to no response from EPDG */ /** IKE message timeout, tunnel setup failed due to no response from EPDG */
public static final int IWLAN_IKEV2_MSG_TIMEOUT = 0x4002; public static final int IWLAN_IKEV2_MSG_TIMEOUT = 0x4002;
/** IKE Certification validation failure */ /** IKE Certification validation failure */
public static final int IWLAN_IKEV2_CERT_INVALID = 0x4003; public static final int IWLAN_IKEV2_CERT_INVALID = 0x4003;
@@ -1419,6 +1421,7 @@ public final class DataFailCause {
sFailCauseMap.put(VSNCP_RECONNECT_NOT_ALLOWED, "VSNCP_RECONNECT_NOT_ALLOWED"); sFailCauseMap.put(VSNCP_RECONNECT_NOT_ALLOWED, "VSNCP_RECONNECT_NOT_ALLOWED");
sFailCauseMap.put(IPV6_PREFIX_UNAVAILABLE, "IPV6_PREFIX_UNAVAILABLE"); sFailCauseMap.put(IPV6_PREFIX_UNAVAILABLE, "IPV6_PREFIX_UNAVAILABLE");
sFailCauseMap.put(HANDOFF_PREFERENCE_CHANGED, "HANDOFF_PREFERENCE_CHANGED"); sFailCauseMap.put(HANDOFF_PREFERENCE_CHANGED, "HANDOFF_PREFERENCE_CHANGED");
sFailCauseMap.put(SLICE_REJECTED, "SLICE_REJECTED");
sFailCauseMap.put(IWLAN_PDN_CONNECTION_REJECTION, "IWLAN_PDN_CONNECTION_REJECTION"); sFailCauseMap.put(IWLAN_PDN_CONNECTION_REJECTION, "IWLAN_PDN_CONNECTION_REJECTION");
sFailCauseMap.put(IWLAN_MAX_CONNECTION_REACHED, "IWLAN_MAX_CONNECTION_REACHED"); sFailCauseMap.put(IWLAN_MAX_CONNECTION_REACHED, "IWLAN_MAX_CONNECTION_REACHED");
sFailCauseMap.put(IWLAN_SEMANTIC_ERROR_IN_THE_TFT_OPERATION, sFailCauseMap.put(IWLAN_SEMANTIC_ERROR_IN_THE_TFT_OPERATION,

View File

@@ -136,6 +136,7 @@ public final class DataCallResponse implements Parcelable {
private final int mPduSessionId; private final int mPduSessionId;
private final Qos mDefaultQos; private final Qos mDefaultQos;
private final List<QosSession> mQosSessions; private final List<QosSession> mQosSessions;
private final SliceInfo mSliceInfo;
/** /**
* @param cause Data call fail cause. {@link DataFailCause#NONE} indicates no error. * @param cause Data call fail cause. {@link DataFailCause#NONE} indicates no error.
@@ -186,6 +187,7 @@ public final class DataCallResponse implements Parcelable {
mPduSessionId = PDU_SESSION_ID_NOT_SET; mPduSessionId = PDU_SESSION_ID_NOT_SET;
mDefaultQos = null; mDefaultQos = null;
mQosSessions = new ArrayList<>(); mQosSessions = new ArrayList<>();
mSliceInfo = null;
} }
private DataCallResponse(@DataFailureCause int cause, long suggestedRetryTime, int id, private DataCallResponse(@DataFailureCause int cause, long suggestedRetryTime, int id,
@@ -194,7 +196,8 @@ public final class DataCallResponse implements Parcelable {
@Nullable List<InetAddress> dnsAddresses, @Nullable List<InetAddress> gatewayAddresses, @Nullable List<InetAddress> dnsAddresses, @Nullable List<InetAddress> gatewayAddresses,
@Nullable List<InetAddress> pcscfAddresses, int mtu, int mtuV4, int mtuV6, @Nullable List<InetAddress> pcscfAddresses, int mtu, int mtuV4, int mtuV6,
@HandoverFailureMode int handoverFailureMode, int pduSessionId, @HandoverFailureMode int handoverFailureMode, int pduSessionId,
@Nullable Qos defaultQos, @Nullable List<QosSession> qosSessions) { @Nullable Qos defaultQos, @Nullable List<QosSession> qosSessions,
@Nullable SliceInfo sliceInfo) {
mCause = cause; mCause = cause;
mSuggestedRetryTime = suggestedRetryTime; mSuggestedRetryTime = suggestedRetryTime;
mId = id; mId = id;
@@ -216,6 +219,7 @@ public final class DataCallResponse implements Parcelable {
mPduSessionId = pduSessionId; mPduSessionId = pduSessionId;
mDefaultQos = defaultQos; mDefaultQos = defaultQos;
mQosSessions = qosSessions; mQosSessions = qosSessions;
mSliceInfo = sliceInfo;
} }
/** @hide */ /** @hide */
@@ -243,6 +247,7 @@ public final class DataCallResponse implements Parcelable {
mDefaultQos = source.readParcelable(Qos.class.getClassLoader()); mDefaultQos = source.readParcelable(Qos.class.getClassLoader());
mQosSessions = new ArrayList<>(); mQosSessions = new ArrayList<>();
source.readList(mQosSessions, QosSession.class.getClassLoader()); source.readList(mQosSessions, QosSession.class.getClassLoader());
mSliceInfo = source.readParcelable(SliceInfo.class.getClassLoader());
} }
/** /**
@@ -368,7 +373,7 @@ public final class DataCallResponse implements Parcelable {
} }
/** /**
* @return default QOS of the data call received from the network * @return default QOS of the data connection received from the network
* *
* @hide * @hide
*/ */
@@ -379,16 +384,24 @@ public final class DataCallResponse implements Parcelable {
} }
/** /**
* @return All the dedicated bearer QOS sessions of the data call received from the network * @return All the dedicated bearer QOS sessions of the data connection received from the
* network.
* *
* @hide * @hide
*/ */
@NonNull @NonNull
public List<QosSession> getQosSessions() { public List<QosSession> getQosSessions() {
return mQosSessions; return mQosSessions;
} }
/**
* @return The slice info related to this data connection.
*/
@Nullable
public SliceInfo getSliceInfo() {
return mSliceInfo;
}
@NonNull @NonNull
@Override @Override
public String toString() { public String toString() {
@@ -411,6 +424,7 @@ public final class DataCallResponse implements Parcelable {
.append(" pduSessionId=").append(getPduSessionId()) .append(" pduSessionId=").append(getPduSessionId())
.append(" defaultQos=").append(mDefaultQos) .append(" defaultQos=").append(mDefaultQos)
.append(" qosSessions=").append(mQosSessions) .append(" qosSessions=").append(mQosSessions)
.append(" sliceInfo=").append(mSliceInfo)
.append("}"); .append("}");
return sb.toString(); return sb.toString();
} }
@@ -454,7 +468,8 @@ public final class DataCallResponse implements Parcelable {
&& mHandoverFailureMode == other.mHandoverFailureMode && mHandoverFailureMode == other.mHandoverFailureMode
&& mPduSessionId == other.mPduSessionId && mPduSessionId == other.mPduSessionId
&& isQosSame && isQosSame
&& isQosSessionsSame; && isQosSessionsSame
&& Objects.equals(mSliceInfo, other.mSliceInfo);
} }
@Override @Override
@@ -462,7 +477,7 @@ public final class DataCallResponse implements Parcelable {
return Objects.hash(mCause, mSuggestedRetryTime, mId, mLinkStatus, mProtocolType, return Objects.hash(mCause, mSuggestedRetryTime, mId, mLinkStatus, mProtocolType,
mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses, mPcscfAddresses, mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses, mPcscfAddresses,
mMtu, mMtuV4, mMtuV6, mHandoverFailureMode, mPduSessionId, mDefaultQos, mMtu, mMtuV4, mMtuV6, mHandoverFailureMode, mPduSessionId, mDefaultQos,
mQosSessions); mQosSessions, mSliceInfo);
} }
@Override @Override
@@ -493,6 +508,7 @@ public final class DataCallResponse implements Parcelable {
dest.writeParcelable((NrQos)mDefaultQos, flags); dest.writeParcelable((NrQos)mDefaultQos, flags);
} }
dest.writeList(mQosSessions); dest.writeList(mQosSessions);
dest.writeParcelable(mSliceInfo, flags);
} }
public static final @android.annotation.NonNull Parcelable.Creator<DataCallResponse> CREATOR = public static final @android.annotation.NonNull Parcelable.Creator<DataCallResponse> CREATOR =
@@ -576,6 +592,8 @@ public final class DataCallResponse implements Parcelable {
private List<QosSession> mQosSessions = new ArrayList<>(); private List<QosSession> mQosSessions = new ArrayList<>();
private SliceInfo mSliceInfo;
/** /**
* Default constructor for Builder. * Default constructor for Builder.
*/ */
@@ -798,6 +816,21 @@ public final class DataCallResponse implements Parcelable {
return this; return this;
} }
/**
* The Slice used for this data connection.
* <p/>
* If a handover occurs from EPDG to 5G,
* this is the {@link SliceInfo} used in {@link DataService#setupDataCall}.
*
* @param sliceInfo the slice info for the data call
*
* @return The same instance of the builder.
*/
public @NonNull Builder setSliceInfo(@Nullable SliceInfo sliceInfo) {
mSliceInfo = sliceInfo;
return this;
}
/** /**
* Build the DataCallResponse. * Build the DataCallResponse.
* *
@@ -807,7 +840,7 @@ public final class DataCallResponse implements Parcelable {
return new DataCallResponse(mCause, mSuggestedRetryTime, mId, mLinkStatus, return new DataCallResponse(mCause, mSuggestedRetryTime, mId, mLinkStatus,
mProtocolType, mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses, mProtocolType, mInterfaceName, mAddresses, mDnsAddresses, mGatewayAddresses,
mPcscfAddresses, mMtu, mMtuV4, mMtuV6, mHandoverFailureMode, mPduSessionId, mPcscfAddresses, mMtu, mMtuV4, mMtuV6, mHandoverFailureMode, mPduSessionId,
mDefaultQos, mQosSessions); mDefaultQos, mQosSessions, mSliceInfo);
} }
} }
} }

View File

@@ -194,13 +194,19 @@ public abstract class DataService extends Service {
* The standard range of values are 1-15 while 0 means no pdu session id * The standard range of values are 1-15 while 0 means no pdu session id
* was attached to this call. Reference: 3GPP TS 24.007 section * was attached to this call. Reference: 3GPP TS 24.007 section
* 11.2.3.1b. * 11.2.3.1b.
* @param sliceInfo used within the data connection when a handover occurs from EPDG to 5G.
* The value is null unless the access network is
* {@link android.telephony.AccessNetworkConstants.AccessNetworkType#NGRAN} and a
* 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 callback The result callback for this request. * @param callback The result callback for this request.
*/ */
public void setupDataCall(int accessNetworkType, @NonNull DataProfile dataProfile, public void setupDataCall(int accessNetworkType, @NonNull DataProfile dataProfile,
boolean isRoaming, boolean allowRoaming, boolean isRoaming, boolean allowRoaming,
@SetupDataReason int reason, @SetupDataReason int reason,
@Nullable LinkProperties linkProperties, @Nullable LinkProperties linkProperties,
@IntRange(from = 0, to = 15) int pduSessionId, @IntRange(from = 0, to = 15) int pduSessionId, @Nullable SliceInfo sliceInfo,
@NonNull DataServiceCallback callback) { @NonNull DataServiceCallback callback) {
/* Call the old version since the new version isn't supported */ /* Call the old version since the new version isn't supported */
setupDataCall(accessNetworkType, dataProfile, isRoaming, allowRoaming, reason, setupDataCall(accessNetworkType, dataProfile, isRoaming, allowRoaming, reason,
@@ -392,10 +398,11 @@ public abstract class DataService extends Service {
public final int reason; public final int reason;
public final LinkProperties linkProperties; public final LinkProperties linkProperties;
public final int pduSessionId; public final int pduSessionId;
public final SliceInfo sliceInfo;
public final IDataServiceCallback callback; public final IDataServiceCallback callback;
SetupDataCallRequest(int accessNetworkType, DataProfile dataProfile, boolean isRoaming, SetupDataCallRequest(int accessNetworkType, DataProfile dataProfile, boolean isRoaming,
boolean allowRoaming, int reason, LinkProperties linkProperties, boolean allowRoaming, int reason, LinkProperties linkProperties,
int pduSessionId, IDataServiceCallback callback) { int pduSessionId, SliceInfo sliceInfo, IDataServiceCallback callback) {
this.accessNetworkType = accessNetworkType; this.accessNetworkType = accessNetworkType;
this.dataProfile = dataProfile; this.dataProfile = dataProfile;
this.isRoaming = isRoaming; this.isRoaming = isRoaming;
@@ -403,6 +410,7 @@ public abstract class DataService extends Service {
this.linkProperties = linkProperties; this.linkProperties = linkProperties;
this.reason = reason; this.reason = reason;
this.pduSessionId = pduSessionId; this.pduSessionId = pduSessionId;
this.sliceInfo = sliceInfo;
this.callback = callback; this.callback = callback;
} }
} }
@@ -513,6 +521,7 @@ public abstract class DataService extends Service {
setupDataCallRequest.dataProfile, setupDataCallRequest.isRoaming, setupDataCallRequest.dataProfile, setupDataCallRequest.isRoaming,
setupDataCallRequest.allowRoaming, setupDataCallRequest.reason, setupDataCallRequest.allowRoaming, setupDataCallRequest.reason,
setupDataCallRequest.linkProperties, setupDataCallRequest.pduSessionId, setupDataCallRequest.linkProperties, setupDataCallRequest.pduSessionId,
setupDataCallRequest.sliceInfo,
(setupDataCallRequest.callback != null) (setupDataCallRequest.callback != null)
? new DataServiceCallback(setupDataCallRequest.callback) ? new DataServiceCallback(setupDataCallRequest.callback)
: null); : null);
@@ -676,10 +685,12 @@ public abstract class DataService extends Service {
@Override @Override
public void setupDataCall(int slotIndex, int accessNetworkType, DataProfile dataProfile, public void setupDataCall(int slotIndex, int accessNetworkType, DataProfile dataProfile,
boolean isRoaming, boolean allowRoaming, int reason, boolean isRoaming, boolean allowRoaming, int reason,
LinkProperties linkProperties, int pduSessionId, IDataServiceCallback callback) { LinkProperties linkProperties, int pduSessionId, SliceInfo sliceInfo,
IDataServiceCallback callback) {
mHandler.obtainMessage(DATA_SERVICE_REQUEST_SETUP_DATA_CALL, slotIndex, 0, mHandler.obtainMessage(DATA_SERVICE_REQUEST_SETUP_DATA_CALL, slotIndex, 0,
new SetupDataCallRequest(accessNetworkType, dataProfile, isRoaming, new SetupDataCallRequest(accessNetworkType, dataProfile, isRoaming,
allowRoaming, reason, linkProperties, pduSessionId, callback)) allowRoaming, reason, linkProperties, pduSessionId, sliceInfo,
callback))
.sendToTarget(); .sendToTarget();
} }

View File

@@ -19,6 +19,7 @@ package android.telephony.data;
import android.net.LinkProperties; import android.net.LinkProperties;
import android.telephony.data.DataProfile; import android.telephony.data.DataProfile;
import android.telephony.data.IDataServiceCallback; import android.telephony.data.IDataServiceCallback;
import android.telephony.data.SliceInfo;
/** /**
* {@hide} * {@hide}
@@ -29,7 +30,7 @@ oneway interface IDataService
void removeDataServiceProvider(int slotId); void removeDataServiceProvider(int slotId);
void setupDataCall(int slotId, int accessNetwork, in DataProfile dataProfile, boolean isRoaming, void setupDataCall(int slotId, int accessNetwork, in DataProfile dataProfile, boolean isRoaming,
boolean allowRoaming, int reason, in LinkProperties linkProperties, boolean allowRoaming, int reason, in LinkProperties linkProperties,
int pduSessionId, IDataServiceCallback callback); int pduSessionId, in SliceInfo sliceInfo, IDataServiceCallback callback);
void deactivateDataCall(int slotId, int cid, int reason, IDataServiceCallback callback); void deactivateDataCall(int slotId, int cid, int reason, IDataServiceCallback callback);
void setInitialAttachApn(int slotId, in DataProfile dataProfile, boolean isRoaming, void setInitialAttachApn(int slotId, in DataProfile dataProfile, boolean isRoaming,
IDataServiceCallback callback); IDataServiceCallback callback);

View File

@@ -0,0 +1,20 @@
/*
* Copyright 2020 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 SliceInfo;

View File

@@ -0,0 +1,342 @@
/*
* Copyright (C) 2020 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.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Objects;
/**
* Represents a S-NSSAI as defined in 3GPP TS 24.501.
*
* @hide
*/
@SystemApi
public final class SliceInfo implements Parcelable {
/**
* When set on a Slice Differentiator, this value indicates that there is no corresponding
* Slice.
*/
public static final int SLICE_DIFFERENTIATOR_NO_SLICE = -1;
/**
* Indicates that the service type is not present.
*/
public static final int SLICE_SERVICE_TYPE_NONE = 0;
/**
* Slice suitable for the handling of 5G enhanced Mobile Broadband.
*/
public static final int SLICE_SERVICE_TYPE_EMBB = 1;
/**
* Slice suitable for the handling of ultra-reliable low latency communications.
*/
public static final int SLICE_SERVICE_TYPE_URLLC = 2;
/**
* Slice suitable for the handling of massive IoT.
*/
public static final int SLICE_SERVICE_TYPE_MIOT = 3;
/**
* The min acceptable value for a Slice Differentiator
*/
@SuppressLint("MinMaxConstant")
public static final int MIN_SLICE_DIFFERENTIATOR = -1;
/**
* The max acceptable value for a Slice Differentiator
*/
@SuppressLint("MinMaxConstant")
public static final int MAX_SLICE_DIFFERENTIATOR = 0xFFFFFE;
/** @hide */
@IntDef(prefix = { "SLICE_SERVICE_TYPE_" }, value = {
SLICE_SERVICE_TYPE_NONE,
SLICE_SERVICE_TYPE_EMBB,
SLICE_SERVICE_TYPE_URLLC,
SLICE_SERVICE_TYPE_MIOT,
})
@Retention(RetentionPolicy.SOURCE)
public @interface SliceServiceType {}
@SliceServiceType
private final int mSliceServiceType;
@IntRange(from = MIN_SLICE_DIFFERENTIATOR, to = MAX_SLICE_DIFFERENTIATOR)
private final int mSliceDifferentiator;
@SliceServiceType
private final int mMappedHplmnSliceServiceType;
@IntRange(from = MIN_SLICE_DIFFERENTIATOR, to = MAX_SLICE_DIFFERENTIATOR)
private final int mMappedHplmnSliceDifferentiator;
private SliceInfo(@SliceServiceType int sliceServiceType,
int sliceDifferentiator, int mappedHplmnSliceServiceType,
int mappedHplmnSliceDifferentiator) {
mSliceServiceType = sliceServiceType;
mSliceDifferentiator = sliceDifferentiator;
mMappedHplmnSliceDifferentiator = mappedHplmnSliceDifferentiator;
mMappedHplmnSliceServiceType = mappedHplmnSliceServiceType;
}
/**
* The type of service provided by the slice.
* <p/>
* see: 3GPP TS 24.501 Section 9.11.2.8.
*/
@SliceServiceType
public int getSliceServiceType() {
return mSliceServiceType;
}
/**
* Identifies the slice from others with the same Slice Service Type.
* <p/>
* Returns {@link #SLICE_DIFFERENTIATOR_NO_SLICE} if {@link #getSliceServiceType} returns
* {@link #SLICE_SERVICE_TYPE_NONE}.
* <p/>
* see: 3GPP TS 24.501 Section 9.11.2.8.
*/
@IntRange(from = MIN_SLICE_DIFFERENTIATOR, to = MAX_SLICE_DIFFERENTIATOR)
public int getSliceDifferentiator() {
return mSliceDifferentiator;
}
/**
* Corresponds to a Slice Info (S-NSSAI) of the HPLMN.
* <p/>
* see: 3GPP TS 24.501 Section 9.11.2.8.
*/
@SliceServiceType
public int getMappedHplmnSliceServiceType() {
return mMappedHplmnSliceServiceType;
}
/**
* This Slice Differentiator corresponds to a {@link SliceInfo} (S-NSSAI) of the HPLMN;
* {@link #getSliceDifferentiator()} is mapped to this value.
* <p/>
* Returns {@link #SLICE_DIFFERENTIATOR_NO_SLICE} if either of the following are true:
* <ul>
* <li>{@link #getSliceDifferentiator()} returns {@link #SLICE_DIFFERENTIATOR_NO_SLICE}</li>
* <li>{@link #getMappedHplmnSliceServiceType()} returns {@link #SLICE_SERVICE_TYPE_NONE}</li>
* </ul>
* <p/>
* see: 3GPP TS 24.501 Section 9.11.2.8.
*/
@IntRange(from = MIN_SLICE_DIFFERENTIATOR, to = MAX_SLICE_DIFFERENTIATOR)
public int getMappedHplmnSliceDifferentiator() {
return mMappedHplmnSliceDifferentiator;
}
private SliceInfo(@NonNull Parcel in) {
mSliceServiceType = in.readInt();
mSliceDifferentiator = in.readInt();
mMappedHplmnSliceServiceType = in.readInt();
mMappedHplmnSliceDifferentiator = in.readInt();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(mSliceServiceType);
dest.writeInt(mSliceDifferentiator);
dest.writeInt(mMappedHplmnSliceServiceType);
dest.writeInt(mMappedHplmnSliceDifferentiator);
}
public static final @android.annotation.NonNull Parcelable.Creator<SliceInfo> CREATOR =
new Parcelable.Creator<SliceInfo>() {
@Override
@NonNull
public SliceInfo createFromParcel(@NonNull Parcel source) {
return new SliceInfo(source);
}
@Override
@NonNull
public SliceInfo[] newArray(int size) {
return new SliceInfo[size];
}
};
@Override
public String toString() {
return "SliceInfo{"
+ "mSliceServiceType=" + sliceServiceTypeToString(mSliceServiceType)
+ ", mSliceDifferentiator=" + mSliceDifferentiator
+ ", mMappedHplmnSliceServiceType="
+ sliceServiceTypeToString(mMappedHplmnSliceServiceType)
+ ", mMappedHplmnSliceDifferentiator=" + mMappedHplmnSliceDifferentiator
+ '}';
}
private static String sliceServiceTypeToString(@SliceServiceType int sliceServiceType) {
switch(sliceServiceType) {
case SLICE_SERVICE_TYPE_NONE:
return "NONE";
case SLICE_SERVICE_TYPE_EMBB:
return "EMBB";
case SLICE_SERVICE_TYPE_URLLC:
return "URLLC";
case SLICE_SERVICE_TYPE_MIOT:
return "MIOT";
default:
return Integer.toString(sliceServiceType);
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SliceInfo sliceInfo = (SliceInfo) o;
return mSliceServiceType == sliceInfo.mSliceServiceType
&& mSliceDifferentiator == sliceInfo.mSliceDifferentiator
&& mMappedHplmnSliceServiceType == sliceInfo.mMappedHplmnSliceServiceType
&& mMappedHplmnSliceDifferentiator == sliceInfo.mMappedHplmnSliceDifferentiator;
}
@Override
public int hashCode() {
return Objects.hash(mSliceServiceType, mSliceDifferentiator, mMappedHplmnSliceServiceType,
mMappedHplmnSliceDifferentiator);
}
/**
* Provides a convenient way to set the fields of a {@link SliceInfo} when creating a
* new instance.
*
* <p>The example below shows how you might create a new {@code SliceInfo}:
*
* <pre><code>
*
* SliceInfo response = new SliceInfo.Builder()
* .setSliceServiceType(SLICE_SERVICE_TYPE_URLLC)
* .build();
* </code></pre>
*/
public static final class Builder {
@SliceServiceType
private int mSliceServiceType = SLICE_SERVICE_TYPE_NONE;
@IntRange(from = MIN_SLICE_DIFFERENTIATOR, to = MAX_SLICE_DIFFERENTIATOR)
private int mSliceDifferentiator = SLICE_DIFFERENTIATOR_NO_SLICE;
@SliceServiceType
private int mMappedHplmnSliceServiceType = SLICE_SERVICE_TYPE_NONE;
@IntRange(from = MIN_SLICE_DIFFERENTIATOR, to = MAX_SLICE_DIFFERENTIATOR)
private int mMappedHplmnSliceDifferentiator = SLICE_DIFFERENTIATOR_NO_SLICE;
/**
* Default constructor for Builder.
*/
public Builder() {
}
/**
* Set the Slice Service Type.
*
* @return The same instance of the builder.
*/
@NonNull
public Builder setSliceServiceType(@SliceServiceType int mSliceServiceType) {
this.mSliceServiceType = mSliceServiceType;
return this;
}
/**
* Set the Slice Differentiator.
* <p/>
* A value of {@link #SLICE_DIFFERENTIATOR_NO_SLICE} indicates that there is no
* corresponding Slice.
*
* @throws IllegalArgumentException if the parameter is not between
* {@link #MIN_SLICE_DIFFERENTIATOR} and {@link #MAX_SLICE_DIFFERENTIATOR}.
*
* @return The same instance of the builder.
*/
@NonNull
public Builder setSliceDifferentiator(
@IntRange(from = MIN_SLICE_DIFFERENTIATOR, to = MAX_SLICE_DIFFERENTIATOR)
int sliceDifferentiator) {
if (sliceDifferentiator < MIN_SLICE_DIFFERENTIATOR
|| sliceDifferentiator > MAX_SLICE_DIFFERENTIATOR) {
throw new IllegalArgumentException("The slice diffentiator value is out of range");
}
this.mSliceDifferentiator = sliceDifferentiator;
return this;
}
/**
* Set the HPLMN Slice Service Type.
*
* @return The same instance of the builder.
*/
@NonNull
public Builder setMappedHplmnSliceServiceType(
@SliceServiceType int mappedHplmnSliceServiceType) {
this.mMappedHplmnSliceServiceType = mappedHplmnSliceServiceType;
return this;
}
/**
* Set the HPLMN Slice Differentiator.
* <p/>
* A value of {@link #SLICE_DIFFERENTIATOR_NO_SLICE} indicates that there is no
* corresponding Slice of the HPLMN.
*
* @throws IllegalArgumentException if the parameter is not between
* {@link #MIN_SLICE_DIFFERENTIATOR} and {@link #MAX_SLICE_DIFFERENTIATOR}.
*
* @return The same instance of the builder.
*/
@NonNull
public Builder setMappedHplmnSliceDifferentiator(
@IntRange(from = MIN_SLICE_DIFFERENTIATOR, to = MAX_SLICE_DIFFERENTIATOR)
int mappedHplmnSliceDifferentiator) {
if (mappedHplmnSliceDifferentiator < MIN_SLICE_DIFFERENTIATOR
|| mappedHplmnSliceDifferentiator > MAX_SLICE_DIFFERENTIATOR) {
throw new IllegalArgumentException("The slice diffentiator value is out of range");
}
this.mMappedHplmnSliceDifferentiator = mappedHplmnSliceDifferentiator;
return this;
}
/**
* Build the {@link SliceInfo}.
*
* @return the {@link SliceInfo} object.
*/
@NonNull
public SliceInfo build() {
return new SliceInfo(this.mSliceServiceType, this.mSliceDifferentiator,
this.mMappedHplmnSliceServiceType, this.mMappedHplmnSliceDifferentiator);
}
}
}