Merge "[TNU1.1] Update tethering notification strings"
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 8a25914..a1c8e13 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -328,6 +328,7 @@
         <permission name="android.permission.SUSPEND_APPS" />
         <permission name="android.permission.UPDATE_APP_OPS_STATS"/>
         <permission name="android.permission.USE_RESERVED_DISK"/>
+        <permission name="android.permission.WIFI_UPDATE_USABILITY_STATS_SCORE"/>
         <permission name="android.permission.WRITE_MEDIA_STORAGE"/>
         <permission name="android.permission.WRITE_SECURE_SETTINGS"/>
         <permission name="android.permission.STATUS_BAR_SERVICE"/>
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index d1d080c..ff91c79 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -241,6 +241,9 @@
     <!-- Permission needed to read wifi network credentials for CtsNetTestCases -->
     <uses-permission android:name="android.permission.READ_WIFI_CREDENTIAL" />
 
+    <!-- Permission needed to use wifi usability API's for CtsNetTestCases -->
+    <uses-permission android:name="android.permission.WIFI_UPDATE_USABILITY_STATS_SCORE" />
+
     <!-- Permission required for testing system audio effect APIs. -->
     <uses-permission android:name="android.permission.MODIFY_DEFAULT_AUDIO_EFFECTS"/>
 
diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java
index 7c42cc2..3006ef4 100644
--- a/services/core/java/com/android/server/hdmi/Constants.java
+++ b/services/core/java/com/android/server/hdmi/Constants.java
@@ -306,10 +306,6 @@
     static final String PROPERTY_PREFERRED_ADDRESS_PLAYBACK = "persist.sys.hdmi.addr.playback";
     static final String PROPERTY_PREFERRED_ADDRESS_TV = "persist.sys.hdmi.addr.tv";
 
-    // Property name for the local device configurations.
-    // TODO(OEM): OEM should provide this property, and the value is the comma separated integer
-    //     values which denotes the device type in HDMI Spec 1.4.
-    static final String PROPERTY_DEVICE_TYPE = "ro.hdmi.device_type";
 
     // TODO(OEM): Set this to false to keep the playback device in sleep upon hotplug event.
     //            True by default.
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index a83dd21..d489c39 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -67,6 +67,7 @@
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.provider.Settings.Global;
+import android.sysprop.HdmiProperties;
 import android.text.TextUtils;
 import android.util.ArraySet;
 import android.util.Slog;
@@ -94,6 +95,8 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * Provides a service for sending and processing HDMI control messages,
@@ -435,7 +438,14 @@
 
     public HdmiControlService(Context context) {
         super(context);
-        mLocalDevices = getIntList(SystemProperties.get(Constants.PROPERTY_DEVICE_TYPE));
+        List<Integer> deviceTypes = HdmiProperties.device_type();
+        if (deviceTypes.contains(null)) {
+            Slog.w(TAG, "Error parsing ro.hdmi.device.type: " + SystemProperties.get(
+                    "ro.hdmi.device_type"));
+            deviceTypes = deviceTypes.stream().filter(Objects::nonNull).collect(
+                    Collectors.toList());
+        }
+        mLocalDevices = deviceTypes;
         mSettingsObserver = new SettingsObserver(mHandler);
     }
 
diff --git a/telephony/java/android/telephony/AccessNetworkConstants.java b/telephony/java/android/telephony/AccessNetworkConstants.java
index 01abb26..558f4cd 100644
--- a/telephony/java/android/telephony/AccessNetworkConstants.java
+++ b/telephony/java/android/telephony/AccessNetworkConstants.java
@@ -19,6 +19,10 @@
 import android.annotation.IntDef;
 import android.annotation.SystemApi;
 import android.annotation.TestApi;
+import android.hardware.radio.V1_1.EutranBands;
+import android.hardware.radio.V1_1.GeranBands;
+import android.hardware.radio.V1_5.AccessNetwork;
+import android.hardware.radio.V1_5.UtranBands;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -84,13 +88,13 @@
     public @interface RadioAccessNetworkType {}
 
     public static final class AccessNetworkType {
-        public static final int UNKNOWN = 0;
-        public static final int GERAN = 1;
-        public static final int UTRAN = 2;
-        public static final int EUTRAN = 3;
-        public static final int CDMA2000 = 4;
-        public static final int IWLAN = 5;
-        public static final int NGRAN = 6;
+        public static final int UNKNOWN = AccessNetwork.UNKNOWN;
+        public static final int GERAN = AccessNetwork.GERAN;
+        public static final int UTRAN = AccessNetwork.UTRAN;
+        public static final int EUTRAN = AccessNetwork.EUTRAN;
+        public static final int CDMA2000 = AccessNetwork.CDMA2000;
+        public static final int IWLAN = AccessNetwork.IWLAN;
+        public static final int NGRAN = AccessNetwork.NGRAN;
 
         /** @hide */
         private AccessNetworkType() {}
@@ -115,20 +119,20 @@
      * http://www.etsi.org/deliver/etsi_ts/145000_145099/145005/14.00.00_60/ts_145005v140000p.pdf
      */
     public static final class GeranBand {
-        public static final int BAND_T380 = 1;
-        public static final int BAND_T410 = 2;
-        public static final int BAND_450 = 3;
-        public static final int BAND_480 = 4;
-        public static final int BAND_710 = 5;
-        public static final int BAND_750 = 6;
-        public static final int BAND_T810 = 7;
-        public static final int BAND_850 = 8;
-        public static final int BAND_P900 = 9;
-        public static final int BAND_E900 = 10;
-        public static final int BAND_R900 = 11;
-        public static final int BAND_DCS1800 = 12;
-        public static final int BAND_PCS1900 = 13;
-        public static final int BAND_ER900 = 14;
+        public static final int BAND_T380 = GeranBands.BAND_T380;
+        public static final int BAND_T410 = GeranBands.BAND_T410;
+        public static final int BAND_450 = GeranBands.BAND_450;
+        public static final int BAND_480 = GeranBands.BAND_480;
+        public static final int BAND_710 = GeranBands.BAND_710;
+        public static final int BAND_750 = GeranBands.BAND_750;
+        public static final int BAND_T810 = GeranBands.BAND_T810;
+        public static final int BAND_850 = GeranBands.BAND_850;
+        public static final int BAND_P900 = GeranBands.BAND_P900;
+        public static final int BAND_E900 = GeranBands.BAND_E900;
+        public static final int BAND_R900 = GeranBands.BAND_R900;
+        public static final int BAND_DCS1800 = GeranBands.BAND_DCS1800;
+        public static final int BAND_PCS1900 = GeranBands.BAND_PCS1900;
+        public static final int BAND_ER900 = GeranBands.BAND_ER900;
 
         /** @hide */
         private GeranBand() {}
@@ -139,28 +143,28 @@
      * http://www.etsi.org/deliver/etsi_ts/125100_125199/125104/13.03.00_60/ts_125104v130p.pdf
      */
     public static final class UtranBand {
-        public static final int BAND_1 = 1;
-        public static final int BAND_2 = 2;
-        public static final int BAND_3 = 3;
-        public static final int BAND_4 = 4;
-        public static final int BAND_5 = 5;
-        public static final int BAND_6 = 6;
-        public static final int BAND_7 = 7;
-        public static final int BAND_8 = 8;
-        public static final int BAND_9 = 9;
-        public static final int BAND_10 = 10;
-        public static final int BAND_11 = 11;
-        public static final int BAND_12 = 12;
-        public static final int BAND_13 = 13;
-        public static final int BAND_14 = 14;
+        public static final int BAND_1 = UtranBands.BAND_1;
+        public static final int BAND_2 = UtranBands.BAND_2;
+        public static final int BAND_3 = UtranBands.BAND_3;
+        public static final int BAND_4 = UtranBands.BAND_4;
+        public static final int BAND_5 = UtranBands.BAND_5;
+        public static final int BAND_6 = UtranBands.BAND_6;
+        public static final int BAND_7 = UtranBands.BAND_7;
+        public static final int BAND_8 = UtranBands.BAND_8;
+        public static final int BAND_9 = UtranBands.BAND_9;
+        public static final int BAND_10 = UtranBands.BAND_10;
+        public static final int BAND_11 = UtranBands.BAND_11;
+        public static final int BAND_12 = UtranBands.BAND_12;
+        public static final int BAND_13 = UtranBands.BAND_13;
+        public static final int BAND_14 = UtranBands.BAND_14;
         // band 15, 16, 17, 18 are reserved
-        public static final int BAND_19 = 19;
-        public static final int BAND_20 = 20;
-        public static final int BAND_21 = 21;
-        public static final int BAND_22 = 22;
+        public static final int BAND_19 = UtranBands.BAND_19;
+        public static final int BAND_20 = UtranBands.BAND_20;
+        public static final int BAND_21 = UtranBands.BAND_21;
+        public static final int BAND_22 = UtranBands.BAND_22;
         // band 23, 24 are reserved
-        public static final int BAND_25 = 25;
-        public static final int BAND_26 = 26;
+        public static final int BAND_25 = UtranBands.BAND_25;
+        public static final int BAND_26 = UtranBands.BAND_26;
 
         // Frequency bands for TD-SCDMA. Defined in 3GPP TS 25.102, Table 5.2.
 
@@ -169,38 +173,38 @@
          * 1900 - 1920 MHz: Uplink and downlink transmission
          * 2010 - 2025 MHz: Uplink and downlink transmission
          */
-        public static final int BAND_A = 101;
+        public static final int BAND_A = UtranBands.BAND_A;
 
         /**
          * Band B
          * 1850 - 1910 MHz: Uplink and downlink transmission
          * 1930 - 1990 MHz: Uplink and downlink transmission
          */
-        public static final int BAND_B = 102;
+        public static final int BAND_B = UtranBands.BAND_B;
 
         /**
          * Band C
          * 1910 - 1930 MHz: Uplink and downlink transmission
          */
-        public static final int BAND_C = 103;
+        public static final int BAND_C = UtranBands.BAND_C;
 
         /**
          * Band D
          * 2570 - 2620 MHz: Uplink and downlink transmission
          */
-        public static final int BAND_D = 104;
+        public static final int BAND_D = UtranBands.BAND_D;
 
         /**
          * Band E
          * 2300—2400 MHz: Uplink and downlink transmission
          */
-        public static final int BAND_E = 105;
+        public static final int BAND_E = UtranBands.BAND_E;
 
         /**
          * Band F
          * 1880 - 1920 MHz: Uplink and downlink transmission
          */
-        public static final int BAND_F = 106;
+        public static final int BAND_F = UtranBands.BAND_F;
 
         /** @hide */
         private UtranBand() {}
@@ -211,54 +215,54 @@
      * http://www.etsi.org/deliver/etsi_ts/136100_136199/136101/14.03.00_60/ts_136101v140p.pdf
      */
     public static final class EutranBand {
-        public static final int BAND_1 = 1;
-        public static final int BAND_2 = 2;
-        public static final int BAND_3 = 3;
-        public static final int BAND_4 = 4;
-        public static final int BAND_5 = 5;
-        public static final int BAND_6 = 6;
-        public static final int BAND_7 = 7;
-        public static final int BAND_8 = 8;
-        public static final int BAND_9 = 9;
-        public static final int BAND_10 = 10;
-        public static final int BAND_11 = 11;
-        public static final int BAND_12 = 12;
-        public static final int BAND_13 = 13;
-        public static final int BAND_14 = 14;
-        public static final int BAND_17 = 17;
-        public static final int BAND_18 = 18;
-        public static final int BAND_19 = 19;
-        public static final int BAND_20 = 20;
-        public static final int BAND_21 = 21;
-        public static final int BAND_22 = 22;
-        public static final int BAND_23 = 23;
-        public static final int BAND_24 = 24;
-        public static final int BAND_25 = 25;
-        public static final int BAND_26 = 26;
-        public static final int BAND_27 = 27;
-        public static final int BAND_28 = 28;
-        public static final int BAND_30 = 30;
-        public static final int BAND_31 = 31;
-        public static final int BAND_33 = 33;
-        public static final int BAND_34 = 34;
-        public static final int BAND_35 = 35;
-        public static final int BAND_36 = 36;
-        public static final int BAND_37 = 37;
-        public static final int BAND_38 = 38;
-        public static final int BAND_39 = 39;
-        public static final int BAND_40 = 40;
-        public static final int BAND_41 = 41;
-        public static final int BAND_42 = 42;
-        public static final int BAND_43 = 43;
-        public static final int BAND_44 = 44;
-        public static final int BAND_45 = 45;
-        public static final int BAND_46 = 46;
-        public static final int BAND_47 = 47;
-        public static final int BAND_48 = 48;
-        public static final int BAND_65 = 65;
-        public static final int BAND_66 = 66;
-        public static final int BAND_68 = 68;
-        public static final int BAND_70 = 70;
+        public static final int BAND_1 = EutranBands.BAND_1;
+        public static final int BAND_2 = EutranBands.BAND_2;
+        public static final int BAND_3 = EutranBands.BAND_3;
+        public static final int BAND_4 = EutranBands.BAND_4;
+        public static final int BAND_5 = EutranBands.BAND_5;
+        public static final int BAND_6 = EutranBands.BAND_6;
+        public static final int BAND_7 = EutranBands.BAND_7;
+        public static final int BAND_8 = EutranBands.BAND_8;
+        public static final int BAND_9 = EutranBands.BAND_9;
+        public static final int BAND_10 = EutranBands.BAND_10;
+        public static final int BAND_11 = EutranBands.BAND_11;
+        public static final int BAND_12 = EutranBands.BAND_12;
+        public static final int BAND_13 = EutranBands.BAND_13;
+        public static final int BAND_14 = EutranBands.BAND_14;
+        public static final int BAND_17 = EutranBands.BAND_17;
+        public static final int BAND_18 = EutranBands.BAND_18;
+        public static final int BAND_19 = EutranBands.BAND_19;
+        public static final int BAND_20 = EutranBands.BAND_20;
+        public static final int BAND_21 = EutranBands.BAND_21;
+        public static final int BAND_22 = EutranBands.BAND_22;
+        public static final int BAND_23 = EutranBands.BAND_23;
+        public static final int BAND_24 = EutranBands.BAND_24;
+        public static final int BAND_25 = EutranBands.BAND_25;
+        public static final int BAND_26 = EutranBands.BAND_26;
+        public static final int BAND_27 = EutranBands.BAND_27;
+        public static final int BAND_28 = EutranBands.BAND_28;
+        public static final int BAND_30 = EutranBands.BAND_30;
+        public static final int BAND_31 = EutranBands.BAND_31;
+        public static final int BAND_33 = EutranBands.BAND_33;
+        public static final int BAND_34 = EutranBands.BAND_34;
+        public static final int BAND_35 = EutranBands.BAND_35;
+        public static final int BAND_36 = EutranBands.BAND_36;
+        public static final int BAND_37 = EutranBands.BAND_37;
+        public static final int BAND_38 = EutranBands.BAND_38;
+        public static final int BAND_39 = EutranBands.BAND_39;
+        public static final int BAND_40 = EutranBands.BAND_40;
+        public static final int BAND_41 = EutranBands.BAND_41;
+        public static final int BAND_42 = EutranBands.BAND_42;
+        public static final int BAND_43 = EutranBands.BAND_43;
+        public static final int BAND_44 = EutranBands.BAND_44;
+        public static final int BAND_45 = EutranBands.BAND_45;
+        public static final int BAND_46 = EutranBands.BAND_46;
+        public static final int BAND_47 = EutranBands.BAND_47;
+        public static final int BAND_48 = EutranBands.BAND_48;
+        public static final int BAND_65 = EutranBands.BAND_65;
+        public static final int BAND_66 = EutranBands.BAND_66;
+        public static final int BAND_68 = EutranBands.BAND_68;
+        public static final int BAND_70 = EutranBands.BAND_70;
 
         /** @hide */
         private EutranBand() {};
@@ -304,51 +308,51 @@
      */
     public static final class NgranBands {
         /** FR1 bands */
-        public static final int BAND_1 = 1;
-        public static final int BAND_2 = 2;
-        public static final int BAND_3 = 3;
-        public static final int BAND_5 = 5;
-        public static final int BAND_7 = 7;
-        public static final int BAND_8 = 8;
-        public static final int BAND_12 = 12;
-        public static final int BAND_14 = 14;
-        public static final int BAND_18 = 18;
-        public static final int BAND_20 = 20;
-        public static final int BAND_25 = 25;
-        public static final int BAND_28 = 28;
-        public static final int BAND_29 = 29;
-        public static final int BAND_30 = 30;
-        public static final int BAND_34 = 34;
-        public static final int BAND_38 = 38;
-        public static final int BAND_39 = 39;
-        public static final int BAND_40 = 40;
-        public static final int BAND_41 = 41;
-        public static final int BAND_48 = 48;
-        public static final int BAND_50 = 50;
-        public static final int BAND_51 = 51;
-        public static final int BAND_65 = 65;
-        public static final int BAND_66 = 66;
-        public static final int BAND_70 = 70;
-        public static final int BAND_71 = 71;
-        public static final int BAND_74 = 74;
-        public static final int BAND_75 = 75;
-        public static final int BAND_76 = 76;
-        public static final int BAND_77 = 77;
-        public static final int BAND_78 = 78;
-        public static final int BAND_79 = 79;
-        public static final int BAND_80 = 80;
-        public static final int BAND_81 = 81;
-        public static final int BAND_82 = 82;
-        public static final int BAND_83 = 83;
-        public static final int BAND_84 = 84;
-        public static final int BAND_86 = 86;
-        public static final int BAND_90 = 90;
+        public static final int BAND_1 = android.hardware.radio.V1_5.NgranBands.BAND_1;
+        public static final int BAND_2 = android.hardware.radio.V1_5.NgranBands.BAND_2;
+        public static final int BAND_3 = android.hardware.radio.V1_5.NgranBands.BAND_3;
+        public static final int BAND_5 = android.hardware.radio.V1_5.NgranBands.BAND_5;
+        public static final int BAND_7 = android.hardware.radio.V1_5.NgranBands.BAND_7;
+        public static final int BAND_8 = android.hardware.radio.V1_5.NgranBands.BAND_8;
+        public static final int BAND_12 = android.hardware.radio.V1_5.NgranBands.BAND_12;
+        public static final int BAND_14 = android.hardware.radio.V1_5.NgranBands.BAND_14;
+        public static final int BAND_18 = android.hardware.radio.V1_5.NgranBands.BAND_18;
+        public static final int BAND_20 = android.hardware.radio.V1_5.NgranBands.BAND_20;
+        public static final int BAND_25 = android.hardware.radio.V1_5.NgranBands.BAND_25;
+        public static final int BAND_28 = android.hardware.radio.V1_5.NgranBands.BAND_28;
+        public static final int BAND_29 = android.hardware.radio.V1_5.NgranBands.BAND_29;
+        public static final int BAND_30 = android.hardware.radio.V1_5.NgranBands.BAND_30;
+        public static final int BAND_34 = android.hardware.radio.V1_5.NgranBands.BAND_34;
+        public static final int BAND_38 = android.hardware.radio.V1_5.NgranBands.BAND_38;
+        public static final int BAND_39 = android.hardware.radio.V1_5.NgranBands.BAND_39;
+        public static final int BAND_40 = android.hardware.radio.V1_5.NgranBands.BAND_40;
+        public static final int BAND_41 = android.hardware.radio.V1_5.NgranBands.BAND_41;
+        public static final int BAND_48 = android.hardware.radio.V1_5.NgranBands.BAND_48;
+        public static final int BAND_50 = android.hardware.radio.V1_5.NgranBands.BAND_50;
+        public static final int BAND_51 = android.hardware.radio.V1_5.NgranBands.BAND_51;
+        public static final int BAND_65 = android.hardware.radio.V1_5.NgranBands.BAND_65;
+        public static final int BAND_66 = android.hardware.radio.V1_5.NgranBands.BAND_66;
+        public static final int BAND_70 = android.hardware.radio.V1_5.NgranBands.BAND_70;
+        public static final int BAND_71 = android.hardware.radio.V1_5.NgranBands.BAND_71;
+        public static final int BAND_74 = android.hardware.radio.V1_5.NgranBands.BAND_74;
+        public static final int BAND_75 = android.hardware.radio.V1_5.NgranBands.BAND_75;
+        public static final int BAND_76 = android.hardware.radio.V1_5.NgranBands.BAND_76;
+        public static final int BAND_77 = android.hardware.radio.V1_5.NgranBands.BAND_77;
+        public static final int BAND_78 = android.hardware.radio.V1_5.NgranBands.BAND_78;
+        public static final int BAND_79 = android.hardware.radio.V1_5.NgranBands.BAND_79;
+        public static final int BAND_80 = android.hardware.radio.V1_5.NgranBands.BAND_80;
+        public static final int BAND_81 = android.hardware.radio.V1_5.NgranBands.BAND_81;
+        public static final int BAND_82 = android.hardware.radio.V1_5.NgranBands.BAND_82;
+        public static final int BAND_83 = android.hardware.radio.V1_5.NgranBands.BAND_83;
+        public static final int BAND_84 = android.hardware.radio.V1_5.NgranBands.BAND_84;
+        public static final int BAND_86 = android.hardware.radio.V1_5.NgranBands.BAND_86;
+        public static final int BAND_90 = android.hardware.radio.V1_5.NgranBands.BAND_90;
 
         /** FR2 bands */
-        public static final int BAND_257 = 257;
-        public static final int BAND_258 = 258;
-        public static final int BAND_260 = 260;
-        public static final int BAND_261 = 261;
+        public static final int BAND_257 = android.hardware.radio.V1_5.NgranBands.BAND_257;
+        public static final int BAND_258 = android.hardware.radio.V1_5.NgranBands.BAND_258;
+        public static final int BAND_260 = android.hardware.radio.V1_5.NgranBands.BAND_260;
+        public static final int BAND_261 = android.hardware.radio.V1_5.NgranBands.BAND_261;
 
         /**
          * NR Bands
diff --git a/telephony/java/android/telephony/CellInfo.java b/telephony/java/android/telephony/CellInfo.java
index bfa209b..b381cce 100644
--- a/telephony/java/android/telephony/CellInfo.java
+++ b/telephony/java/android/telephony/CellInfo.java
@@ -21,6 +21,7 @@
 import android.annotation.NonNull;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.hardware.radio.V1_4.CellInfo.Info;
+import android.hardware.radio.V1_5.CellInfo.CellInfoRatSpecificInfo;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -28,6 +29,7 @@
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.Objects;
 
 /**
  * Immutable cell information from a point in time.
@@ -152,7 +154,7 @@
     protected CellInfo() {
         this.mRegistered = false;
         this.mTimeStamp = Long.MAX_VALUE;
-        mCellConnectionStatus = CONNECTION_NONE;
+        this.mCellConnectionStatus = CONNECTION_NONE;
     }
 
     /** @hide */
@@ -240,27 +242,17 @@
 
     @Override
     public int hashCode() {
-        int primeNum = 31;
-        return ((mRegistered ? 0 : 1) * primeNum) + ((int)(mTimeStamp / 1000) * primeNum)
-                + (mCellConnectionStatus * primeNum);
+        return Objects.hash(mCellConnectionStatus, mRegistered, mTimeStamp);
     }
 
     @Override
-    public boolean equals(Object other) {
-        if (other == null) {
-            return false;
-        }
-        if (this == other) {
-            return true;
-        }
-        try {
-            CellInfo o = (CellInfo) other;
-            return mRegistered == o.mRegistered
-                    && mTimeStamp == o.mTimeStamp
-                    && mCellConnectionStatus == o.mCellConnectionStatus;
-        } catch (ClassCastException e) {
-            return false;
-        }
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof CellInfo)) return false;
+        CellInfo cellInfo = (CellInfo) o;
+        return mCellConnectionStatus == cellInfo.mCellConnectionStatus
+                && mRegistered == cellInfo.mRegistered
+                && mTimeStamp == cellInfo.mTimeStamp;
     }
 
     @Override
@@ -353,6 +345,13 @@
     }
 
     /** @hide */
+    protected CellInfo(android.hardware.radio.V1_5.CellInfo ci, long timeStamp) {
+        this.mRegistered = ci.registered;
+        this.mTimeStamp = timeStamp;
+        this.mCellConnectionStatus = ci.connectionStatus;
+    }
+
+    /** @hide */
     public static CellInfo create(android.hardware.radio.V1_0.CellInfo ci) {
         if (ci == null) return null;
         switch(ci.cellInfoType) {
@@ -391,4 +390,24 @@
             default: return null;
         }
     }
+
+    /** @hide */
+    public static CellInfo create(android.hardware.radio.V1_5.CellInfo ci, long timeStamp) {
+        if (ci == null) return null;
+        switch (ci.ratSpecificInfo.getDiscriminator()) {
+            case CellInfoRatSpecificInfo.hidl_discriminator.gsm:
+                return new CellInfoGsm(ci, timeStamp);
+            case CellInfoRatSpecificInfo.hidl_discriminator.cdma:
+                return new CellInfoCdma(ci, timeStamp);
+            case CellInfoRatSpecificInfo.hidl_discriminator.lte:
+                return new CellInfoLte(ci, timeStamp);
+            case CellInfoRatSpecificInfo.hidl_discriminator.wcdma:
+                return new CellInfoWcdma(ci, timeStamp);
+            case CellInfoRatSpecificInfo.hidl_discriminator.tdscdma:
+                return new CellInfoTdscdma(ci, timeStamp);
+            case CellInfoRatSpecificInfo.hidl_discriminator.nr:
+                return new CellInfoNr(ci, timeStamp);
+            default: return null;
+        }
+    }
 }
diff --git a/telephony/java/android/telephony/CellInfoCdma.java b/telephony/java/android/telephony/CellInfoCdma.java
index 0edb4a4..1bef681 100644
--- a/telephony/java/android/telephony/CellInfoCdma.java
+++ b/telephony/java/android/telephony/CellInfoCdma.java
@@ -78,6 +78,15 @@
                 new CellSignalStrengthCdma(cic.signalStrengthCdma, cic.signalStrengthEvdo);
     }
 
+    /** @hide */
+    public CellInfoCdma(android.hardware.radio.V1_5.CellInfo ci, long timeStamp) {
+        super(ci, timeStamp);
+        final android.hardware.radio.V1_2.CellInfoCdma cic = ci.ratSpecificInfo.cdma();
+        mCellIdentityCdma = new CellIdentityCdma(cic.cellIdentityCdma);
+        mCellSignalStrengthCdma =
+                new CellSignalStrengthCdma(cic.signalStrengthCdma, cic.signalStrengthEvdo);
+    }
+
     /**
      * @return a {@link CellIdentityCdma} instance.
      */
diff --git a/telephony/java/android/telephony/CellInfoGsm.java b/telephony/java/android/telephony/CellInfoGsm.java
index 2dddd3f..c19521f 100644
--- a/telephony/java/android/telephony/CellInfoGsm.java
+++ b/telephony/java/android/telephony/CellInfoGsm.java
@@ -73,6 +73,14 @@
         mCellSignalStrengthGsm = new CellSignalStrengthGsm(cig.signalStrengthGsm);
     }
 
+    /** @hide */
+    public CellInfoGsm(android.hardware.radio.V1_5.CellInfo ci, long timeStamp) {
+        super(ci, timeStamp);
+        final android.hardware.radio.V1_5.CellInfoGsm cig = ci.ratSpecificInfo.gsm();
+        mCellIdentityGsm = new CellIdentityGsm(cig.cellIdentityGsm);
+        mCellSignalStrengthGsm = new CellSignalStrengthGsm(cig.signalStrengthGsm);
+    }
+
     /**
      * @return a {@link CellIdentityGsm} instance.
      */
diff --git a/telephony/java/android/telephony/CellInfoLte.java b/telephony/java/android/telephony/CellInfoLte.java
index a57c7cd..320925e 100644
--- a/telephony/java/android/telephony/CellInfoLte.java
+++ b/telephony/java/android/telephony/CellInfoLte.java
@@ -82,6 +82,15 @@
         mCellConfig = new CellConfigLte(cil.cellConfig);
     }
 
+    /** @hide */
+    public CellInfoLte(android.hardware.radio.V1_5.CellInfo ci, long timeStamp) {
+        super(ci, timeStamp);
+        final android.hardware.radio.V1_5.CellInfoLte cil = ci.ratSpecificInfo.lte();
+        mCellIdentityLte = new CellIdentityLte(cil.cellIdentityLte);
+        mCellSignalStrengthLte = new CellSignalStrengthLte(cil.signalStrengthLte);
+        mCellConfig = new CellConfigLte();
+    }
+
     /**
      * @return a {@link CellIdentityLte} instance.
      */
diff --git a/telephony/java/android/telephony/CellInfoNr.java b/telephony/java/android/telephony/CellInfoNr.java
index 8b41b8b..a7e79f9 100644
--- a/telephony/java/android/telephony/CellInfoNr.java
+++ b/telephony/java/android/telephony/CellInfoNr.java
@@ -53,6 +53,14 @@
         mCellSignalStrength = new CellSignalStrengthNr(cil.signalStrength);
     }
 
+    /** @hide */
+    public CellInfoNr(android.hardware.radio.V1_5.CellInfo ci, long timeStamp) {
+        super(ci, timeStamp);
+        final android.hardware.radio.V1_5.CellInfoNr cil = ci.ratSpecificInfo.nr();
+        mCellIdentity = new CellIdentityNr(cil.cellIdentityNr);
+        mCellSignalStrength = new CellSignalStrengthNr(cil.signalStrengthNr);
+    }
+
     /**
      * @return a {@link CellIdentityNr} instance.
      */
diff --git a/telephony/java/android/telephony/CellInfoTdscdma.java b/telephony/java/android/telephony/CellInfoTdscdma.java
index d2cc9c6c..038c49a 100644
--- a/telephony/java/android/telephony/CellInfoTdscdma.java
+++ b/telephony/java/android/telephony/CellInfoTdscdma.java
@@ -77,6 +77,14 @@
         mCellSignalStrengthTdscdma = new CellSignalStrengthTdscdma(cit.signalStrengthTdscdma);
     }
 
+    /** @hide */
+    public CellInfoTdscdma(android.hardware.radio.V1_5.CellInfo ci, long timeStamp) {
+        super(ci, timeStamp);
+        final android.hardware.radio.V1_5.CellInfoTdscdma cit = ci.ratSpecificInfo.tdscdma();
+        mCellIdentityTdscdma = new CellIdentityTdscdma(cit.cellIdentityTdscdma);
+        mCellSignalStrengthTdscdma = new CellSignalStrengthTdscdma(cit.signalStrengthTdscdma);
+    }
+
     /**
      * @return a {@link CellIdentityTdscdma} instance.
      */
diff --git a/telephony/java/android/telephony/CellInfoWcdma.java b/telephony/java/android/telephony/CellInfoWcdma.java
index 3f792d1..c74955f 100644
--- a/telephony/java/android/telephony/CellInfoWcdma.java
+++ b/telephony/java/android/telephony/CellInfoWcdma.java
@@ -72,6 +72,14 @@
         mCellSignalStrengthWcdma = new CellSignalStrengthWcdma(ciw.signalStrengthWcdma);
     }
 
+    /** @hide */
+    public CellInfoWcdma(android.hardware.radio.V1_5.CellInfo ci, long timeStamp) {
+        super(ci, timeStamp);
+        final android.hardware.radio.V1_5.CellInfoWcdma ciw = ci.ratSpecificInfo.wcdma();
+        mCellIdentityWcdma = new CellIdentityWcdma(ciw.cellIdentityWcdma);
+        mCellSignalStrengthWcdma = new CellSignalStrengthWcdma(ciw.signalStrengthWcdma);
+    }
+
     /**
      * @return a {@link CellIdentityWcdma} instance.
      */