new system API getRadioAccessFamily
1. new API in telephonyManager to getRadioAccessFamily
2. define bitmask for radioAccessFamily based on NetworkType because
we don't want to expose two sets of definition RIL_RADIO and Network
type together in public API surface
3. convert definition to NetworkType
Bug: 118351153
Test: telehony unit test
Change-Id: I4a71c61929d9df8ec13c157e0452c6f30d8e4b9c
Merged-in: I4a71c61929d9df8ec13c157e0452c6f30d8e4b9c
diff --git a/api/system-current.txt b/api/system-current.txt
index 9b1400c..3ad8f09 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -5293,6 +5293,7 @@
method public int getRadioPowerState();
method public int getSimApplicationState();
method public int getSimCardState();
+ method public int getSupportedRadioAccessFamily();
method public java.util.List<android.telephony.TelephonyHistogram> getTelephonyHistograms();
method public android.telephony.UiccSlotInfo[] getUiccSlotsInfo();
method public android.os.Bundle getVisualVoicemailSettings();
@@ -5358,6 +5359,24 @@
field public static final int NETWORK_MODE_TDSCDMA_WCDMA = 14; // 0xe
field public static final int NETWORK_MODE_WCDMA_ONLY = 2; // 0x2
field public static final int NETWORK_MODE_WCDMA_PREF = 0; // 0x0
+ field public static final int NETWORK_TYPE_BITMASK_1xRTT = 128; // 0x80
+ field public static final int NETWORK_TYPE_BITMASK_CDMA = 16; // 0x10
+ field public static final int NETWORK_TYPE_BITMASK_EDGE = 4; // 0x4
+ field public static final int NETWORK_TYPE_BITMASK_EHRPD = 16384; // 0x4000
+ field public static final int NETWORK_TYPE_BITMASK_EVDO_0 = 32; // 0x20
+ field public static final int NETWORK_TYPE_BITMASK_EVDO_A = 64; // 0x40
+ field public static final int NETWORK_TYPE_BITMASK_EVDO_B = 4096; // 0x1000
+ field public static final int NETWORK_TYPE_BITMASK_GPRS = 2; // 0x2
+ field public static final int NETWORK_TYPE_BITMASK_GSM = 65536; // 0x10000
+ field public static final int NETWORK_TYPE_BITMASK_HSDPA = 256; // 0x100
+ field public static final int NETWORK_TYPE_BITMASK_HSPA = 1024; // 0x400
+ field public static final int NETWORK_TYPE_BITMASK_HSPAP = 32768; // 0x8000
+ field public static final int NETWORK_TYPE_BITMASK_HSUPA = 512; // 0x200
+ field public static final int NETWORK_TYPE_BITMASK_LTE = 8192; // 0x2000
+ field public static final int NETWORK_TYPE_BITMASK_LTE_CA = 524288; // 0x80000
+ field public static final int NETWORK_TYPE_BITMASK_TD_SCDMA = 131072; // 0x20000
+ field public static final int NETWORK_TYPE_BITMASK_UMTS = 8; // 0x8
+ field public static final int NETWORK_TYPE_BITMASK_UNKNOWN = 1; // 0x1
field public static final int RADIO_POWER_OFF = 0; // 0x0
field public static final int RADIO_POWER_ON = 1; // 0x1
field public static final int RADIO_POWER_UNAVAILABLE = 2; // 0x2
diff --git a/telephony/java/android/telephony/RadioAccessFamily.java b/telephony/java/android/telephony/RadioAccessFamily.java
index 1d79988..da3acc2 100644
--- a/telephony/java/android/telephony/RadioAccessFamily.java
+++ b/telephony/java/android/telephony/RadioAccessFamily.java
@@ -29,29 +29,32 @@
*/
public class RadioAccessFamily implements Parcelable {
- // Radio Access Family
+ /**
+ * TODO: get rid of RAF definition in RadioAccessFamily and
+ * use {@link TelephonyManager.NetworkTypeBitMask}
+ */
// 2G
- public static final int RAF_UNKNOWN = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN);
- public static final int RAF_GSM = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GSM);
- public static final int RAF_GPRS = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GPRS);
- public static final int RAF_EDGE = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EDGE);
- public static final int RAF_IS95A = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IS95A);
- public static final int RAF_IS95B = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IS95B);
- public static final int RAF_1xRTT = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT);
+ public static final int RAF_UNKNOWN = TelephonyManager.NETWORK_TYPE_BITMASK_UNKNOWN;
+ public static final int RAF_GSM = TelephonyManager.NETWORK_TYPE_BITMASK_GSM;
+ public static final int RAF_GPRS = TelephonyManager.NETWORK_TYPE_BITMASK_GPRS;
+ public static final int RAF_EDGE = TelephonyManager.NETWORK_TYPE_BITMASK_EDGE;
+ public static final int RAF_IS95A = TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
+ public static final int RAF_IS95B = TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
+ public static final int RAF_1xRTT = TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT;
// 3G
- public static final int RAF_EVDO_0 = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0);
- public static final int RAF_EVDO_A = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A);
- public static final int RAF_EVDO_B = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B);
- public static final int RAF_EHRPD = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD);
- public static final int RAF_HSUPA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA);
- public static final int RAF_HSDPA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA);
- public static final int RAF_HSPA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPA);
- public static final int RAF_HSPAP = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP);
- public static final int RAF_UMTS = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_UMTS);
- public static final int RAF_TD_SCDMA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA);
+ public static final int RAF_EVDO_0 = TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0;
+ public static final int RAF_EVDO_A = TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A;
+ public static final int RAF_EVDO_B = TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B;
+ public static final int RAF_EHRPD = TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD;
+ public static final int RAF_HSUPA = TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA;
+ public static final int RAF_HSDPA = TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA;
+ public static final int RAF_HSPA = TelephonyManager.NETWORK_TYPE_BITMASK_HSPA;
+ public static final int RAF_HSPAP = TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP;
+ public static final int RAF_UMTS = TelephonyManager.NETWORK_TYPE_BITMASK_UMTS;
+ public static final int RAF_TD_SCDMA = TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA;
// 4G
- public static final int RAF_LTE = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_LTE);
- public static final int RAF_LTE_CA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA);
+ public static final int RAF_LTE = TelephonyManager.NETWORK_TYPE_BITMASK_LTE;
+ public static final int RAF_LTE_CA = TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA;
// Grouping of RAFs
// 2G
@@ -74,9 +77,9 @@
* Constructor.
*
* @param phoneId the phone ID
- * @param radioAccessFamily the phone radio access family defined
- * in RadioAccessFamily. It's a bit mask value to represent
- * the support type.
+ * @param radioAccessFamily the phone radio access family bitmask based on
+ * {@link TelephonyManager.NetworkTypeBitMask}. It's a bit mask value to represent the support
+ * type.
*/
@UnsupportedAppUsage
public RadioAccessFamily(int phoneId, int radioAccessFamily) {
@@ -100,7 +103,7 @@
* @return radio access family
*/
@UnsupportedAppUsage
- public int getRadioAccessFamily() {
+ public @TelephonyManager.NetworkTypeBitMask int getRadioAccessFamily() {
return mRadioAccessFamily;
}
@@ -388,4 +391,76 @@
}
return result;
}
+
+ /**
+ * convert RAF from {@link ServiceState.RilRadioTechnology} bitmask to
+ * {@link TelephonyManager.NetworkTypeBitMask}, the bitmask represented by
+ * {@link TelephonyManager.NetworkType}. Reasons are {@link TelephonyManager.NetworkType} are
+ * public while {@link ServiceState.RilRadioTechnology} are hidden. We
+ * don't want to expose two sets of definition to public.
+ *
+ * @param raf bitmask represented by {@link ServiceState.RilRadioTechnology}
+ * @return {@link TelephonyManager.NetworkTypeBitMask}
+ */
+ public static int convertToNetworkTypeBitMask(int raf) {
+ int networkTypeRaf = 0;
+
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GSM)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_GSM;
+ }
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GPRS)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_GPRS;
+ }
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EDGE)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EDGE;
+ }
+ // convert both IS95A/IS95B to CDMA as network mode doesn't support CDMA
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IS95A)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
+ }
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IS95B)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
+ }
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT;
+ }
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0;
+ }
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A;
+ }
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B;
+ }
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD;
+ }
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA;
+ }
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA;
+ }
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPA)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSPA;
+ }
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP;
+ }
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_UMTS)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_UMTS;
+ }
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA;
+ }
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_LTE)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_LTE;
+ }
+ if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA)) != 0) {
+ networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA;
+ }
+
+ return (networkTypeRaf == 0) ? TelephonyManager.NETWORK_TYPE_UNKNOWN : networkTypeRaf;
+ }
}
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 2508b6d..0ee493c 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -8773,4 +8773,168 @@
return isEnabled;
}
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(flag = true, prefix = {"NETWORK_TYPE_BITMASK_"},
+ value = {NETWORK_TYPE_BITMASK_UNKNOWN,
+ NETWORK_TYPE_BITMASK_GSM,
+ NETWORK_TYPE_BITMASK_GPRS,
+ NETWORK_TYPE_BITMASK_EDGE,
+ NETWORK_TYPE_BITMASK_CDMA,
+ NETWORK_TYPE_BITMASK_1xRTT,
+ NETWORK_TYPE_BITMASK_EVDO_0,
+ NETWORK_TYPE_BITMASK_EVDO_A,
+ NETWORK_TYPE_BITMASK_EVDO_B,
+ NETWORK_TYPE_BITMASK_EHRPD,
+ NETWORK_TYPE_BITMASK_HSUPA,
+ NETWORK_TYPE_BITMASK_HSDPA,
+ NETWORK_TYPE_BITMASK_HSPA,
+ NETWORK_TYPE_BITMASK_HSPAP,
+ NETWORK_TYPE_BITMASK_UMTS,
+ NETWORK_TYPE_BITMASK_TD_SCDMA,
+ NETWORK_TYPE_BITMASK_LTE,
+ NETWORK_TYPE_BITMASK_LTE_CA,
+ })
+ public @interface NetworkTypeBitMask {}
+
+ // 2G
+ /**
+ * network type bitmask unknown.
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_UNKNOWN = (1 << NETWORK_TYPE_UNKNOWN);
+ /**
+ * network type bitmask indicating the support of radio tech GSM.
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_GSM = (1 << NETWORK_TYPE_GSM);
+ /**
+ * network type bitmask indicating the support of radio tech GPRS.
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_GPRS = (1 << NETWORK_TYPE_GPRS);
+ /**
+ * network type bitmask indicating the support of radio tech EDGE.
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_EDGE = (1 << NETWORK_TYPE_EDGE);
+ /**
+ * network type bitmask indicating the support of radio tech CDMA(IS95A/IS95B).
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_CDMA = (1 << NETWORK_TYPE_CDMA);
+ /**
+ * network type bitmask indicating the support of radio tech 1xRTT.
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_1xRTT = (1 << NETWORK_TYPE_1xRTT);
+ // 3G
+ /**
+ * network type bitmask indicating the support of radio tech EVDO 0.
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_EVDO_0 = (1 << NETWORK_TYPE_EVDO_0);
+ /**
+ * network type bitmask indicating the support of radio tech EVDO A.
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_EVDO_A = (1 << NETWORK_TYPE_EVDO_A);
+ /**
+ * network type bitmask indicating the support of radio tech EVDO B.
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_EVDO_B = (1 << NETWORK_TYPE_EVDO_B);
+ /**
+ * network type bitmask indicating the support of radio tech EHRPD.
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_EHRPD = (1 << NETWORK_TYPE_EHRPD);
+ /**
+ * network type bitmask indicating the support of radio tech HSUPA.
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_HSUPA = (1 << NETWORK_TYPE_HSUPA);
+ /**
+ * network type bitmask indicating the support of radio tech HSDPA.
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_HSDPA = (1 << NETWORK_TYPE_HSDPA);
+ /**
+ * network type bitmask indicating the support of radio tech HSPA.
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_HSPA = (1 << NETWORK_TYPE_HSPA);
+ /**
+ * network type bitmask indicating the support of radio tech HSPAP.
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_HSPAP = (1 << NETWORK_TYPE_HSPAP);
+ /**
+ * network type bitmask indicating the support of radio tech UMTS.
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_UMTS = (1 << NETWORK_TYPE_UMTS);
+ /**
+ * network type bitmask indicating the support of radio tech TD_SCDMA.
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_TD_SCDMA = (1 << NETWORK_TYPE_TD_SCDMA);
+ // 4G
+ /**
+ * network type bitmask indicating the support of radio tech LTE.
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_LTE = (1 << NETWORK_TYPE_LTE);
+ /**
+ * network type bitmask indicating the support of radio tech LTE CA (carrier aggregation).
+ * @hide
+ */
+ @SystemApi
+ public static final int NETWORK_TYPE_BITMASK_LTE_CA = (1 << NETWORK_TYPE_LTE_CA);
+
+ /**
+ * @return Modem supported radio access family bitmask {@link NetworkTypeBitMask}
+ *
+ * <p>Requires permission: {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE} or
+ * that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}).
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ public @NetworkTypeBitMask int getSupportedRadioAccessFamily() {
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony != null) {
+ return telephony.getRadioAccessFamily(getSlotIndex(), getOpPackageName());
+ } else {
+ // This can happen when the ITelephony interface is not up yet.
+ return NETWORK_TYPE_BITMASK_UNKNOWN;
+ }
+ } catch (RemoteException ex) {
+ // This shouldn't happen in the normal case
+ return NETWORK_TYPE_BITMASK_UNKNOWN;
+ } catch (NullPointerException ex) {
+ // This could happen before phone restarts due to crashing
+ return NETWORK_TYPE_BITMASK_UNKNOWN;
+ }
+ }
+
}
diff --git a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java
index 06378ba..3822cbe 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java
@@ -269,6 +269,27 @@
}
/**
+ * Ensure the caller (or self, if not processing an IPC) has
+ * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE} or carrier privileges.
+ *
+ * @throws SecurityException if the caller does not have the required permission/privileges
+ */
+ public static void enforeceCallingOrSelfReadPrivilegedPhoneStatePermissionOrCarrierPrivilege(
+ Context context, int subId, String message) {
+ if (context.checkCallingOrSelfPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ == PERMISSION_GRANTED) {
+ return;
+ }
+
+ if (DBG) {
+ Rlog.d(LOG_TAG, "No READ_PRIVILEDED_PHONE_STATE permission, " +
+ "check carrier privilege next.");
+ }
+
+ enforceCallingOrSelfCarrierPrivilege(subId, message);
+ }
+
+ /**
* Make sure the caller (or self, if not processing an IPC) has carrier privileges.
*
* @throws SecurityException if the caller does not have the required privileges