From f4a9445a52524ef227e46c1b6bd13a6265bf47b4 Mon Sep 17 00:00:00 2001 From: Nathan Harold Date: Tue, 1 Oct 2019 18:02:06 -0700 Subject: [PATCH 1/2] Add Network Preference Bitmaps To support conversion of the preferred network types back to the network "class" types (really the RANs), this change adds bitmaps for 2G, 3G, and 4G bitmaps as well as for differentiating between 3gpp and 3gpp2 RATs. Bug: 128572818 Test: manual Merged-In: I25f41ad48eb4dc74c2cace80ccec4e1e954443f9 Change-Id: I25f41ad48eb4dc74c2cace80ccec4e1e954443f9 (cherry picked from commit febfb82bc86f1334921a31bff1cb4725e94a7b24) --- .../android/telephony/TelephonyManager.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 31d965463a7ef..be2071cf7fd6c 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -11600,6 +11600,55 @@ public class TelephonyManager { @SystemApi public static final long NETWORK_TYPE_BITMASK_IWLAN = (1 << (NETWORK_TYPE_IWLAN -1)); + /** @hide */ + public static final long NETWORK_CLASS_BITMASK_2G = NETWORK_TYPE_BITMASK_GSM + | NETWORK_TYPE_BITMASK_GPRS + | NETWORK_TYPE_BITMASK_EDGE + | NETWORK_TYPE_BITMASK_CDMA + | NETWORK_TYPE_BITMASK_1xRTT; + + /** @hide */ + public static final long NETWORK_CLASS_BITMASK_3G = 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; + + /** @hide */ + public static final long NETWORK_CLASS_BITMASK_4G = NETWORK_TYPE_BITMASK_LTE + | NETWORK_TYPE_BITMASK_LTE_CA + | NETWORK_TYPE_BITMASK_IWLAN; + + /** @hide */ + public static final long NETWORK_CLASS_BITMASK_5G = NETWORK_TYPE_BITMASK_NR; + + /** @hide */ + public static final long NETWORK_STANDARDS_FAMILY_BITMASK_3GPP = NETWORK_TYPE_BITMASK_GSM + | NETWORK_TYPE_BITMASK_GPRS + | NETWORK_TYPE_BITMASK_EDGE + | 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 + | NETWORK_TYPE_BITMASK_NR; + + /** @hide */ + public static final long NETWORK_STANDARDS_FAMILY_BITMASK_3GPP2 = 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; + /** * @return Modem supported radio access family bitmask * From c058cac051ab083dc7fb7ea6aa85699110b2e9bf Mon Sep 17 00:00:00 2001 From: Nathan Harold Date: Thu, 20 Feb 2020 17:17:36 -0800 Subject: [PATCH 2/2] Remove NetworkClass from TelephonyManager NetworkClass isn't especially useful because the APIs for getting and setting preferred networks have been converted to bitmasks of individual RATs. Removing this because it's causing confusion about the proper structure of the API surface. There are < 100k total usages with the vast majority (60% or more) coming from two apps. Because NetworkClass is used in RadioAccessFamily for a sort of comparison function, rewrite that function, porting and updating logic from TelephonyConnectionService to that compare() method. Bug: 128572818 Test: atest RadioAccessFamilyTest Merged-In: I1f279fadd8c543b845fce0f13dc62c1480757692 Change-Id: I1f279fadd8c543b845fce0f13dc62c1480757692 (cherry picked from commit d44b4efa33d5b17303ae5f4ee43d7096b85e7295) --- .../android/telephony/RadioAccessFamily.java | 48 +++++++++------ .../android/telephony/TelephonyManager.java | 58 ------------------- 2 files changed, 30 insertions(+), 76 deletions(-) diff --git a/telephony/java/android/telephony/RadioAccessFamily.java b/telephony/java/android/telephony/RadioAccessFamily.java index bc84738654660..90ddf2cd47300 100644 --- a/telephony/java/android/telephony/RadioAccessFamily.java +++ b/telephony/java/android/telephony/RadioAccessFamily.java @@ -260,24 +260,6 @@ public class RadioAccessFamily implements Parcelable { return raf; } - /** - * Returns the highest capability of the RadioAccessFamily (4G > 3G > 2G). - * @param raf The RadioAccessFamily that we wish to filter - * @return The highest radio capability - */ - public static int getHighestRafCapability(int raf) { - if ((LTE & raf) > 0) { - return TelephonyManager.NETWORK_CLASS_4_G; - } - if ((EVDO|HS|WCDMA & raf) > 0) { - return TelephonyManager.NETWORK_CLASS_3_G; - } - if((GSM|CDMA & raf) > 0) { - return TelephonyManager.NETWORK_CLASS_2_G; - } - return TelephonyManager.NETWORK_CLASS_UNKNOWN; - } - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) @PrefNetworkMode public static int getNetworkTypeFromRaf(int raf) { @@ -395,4 +377,34 @@ public class RadioAccessFamily implements Parcelable { } return result; } + + /** + * Compare two sets of network types to see which is more capable. + * + * This algorithm first tries to see see if a set has a strict superset of RAT support for + * each generation, from newest to oldest; if that results in a tie, then it returns the set + * that supports the most RAT types. + */ + public static int compare(long networkTypeBitmaskL, long networkTypeBitmaskR) { + final long[] prioritizedNetworkClassBitmasks = new long[] { + TelephonyManager.NETWORK_CLASS_BITMASK_5G, + TelephonyManager.NETWORK_CLASS_BITMASK_4G, + TelephonyManager.NETWORK_CLASS_BITMASK_3G, + TelephonyManager.NETWORK_CLASS_BITMASK_2G, + }; + + long lhsUnique = networkTypeBitmaskL & ~networkTypeBitmaskR; + long rhsUnique = networkTypeBitmaskR & ~networkTypeBitmaskL; + + // See if one has a strict super-set of capabilities, generation by generation. + for (long classBitmask : prioritizedNetworkClassBitmasks) { + int result = 0; + if ((lhsUnique & classBitmask) != 0) ++result; + if ((rhsUnique & classBitmask) != 0) --result; + if (result != 0) return result; + } + + // Without a clear winner, return the one that supports the most types. + return Long.bitCount(networkTypeBitmaskL) - Long.bitCount(networkTypeBitmaskR); + } } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index be2071cf7fd6c..da828ea6a9572 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -3074,64 +3074,6 @@ public class TelephonyManager { } } - /** - * Network Class Definitions. - * Do not change this order, it is used for sorting during emergency calling in - * {@link TelephonyConnectionService#getFirstPhoneForEmergencyCall()}. Any newer technologies - * should be added after the current definitions. - */ - /** Unknown network class. {@hide} */ - public static final int NETWORK_CLASS_UNKNOWN = 0; - /** Class of broadly defined "2G" networks. {@hide} */ - @UnsupportedAppUsage - public static final int NETWORK_CLASS_2_G = 1; - /** Class of broadly defined "3G" networks. {@hide} */ - @UnsupportedAppUsage - public static final int NETWORK_CLASS_3_G = 2; - /** Class of broadly defined "4G" networks. {@hide} */ - @UnsupportedAppUsage - public static final int NETWORK_CLASS_4_G = 3; - /** Class of broadly defined "5G" networks. {@hide} */ - public static final int NETWORK_CLASS_5_G = 4; - - /** - * Return general class of network type, such as "3G" or "4G". In cases - * where classification is contentious, this method is conservative. - * - * @hide - */ - @UnsupportedAppUsage - public static int getNetworkClass(int networkType) { - switch (networkType) { - case NETWORK_TYPE_GPRS: - case NETWORK_TYPE_GSM: - case NETWORK_TYPE_EDGE: - case NETWORK_TYPE_CDMA: - case NETWORK_TYPE_1xRTT: - case NETWORK_TYPE_IDEN: - return NETWORK_CLASS_2_G; - case NETWORK_TYPE_UMTS: - case NETWORK_TYPE_EVDO_0: - case NETWORK_TYPE_EVDO_A: - case NETWORK_TYPE_HSDPA: - case NETWORK_TYPE_HSUPA: - case NETWORK_TYPE_HSPA: - case NETWORK_TYPE_EVDO_B: - case NETWORK_TYPE_EHRPD: - case NETWORK_TYPE_HSPAP: - case NETWORK_TYPE_TD_SCDMA: - return NETWORK_CLASS_3_G; - case NETWORK_TYPE_LTE: - case NETWORK_TYPE_IWLAN: - case NETWORK_TYPE_LTE_CA: - return NETWORK_CLASS_4_G; - case NETWORK_TYPE_NR: - return NETWORK_CLASS_5_G; - default: - return NETWORK_CLASS_UNKNOWN; - } - } - /** * Returns a string representation of the radio technology (network type) * currently in use on the device.