script-astra/Android/Sdk/sources/android-35/android/telephony/data/DataProfile.java

854 lines
28 KiB
Java
Raw Normal View History

2025-01-20 15:15:20 +00:00
/*
* Copyright 2017 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 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.NetCapability;
import android.telephony.TelephonyManager;
import android.telephony.TelephonyManager.NetworkTypeBitMask;
import android.telephony.data.ApnSetting.ApnType;
import android.telephony.data.ApnSetting.AuthType;
import android.text.TextUtils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Objects;
/**
* Description of a mobile data profile used for establishing data networks. The data profile
* consist an {@link ApnSetting} which is needed for 2G/3G/4G networks bring up, and a
* {@link TrafficDescriptor} contains additional information that can be used for 5G standalone
* network bring up.
*
* @hide
*/
@SystemApi
public final class DataProfile implements Parcelable {
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = {"TYPE_"},
value = {
TYPE_COMMON,
TYPE_3GPP,
TYPE_3GPP2})
public @interface Type {}
/** Common data profile */
public static final int TYPE_COMMON = 0;
/** 3GPP type data profile */
public static final int TYPE_3GPP = 1;
/** 3GPP2 type data profile */
public static final int TYPE_3GPP2 = 2;
private final @Type int mType;
private final @Nullable ApnSetting mApnSetting;
private final @Nullable TrafficDescriptor mTrafficDescriptor;
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;
mPreferred = builder.mPreferred;
if (builder.mType != -1) {
mType = builder.mType;
} else if (mApnSetting != null) {
int networkTypes = mApnSetting.getNetworkTypeBitmask();
if (networkTypes == 0) {
mType = DataProfile.TYPE_COMMON;
} else if ((networkTypes & TelephonyManager.NETWORK_STANDARDS_FAMILY_BITMASK_3GPP2)
== networkTypes) {
mType = DataProfile.TYPE_3GPP2;
} else if ((networkTypes & TelephonyManager.NETWORK_STANDARDS_FAMILY_BITMASK_3GPP)
== networkTypes) {
mType = DataProfile.TYPE_3GPP;
} else {
mType = DataProfile.TYPE_COMMON;
}
} else {
mType = DataProfile.TYPE_COMMON;
}
}
private DataProfile(Parcel source) {
mType = source.readInt();
mApnSetting = source.readParcelable(ApnSetting.class.getClassLoader(), android.telephony.data.ApnSetting.class);
mTrafficDescriptor = source.readParcelable(TrafficDescriptor.class.getClassLoader(), android.telephony.data.TrafficDescriptor.class);
mPreferred = source.readBoolean();
mSetupTimestamp = source.readLong();
}
/**
* @return Id of the data profile.
* @deprecated Use {@link #getApnSetting()} and {@link ApnSetting#getProfileId()} instead.
*/
@Deprecated
public int getProfileId() {
if (mApnSetting != null) {
return mApnSetting.getProfileId();
}
return 0;
}
/**
* @return The APN (Access Point Name) to establish data connection. This is a string
* specifically defined by the carrier.
* @deprecated Use {@link #getApnSetting()} and {@link ApnSetting#getApnName()} instead.
*/
@Deprecated
public @NonNull String getApn() {
if (mApnSetting != null) {
return TextUtils.emptyIfNull(mApnSetting.getApnName());
}
return "";
}
/**
* @return The connection protocol defined in 3GPP TS 27.007 section 10.1.1.
* @deprecated Use {@link #getApnSetting()} and {@link ApnSetting#getProtocol()} instead.
*/
@Deprecated
public @ProtocolType int getProtocolType() {
if (mApnSetting != null) {
return mApnSetting.getProtocol();
}
return ApnSetting.PROTOCOL_IPV4V6;
}
/**
* @return The authentication protocol used for this PDP context.
* @deprecated Use {@link #getApnSetting()} and {@link ApnSetting#getAuthType()} instead.
*/
@Deprecated
public @AuthType int getAuthType() {
if (mApnSetting != null) {
return mApnSetting.getAuthType();
}
return ApnSetting.AUTH_TYPE_NONE;
}
/**
* @return The username for APN.
* @deprecated Use {@link #getApnSetting()} and {@link ApnSetting#getUser()} instead.
*/
@Deprecated
public @Nullable String getUserName() {
if (mApnSetting != null) {
return mApnSetting.getUser();
}
return null;
}
/**
* @return The password for APN.
* @deprecated Use {@link #getApnSetting()} and {@link ApnSetting#getPassword()} instead.
*/
@Deprecated
public @Nullable String getPassword() {
if (mApnSetting != null) {
return mApnSetting.getPassword();
}
return null;
}
/**
* @return The profile type.
*/
public @Type int getType() {
return mType;
}
/**
* @return The period in seconds to limit the maximum connections.
*
* @hide
*/
public int getMaxConnectionsTime() {
if (mApnSetting != null) {
return mApnSetting.getMaxConnsTime();
}
return 0;
}
/**
* @return The maximum connections allowed.
*
* @hide
*/
public int getMaxConnections() {
if (mApnSetting != null) {
return mApnSetting.getMaxConns();
}
return 0;
}
/**
* @return The required wait time in seconds after a successful UE initiated disconnect of a
* given PDN connection before the device can send a new PDN connection request for that given
* PDN.
*
* @hide
*/
public int getWaitTime() {
if (mApnSetting != null) {
return mApnSetting.getWaitTime();
}
return 0;
}
/**
* @return {@code true} if the profile is enabled. If the profile only has a
* {@link TrafficDescriptor}, but no {@link ApnSetting}, then this profile is always enabled.
*/
public boolean isEnabled() {
if (mApnSetting != null) {
return mApnSetting.isEnabled();
}
return true;
}
/**
* @return The supported APN types bitmask.
* @deprecated Use {@link #getApnSetting()} and {@link ApnSetting#getApnTypeBitmask()} instead.
*/
@Deprecated public @ApnType int getSupportedApnTypesBitmask() {
if (mApnSetting != null) {
return mApnSetting.getApnTypeBitmask();
}
return ApnSetting.TYPE_NONE;
}
/**
* @return The connection protocol on roaming network defined in 3GPP TS 27.007 section 10.1.1.
* @deprecated Use {@link #getApnSetting()} and {@link ApnSetting#getRoamingProtocol()} instead.
*/
@Deprecated
public @ProtocolType int getRoamingProtocolType() {
if (mApnSetting != null) {
return mApnSetting.getRoamingProtocol();
}
return ApnSetting.PROTOCOL_IP;
}
/**
* @return The bearer bitmask indicating the applicable networks for this data profile.
* @deprecated use {@link #getApnSetting()} and {@link ApnSetting#getNetworkTypeBitmask()}
* instead.
*/
@Deprecated
public @NetworkTypeBitMask int getBearerBitmask() {
if (mApnSetting != null) {
return mApnSetting.getNetworkTypeBitmask();
}
return (int) TelephonyManager.NETWORK_TYPE_BITMASK_UNKNOWN;
}
/**
* @return The maximum transmission unit (MTU) size in bytes.
* @deprecated use {@link #getApnSetting()} and {@link ApnSetting#getMtuV4()}/
* {@link ApnSetting#getMtuV6()} instead.
*/
@Deprecated
public int getMtu() {
return getMtuV4();
}
/**
* This replaces the deprecated method getMtu.
* @return The maximum transmission unit (MTU) size in bytes, for IPv4.
* @deprecated use {@link #getApnSetting()} and {@link ApnSetting#getMtuV4()} instead.
*/
@Deprecated
public int getMtuV4() {
if (mApnSetting != null) {
return mApnSetting.getMtuV4();
}
return 0;
}
/**
* @return The maximum transmission unit (MTU) size in bytes, for IPv6.
* @deprecated use {@link #getApnSetting()} and {@link ApnSetting#getMtuV6()} instead.
*/
@Deprecated
public int getMtuV6() {
if (mApnSetting != null) {
return mApnSetting.getMtuV6();
}
return 0;
}
/**
* @return {@code true} if modem must persist this data profile.
* @deprecated Use {@link #getApnSetting()} and {@link ApnSetting#isPersistent()} instead.
*/
@Deprecated
public boolean isPersistent() {
if (mApnSetting != null) {
return mApnSetting.isPersistent();
}
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'
* APN editor. For one carrier there can be only one profiled preferred.
*/
public boolean isPreferred() {
return mPreferred;
}
/**
* @return The APN setting {@link ApnSetting}, which is used to establish data network on
* 2G/3G/4G.
*/
public @Nullable ApnSetting getApnSetting() {
return mApnSetting;
}
/**
* @return The traffic descriptor {@link TrafficDescriptor}, which can be used to establish
* data network on 5G.
*/
public @Nullable TrafficDescriptor getTrafficDescriptor() {
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;
case NetworkCapabilities.NET_CAPABILITY_BIP:
return ApnSetting.TYPE_BIP;
case NetworkCapabilities.NET_CAPABILITY_VSIM:
return ApnSetting.TYPE_VSIM;
case NetworkCapabilities.NET_CAPABILITY_ENTERPRISE:
return ApnSetting.TYPE_ENTERPRISE;
case NetworkCapabilities.NET_CAPABILITY_RCS:
return ApnSetting.TYPE_RCS;
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;
}
@NonNull
@Override
public String toString() {
return "[DataProfile=" + mApnSetting + ", " + mTrafficDescriptor + ", preferred="
+ mPreferred + "]";
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mType);
dest.writeParcelable(mApnSetting, flags);
dest.writeParcelable(mTrafficDescriptor, flags);
dest.writeBoolean(mPreferred);
dest.writeLong(mSetupTimestamp);
}
public static final @android.annotation.NonNull Parcelable.Creator<DataProfile> CREATOR =
new Parcelable.Creator<DataProfile>() {
@Override
public DataProfile createFromParcel(Parcel source) {
return new DataProfile(source);
}
@Override
public DataProfile[] newArray(int size) {
return new DataProfile[size];
}
};
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DataProfile that = (DataProfile) o;
return mType == that.mType
&& Objects.equals(mApnSetting, that.mApnSetting)
&& Objects.equals(mTrafficDescriptor, that.mTrafficDescriptor);
}
@Override
public int hashCode() {
return Objects.hash(mType, mApnSetting, mTrafficDescriptor);
}
/**
* Provides a convenient way to set the fields of a {@link DataProfile} when creating a new
* instance.
*
* <p>The example below shows how you might create a new {@code DataProfile}:
*
* <pre><code>
*
* DataProfile dp = new DataProfile.Builder()
* .setApn("apn.xyz.com")
* .setProtocol(ApnSetting.PROTOCOL_IPV4V6)
* .build();
* </code></pre>
*/
public static final class Builder {
private int mProfileId;
private String mApn;
@ProtocolType
private int mProtocolType;
@AuthType
private int mAuthType;
private String mUserName;
private String mPassword;
@Type
private int mType = -1;
private boolean mEnabled = true;
@ApnType
private int mSupportedApnTypesBitmask;
@ProtocolType
private int mRoamingProtocolType;
@NetworkTypeBitMask
private int mBearerBitmask;
private int mMtuV4;
private int mMtuV6;
private boolean mPersistent;
private boolean mPreferred;
private ApnSetting mApnSetting;
private TrafficDescriptor mTrafficDescriptor;
/**
* Default constructor for Builder.
*/
public Builder() {
}
/**
* Set profile id. Note that this is not a global unique id of the data profile. This id
* is only used by certain CDMA carriers to identify the type of data profile.
*
* @param profileId Network domain.
* @return The same instance of the builder.
* @deprecated use {@link #setApnSetting(ApnSetting)} and
* {@link ApnSetting.Builder#setProfileId(int)} instead.
*/
@Deprecated
public @NonNull Builder setProfileId(int profileId) {
mProfileId = profileId;
return this;
}
/**
* Set the APN (Access Point Name) to establish data connection. This is a string
* specifically defined by the carrier.
*
* @param apn Access point name
* @return The same instance of the builder.
* @deprecated use {@link #setApnSetting(ApnSetting)} and
* {@link ApnSetting.Builder#setApnName(String)} instead.
*/
@Deprecated
public @NonNull Builder setApn(@NonNull String apn) {
mApn = apn;
return this;
}
/**
* Set the connection protocol type.
*
* @param protocolType The connection protocol defined in 3GPP TS 27.007 section 10.1.1.
* @return The same instance of the builder.
* @deprecated use {@link #setApnSetting(ApnSetting)} and
* {@link ApnSetting.Builder#setProtocol(int)} instead.
*/
@Deprecated
public @NonNull Builder setProtocolType(@ProtocolType int protocolType) {
mProtocolType = protocolType;
return this;
}
/**
* Set the authentication type.
*
* @param authType The authentication type
* @return The same instance of the builder.
* @deprecated use {@link #setApnSetting(ApnSetting)} and
* {@link ApnSetting.Builder#setAuthType(int)} instead.
*/
@Deprecated
public @NonNull Builder setAuthType(@AuthType int authType) {
mAuthType = authType;
return this;
}
/**
* Set the user name
*
* @param userName The user name
* @return The same instance of the builder.
* @deprecated use {@link #setApnSetting(ApnSetting)} and
* {@link ApnSetting.Builder#setUser(String)} instead.
*/
@Deprecated
public @NonNull Builder setUserName(@NonNull String userName) {
mUserName = userName;
return this;
}
/**
* Set the password
*
* @param password The password
* @return The same instance of the builder.
* @deprecated use {@link #setApnSetting(ApnSetting)} and
* {@link ApnSetting.Builder#setPassword(String)} (int)} instead.
*/
@Deprecated
public @NonNull Builder setPassword(@NonNull String password) {
mPassword = password;
return this;
}
/**
* Set the type
*
* @param type The profile type
* @return The same instance of the builder.
*/
public @NonNull Builder setType(@Type int type) {
mType = type;
return this;
}
/**
* Enable the data profile
*
* @param isEnabled {@code true} to enable the data profile, otherwise disable.
* @return The same instance of the builder.
*/
public @NonNull Builder enable(boolean isEnabled) {
mEnabled = isEnabled;
return this;
}
/**
* Set the supported APN types bitmask.
*
* @param supportedApnTypesBitmask The supported APN types bitmask.
* @return The same instance of the builder.
* @deprecated use {@link #setApnSetting(ApnSetting)} and
* {@link ApnSetting.Builder#setApnTypeBitmask(int)} instead.
*/
@Deprecated
public @NonNull Builder setSupportedApnTypesBitmask(@ApnType int supportedApnTypesBitmask) {
mSupportedApnTypesBitmask = supportedApnTypesBitmask;
return this;
}
/**
* Set the connection protocol type for roaming.
*
* @param protocolType The connection protocol defined in 3GPP TS 27.007 section 10.1.1.
* @return The same instance of the builder.
* @deprecated use {@link #setApnSetting(ApnSetting)} and
* {@link ApnSetting.Builder#setRoamingProtocol(int)} instead.
*/
@Deprecated
public @NonNull Builder setRoamingProtocolType(@ProtocolType int protocolType) {
mRoamingProtocolType = protocolType;
return this;
}
/**
* Set the bearer bitmask indicating the applicable networks for this data profile.
*
* @param bearerBitmask The bearer bitmask indicating the applicable networks for this data
* profile.
* @return The same instance of the builder.
* @deprecated use {@link #setApnSetting(ApnSetting)} and
* {@link ApnSetting.Builder#setNetworkTypeBitmask(int)} instead.
*/
@Deprecated
public @NonNull Builder setBearerBitmask(@NetworkTypeBitMask int bearerBitmask) {
mBearerBitmask = bearerBitmask;
return this;
}
/**
* Set the maximum transmission unit (MTU) size in bytes.
*
* @param mtu The maximum transmission unit (MTU) size in bytes.
* @return The same instance of the builder.
* @deprecated use {@link #setApnSetting(ApnSetting)} and
* {@link ApnSetting.Builder#setMtuV4(int)}/{@link ApnSetting.Builder#setMtuV6(int)}
* instead.
*/
@Deprecated
public @NonNull Builder setMtu(int mtu) {
mMtuV4 = mMtuV6 = mtu;
return this;
}
/**
* Set the maximum transmission unit (MTU) size in bytes, for IPv4.
*
* @param mtu The maximum transmission unit (MTU) size in bytes.
* @return The same instance of the builder.
* @deprecated Use {{@link #setApnSetting(ApnSetting)}} and
* {@link ApnSetting.Builder#setMtuV4(int)} instead.
*/
@Deprecated
public @NonNull Builder setMtuV4(int mtu) {
mMtuV4 = mtu;
return this;
}
/**
* Set the maximum transmission unit (MTU) size in bytes, for IPv6.
*
* @param mtu The maximum transmission unit (MTU) size in bytes.
* @return The same instance of the builder.
* @deprecated Use {{@link #setApnSetting(ApnSetting)}} and
* {@link ApnSetting.Builder#setMtuV6(int)} instead.
*/
@Deprecated
public @NonNull Builder setMtuV6(int mtu) {
mMtuV6 = mtu;
return this;
}
/**
* Set data profile as preferred/non-preferred.
*
* @param isPreferred {@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.
* @return The same instance of the builder.
*/
public @NonNull Builder setPreferred(boolean isPreferred) {
mPreferred = isPreferred;
return this;
}
/**
* Set data profile as persistent/non-persistent.
*
* @param isPersistent {@code true} if this data profile was used to bring up the last
* default (i.e internet) data connection successfully.
* @return The same instance of the builder.
* @deprecated Use {{@link #setApnSetting(ApnSetting)}} and
* {@link ApnSetting.Builder#setPersistent(boolean)} instead.
*/
@Deprecated
public @NonNull Builder setPersistent(boolean isPersistent) {
mPersistent = isPersistent;
return this;
}
/**
* Set the APN setting. Note that if an APN setting is not set here, then either
* {@link #setApn(String)} or {@link #setTrafficDescriptor(TrafficDescriptor)} must be
* called. Otherwise {@link IllegalArgumentException} will be thrown when {@link #build()}
* the data profile.
*
* @param apnSetting The APN setting.
* @return The same instance of the builder.
*/
public @NonNull Builder setApnSetting(@NonNull ApnSetting apnSetting) {
mApnSetting = apnSetting;
return this;
}
/**
* Set the traffic descriptor. Note that if a traffic descriptor is not set here, then
* either {@link #setApnSetting(ApnSetting)} or {@link #setApn(String)} must be called.
* Otherwise {@link IllegalArgumentException} will be thrown when {@link #build()} the data
* profile.
*
* @param trafficDescriptor The traffic descriptor.
* @return The same instance of the builder.
*/
public @NonNull Builder setTrafficDescriptor(@NonNull TrafficDescriptor trafficDescriptor) {
mTrafficDescriptor = trafficDescriptor;
return this;
}
/**
* Build the DataProfile object.
*
* @return The data profile object.
*/
public @NonNull DataProfile build() {
if (mApnSetting == null && mApn != null) {
// This is for backwards compatibility.
mApnSetting = new ApnSetting.Builder()
.setEntryName(mApn)
.setApnName(mApn)
.setApnTypeBitmask(mSupportedApnTypesBitmask)
.setAuthType(mAuthType)
.setCarrierEnabled(mEnabled)
.setModemCognitive(mPersistent)
.setMtuV4(mMtuV4)
.setMtuV6(mMtuV6)
.setNetworkTypeBitmask(mBearerBitmask)
.setProfileId(mProfileId)
.setPassword(mPassword)
.setProtocol(mProtocolType)
.setRoamingProtocol(mRoamingProtocolType)
.setUser(mUserName)
.build();
}
if (mApnSetting == null && mTrafficDescriptor == null) {
throw new IllegalArgumentException("APN setting and traffic descriptor can't be "
+ "both null.");
}
return new DataProfile(this);
}
}
}