Modify PhoneCapabilities for device capabilities
Updated PhoneCapability from 1.3 RadioConfig HAL New SimSlotCapability Add getPhoneCapability API Test: atest FrameworksTelephonyTests Bug: 143238237 Bug: 143238191 Change-Id: I3349c3e50a806fb7bfd65b1bf16079878a5aeb06 Merged-In: I3349c3e50a806fb7bfd65b1bf16079878a5aeb06
This commit is contained in:
@@ -45314,8 +45314,32 @@ package android.telephony {
|
||||
|
||||
public final class PhoneCapability implements android.os.Parcelable {
|
||||
method public int describeContents();
|
||||
method @NonNull public java.util.List<java.lang.Integer> getBands(int);
|
||||
method @NonNull public java.util.List<java.util.List<java.lang.Long>> getConcurrentFeaturesSupport();
|
||||
method @NonNull public java.util.List<java.lang.String> getLogicalModemUuids();
|
||||
method public int getMaxActiveDedicatedBearers();
|
||||
method public int getMaxActiveInternetData();
|
||||
method public int getMaxActivePsVoice();
|
||||
method public long getPsDataConnectionLingerTimeMillis();
|
||||
method @NonNull public java.util.List<android.telephony.SimSlotCapability> getSimSlotCapabilities();
|
||||
method public long getSupportedRats();
|
||||
method public int getUeCategory(boolean, int);
|
||||
method public void writeToParcel(@NonNull android.os.Parcel, int);
|
||||
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.PhoneCapability> CREATOR;
|
||||
field public static final long MODEM_FEATURE_3GPP2_REG = 1L; // 0x1L
|
||||
field public static final long MODEM_FEATURE_3GPP_REG = 2L; // 0x2L
|
||||
field public static final long MODEM_FEATURE_CDMA2000_EHRPD_REG = 4L; // 0x4L
|
||||
field public static final long MODEM_FEATURE_CSIM = 8192L; // 0x2000L
|
||||
field public static final long MODEM_FEATURE_CS_VOICE_SESSION = 512L; // 0x200L
|
||||
field public static final long MODEM_FEATURE_DEDICATED_BEARER = 2048L; // 0x800L
|
||||
field public static final long MODEM_FEATURE_EUTRAN_REG = 32L; // 0x20L
|
||||
field public static final long MODEM_FEATURE_EUTRA_NR_DUAL_CONNECTIVITY_REG = 128L; // 0x80L
|
||||
field public static final long MODEM_FEATURE_GERAN_REG = 8L; // 0x8L
|
||||
field public static final long MODEM_FEATURE_INTERACTIVE_DATA_SESSION = 1024L; // 0x400L
|
||||
field public static final long MODEM_FEATURE_NETWORK_SCAN = 4096L; // 0x1000L
|
||||
field public static final long MODEM_FEATURE_NGRAN_REG = 64L; // 0x40L
|
||||
field public static final long MODEM_FEATURE_PS_VOICE_REG = 256L; // 0x100L
|
||||
field public static final long MODEM_FEATURE_UTRAN_REG = 16L; // 0x10L
|
||||
}
|
||||
|
||||
public class PhoneNumberFormattingTextWatcher implements android.text.TextWatcher {
|
||||
@@ -45500,6 +45524,18 @@ package android.telephony {
|
||||
field public static final int INVALID = 2147483647; // 0x7fffffff
|
||||
}
|
||||
|
||||
public final class SimSlotCapability implements android.os.Parcelable {
|
||||
method public int describeContents();
|
||||
method public int getPhysicalSlotIndex();
|
||||
method public int getSlotType();
|
||||
method public void writeToParcel(@NonNull android.os.Parcel, int);
|
||||
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.SimSlotCapability> CREATOR;
|
||||
field public static final int SLOT_TYPE_EUICC = 3; // 0x3
|
||||
field public static final int SLOT_TYPE_IUICC = 2; // 0x2
|
||||
field public static final int SLOT_TYPE_SOFT_SIM = 4; // 0x4
|
||||
field public static final int SLOT_TYPE_UICC = 1; // 0x1
|
||||
}
|
||||
|
||||
public final class SmsManager {
|
||||
method public String createAppSpecificSmsToken(android.app.PendingIntent);
|
||||
method @Nullable public String createAppSpecificSmsTokenWithPackageInfo(@Nullable String, @NonNull android.app.PendingIntent);
|
||||
@@ -45846,6 +45882,7 @@ package android.telephony {
|
||||
method @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public int getNetworkSelectionMode();
|
||||
method public String getNetworkSpecifier();
|
||||
method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public int getNetworkType();
|
||||
method @Nullable @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public android.telephony.PhoneCapability getPhoneCapability();
|
||||
method @Deprecated public int getPhoneCount();
|
||||
method public int getPhoneType();
|
||||
method @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PHONE_STATE}) public int getPreferredOpportunisticDataSubscription();
|
||||
|
||||
@@ -67,6 +67,22 @@ public final class AccessNetworkConstants {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Access network type
|
||||
* @hide
|
||||
*/
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef(prefix = {"RADIO_ACCESS_NETWORK_TYPE_"},
|
||||
value = {
|
||||
AccessNetworkType.UNKNOWN,
|
||||
AccessNetworkType.GERAN,
|
||||
AccessNetworkType.UTRAN,
|
||||
AccessNetworkType.EUTRAN,
|
||||
AccessNetworkType.CDMA2000,
|
||||
AccessNetworkType.IWLAN,
|
||||
AccessNetworkType.NGRAN})
|
||||
public @interface RadioAccessNetworkType {}
|
||||
|
||||
public static final class AccessNetworkType {
|
||||
public static final int UNKNOWN = 0;
|
||||
public static final int GERAN = 1;
|
||||
|
||||
@@ -16,13 +16,20 @@
|
||||
|
||||
package android.telephony;
|
||||
|
||||
import android.annotation.LongDef;
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.SystemApi;
|
||||
import android.annotation.Nullable;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.telephony.AccessNetworkConstants.AccessNetworkType;
|
||||
import android.telephony.AccessNetworkConstants.RadioAccessNetworkType;
|
||||
import android.telephony.TelephonyManager.NetworkTypeBitMask;
|
||||
|
||||
import com.android.internal.util.CollectionUtils;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
@@ -31,68 +38,365 @@ import java.util.Objects;
|
||||
* are shared between those modems defined by list of modem IDs.
|
||||
*/
|
||||
public final class PhoneCapability implements Parcelable {
|
||||
// Hardcoded default DSDS capability.
|
||||
/** Modem feature indicating 3GPP2 capability. */
|
||||
public static final long MODEM_FEATURE_3GPP2_REG = 1 << 0;
|
||||
/** Modem feature indicating 3GPP capability. */
|
||||
public static final long MODEM_FEATURE_3GPP_REG = 1 << 1;
|
||||
/** Modem feature indicating CDMA 2000 with EHRPD capability. */
|
||||
public static final long MODEM_FEATURE_CDMA2000_EHRPD_REG = 1 << 2;
|
||||
/** Modem feature indicating GSM capability. */
|
||||
public static final long MODEM_FEATURE_GERAN_REG = 1 << 3;
|
||||
/** Modem feature indicating UMTS capability. */
|
||||
public static final long MODEM_FEATURE_UTRAN_REG = 1 << 4;
|
||||
/** Modem feature indicating LTE capability. */
|
||||
public static final long MODEM_FEATURE_EUTRAN_REG = 1 << 5;
|
||||
/** Modem feature indicating 5G capability.*/
|
||||
public static final long MODEM_FEATURE_NGRAN_REG = 1 << 6;
|
||||
/** Modem feature indicating EN-DC capability. */
|
||||
public static final long MODEM_FEATURE_EUTRA_NR_DUAL_CONNECTIVITY_REG = 1 << 7;
|
||||
/** Modem feature indicating VoLTE capability (IMS registered). */
|
||||
public static final long MODEM_FEATURE_PS_VOICE_REG = 1 << 8;
|
||||
/** Modem feature indicating CS voice call capability. */
|
||||
public static final long MODEM_FEATURE_CS_VOICE_SESSION = 1 << 9;
|
||||
/** Modem feature indicating Internet connection capability. */
|
||||
public static final long MODEM_FEATURE_INTERACTIVE_DATA_SESSION = 1 << 10;
|
||||
/**
|
||||
* Modem feature indicating dedicated bearer capability.
|
||||
* For services that require a high level QoS (eg. VoLTE), the network can create
|
||||
* a dedicated bearer with the required QoS on top of an established default bearer.
|
||||
* This will provide a dedicated tunnel for one or more specific traffic types.
|
||||
*/
|
||||
public static final long MODEM_FEATURE_DEDICATED_BEARER = 1 << 11;
|
||||
/** Modem feature indicating network scan capability. */
|
||||
public static final long MODEM_FEATURE_NETWORK_SCAN = 1 << 12;
|
||||
/** Modem feature indicating corresponding SIM has CDMA capability. */
|
||||
public static final long MODEM_FEATURE_CSIM = 1 << 13;
|
||||
|
||||
/** @hide */
|
||||
@LongDef(flag = true, prefix = {"MODEM_FEATURE_" }, value = {
|
||||
MODEM_FEATURE_3GPP2_REG,
|
||||
MODEM_FEATURE_3GPP_REG,
|
||||
MODEM_FEATURE_CDMA2000_EHRPD_REG,
|
||||
MODEM_FEATURE_GERAN_REG,
|
||||
MODEM_FEATURE_UTRAN_REG,
|
||||
MODEM_FEATURE_EUTRAN_REG,
|
||||
MODEM_FEATURE_NGRAN_REG,
|
||||
MODEM_FEATURE_EUTRA_NR_DUAL_CONNECTIVITY_REG,
|
||||
MODEM_FEATURE_PS_VOICE_REG,
|
||||
MODEM_FEATURE_CS_VOICE_SESSION,
|
||||
MODEM_FEATURE_INTERACTIVE_DATA_SESSION,
|
||||
MODEM_FEATURE_DEDICATED_BEARER,
|
||||
MODEM_FEATURE_NETWORK_SCAN,
|
||||
MODEM_FEATURE_CSIM,
|
||||
})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface ModemFeature {
|
||||
}
|
||||
|
||||
/**
|
||||
* Hardcoded default DSDS capability.
|
||||
* @hide
|
||||
*/
|
||||
public static final PhoneCapability DEFAULT_DSDS_CAPABILITY;
|
||||
// Hardcoded default Single SIM single standby capability.
|
||||
/** @hide */
|
||||
/**
|
||||
* Hardcoded default Single SIM single standby capability.
|
||||
* @hide
|
||||
*/
|
||||
public static final PhoneCapability DEFAULT_SSSS_CAPABILITY;
|
||||
|
||||
static {
|
||||
ModemInfo modemInfo1 = new ModemInfo(0, 0, true, true);
|
||||
ModemInfo modemInfo2 = new ModemInfo(1, 0, true, true);
|
||||
List<List<Long>> capabilities = new ArrayList<>();
|
||||
List<Long> modem1 = new ArrayList<>();
|
||||
List<Long> modem2 = new ArrayList<>();
|
||||
modem1.add(MODEM_FEATURE_GERAN_REG | MODEM_FEATURE_UTRAN_REG | MODEM_FEATURE_EUTRAN_REG
|
||||
| MODEM_FEATURE_PS_VOICE_REG | MODEM_FEATURE_CS_VOICE_SESSION
|
||||
| MODEM_FEATURE_INTERACTIVE_DATA_SESSION | MODEM_FEATURE_DEDICATED_BEARER);
|
||||
modem2.add(MODEM_FEATURE_GERAN_REG | MODEM_FEATURE_UTRAN_REG | MODEM_FEATURE_EUTRAN_REG
|
||||
| MODEM_FEATURE_PS_VOICE_REG | MODEM_FEATURE_INTERACTIVE_DATA_SESSION
|
||||
| MODEM_FEATURE_DEDICATED_BEARER);
|
||||
capabilities.add(modem1);
|
||||
capabilities.add(modem2);
|
||||
List<String> uuids = new ArrayList<>();
|
||||
uuids.add("com.xxxx.lm0");
|
||||
uuids.add("com.xxxx.lm1");
|
||||
long rats = TelephonyManager.NETWORK_TYPE_BITMASK_GSM
|
||||
| TelephonyManager.NETWORK_TYPE_BITMASK_GPRS
|
||||
| TelephonyManager.NETWORK_TYPE_BITMASK_EDGE
|
||||
| TelephonyManager.NETWORK_TYPE_BITMASK_UMTS
|
||||
| TelephonyManager.NETWORK_TYPE_BITMASK_LTE;
|
||||
DEFAULT_DSDS_CAPABILITY = new PhoneCapability(0, 0, 0, 0, 0, rats, null, null, null, null,
|
||||
uuids, null, capabilities);
|
||||
|
||||
List<ModemInfo> logicalModemList = new ArrayList<>();
|
||||
logicalModemList.add(modemInfo1);
|
||||
logicalModemList.add(modemInfo2);
|
||||
DEFAULT_DSDS_CAPABILITY = new PhoneCapability(1, 1, 0, logicalModemList, false);
|
||||
|
||||
logicalModemList = new ArrayList<>();
|
||||
logicalModemList.add(modemInfo1);
|
||||
DEFAULT_SSSS_CAPABILITY = new PhoneCapability(1, 1, 0, logicalModemList, false);
|
||||
capabilities = new ArrayList<>();
|
||||
capabilities.add(modem1);
|
||||
uuids = new ArrayList<>();
|
||||
uuids.add("com.xxxx.lm0");
|
||||
DEFAULT_SSSS_CAPABILITY = new PhoneCapability(0, 0, 0, 0, 0, rats, null, null, null, null,
|
||||
uuids, null, capabilities);
|
||||
}
|
||||
/** @hide */
|
||||
public final int maxActiveVoiceCalls;
|
||||
/** @hide */
|
||||
public final int maxActiveData;
|
||||
/** @hide */
|
||||
public final int max5G;
|
||||
/** @hide */
|
||||
public final boolean validationBeforeSwitchSupported;
|
||||
/** @hide */
|
||||
public final List<ModemInfo> logicalModemList;
|
||||
|
||||
/** @hide */
|
||||
public PhoneCapability(int maxActiveVoiceCalls, int maxActiveData, int max5G,
|
||||
List<ModemInfo> logicalModemList, boolean validationBeforeSwitchSupported) {
|
||||
this.maxActiveVoiceCalls = maxActiveVoiceCalls;
|
||||
this.maxActiveData = maxActiveData;
|
||||
this.max5G = max5G;
|
||||
// Make sure it's not null.
|
||||
this.logicalModemList = logicalModemList == null ? new ArrayList<>() : logicalModemList;
|
||||
this.validationBeforeSwitchSupported = validationBeforeSwitchSupported;
|
||||
private final int mUtranUeCategoryDl;
|
||||
private final int mUtranUeCategoryUl;
|
||||
private final int mEutranUeCategoryDl;
|
||||
private final int mEutranUeCategoryUl;
|
||||
private final long mPsDataConnectionLingerTimeMillis;
|
||||
private final @NetworkTypeBitMask long mSupportedRats;
|
||||
private final List<Integer> mGeranBands;
|
||||
private final List<Integer> mUtranBands;
|
||||
private final List<Integer> mEutranBands;
|
||||
private final List<Integer> mNgranBands;
|
||||
private final List<String> mLogicalModemUuids;
|
||||
private final List<SimSlotCapability> mSimSlotCapabilities;
|
||||
private final @ModemFeature List<List<Long>> mConcurrentFeaturesSupport;
|
||||
|
||||
/**
|
||||
* Default constructor to create a PhoneCapability object.
|
||||
* @param utranUeCategoryDl 3GPP UE category for UTRAN downlink.
|
||||
* @param utranUeCategoryUl 3GPP UE category for UTRAN uplink.
|
||||
* @param eutranUeCategoryDl 3GPP UE category for EUTRAN downlink.
|
||||
* @param eutranUeCategoryUl 3GPP UE category for EUTRAN uplink.
|
||||
* @param psDataConnectionLingerTimeMillis length of the grace period to allow a smooth
|
||||
* "handover" between data connections.
|
||||
* @param supportedRats all radio access technologies this phone is capable of supporting.
|
||||
* @param geranBands list of supported {@link AccessNetworkConstants.GeranBand}.
|
||||
* @param utranBands list of supported {@link AccessNetworkConstants.UtranBand}.
|
||||
* @param eutranBands list of supported {@link AccessNetworkConstants.EutranBand}.
|
||||
* @param ngranBands list of supported {@link AccessNetworkConstants.NgranBands}.
|
||||
* @param logicalModemUuids list of logical modem UUIDs, typically of the form
|
||||
* "com.xxxx.lmX", where X is the logical modem ID.
|
||||
* @param simSlotCapabilities list of {@link SimSlotCapability} for the device
|
||||
* @param concurrentFeaturesSupport list of list of concurrently supportable modem feature sets.
|
||||
* @hide
|
||||
*/
|
||||
public PhoneCapability(int utranUeCategoryDl, int utranUeCategoryUl, int eutranUeCategoryDl,
|
||||
int eutranUeCategoryUl, long psDataConnectionLingerTimeMillis,
|
||||
@NetworkTypeBitMask long supportedRats, @Nullable List<Integer> geranBands,
|
||||
@Nullable List<Integer> utranBands, @Nullable List<Integer> eutranBands,
|
||||
@Nullable List<Integer> ngranBands, @Nullable List<String> logicalModemUuids,
|
||||
@Nullable List<SimSlotCapability> simSlotCapabilities,
|
||||
@Nullable @ModemFeature List<List<Long>> concurrentFeaturesSupport) {
|
||||
this.mUtranUeCategoryDl = utranUeCategoryDl;
|
||||
this.mUtranUeCategoryUl = utranUeCategoryUl;
|
||||
this.mEutranUeCategoryDl = eutranUeCategoryDl;
|
||||
this.mEutranUeCategoryUl = eutranUeCategoryUl;
|
||||
this.mPsDataConnectionLingerTimeMillis = psDataConnectionLingerTimeMillis;
|
||||
this.mSupportedRats = supportedRats;
|
||||
this.mGeranBands = CollectionUtils.emptyIfNull(geranBands);
|
||||
this.mUtranBands = CollectionUtils.emptyIfNull(utranBands);
|
||||
this.mEutranBands = CollectionUtils.emptyIfNull(eutranBands);
|
||||
this.mNgranBands = CollectionUtils.emptyIfNull(ngranBands);
|
||||
this.mLogicalModemUuids = CollectionUtils.emptyIfNull(logicalModemUuids);
|
||||
this.mSimSlotCapabilities = CollectionUtils.emptyIfNull(simSlotCapabilities);
|
||||
this.mConcurrentFeaturesSupport = CollectionUtils.emptyIfNull(concurrentFeaturesSupport);
|
||||
}
|
||||
|
||||
private PhoneCapability(Parcel in) {
|
||||
mUtranUeCategoryDl = in.readInt();
|
||||
mUtranUeCategoryUl = in.readInt();
|
||||
mEutranUeCategoryDl = in.readInt();
|
||||
mEutranUeCategoryUl = in.readInt();
|
||||
mPsDataConnectionLingerTimeMillis = in.readLong();
|
||||
mSupportedRats = in.readLong();
|
||||
mGeranBands = new ArrayList<>();
|
||||
in.readList(mGeranBands, Integer.class.getClassLoader());
|
||||
mUtranBands = new ArrayList<>();
|
||||
in.readList(mUtranBands, Integer.class.getClassLoader());
|
||||
mEutranBands = new ArrayList<>();
|
||||
in.readList(mEutranBands, Integer.class.getClassLoader());
|
||||
mNgranBands = new ArrayList<>();
|
||||
in.readList(mNgranBands, Integer.class.getClassLoader());
|
||||
mLogicalModemUuids = in.createStringArrayList();
|
||||
mSimSlotCapabilities = in.createTypedArrayList(SimSlotCapability.CREATOR);
|
||||
int length = in.readInt();
|
||||
mConcurrentFeaturesSupport = new ArrayList<>();
|
||||
for (int i = 0; i < length; i++) {
|
||||
ArrayList<Long> feature = new ArrayList<>();
|
||||
in.readList(feature, Long.class.getClassLoader());
|
||||
mConcurrentFeaturesSupport.add(feature);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 3GPP UE category for a given Radio Access Network and direction.
|
||||
*
|
||||
* References are:
|
||||
* TS 25.306 Table 4.1a EUTRAN downlink
|
||||
* TS 25.306 Table 5.1a-2 EUTRAN uplink
|
||||
* TS 25.306 Table 5.1a UTRAN downlink
|
||||
* TS 25.306 Table 5.1g UTRAN uplink
|
||||
*
|
||||
* @param uplink true for uplink direction and false for downlink direction.
|
||||
* @param accessNetworkType accessNetworkType, defined in {@link AccessNetworkType}.
|
||||
* @return the UE category, or -1 if it is not supported.
|
||||
*/
|
||||
public int getUeCategory(boolean uplink, @RadioAccessNetworkType int accessNetworkType) {
|
||||
if (uplink) {
|
||||
switch (accessNetworkType) {
|
||||
case AccessNetworkType.UTRAN: return mUtranUeCategoryUl;
|
||||
case AccessNetworkType.EUTRAN: return mEutranUeCategoryUl;
|
||||
default: return -1;
|
||||
}
|
||||
} else {
|
||||
switch (accessNetworkType) {
|
||||
case AccessNetworkType.UTRAN: return mUtranUeCategoryDl;
|
||||
case AccessNetworkType.EUTRAN: return mEutranUeCategoryDl;
|
||||
default: return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* In cellular devices that support a greater number of logical modems than
|
||||
* Internet connections, some devices support a grace period to allow a smooth "handover"
|
||||
* between those connections. If that feature is supported, then this API will provide
|
||||
* the length of that grace period in milliseconds. If it is not supported, the default value
|
||||
* for the grace period is 0.
|
||||
* @return handover linger time in milliseconds, or 0 if it is not supported.
|
||||
*/
|
||||
public long getPsDataConnectionLingerTimeMillis() {
|
||||
return mPsDataConnectionLingerTimeMillis;
|
||||
}
|
||||
|
||||
/**
|
||||
* The radio access technologies this device is capable of supporting.
|
||||
* @return a bitfield of all supported network types, defined in {@link TelephonyManager}
|
||||
*/
|
||||
public @NetworkTypeBitMask long getSupportedRats() {
|
||||
return mSupportedRats;
|
||||
}
|
||||
|
||||
/**
|
||||
* List of supported cellular bands for the given accessNetworkType.
|
||||
* @param accessNetworkType accessNetworkType, defined in {@link AccessNetworkType}.
|
||||
* @return a list of bands, or an empty list if the access network type is unsupported.
|
||||
*/
|
||||
public @NonNull List<Integer> getBands(@RadioAccessNetworkType int accessNetworkType) {
|
||||
switch (accessNetworkType) {
|
||||
case AccessNetworkType.GERAN: return mGeranBands;
|
||||
case AccessNetworkType.UTRAN: return mUtranBands;
|
||||
case AccessNetworkType.EUTRAN: return mEutranBands;
|
||||
case AccessNetworkType.NGRAN: return mNgranBands;
|
||||
default: return new ArrayList<>();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* List of logical modem UUIDs, each typically "com.xxxx.lmX", where X is the logical modem ID.
|
||||
* @return a list of modem UUIDs, one for every logical modem the device has.
|
||||
*/
|
||||
public @NonNull List<String> getLogicalModemUuids() {
|
||||
return mLogicalModemUuids;
|
||||
}
|
||||
|
||||
/**
|
||||
* List of {@link SimSlotCapability} for the device. The order of SIMs corresponds to the
|
||||
* order of modems in {@link #getLogicalModemUuids}.
|
||||
* @return a list of SIM slot capabilities, one for every SIM slot the device has.
|
||||
*/
|
||||
public @NonNull List<SimSlotCapability> getSimSlotCapabilities() {
|
||||
return mSimSlotCapabilities;
|
||||
}
|
||||
|
||||
/**
|
||||
* A List of Lists of concurrently supportable modem feature sets.
|
||||
*
|
||||
* Each entry in the top-level list is an independent configuration across all modems
|
||||
* that describes the capabilities of the device as a whole.
|
||||
*
|
||||
* Each entry in the second-level list is a bitfield of ModemFeatures that describes
|
||||
* the capabilities for a single modem. In the second-level list, the order of the modems
|
||||
* corresponds to order of the UUIDs in {@link #getLogicalModemUuids}.
|
||||
*
|
||||
* For symmetric capabilities that can only be active on one modem at a time, there will be
|
||||
* multiple configurations (equal to the number of modems) that shows it active on each modem.
|
||||
* For asymmetric capabilities that are only available on one of the modems, all configurations
|
||||
* will have that capability on just that one modem.
|
||||
*
|
||||
* The example below shows the concurrentFeaturesSupport for a 3-modem device with
|
||||
* theoretical capabilities SYMMETRIC (available on all modems, but only one at a time) and
|
||||
* ASYMMETRIC (only available on the first modem):
|
||||
* {
|
||||
* Configuration 1: ASYMMETRIC and SYMMETRIC on modem 1, modem 2 empty, modem 3 empty
|
||||
* {(ASYMMETRIC | SYMMETRIC), (), ()},
|
||||
*
|
||||
* Configuration 2: ASYMMETRIC on modem 1, SYMMETRIC on modem 2, modem 3 empty
|
||||
* {(ASYMMETRIC), (SYMMETRIC), ()},
|
||||
*
|
||||
* Configuration 3: ASYMMETRIC on modem 1, modem 2 empty, SYMMETRIC on modem 3
|
||||
* {(ASYMMETRIC), (), (SYMMETRIC)}
|
||||
* }
|
||||
*
|
||||
* @return List of all concurrently supportable modem features.
|
||||
*/
|
||||
public @NonNull @ModemFeature List<List<Long>> getConcurrentFeaturesSupport() {
|
||||
return mConcurrentFeaturesSupport;
|
||||
}
|
||||
|
||||
/**
|
||||
* How many modems can simultaneously have PS attached.
|
||||
* @return maximum number of active PS voice connections.
|
||||
*/
|
||||
public int getMaxActivePsVoice() {
|
||||
return countFeature(MODEM_FEATURE_PS_VOICE_REG);
|
||||
}
|
||||
|
||||
/**
|
||||
* How many modems can simultaneously support active data connections.
|
||||
* For DSDS, this will be 1, and for DSDA this will be 2.
|
||||
* @return maximum number of active Internet data sessions.
|
||||
*/
|
||||
public int getMaxActiveInternetData() {
|
||||
return countFeature(MODEM_FEATURE_INTERACTIVE_DATA_SESSION);
|
||||
}
|
||||
|
||||
/**
|
||||
* How many modems can simultaneously have dedicated bearer capability.
|
||||
* @return maximum number of active dedicated bearers.
|
||||
*/
|
||||
public int getMaxActiveDedicatedBearers() {
|
||||
return countFeature(MODEM_FEATURE_DEDICATED_BEARER);
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the CBRS band 48 is supported or not.
|
||||
* @return true if any RadioAccessNetwork supports CBRS and false if none do.
|
||||
* @hide
|
||||
*/
|
||||
public boolean isCbrsSupported() {
|
||||
return mEutranBands.contains(AccessNetworkConstants.EutranBand.BAND_48)
|
||||
|| mNgranBands.contains(AccessNetworkConstants.NgranBands.BAND_48);
|
||||
}
|
||||
|
||||
private int countFeature(@ModemFeature long feature) {
|
||||
int count = 0;
|
||||
for (long featureSet : mConcurrentFeaturesSupport.get(0)) {
|
||||
if ((featureSet & feature) != 0) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "maxActiveVoiceCalls=" + maxActiveVoiceCalls + " maxActiveData=" + maxActiveData
|
||||
+ " max5G=" + max5G + "logicalModemList:"
|
||||
+ Arrays.toString(logicalModemList.toArray());
|
||||
}
|
||||
|
||||
private PhoneCapability(Parcel in) {
|
||||
maxActiveVoiceCalls = in.readInt();
|
||||
maxActiveData = in.readInt();
|
||||
max5G = in.readInt();
|
||||
validationBeforeSwitchSupported = in.readBoolean();
|
||||
logicalModemList = new ArrayList<>();
|
||||
in.readList(logicalModemList, ModemInfo.class.getClassLoader());
|
||||
return "utranUeCategoryDl=" + mUtranUeCategoryDl
|
||||
+ " utranUeCategoryUl=" + mUtranUeCategoryUl
|
||||
+ " eutranUeCategoryDl=" + mEutranUeCategoryDl
|
||||
+ " eutranUeCategoryUl=" + mEutranUeCategoryUl
|
||||
+ " psDataConnectionLingerTimeMillis=" + mPsDataConnectionLingerTimeMillis
|
||||
+ " supportedRats=" + mSupportedRats + " geranBands=" + mGeranBands
|
||||
+ " utranBands=" + mUtranBands + " eutranBands=" + mEutranBands
|
||||
+ " ngranBands=" + mNgranBands + " logicalModemUuids=" + mLogicalModemUuids
|
||||
+ " simSlotCapabilities=" + mSimSlotCapabilities
|
||||
+ " concurrentFeaturesSupport=" + mConcurrentFeaturesSupport;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(maxActiveVoiceCalls, maxActiveData, max5G, logicalModemList,
|
||||
validationBeforeSwitchSupported);
|
||||
return Objects.hash(mUtranUeCategoryDl, mUtranUeCategoryUl, mEutranUeCategoryDl,
|
||||
mEutranUeCategoryUl, mPsDataConnectionLingerTimeMillis, mSupportedRats, mGeranBands,
|
||||
mUtranBands, mEutranBands, mNgranBands, mLogicalModemUuids, mSimSlotCapabilities,
|
||||
mConcurrentFeaturesSupport);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -107,11 +411,19 @@ public final class PhoneCapability implements Parcelable {
|
||||
|
||||
PhoneCapability s = (PhoneCapability) o;
|
||||
|
||||
return (maxActiveVoiceCalls == s.maxActiveVoiceCalls
|
||||
&& maxActiveData == s.maxActiveData
|
||||
&& max5G == s.max5G
|
||||
&& validationBeforeSwitchSupported == s.validationBeforeSwitchSupported
|
||||
&& logicalModemList.equals(s.logicalModemList));
|
||||
return (mUtranUeCategoryDl == s.mUtranUeCategoryDl
|
||||
&& mUtranUeCategoryUl == s.mUtranUeCategoryUl
|
||||
&& mEutranUeCategoryDl == s.mEutranUeCategoryDl
|
||||
&& mEutranUeCategoryUl == s.mEutranUeCategoryUl
|
||||
&& mPsDataConnectionLingerTimeMillis == s.mPsDataConnectionLingerTimeMillis
|
||||
&& mSupportedRats == s.mSupportedRats
|
||||
&& mGeranBands.equals(s.mGeranBands)
|
||||
&& mUtranBands.equals(s.mUtranBands)
|
||||
&& mEutranBands.equals(s.mEutranBands)
|
||||
&& mNgranBands.equals(s.mNgranBands)
|
||||
&& mLogicalModemUuids.equals(s.mLogicalModemUuids)
|
||||
&& mSimSlotCapabilities.equals(s.mSimSlotCapabilities)
|
||||
&& mConcurrentFeaturesSupport.equals(s.mConcurrentFeaturesSupport));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -125,20 +437,32 @@ public final class PhoneCapability implements Parcelable {
|
||||
* {@link Parcelable#writeToParcel}
|
||||
*/
|
||||
public void writeToParcel(@NonNull Parcel dest, @Parcelable.WriteFlags int flags) {
|
||||
dest.writeInt(maxActiveVoiceCalls);
|
||||
dest.writeInt(maxActiveData);
|
||||
dest.writeInt(max5G);
|
||||
dest.writeBoolean(validationBeforeSwitchSupported);
|
||||
dest.writeList(logicalModemList);
|
||||
dest.writeInt(mUtranUeCategoryDl);
|
||||
dest.writeInt(mUtranUeCategoryUl);
|
||||
dest.writeInt(mEutranUeCategoryDl);
|
||||
dest.writeInt(mEutranUeCategoryUl);
|
||||
dest.writeLong(mPsDataConnectionLingerTimeMillis);
|
||||
dest.writeLong(mSupportedRats);
|
||||
dest.writeList(mGeranBands);
|
||||
dest.writeList(mUtranBands);
|
||||
dest.writeList(mEutranBands);
|
||||
dest.writeList(mNgranBands);
|
||||
dest.writeStringList(mLogicalModemUuids);
|
||||
dest.writeTypedList(mSimSlotCapabilities);
|
||||
dest.writeInt(mConcurrentFeaturesSupport.size());
|
||||
for (List<Long> feature : mConcurrentFeaturesSupport) {
|
||||
dest.writeList(feature);
|
||||
}
|
||||
}
|
||||
|
||||
public static final @android.annotation.NonNull Parcelable.Creator<PhoneCapability> CREATOR = new Parcelable.Creator() {
|
||||
public PhoneCapability createFromParcel(Parcel in) {
|
||||
return new PhoneCapability(in);
|
||||
}
|
||||
public static final @NonNull Parcelable.Creator<PhoneCapability> CREATOR =
|
||||
new Parcelable.Creator() {
|
||||
public PhoneCapability createFromParcel(Parcel in) {
|
||||
return new PhoneCapability(in);
|
||||
}
|
||||
|
||||
public PhoneCapability[] newArray(int size) {
|
||||
return new PhoneCapability[size];
|
||||
}
|
||||
};
|
||||
public PhoneCapability[] newArray(int size) {
|
||||
return new PhoneCapability[size];
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
130
telephony/java/android/telephony/SimSlotCapability.java
Normal file
130
telephony/java/android/telephony/SimSlotCapability.java
Normal file
@@ -0,0 +1,130 @@
|
||||
/*
|
||||
* Copyright (C) 2019 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;
|
||||
|
||||
import android.annotation.IntDef;
|
||||
import android.annotation.NonNull;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Capabilities for a SIM Slot.
|
||||
*/
|
||||
public final class SimSlotCapability implements Parcelable {
|
||||
/** Slot type for UICC (removable SIM). */
|
||||
public static final int SLOT_TYPE_UICC = 1;
|
||||
/** Slot type for iUICC/iSIM (integrated SIM). */
|
||||
public static final int SLOT_TYPE_IUICC = 2;
|
||||
/** Slot type for eUICC/eSIM (embedded SIM). */
|
||||
public static final int SLOT_TYPE_EUICC = 3;
|
||||
/** Slot type for soft SIM (no physical SIM). */
|
||||
public static final int SLOT_TYPE_SOFT_SIM = 4;
|
||||
|
||||
/** @hide */
|
||||
@IntDef(prefix = {"SLOT_TYPE_" }, value = {
|
||||
SLOT_TYPE_UICC,
|
||||
SLOT_TYPE_IUICC,
|
||||
SLOT_TYPE_EUICC,
|
||||
SLOT_TYPE_SOFT_SIM,
|
||||
})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface SlotType {
|
||||
}
|
||||
|
||||
private final int mPhysicalSlotIndex;
|
||||
private final int mSlotType;
|
||||
|
||||
/** @hide */
|
||||
public SimSlotCapability(int physicalSlotId, int slotType) {
|
||||
this.mPhysicalSlotIndex = physicalSlotId;
|
||||
this.mSlotType = slotType;
|
||||
}
|
||||
|
||||
private SimSlotCapability(Parcel in) {
|
||||
mPhysicalSlotIndex = in.readInt();
|
||||
mSlotType = in.readInt();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return physical SIM slot index
|
||||
*/
|
||||
public int getPhysicalSlotIndex() {
|
||||
return mPhysicalSlotIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return type of SIM {@link SlotType}
|
||||
*/
|
||||
public @SlotType int getSlotType() {
|
||||
return mSlotType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "mPhysicalSlotIndex=" + mPhysicalSlotIndex + " slotType=" + mSlotType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(mPhysicalSlotIndex, mSlotType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (o == null || !(o instanceof SimSlotCapability) || hashCode() != o.hashCode()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
|
||||
SimSlotCapability s = (SimSlotCapability) o;
|
||||
|
||||
return (mPhysicalSlotIndex == s.mPhysicalSlotIndex && mSlotType == s.mSlotType);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link Parcelable#describeContents}
|
||||
*/
|
||||
public @ContentsFlags int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link Parcelable#writeToParcel}
|
||||
*/
|
||||
public void writeToParcel(@NonNull Parcel dest, @WriteFlags int flags) {
|
||||
dest.writeInt(mPhysicalSlotIndex);
|
||||
dest.writeInt(mSlotType);
|
||||
}
|
||||
|
||||
public static final @NonNull Parcelable.Creator<SimSlotCapability> CREATOR =
|
||||
new Parcelable.Creator() {
|
||||
public SimSlotCapability createFromParcel(Parcel in) {
|
||||
return new SimSlotCapability(in);
|
||||
}
|
||||
|
||||
public SimSlotCapability[] newArray(int size) {
|
||||
return new SimSlotCapability[size];
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -1439,6 +1439,24 @@ public class TelephonyManager {
|
||||
//
|
||||
//
|
||||
|
||||
/**
|
||||
* Returns the {@link PhoneCapability} for the device or null if it is not available.
|
||||
* <p>
|
||||
* Requires Permission: READ_PHONE_STATE or that the calling app has
|
||||
* carrier privileges (see {@link #hasCarrierPrivileges}).
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
|
||||
@Nullable
|
||||
public PhoneCapability getPhoneCapability() {
|
||||
try {
|
||||
ITelephony telephony = getITelephony();
|
||||
return telephony == null ? null :
|
||||
telephony.getPhoneCapability(getSubId(), getOpPackageName(), getFeatureId());
|
||||
} catch (RemoteException ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the software version number for the device, for example,
|
||||
* the IMEI/SV for GSM phones. Return null if the software version is
|
||||
|
||||
@@ -38,6 +38,7 @@ import android.telephony.ICellInfoCallback;
|
||||
import android.telephony.ModemActivityInfo;
|
||||
import android.telephony.NeighboringCellInfo;
|
||||
import android.telephony.NetworkScanRequest;
|
||||
import android.telephony.PhoneCapability;
|
||||
import android.telephony.PhoneNumberRange;
|
||||
import android.telephony.RadioAccessFamily;
|
||||
import android.telephony.ServiceState;
|
||||
@@ -1825,12 +1826,17 @@ interface ITelephony {
|
||||
/**
|
||||
* Return the network selection mode on the subscription with id {@code subId}.
|
||||
*/
|
||||
int getNetworkSelectionMode(int subId);
|
||||
int getNetworkSelectionMode(int subId);
|
||||
|
||||
/**
|
||||
/**
|
||||
* Return the PhoneCapability for the device.
|
||||
*/
|
||||
PhoneCapability getPhoneCapability(int subId, String callingPackage, String callingFeatureId);
|
||||
|
||||
/**
|
||||
* Return true if the device is in emergency sms mode, false otherwise.
|
||||
*/
|
||||
boolean isInEmergencySmsMode();
|
||||
boolean isInEmergencySmsMode();
|
||||
|
||||
/**
|
||||
* Return the modem radio power state for slot index.
|
||||
|
||||
Reference in New Issue
Block a user