Test: runtest -x frameworks/base/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java run cts --module CtsDevicePolicyManagerTestCases --test com.android.cts.devicepolicy.DeviceOwnerTest#testOverrideApn Bug: 73087996 Change-Id: I5232c92a44ab505946956f81965a205f170aa52b
1362 lines
48 KiB
Java
1362 lines
48 KiB
Java
/*
|
|
* Copyright (C) 2018 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.NonNull;
|
|
import android.content.ContentValues;
|
|
import android.database.Cursor;
|
|
import android.hardware.radio.V1_0.ApnTypes;
|
|
import android.net.Uri;
|
|
import android.os.Parcel;
|
|
import android.os.Parcelable;
|
|
import android.provider.Telephony;
|
|
import android.telephony.Rlog;
|
|
import android.telephony.ServiceState;
|
|
import android.telephony.TelephonyManager;
|
|
import android.text.TextUtils;
|
|
import android.util.ArrayMap;
|
|
import android.util.Log;
|
|
import java.lang.annotation.Retention;
|
|
import java.lang.annotation.RetentionPolicy;
|
|
import java.net.InetAddress;
|
|
import java.net.UnknownHostException;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Objects;
|
|
|
|
/**
|
|
* A class representing an APN configuration.
|
|
*/
|
|
public class ApnSetting implements Parcelable {
|
|
|
|
private static final String LOG_TAG = "ApnSetting";
|
|
private static final boolean VDBG = false;
|
|
|
|
private static final Map<String, Integer> APN_TYPE_STRING_MAP;
|
|
private static final Map<Integer, String> APN_TYPE_INT_MAP;
|
|
private static final Map<String, Integer> PROTOCOL_STRING_MAP;
|
|
private static final Map<Integer, String> PROTOCOL_INT_MAP;
|
|
private static final Map<String, Integer> MVNO_TYPE_STRING_MAP;
|
|
private static final Map<Integer, String> MVNO_TYPE_INT_MAP;
|
|
private static final int NOT_IN_MAP_INT = -1;
|
|
private static final int NO_PORT_SPECIFIED = -1;
|
|
|
|
/** All APN types except IA. */
|
|
private static final int TYPE_ALL_BUT_IA = ApnTypes.ALL & (~ApnTypes.IA);
|
|
|
|
/** APN type for default data traffic and HiPri traffic. */
|
|
public static final int TYPE_DEFAULT = ApnTypes.DEFAULT | ApnTypes.HIPRI;
|
|
/** APN type for MMS traffic. */
|
|
public static final int TYPE_MMS = ApnTypes.MMS;
|
|
/** APN type for SUPL assisted GPS. */
|
|
public static final int TYPE_SUPL = ApnTypes.SUPL;
|
|
/** APN type for DUN traffic. */
|
|
public static final int TYPE_DUN = ApnTypes.DUN;
|
|
/** APN type for HiPri traffic. */
|
|
public static final int TYPE_HIPRI = ApnTypes.HIPRI;
|
|
/** APN type for accessing the carrier's FOTA portal, used for over the air updates. */
|
|
public static final int TYPE_FOTA = ApnTypes.FOTA;
|
|
/** APN type for IMS. */
|
|
public static final int TYPE_IMS = ApnTypes.IMS;
|
|
/** APN type for CBS. */
|
|
public static final int TYPE_CBS = ApnTypes.CBS;
|
|
/** APN type for IA Initial Attach APN. */
|
|
public static final int TYPE_IA = ApnTypes.IA;
|
|
/**
|
|
* APN type for Emergency PDN. This is not an IA apn, but is used
|
|
* for access to carrier services in an emergency call situation.
|
|
*/
|
|
public static final int TYPE_EMERGENCY = ApnTypes.EMERGENCY;
|
|
|
|
/** @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
|
|
})
|
|
@Retention(RetentionPolicy.SOURCE)
|
|
public @interface ApnType {}
|
|
|
|
// Possible values for authentication types.
|
|
/** No authentication type. */
|
|
public static final int AUTH_TYPE_NONE = 0;
|
|
/** Authentication type for PAP. */
|
|
public static final int AUTH_TYPE_PAP = 1;
|
|
/** Authentication type for CHAP. */
|
|
public static final int AUTH_TYPE_CHAP = 2;
|
|
/** Authentication type for PAP or CHAP. */
|
|
public static final int AUTH_TYPE_PAP_OR_CHAP = 3;
|
|
|
|
/** @hide */
|
|
@IntDef(prefix = { "AUTH_TYPE_" }, value = {
|
|
AUTH_TYPE_NONE,
|
|
AUTH_TYPE_PAP,
|
|
AUTH_TYPE_CHAP,
|
|
AUTH_TYPE_PAP_OR_CHAP,
|
|
})
|
|
@Retention(RetentionPolicy.SOURCE)
|
|
public @interface AuthType {}
|
|
|
|
// Possible values for protocol.
|
|
/** Protocol type for IP. */
|
|
public static final int PROTOCOL_IP = 0;
|
|
/** Protocol type for IPV6. */
|
|
public static final int PROTOCOL_IPV6 = 1;
|
|
/** Protocol type for IPV4V6. */
|
|
public static final int PROTOCOL_IPV4V6 = 2;
|
|
/** Protocol type for PPP. */
|
|
public static final int PROTOCOL_PPP = 3;
|
|
|
|
/** @hide */
|
|
@IntDef(prefix = { "PROTOCOL_" }, value = {
|
|
PROTOCOL_IP,
|
|
PROTOCOL_IPV6,
|
|
PROTOCOL_IPV4V6,
|
|
PROTOCOL_PPP,
|
|
})
|
|
@Retention(RetentionPolicy.SOURCE)
|
|
public @interface ProtocolType {}
|
|
|
|
// Possible values for MVNO type.
|
|
/** MVNO type for service provider name. */
|
|
public static final int MVNO_TYPE_SPN = 0;
|
|
/** MVNO type for IMSI. */
|
|
public static final int MVNO_TYPE_IMSI = 1;
|
|
/** MVNO type for group identifier level 1. */
|
|
public static final int MVNO_TYPE_GID = 2;
|
|
/** MVNO type for ICCID. */
|
|
public static final int MVNO_TYPE_ICCID = 3;
|
|
|
|
/** @hide */
|
|
@IntDef(prefix = { "MVNO_TYPE_" }, value = {
|
|
MVNO_TYPE_SPN,
|
|
MVNO_TYPE_IMSI,
|
|
MVNO_TYPE_GID,
|
|
MVNO_TYPE_ICCID,
|
|
})
|
|
@Retention(RetentionPolicy.SOURCE)
|
|
public @interface MvnoType {}
|
|
|
|
static {
|
|
APN_TYPE_STRING_MAP = new ArrayMap<String, Integer>();
|
|
APN_TYPE_STRING_MAP.put("*", TYPE_ALL_BUT_IA);
|
|
APN_TYPE_STRING_MAP.put("default", TYPE_DEFAULT);
|
|
APN_TYPE_STRING_MAP.put("mms", TYPE_MMS);
|
|
APN_TYPE_STRING_MAP.put("supl", TYPE_SUPL);
|
|
APN_TYPE_STRING_MAP.put("dun", TYPE_DUN);
|
|
APN_TYPE_STRING_MAP.put("hipri", TYPE_HIPRI);
|
|
APN_TYPE_STRING_MAP.put("fota", TYPE_FOTA);
|
|
APN_TYPE_STRING_MAP.put("ims", TYPE_IMS);
|
|
APN_TYPE_STRING_MAP.put("cbs", TYPE_CBS);
|
|
APN_TYPE_STRING_MAP.put("ia", TYPE_IA);
|
|
APN_TYPE_STRING_MAP.put("emergency", TYPE_EMERGENCY);
|
|
APN_TYPE_INT_MAP = new ArrayMap<Integer, String>();
|
|
APN_TYPE_INT_MAP.put(TYPE_DEFAULT, "default");
|
|
APN_TYPE_INT_MAP.put(TYPE_MMS, "mms");
|
|
APN_TYPE_INT_MAP.put(TYPE_SUPL, "supl");
|
|
APN_TYPE_INT_MAP.put(TYPE_DUN, "dun");
|
|
APN_TYPE_INT_MAP.put(TYPE_HIPRI, "hipri");
|
|
APN_TYPE_INT_MAP.put(TYPE_FOTA, "fota");
|
|
APN_TYPE_INT_MAP.put(TYPE_IMS, "ims");
|
|
APN_TYPE_INT_MAP.put(TYPE_CBS, "cbs");
|
|
APN_TYPE_INT_MAP.put(TYPE_IA, "ia");
|
|
APN_TYPE_INT_MAP.put(TYPE_EMERGENCY, "emergency");
|
|
|
|
PROTOCOL_STRING_MAP = new ArrayMap<String, Integer>();
|
|
PROTOCOL_STRING_MAP.put("IP", PROTOCOL_IP);
|
|
PROTOCOL_STRING_MAP.put("IPV6", PROTOCOL_IPV6);
|
|
PROTOCOL_STRING_MAP.put("IPV4V6", PROTOCOL_IPV4V6);
|
|
PROTOCOL_STRING_MAP.put("PPP", PROTOCOL_PPP);
|
|
PROTOCOL_INT_MAP = new ArrayMap<Integer, String>();
|
|
PROTOCOL_INT_MAP.put(PROTOCOL_IP, "IP");
|
|
PROTOCOL_INT_MAP.put(PROTOCOL_IPV6, "IPV6");
|
|
PROTOCOL_INT_MAP.put(PROTOCOL_IPV4V6, "IPV4V6");
|
|
PROTOCOL_INT_MAP.put(PROTOCOL_PPP, "PPP");
|
|
|
|
MVNO_TYPE_STRING_MAP = new ArrayMap<String, Integer>();
|
|
MVNO_TYPE_STRING_MAP.put("spn", MVNO_TYPE_SPN);
|
|
MVNO_TYPE_STRING_MAP.put("imsi", MVNO_TYPE_IMSI);
|
|
MVNO_TYPE_STRING_MAP.put("gid", MVNO_TYPE_GID);
|
|
MVNO_TYPE_STRING_MAP.put("iccid", MVNO_TYPE_ICCID);
|
|
MVNO_TYPE_INT_MAP = new ArrayMap<Integer, String>();
|
|
MVNO_TYPE_INT_MAP.put(MVNO_TYPE_SPN, "spn");
|
|
MVNO_TYPE_INT_MAP.put(MVNO_TYPE_IMSI, "imsi");
|
|
MVNO_TYPE_INT_MAP.put(MVNO_TYPE_GID, "gid");
|
|
MVNO_TYPE_INT_MAP.put(MVNO_TYPE_ICCID, "iccid");
|
|
}
|
|
|
|
private final String mEntryName;
|
|
private final String mApnName;
|
|
private final InetAddress mProxyAddress;
|
|
private final int mProxyPort;
|
|
private final Uri mMmsc;
|
|
private final InetAddress mMmsProxyAddress;
|
|
private final int mMmsProxyPort;
|
|
private final String mUser;
|
|
private final String mPassword;
|
|
private final int mAuthType;
|
|
private final int mApnTypeBitmask;
|
|
private final int mId;
|
|
private final String mOperatorNumeric;
|
|
private final int mProtocol;
|
|
private final int mRoamingProtocol;
|
|
private final int mMtu;
|
|
|
|
private final boolean mCarrierEnabled;
|
|
|
|
private final int mNetworkTypeBitmask;
|
|
|
|
private final int mProfileId;
|
|
|
|
private final boolean mModemCognitive;
|
|
private final int mMaxConns;
|
|
private final int mWaitTime;
|
|
private final int mMaxConnsTime;
|
|
|
|
private final int mMvnoType;
|
|
private final String mMvnoMatchData;
|
|
|
|
private boolean mPermanentFailed = false;
|
|
|
|
/**
|
|
* Returns the MTU size of the mobile interface to which the APN connected.
|
|
*
|
|
* @return the MTU size of the APN
|
|
* @hide
|
|
*/
|
|
public int getMtu() {
|
|
return mMtu;
|
|
}
|
|
|
|
/**
|
|
* Returns the profile id to which the APN saved in modem.
|
|
*
|
|
* @return the profile id of the APN
|
|
* @hide
|
|
*/
|
|
public int getProfileId() {
|
|
return mProfileId;
|
|
}
|
|
|
|
/**
|
|
* Returns if the APN setting is to be set in modem.
|
|
*
|
|
* @return is the APN setting to be set in modem
|
|
* @hide
|
|
*/
|
|
public boolean getModemCognitive() {
|
|
return mModemCognitive;
|
|
}
|
|
|
|
/**
|
|
* Returns the max connections of this APN.
|
|
*
|
|
* @return the max connections of this APN
|
|
* @hide
|
|
*/
|
|
public int getMaxConns() {
|
|
return mMaxConns;
|
|
}
|
|
|
|
/**
|
|
* Returns the wait time for retry of the APN.
|
|
*
|
|
* @return the wait time for retry of the APN
|
|
* @hide
|
|
*/
|
|
public int getWaitTime() {
|
|
return mWaitTime;
|
|
}
|
|
|
|
/**
|
|
* Returns the time to limit max connection for the APN.
|
|
*
|
|
* @return the time to limit max connection for the APN
|
|
* @hide
|
|
*/
|
|
public int getMaxConnsTime() {
|
|
return mMaxConnsTime;
|
|
}
|
|
|
|
/**
|
|
* Returns the MVNO data. Examples:
|
|
* "spn": A MOBILE, BEN NL
|
|
* "imsi": 302720x94, 2060188
|
|
* "gid": 4E, 33
|
|
* "iccid": 898603 etc..
|
|
*
|
|
* @return the mvno match data
|
|
* @hide
|
|
*/
|
|
public String getMvnoMatchData() {
|
|
return mMvnoMatchData;
|
|
}
|
|
|
|
/**
|
|
* Indicates this APN setting is permanently failed and cannot be
|
|
* retried by the retry manager anymore.
|
|
*
|
|
* @return if this APN setting is permanently failed
|
|
* @hide
|
|
*/
|
|
public boolean getPermanentFailed() {
|
|
return mPermanentFailed;
|
|
}
|
|
|
|
/**
|
|
* Sets if this APN setting is permanently failed.
|
|
*
|
|
* @param permanentFailed if this APN setting is permanently failed
|
|
* @hide
|
|
*/
|
|
public void setPermanentFailed(boolean permanentFailed) {
|
|
mPermanentFailed = permanentFailed;
|
|
}
|
|
|
|
/**
|
|
* Returns the entry name of the APN.
|
|
*
|
|
* @return the entry name for the APN
|
|
*/
|
|
public String getEntryName() {
|
|
return mEntryName;
|
|
}
|
|
|
|
/**
|
|
* Returns the name of the APN.
|
|
*
|
|
* @return APN name
|
|
*/
|
|
public String getApnName() {
|
|
return mApnName;
|
|
}
|
|
|
|
/**
|
|
* Returns the proxy address of the APN.
|
|
*
|
|
* @return proxy address.
|
|
*/
|
|
public InetAddress getProxyAddress() {
|
|
return mProxyAddress;
|
|
}
|
|
|
|
/**
|
|
* Returns the proxy port of the APN.
|
|
*
|
|
* @return proxy port
|
|
*/
|
|
public int getProxyPort() {
|
|
return mProxyPort;
|
|
}
|
|
/**
|
|
* Returns the MMSC Uri of the APN.
|
|
*
|
|
* @return MMSC Uri.
|
|
*/
|
|
public Uri getMmsc() {
|
|
return mMmsc;
|
|
}
|
|
|
|
/**
|
|
* Returns the MMS proxy address of the APN.
|
|
*
|
|
* @return MMS proxy address.
|
|
*/
|
|
public InetAddress getMmsProxyAddress() {
|
|
return mMmsProxyAddress;
|
|
}
|
|
|
|
/**
|
|
* Returns the MMS proxy port of the APN.
|
|
*
|
|
* @return MMS proxy port
|
|
*/
|
|
public int getMmsProxyPort() {
|
|
return mMmsProxyPort;
|
|
}
|
|
|
|
/**
|
|
* Returns the APN username of the APN.
|
|
*
|
|
* @return APN username
|
|
*/
|
|
public String getUser() {
|
|
return mUser;
|
|
}
|
|
|
|
/**
|
|
* Returns the APN password of the APN.
|
|
*
|
|
* @return APN password
|
|
*/
|
|
public String getPassword() {
|
|
return mPassword;
|
|
}
|
|
|
|
/**
|
|
* Returns the authentication type of the APN.
|
|
*
|
|
* @return authentication type
|
|
*/
|
|
@AuthType
|
|
public int getAuthType() {
|
|
return mAuthType;
|
|
}
|
|
|
|
/**
|
|
* Returns the bitmask of APN types.
|
|
*
|
|
* <p>Apn types are usage categories for an APN entry. One APN entry may support multiple
|
|
* APN types, eg, a single APN may service regular internet traffic ("default") as well as
|
|
* MMS-specific connections.
|
|
*
|
|
* <p>The bitmask of APN types is calculated from APN types defined in {@link ApnSetting}.
|
|
*
|
|
* @see Builder#setApnTypeBitmask(int)
|
|
* @return a bitmask describing the types of the APN
|
|
*/
|
|
public @ApnType int getApnTypeBitmask() {
|
|
return mApnTypeBitmask;
|
|
}
|
|
|
|
/**
|
|
* Returns the unique database id for this entry.
|
|
*
|
|
* @return the unique database id
|
|
*/
|
|
public int getId() {
|
|
return mId;
|
|
}
|
|
|
|
/**
|
|
* Returns the numeric operator ID for the APN. Numeric operator ID is defined as
|
|
* {@link android.provider.Telephony.Carriers#MCC} +
|
|
* {@link android.provider.Telephony.Carriers#MNC}.
|
|
*
|
|
* @return the numeric operator ID
|
|
*/
|
|
public String getOperatorNumeric() {
|
|
return mOperatorNumeric;
|
|
}
|
|
|
|
/**
|
|
* Returns the protocol to use to connect to this APN.
|
|
*
|
|
* <p>Protocol is one of the {@code PDP_type} values in TS 27.007 section 10.1.1.
|
|
*
|
|
* @see Builder#setProtocol(int)
|
|
* @return the protocol
|
|
*/
|
|
@ProtocolType
|
|
public int getProtocol() {
|
|
return mProtocol;
|
|
}
|
|
|
|
/**
|
|
* Returns the protocol to use to connect to this APN while the device is roaming.
|
|
*
|
|
* <p>Roaming protocol is one of the {@code PDP_type} values in TS 27.007 section 10.1.1.
|
|
*
|
|
* @see Builder#setRoamingProtocol(int)
|
|
* @return the roaming protocol
|
|
*/
|
|
@ProtocolType
|
|
public int getRoamingProtocol() {
|
|
return mRoamingProtocol;
|
|
}
|
|
|
|
/**
|
|
* Returns the current status of APN.
|
|
*
|
|
* {@code true} : enabled APN.
|
|
* {@code false} : disabled APN.
|
|
*
|
|
* @return the current status
|
|
*/
|
|
public boolean isEnabled() {
|
|
return mCarrierEnabled;
|
|
}
|
|
|
|
/**
|
|
* Returns a bitmask describing the Radio Technologies(Network Types) which this APN may use.
|
|
*
|
|
* NetworkType bitmask is calculated from NETWORK_TYPE defined in {@link TelephonyManager}.
|
|
*
|
|
* Examples of Network Types include {@link TelephonyManager#NETWORK_TYPE_UNKNOWN},
|
|
* {@link TelephonyManager#NETWORK_TYPE_GPRS}, {@link TelephonyManager#NETWORK_TYPE_EDGE}.
|
|
*
|
|
* @return a bitmask describing the Radio Technologies(Network Types)
|
|
*/
|
|
public int getNetworkTypeBitmask() {
|
|
return mNetworkTypeBitmask;
|
|
}
|
|
|
|
/**
|
|
* Returns the MVNO match type for this APN.
|
|
*
|
|
* @see Builder#setMvnoType(int)
|
|
* @return the MVNO match type
|
|
*/
|
|
@MvnoType
|
|
public int getMvnoType() {
|
|
return mMvnoType;
|
|
}
|
|
|
|
private ApnSetting(Builder builder) {
|
|
this.mEntryName = builder.mEntryName;
|
|
this.mApnName = builder.mApnName;
|
|
this.mProxyAddress = builder.mProxyAddress;
|
|
this.mProxyPort = builder.mProxyPort;
|
|
this.mMmsc = builder.mMmsc;
|
|
this.mMmsProxyAddress = builder.mMmsProxyAddress;
|
|
this.mMmsProxyPort = builder.mMmsProxyPort;
|
|
this.mUser = builder.mUser;
|
|
this.mPassword = builder.mPassword;
|
|
this.mAuthType = builder.mAuthType;
|
|
this.mApnTypeBitmask = builder.mApnTypeBitmask;
|
|
this.mId = builder.mId;
|
|
this.mOperatorNumeric = builder.mOperatorNumeric;
|
|
this.mProtocol = builder.mProtocol;
|
|
this.mRoamingProtocol = builder.mRoamingProtocol;
|
|
this.mMtu = builder.mMtu;
|
|
this.mCarrierEnabled = builder.mCarrierEnabled;
|
|
this.mNetworkTypeBitmask = builder.mNetworkTypeBitmask;
|
|
this.mProfileId = builder.mProfileId;
|
|
this.mModemCognitive = builder.mModemCognitive;
|
|
this.mMaxConns = builder.mMaxConns;
|
|
this.mWaitTime = builder.mWaitTime;
|
|
this.mMaxConnsTime = builder.mMaxConnsTime;
|
|
this.mMvnoType = builder.mMvnoType;
|
|
this.mMvnoMatchData = builder.mMvnoMatchData;
|
|
}
|
|
|
|
/** @hide */
|
|
public static ApnSetting makeApnSetting(int id, String operatorNumeric, String entryName,
|
|
String apnName, InetAddress proxy, int port, Uri mmsc, InetAddress mmsProxy,
|
|
int mmsPort, String user, String password, int authType, int mApnTypeBitmask,
|
|
int protocol, int roamingProtocol, boolean carrierEnabled,
|
|
int networkTypeBitmask, int profileId, boolean modemCognitive, int maxConns,
|
|
int waitTime, int maxConnsTime, int mtu, int mvnoType, String mvnoMatchData) {
|
|
return new Builder()
|
|
.setId(id)
|
|
.setOperatorNumeric(operatorNumeric)
|
|
.setEntryName(entryName)
|
|
.setApnName(apnName)
|
|
.setProxyAddress(proxy)
|
|
.setProxyPort(port)
|
|
.setMmsc(mmsc)
|
|
.setMmsProxyAddress(mmsProxy)
|
|
.setMmsProxyPort(mmsPort)
|
|
.setUser(user)
|
|
.setPassword(password)
|
|
.setAuthType(authType)
|
|
.setApnTypeBitmask(mApnTypeBitmask)
|
|
.setProtocol(protocol)
|
|
.setRoamingProtocol(roamingProtocol)
|
|
.setCarrierEnabled(carrierEnabled)
|
|
.setNetworkTypeBitmask(networkTypeBitmask)
|
|
.setProfileId(profileId)
|
|
.setModemCognitive(modemCognitive)
|
|
.setMaxConns(maxConns)
|
|
.setWaitTime(waitTime)
|
|
.setMaxConnsTime(maxConnsTime)
|
|
.setMtu(mtu)
|
|
.setMvnoType(mvnoType)
|
|
.setMvnoMatchData(mvnoMatchData)
|
|
.build();
|
|
}
|
|
|
|
/** @hide */
|
|
public static ApnSetting makeApnSetting(Cursor cursor) {
|
|
final int apnTypesBitmask = parseTypes(
|
|
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.TYPE)));
|
|
int networkTypeBitmask = cursor.getInt(
|
|
cursor.getColumnIndexOrThrow(Telephony.Carriers.NETWORK_TYPE_BITMASK));
|
|
if (networkTypeBitmask == 0) {
|
|
final int bearerBitmask = cursor.getInt(cursor.getColumnIndexOrThrow(
|
|
Telephony.Carriers.BEARER_BITMASK));
|
|
networkTypeBitmask =
|
|
ServiceState.convertBearerBitmaskToNetworkTypeBitmask(bearerBitmask);
|
|
}
|
|
|
|
return makeApnSetting(
|
|
cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers._ID)),
|
|
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.NUMERIC)),
|
|
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.NAME)),
|
|
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.APN)),
|
|
inetAddressFromString(cursor.getString(
|
|
cursor.getColumnIndexOrThrow(Telephony.Carriers.PROXY))),
|
|
portFromString(cursor.getString(
|
|
cursor.getColumnIndexOrThrow(Telephony.Carriers.PORT))),
|
|
UriFromString(cursor.getString(
|
|
cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSC))),
|
|
inetAddressFromString(cursor.getString(
|
|
cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSPROXY))),
|
|
portFromString(cursor.getString(
|
|
cursor.getColumnIndexOrThrow(Telephony.Carriers.MMSPORT))),
|
|
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.USER)),
|
|
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PASSWORD)),
|
|
cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.AUTH_TYPE)),
|
|
apnTypesBitmask,
|
|
nullToNotInMapInt(PROTOCOL_STRING_MAP.get(
|
|
cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Carriers.PROTOCOL)))),
|
|
nullToNotInMapInt(PROTOCOL_STRING_MAP.get(
|
|
cursor.getString(cursor.getColumnIndexOrThrow(
|
|
Telephony.Carriers.ROAMING_PROTOCOL)))),
|
|
cursor.getInt(cursor.getColumnIndexOrThrow(
|
|
Telephony.Carriers.CARRIER_ENABLED)) == 1,
|
|
networkTypeBitmask,
|
|
cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.PROFILE_ID)),
|
|
cursor.getInt(cursor.getColumnIndexOrThrow(
|
|
Telephony.Carriers.MODEM_COGNITIVE)) == 1,
|
|
cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.MAX_CONNS)),
|
|
cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.WAIT_TIME)),
|
|
cursor.getInt(cursor.getColumnIndexOrThrow(
|
|
Telephony.Carriers.MAX_CONNS_TIME)),
|
|
cursor.getInt(cursor.getColumnIndexOrThrow(Telephony.Carriers.MTU)),
|
|
nullToNotInMapInt(MVNO_TYPE_STRING_MAP.get(
|
|
cursor.getString(cursor.getColumnIndexOrThrow(
|
|
Telephony.Carriers.MVNO_TYPE)))),
|
|
cursor.getString(cursor.getColumnIndexOrThrow(
|
|
Telephony.Carriers.MVNO_MATCH_DATA)));
|
|
}
|
|
|
|
/** @hide */
|
|
public static ApnSetting makeApnSetting(ApnSetting apn) {
|
|
return makeApnSetting(apn.mId, apn.mOperatorNumeric, apn.mEntryName, apn.mApnName,
|
|
apn.mProxyAddress, apn.mProxyPort, apn.mMmsc, apn.mMmsProxyAddress, apn.mMmsProxyPort, apn.mUser,
|
|
apn.mPassword, apn.mAuthType, apn.mApnTypeBitmask, apn.mProtocol, apn.mRoamingProtocol,
|
|
apn.mCarrierEnabled, apn.mNetworkTypeBitmask, apn.mProfileId,
|
|
apn.mModemCognitive, apn.mMaxConns, apn.mWaitTime, apn.mMaxConnsTime, apn.mMtu,
|
|
apn.mMvnoType, apn.mMvnoMatchData);
|
|
}
|
|
|
|
/** @hide */
|
|
public String toString() {
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.append("[ApnSettingV4] ")
|
|
.append(mEntryName)
|
|
.append(", ").append(mId)
|
|
.append(", ").append(mOperatorNumeric)
|
|
.append(", ").append(mApnName)
|
|
.append(", ").append(inetAddressToString(mProxyAddress))
|
|
.append(", ").append(UriToString(mMmsc))
|
|
.append(", ").append(inetAddressToString(mMmsProxyAddress))
|
|
.append(", ").append(portToString(mMmsProxyPort))
|
|
.append(", ").append(portToString(mProxyPort))
|
|
.append(", ").append(mAuthType).append(", ");
|
|
final String[] types = deParseTypes(mApnTypeBitmask).split(",");
|
|
sb.append(TextUtils.join(" | ", types)).append(", ");
|
|
sb.append(", ").append(mProtocol);
|
|
sb.append(", ").append(mRoamingProtocol);
|
|
sb.append(", ").append(mCarrierEnabled);
|
|
sb.append(", ").append(mProfileId);
|
|
sb.append(", ").append(mModemCognitive);
|
|
sb.append(", ").append(mMaxConns);
|
|
sb.append(", ").append(mWaitTime);
|
|
sb.append(", ").append(mMaxConnsTime);
|
|
sb.append(", ").append(mMtu);
|
|
sb.append(", ").append(mMvnoType);
|
|
sb.append(", ").append(mMvnoMatchData);
|
|
sb.append(", ").append(mPermanentFailed);
|
|
sb.append(", ").append(mNetworkTypeBitmask);
|
|
return sb.toString();
|
|
}
|
|
|
|
/**
|
|
* Returns true if there are MVNO params specified.
|
|
* @hide
|
|
*/
|
|
public boolean hasMvnoParams() {
|
|
return (mMvnoType != NOT_IN_MAP_INT) && !TextUtils.isEmpty(mMvnoMatchData);
|
|
}
|
|
|
|
/** @hide */
|
|
public boolean canHandleType(@ApnType int type) {
|
|
return mCarrierEnabled && ((mApnTypeBitmask & type) == type);
|
|
}
|
|
|
|
// check whether the types of two APN same (even only one type of each APN is same)
|
|
private boolean typeSameAny(ApnSetting first, ApnSetting second) {
|
|
if (VDBG) {
|
|
StringBuilder apnType1 = new StringBuilder(first.mApnName + ": ");
|
|
apnType1.append(deParseTypes(first.mApnTypeBitmask));
|
|
|
|
StringBuilder apnType2 = new StringBuilder(second.mApnName + ": ");
|
|
apnType2.append(deParseTypes(second.mApnTypeBitmask));
|
|
|
|
Rlog.d(LOG_TAG, "APN1: is " + apnType1);
|
|
Rlog.d(LOG_TAG, "APN2: is " + apnType2);
|
|
}
|
|
|
|
if ((first.mApnTypeBitmask & second.mApnTypeBitmask) != 0) {
|
|
if (VDBG) {
|
|
Rlog.d(LOG_TAG, "typeSameAny: return true");
|
|
}
|
|
return true;
|
|
}
|
|
|
|
if (VDBG) {
|
|
Rlog.d(LOG_TAG, "typeSameAny: return false");
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// TODO - if we have this function we should also have hashCode.
|
|
// Also should handle changes in type order and perhaps case-insensitivity
|
|
/** @hide */
|
|
public boolean equals(Object o) {
|
|
if (o instanceof ApnSetting == false) {
|
|
return false;
|
|
}
|
|
|
|
ApnSetting other = (ApnSetting) o;
|
|
|
|
return mEntryName.equals(other.mEntryName)
|
|
&& Objects.equals(mId, other.mId)
|
|
&& Objects.equals(mOperatorNumeric, other.mOperatorNumeric)
|
|
&& Objects.equals(mApnName, other.mApnName)
|
|
&& Objects.equals(mProxyAddress, other.mProxyAddress)
|
|
&& Objects.equals(mMmsc, other.mMmsc)
|
|
&& Objects.equals(mMmsProxyAddress, other.mMmsProxyAddress)
|
|
&& Objects.equals(mMmsProxyPort, other.mMmsProxyPort)
|
|
&& Objects.equals(mProxyPort,other.mProxyPort)
|
|
&& Objects.equals(mUser, other.mUser)
|
|
&& Objects.equals(mPassword, other.mPassword)
|
|
&& Objects.equals(mAuthType, other.mAuthType)
|
|
&& Objects.equals(mApnTypeBitmask, other.mApnTypeBitmask)
|
|
&& Objects.equals(mProtocol, other.mProtocol)
|
|
&& Objects.equals(mRoamingProtocol, other.mRoamingProtocol)
|
|
&& Objects.equals(mCarrierEnabled, other.mCarrierEnabled)
|
|
&& Objects.equals(mProfileId, other.mProfileId)
|
|
&& Objects.equals(mModemCognitive, other.mModemCognitive)
|
|
&& Objects.equals(mMaxConns, other.mMaxConns)
|
|
&& Objects.equals(mWaitTime, other.mWaitTime)
|
|
&& Objects.equals(mMaxConnsTime, other.mMaxConnsTime)
|
|
&& Objects.equals(mMtu, other.mMtu)
|
|
&& Objects.equals(mMvnoType, other.mMvnoType)
|
|
&& Objects.equals(mMvnoMatchData, other.mMvnoMatchData)
|
|
&& Objects.equals(mNetworkTypeBitmask, other.mNetworkTypeBitmask);
|
|
}
|
|
|
|
/**
|
|
* Compare two APN settings
|
|
*
|
|
* Note: This method does not compare 'mId', 'mNetworkTypeBitmask'. We only use this for
|
|
* determining if tearing a data call is needed when conditions change. See
|
|
* cleanUpConnectionsOnUpdatedApns in DcTracker.
|
|
*
|
|
* @param o the other object to compare
|
|
* @param isDataRoaming True if the device is on data roaming
|
|
* @return True if the two APN settings are same
|
|
* @hide
|
|
*/
|
|
public boolean equals(Object o, boolean isDataRoaming) {
|
|
if (!(o instanceof ApnSetting)) {
|
|
return false;
|
|
}
|
|
|
|
ApnSetting other = (ApnSetting) o;
|
|
|
|
return mEntryName.equals(other.mEntryName)
|
|
&& Objects.equals(mOperatorNumeric, other.mOperatorNumeric)
|
|
&& Objects.equals(mApnName, other.mApnName)
|
|
&& Objects.equals(mProxyAddress, other.mProxyAddress)
|
|
&& Objects.equals(mMmsc, other.mMmsc)
|
|
&& Objects.equals(mMmsProxyAddress, other.mMmsProxyAddress)
|
|
&& Objects.equals(mMmsProxyPort, other.mMmsProxyPort)
|
|
&& Objects.equals(mProxyPort, other.mProxyPort)
|
|
&& Objects.equals(mUser, other.mUser)
|
|
&& Objects.equals(mPassword, other.mPassword)
|
|
&& Objects.equals(mAuthType, other.mAuthType)
|
|
&& Objects.equals(mApnTypeBitmask, other.mApnTypeBitmask)
|
|
&& (isDataRoaming || Objects.equals(mProtocol,other.mProtocol))
|
|
&& (!isDataRoaming || Objects.equals(mRoamingProtocol, other.mRoamingProtocol))
|
|
&& Objects.equals(mCarrierEnabled, other.mCarrierEnabled)
|
|
&& Objects.equals(mProfileId, other.mProfileId)
|
|
&& Objects.equals(mModemCognitive, other.mModemCognitive)
|
|
&& Objects.equals(mMaxConns, other.mMaxConns)
|
|
&& Objects.equals(mWaitTime, other.mWaitTime)
|
|
&& Objects.equals(mMaxConnsTime, other.mMaxConnsTime)
|
|
&& Objects.equals(mMtu, other.mMtu)
|
|
&& Objects.equals(mMvnoType, other.mMvnoType)
|
|
&& Objects.equals(mMvnoMatchData, other.mMvnoMatchData);
|
|
}
|
|
|
|
/**
|
|
* Check if neither mention DUN and are substantially similar
|
|
*
|
|
* @param other The other APN settings to compare
|
|
* @return True if two APN settings are similar
|
|
* @hide
|
|
*/
|
|
public boolean similar(ApnSetting other) {
|
|
return (!this.canHandleType(TYPE_DUN)
|
|
&& !other.canHandleType(TYPE_DUN)
|
|
&& Objects.equals(this.mApnName, other.mApnName)
|
|
&& !typeSameAny(this, other)
|
|
&& xorEquals(this.mProxyAddress, other.mProxyAddress)
|
|
&& xorEqualsPort(this.mProxyPort, other.mProxyPort)
|
|
&& xorEquals(this.mProtocol, other.mProtocol)
|
|
&& xorEquals(this.mRoamingProtocol, other.mRoamingProtocol)
|
|
&& Objects.equals(this.mCarrierEnabled, other.mCarrierEnabled)
|
|
&& Objects.equals(this.mProfileId, other.mProfileId)
|
|
&& Objects.equals(this.mMvnoType, other.mMvnoType)
|
|
&& Objects.equals(this.mMvnoMatchData, other.mMvnoMatchData)
|
|
&& xorEquals(this.mMmsc, other.mMmsc)
|
|
&& xorEquals(this.mMmsProxyAddress, other.mMmsProxyAddress)
|
|
&& xorEqualsPort(this.mMmsProxyPort, other.mMmsProxyPort))
|
|
&& Objects.equals(this.mNetworkTypeBitmask, other.mNetworkTypeBitmask);
|
|
}
|
|
|
|
// Equal or one is not specified.
|
|
private boolean xorEquals(String first, String second) {
|
|
return (Objects.equals(first, second)
|
|
|| TextUtils.isEmpty(first)
|
|
|| TextUtils.isEmpty(second));
|
|
}
|
|
|
|
// Equal or one is not null.
|
|
private boolean xorEquals(Object first, Object second) {
|
|
return first == null || second == null || first.equals(second);
|
|
}
|
|
|
|
// Equal or one is not specified.
|
|
private boolean xorEqualsPort(int first, int second) {
|
|
return first == NO_PORT_SPECIFIED || second == NO_PORT_SPECIFIED
|
|
|| Objects.equals(first, second);
|
|
}
|
|
|
|
private String deParseTypes(int apnTypeBitmask) {
|
|
List<String> types = new ArrayList<>();
|
|
for (Integer type : APN_TYPE_INT_MAP.keySet()) {
|
|
if ((apnTypeBitmask & type) == type) {
|
|
types.add(APN_TYPE_INT_MAP.get(type));
|
|
}
|
|
}
|
|
return TextUtils.join(",", types);
|
|
}
|
|
|
|
private String nullToEmpty(String stringValue) {
|
|
return stringValue == null ? "" : stringValue;
|
|
}
|
|
|
|
/** @hide */
|
|
// Called by DPM.
|
|
public ContentValues toContentValues() {
|
|
ContentValues apnValue = new ContentValues();
|
|
apnValue.put(Telephony.Carriers.NUMERIC, nullToEmpty(mOperatorNumeric));
|
|
apnValue.put(Telephony.Carriers.NAME, nullToEmpty(mEntryName));
|
|
apnValue.put(Telephony.Carriers.APN, nullToEmpty(mApnName));
|
|
apnValue.put(Telephony.Carriers.PROXY, mProxyAddress == null ? ""
|
|
: inetAddressToString(mProxyAddress));
|
|
apnValue.put(Telephony.Carriers.PORT, portToString(mProxyPort));
|
|
apnValue.put(Telephony.Carriers.MMSC, mMmsc == null ? "" : UriToString(mMmsc));
|
|
apnValue.put(Telephony.Carriers.MMSPORT, portToString(mMmsProxyPort));
|
|
apnValue.put(Telephony.Carriers.MMSPROXY, mMmsProxyAddress == null
|
|
? "" : inetAddressToString(mMmsProxyAddress));
|
|
apnValue.put(Telephony.Carriers.USER, nullToEmpty(mUser));
|
|
apnValue.put(Telephony.Carriers.PASSWORD, nullToEmpty(mPassword));
|
|
apnValue.put(Telephony.Carriers.AUTH_TYPE, mAuthType);
|
|
String apnType = deParseTypes(mApnTypeBitmask);
|
|
apnValue.put(Telephony.Carriers.TYPE, nullToEmpty(apnType));
|
|
apnValue.put(Telephony.Carriers.PROTOCOL,
|
|
nullToEmpty(PROTOCOL_INT_MAP.get(mProtocol)));
|
|
apnValue.put(Telephony.Carriers.ROAMING_PROTOCOL,
|
|
nullToEmpty(PROTOCOL_INT_MAP.get(mRoamingProtocol)));
|
|
apnValue.put(Telephony.Carriers.CARRIER_ENABLED, mCarrierEnabled);
|
|
apnValue.put(Telephony.Carriers.MVNO_TYPE,
|
|
nullToEmpty(MVNO_TYPE_INT_MAP.get(mMvnoType)));
|
|
apnValue.put(Telephony.Carriers.NETWORK_TYPE_BITMASK, mNetworkTypeBitmask);
|
|
|
|
return apnValue;
|
|
}
|
|
|
|
/**
|
|
* @param types comma delimited list of APN types
|
|
* @return bitmask of APN types
|
|
* @hide
|
|
*/
|
|
public static int parseTypes(String types) {
|
|
// If unset, set to ALL.
|
|
if (TextUtils.isEmpty(types)) {
|
|
return TYPE_ALL_BUT_IA;
|
|
} else {
|
|
int result = 0;
|
|
for (String str : types.split(",")) {
|
|
Integer type = APN_TYPE_STRING_MAP.get(str);
|
|
if (type != null) {
|
|
result |= type;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
|
|
private static Uri UriFromString(String uri) {
|
|
return TextUtils.isEmpty(uri) ? null : Uri.parse(uri);
|
|
}
|
|
|
|
private static String UriToString(Uri uri) {
|
|
return uri == null ? "" : uri.toString();
|
|
}
|
|
|
|
private static InetAddress inetAddressFromString(String inetAddress) {
|
|
if (TextUtils.isEmpty(inetAddress)) {
|
|
return null;
|
|
}
|
|
try {
|
|
return InetAddress.getByName(inetAddress);
|
|
} catch (UnknownHostException e) {
|
|
Log.e(LOG_TAG, "Can't parse InetAddress from string: unknown host.");
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private static String inetAddressToString(InetAddress inetAddress) {
|
|
if (inetAddress == null) {
|
|
return null;
|
|
}
|
|
final String inetAddressString = inetAddress.toString();
|
|
if (TextUtils.isEmpty(inetAddressString)) {
|
|
return null;
|
|
}
|
|
final String hostName = inetAddressString.substring(0, inetAddressString.indexOf("/"));
|
|
final String address = inetAddressString.substring(inetAddressString.indexOf("/") + 1);
|
|
if (TextUtils.isEmpty(hostName) && TextUtils.isEmpty(address)) {
|
|
return null;
|
|
}
|
|
return TextUtils.isEmpty(hostName) ? address : hostName;
|
|
}
|
|
|
|
private static int portFromString(String strPort) {
|
|
int port = NO_PORT_SPECIFIED;
|
|
if (!TextUtils.isEmpty(strPort)) {
|
|
try {
|
|
port = Integer.parseInt(strPort);
|
|
} catch (NumberFormatException e) {
|
|
Log.e(LOG_TAG, "Can't parse port from String");
|
|
}
|
|
}
|
|
return port;
|
|
}
|
|
|
|
private static String portToString(int port) {
|
|
return port == NO_PORT_SPECIFIED ? "" : Integer.toString(port);
|
|
}
|
|
|
|
// Implement Parcelable.
|
|
@Override
|
|
/** @hide */
|
|
public int describeContents() {
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
/** @hide */
|
|
public void writeToParcel(@NonNull Parcel dest, int flags) {
|
|
dest.writeInt(mId);
|
|
dest.writeString(mOperatorNumeric);
|
|
dest.writeString(mEntryName);
|
|
dest.writeString(mApnName);
|
|
dest.writeValue(mProxyAddress);
|
|
dest.writeInt(mProxyPort);
|
|
dest.writeValue(mMmsc);
|
|
dest.writeValue(mMmsProxyAddress);
|
|
dest.writeInt(mMmsProxyPort);
|
|
dest.writeString(mUser);
|
|
dest.writeString(mPassword);
|
|
dest.writeInt(mAuthType);
|
|
dest.writeInt(mApnTypeBitmask);
|
|
dest.writeInt(mProtocol);
|
|
dest.writeInt(mRoamingProtocol);
|
|
dest.writeInt(mCarrierEnabled ? 1: 0);
|
|
dest.writeInt(mMvnoType);
|
|
dest.writeInt(mNetworkTypeBitmask);
|
|
}
|
|
|
|
private static ApnSetting readFromParcel(Parcel in) {
|
|
final int id = in.readInt();
|
|
final String operatorNumeric = in.readString();
|
|
final String entryName = in.readString();
|
|
final String apnName = in.readString();
|
|
final InetAddress proxy = (InetAddress)in.readValue(InetAddress.class.getClassLoader());
|
|
final int port = in.readInt();
|
|
final Uri mmsc = (Uri)in.readValue(Uri.class.getClassLoader());
|
|
final InetAddress mmsProxy = (InetAddress)in.readValue(InetAddress.class.getClassLoader());
|
|
final int mmsPort = in.readInt();
|
|
final String user = in.readString();
|
|
final String password = in.readString();
|
|
final int authType = in.readInt();
|
|
final int apnTypesBitmask = in.readInt();
|
|
final int protocol = in.readInt();
|
|
final int roamingProtocol = in.readInt();
|
|
final boolean carrierEnabled = in.readInt() > 0;
|
|
final int mvnoType = in.readInt();
|
|
final int networkTypeBitmask = in.readInt();
|
|
|
|
return makeApnSetting(id, operatorNumeric, entryName, apnName,
|
|
proxy, port, mmsc, mmsProxy, mmsPort, user, password, authType, apnTypesBitmask,
|
|
protocol, roamingProtocol, carrierEnabled, networkTypeBitmask, 0, false,
|
|
0, 0, 0, 0, mvnoType, null);
|
|
}
|
|
|
|
public static final Parcelable.Creator<ApnSetting> CREATOR =
|
|
new Parcelable.Creator<ApnSetting>() {
|
|
@Override
|
|
public ApnSetting createFromParcel(Parcel in) {
|
|
return readFromParcel(in);
|
|
}
|
|
|
|
@Override
|
|
public ApnSetting[] newArray(int size) {
|
|
return new ApnSetting[size];
|
|
}
|
|
};
|
|
|
|
private static int nullToNotInMapInt(Integer value) {
|
|
return value == null ? NOT_IN_MAP_INT : value;
|
|
}
|
|
|
|
public static class Builder{
|
|
private String mEntryName;
|
|
private String mApnName;
|
|
private InetAddress mProxyAddress;
|
|
private int mProxyPort = NO_PORT_SPECIFIED;
|
|
private Uri mMmsc;
|
|
private InetAddress mMmsProxyAddress;
|
|
private int mMmsProxyPort = NO_PORT_SPECIFIED;
|
|
private String mUser;
|
|
private String mPassword;
|
|
private int mAuthType;
|
|
private int mApnTypeBitmask;
|
|
private int mId;
|
|
private String mOperatorNumeric;
|
|
private int mProtocol = NOT_IN_MAP_INT;
|
|
private int mRoamingProtocol = NOT_IN_MAP_INT;
|
|
private int mMtu;
|
|
private int mNetworkTypeBitmask;
|
|
private boolean mCarrierEnabled;
|
|
private int mProfileId;
|
|
private boolean mModemCognitive;
|
|
private int mMaxConns;
|
|
private int mWaitTime;
|
|
private int mMaxConnsTime;
|
|
private int mMvnoType = NOT_IN_MAP_INT;
|
|
private String mMvnoMatchData;
|
|
|
|
/**
|
|
* Default constructor for Builder.
|
|
*/
|
|
public Builder() {}
|
|
|
|
/**
|
|
* Sets the unique database id for this entry.
|
|
*
|
|
* @param id the unique database id to set for this entry
|
|
*/
|
|
private Builder setId(int id) {
|
|
this.mId = id;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Set the MTU size of the mobile interface to which the APN connected.
|
|
*
|
|
* @param mtu the MTU size to set for the APN
|
|
* @hide
|
|
*/
|
|
public Builder setMtu(int mtu) {
|
|
this.mMtu = mtu;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the profile id to which the APN saved in modem.
|
|
*
|
|
* @param profileId the profile id to set for the APN
|
|
* @hide
|
|
*/
|
|
public Builder setProfileId(int profileId) {
|
|
this.mProfileId = profileId;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets if the APN setting is to be set in modem.
|
|
*
|
|
* @param modemCognitive if the APN setting is to be set in modem
|
|
* @hide
|
|
*/
|
|
public Builder setModemCognitive(boolean modemCognitive) {
|
|
this.mModemCognitive = modemCognitive;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the max connections of this APN.
|
|
*
|
|
* @param maxConns the max connections of this APN
|
|
* @hide
|
|
*/
|
|
public Builder setMaxConns(int maxConns) {
|
|
this.mMaxConns = maxConns;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the wait time for retry of the APN.
|
|
*
|
|
* @param waitTime the wait time for retry of the APN
|
|
* @hide
|
|
*/
|
|
public Builder setWaitTime(int waitTime) {
|
|
this.mWaitTime = waitTime;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the time to limit max connection for the APN.
|
|
*
|
|
* @param maxConnsTime the time to limit max connection for the APN
|
|
* @hide
|
|
*/
|
|
public Builder setMaxConnsTime(int maxConnsTime) {
|
|
this.mMaxConnsTime = maxConnsTime;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the MVNO match data for the APN.
|
|
*
|
|
* @param mvnoMatchData the MVNO match data for the APN
|
|
* @hide
|
|
*/
|
|
public Builder setMvnoMatchData(String mvnoMatchData) {
|
|
this.mMvnoMatchData = mvnoMatchData;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the entry name of the APN.
|
|
*
|
|
* @param entryName the entry name to set for the APN
|
|
*/
|
|
public Builder setEntryName(String entryName) {
|
|
this.mEntryName = entryName;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the name of the APN.
|
|
*
|
|
* @param apnName the name to set for the APN
|
|
*/
|
|
public Builder setApnName(String apnName) {
|
|
this.mApnName = apnName;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the proxy address of the APN.
|
|
*
|
|
* @param proxy the proxy address to set for the APN
|
|
*/
|
|
public Builder setProxyAddress(InetAddress proxy) {
|
|
this.mProxyAddress = proxy;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the proxy port of the APN.
|
|
*
|
|
* @param port the proxy port to set for the APN
|
|
*/
|
|
public Builder setProxyPort(int port) {
|
|
this.mProxyPort = port;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the MMSC Uri of the APN.
|
|
*
|
|
* @param mmsc the MMSC Uri to set for the APN
|
|
*/
|
|
public Builder setMmsc(Uri mmsc) {
|
|
this.mMmsc = mmsc;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the MMS proxy address of the APN.
|
|
*
|
|
* @param mmsProxy the MMS proxy address to set for the APN
|
|
*/
|
|
public Builder setMmsProxyAddress(InetAddress mmsProxy) {
|
|
this.mMmsProxyAddress = mmsProxy;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the MMS proxy port of the APN.
|
|
*
|
|
* @param mmsPort the MMS proxy port to set for the APN
|
|
*/
|
|
public Builder setMmsProxyPort(int mmsPort) {
|
|
this.mMmsProxyPort = mmsPort;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the APN username of the APN.
|
|
*
|
|
* @param user the APN username to set for the APN
|
|
*/
|
|
public Builder setUser(String user) {
|
|
this.mUser = user;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the APN password of the APN.
|
|
*
|
|
* @see android.provider.Telephony.Carriers#PASSWORD
|
|
* @param password the APN password to set for the APN
|
|
*/
|
|
public Builder setPassword(String password) {
|
|
this.mPassword = password;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the authentication type of the APN.
|
|
*
|
|
* @param authType the authentication type to set for the APN
|
|
*/
|
|
public Builder setAuthType(@AuthType int authType) {
|
|
this.mAuthType = authType;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the bitmask of APN types.
|
|
*
|
|
* <p>Apn types are usage categories for an APN entry. One APN entry may support multiple
|
|
* APN types, eg, a single APN may service regular internet traffic ("default") as well as
|
|
* MMS-specific connections.
|
|
*
|
|
* <p>The bitmask of APN types is calculated from APN types defined in {@link ApnSetting}.
|
|
*
|
|
* @param apnTypeBitmask a bitmask describing the types of the APN
|
|
*/
|
|
public Builder setApnTypeBitmask(@ApnType int apnTypeBitmask) {
|
|
this.mApnTypeBitmask = apnTypeBitmask;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the numeric operator ID for the APN. Numeric operator ID is defined as
|
|
* {@link android.provider.Telephony.Carriers#MCC} +
|
|
* {@link android.provider.Telephony.Carriers#MNC}.
|
|
*
|
|
* @param operatorNumeric the numeric operator ID to set for this entry
|
|
*/
|
|
public Builder setOperatorNumeric(String operatorNumeric) {
|
|
this.mOperatorNumeric = operatorNumeric;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the protocol to use to connect to this APN.
|
|
*
|
|
* <p>Protocol is one of the {@code PDP_type} values in TS 27.007 section 10.1.1.
|
|
*
|
|
* @param protocol the protocol to set to use to connect to this APN
|
|
*/
|
|
public Builder setProtocol(@ProtocolType int protocol) {
|
|
this.mProtocol = protocol;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the protocol to use to connect to this APN when the device is roaming.
|
|
*
|
|
* <p>Roaming protocol is one of the {@code PDP_type} values in TS 27.007 section 10.1.1.
|
|
*
|
|
* @param roamingProtocol the protocol to set to use to connect to this APN when roaming
|
|
*/
|
|
public Builder setRoamingProtocol(@ProtocolType int roamingProtocol) {
|
|
this.mRoamingProtocol = roamingProtocol;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the current status for this APN.
|
|
*
|
|
* @param carrierEnabled the current status to set for this APN
|
|
*/
|
|
public Builder setCarrierEnabled(boolean carrierEnabled) {
|
|
this.mCarrierEnabled = carrierEnabled;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets Radio Technology (Network Type) info for this APN.
|
|
*
|
|
* @param networkTypeBitmask the Radio Technology (Network Type) info
|
|
*/
|
|
public Builder setNetworkTypeBitmask(int networkTypeBitmask) {
|
|
this.mNetworkTypeBitmask = networkTypeBitmask;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the MVNO match type for this APN.
|
|
*
|
|
* @param mvnoType the MVNO match type to set for this APN
|
|
*/
|
|
public Builder setMvnoType(@MvnoType int mvnoType) {
|
|
this.mMvnoType = mvnoType;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Builds {@link ApnSetting} from this builder.
|
|
*
|
|
* @return {@code null} if {@link #setApnName(String)} or {@link #setEntryName(String)}
|
|
* is empty, or {@link #setApnTypeBitmask(int)} doesn't contain a valid bit,
|
|
* {@link ApnSetting} built from this builder otherwise.
|
|
*/
|
|
public ApnSetting build() {
|
|
if ((mApnTypeBitmask & ApnTypes.ALL) == 0 || TextUtils.isEmpty(mApnName)
|
|
|| TextUtils.isEmpty(mEntryName)) {
|
|
return null;
|
|
}
|
|
return new ApnSetting(this);
|
|
}
|
|
}
|
|
}
|
|
|