From eb18644660f7153401ba859272ac9cdf69323a88 Mon Sep 17 00:00:00 2001 From: chen xu Date: Wed, 24 Oct 2018 17:12:28 -0700 Subject: [PATCH] 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 --- api/system-current.txt | 19 +++ .../java/android/telephony/RadioAccessFamily.java | 123 +++++++++++++--- .../java/android/telephony/TelephonyManager.java | 164 +++++++++++++++++++++ .../internal/telephony/TelephonyPermissions.java | 21 +++ 4 files changed, 303 insertions(+), 24 deletions(-) diff --git a/api/system-current.txt b/api/system-current.txt index 9b1400c377de..3ad8f0918007 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5293,6 +5293,7 @@ package android.telephony { method public int getRadioPowerState(); method public int getSimApplicationState(); method public int getSimCardState(); + method public int getSupportedRadioAccessFamily(); method public java.util.List getTelephonyHistograms(); method public android.telephony.UiccSlotInfo[] getUiccSlotsInfo(); method public android.os.Bundle getVisualVoicemailSettings(); @@ -5358,6 +5359,24 @@ package android.telephony { 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 1d79988fecb3..da3acc2eedfe 100644 --- a/telephony/java/android/telephony/RadioAccessFamily.java +++ b/telephony/java/android/telephony/RadioAccessFamily.java @@ -29,29 +29,32 @@ import com.android.internal.telephony.RILConstants; */ 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 @@ public class RadioAccessFamily implements Parcelable { * 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 @@ public class RadioAccessFamily implements Parcelable { * @return radio access family */ @UnsupportedAppUsage - public int getRadioAccessFamily() { + public @TelephonyManager.NetworkTypeBitMask int getRadioAccessFamily() { return mRadioAccessFamily; } @@ -388,4 +391,76 @@ public class RadioAccessFamily implements Parcelable { } 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 2508b6d160d0..0ee493c5ba7b 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -8773,4 +8773,168 @@ public class TelephonyManager { 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} + * + *

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 06378ba95d59..3822cbe8402e 100644 --- a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java +++ b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java @@ -269,6 +269,27 @@ public final class TelephonyPermissions { } /** + * 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 -- 2.11.0