Create IRadioDataResponse and IRadioDataIndication

Move all RIL conversion methods into RILUtils

Test: atest RILTest
Bug: 198331673
Change-Id: Ieca47cf2b300af11593a76ed5f178893ca09583e
Merged-In: Ieca47cf2b300af11593a76ed5f178893ca09583e
diff --git a/Android.bp b/Android.bp
index 9aa92f9..bf70772 100644
--- a/Android.bp
+++ b/Android.bp
@@ -105,6 +105,12 @@
         "android.hardware.radio-V1.4-java",
         "android.hardware.radio-V1.5-java",
         "android.hardware.radio-V1.6-java",
+        "android.hardware.radio.data-V1-java",
+        "android.hardware.radio.messaging-V1-java",
+        "android.hardware.radio.modem-V1-java",
+        "android.hardware.radio.network-V1-java",
+        "android.hardware.radio.sim-V1-java",
+        "android.hardware.radio.voice-V1-java",
         "voip-common",
         "ims-common",
         "unsupportedappusage",
diff --git a/src/java/com/android/internal/telephony/DataIndication.java b/src/java/com/android/internal/telephony/DataIndication.java
new file mode 100644
index 0000000..9da1e7c
--- /dev/null
+++ b/src/java/com/android/internal/telephony/DataIndication.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2021 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 com.android.internal.telephony;
+
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_DATA_CALL_LIST_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_KEEPALIVE_STATUS;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_PCO_DATA;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_UNTHROTTLE_APN;
+
+import android.hardware.radio.data.IRadioDataIndication;
+import android.os.AsyncResult;
+import android.os.RemoteException;
+import android.telephony.PcoData;
+import android.telephony.data.DataCallResponse;
+
+import com.android.internal.telephony.dataconnection.KeepaliveStatus;
+
+import java.util.ArrayList;
+
+/**
+ * Interface declaring unsolicited radio indications for data APIs.
+ */
+public class DataIndication extends IRadioDataIndication.Stub {
+    RIL mRil;
+
+    DataIndication(RIL ril) {
+        mRil = ril;
+    }
+
+    /**
+     * Indicates data call contexts have changed.
+     * @param indicationType RadioIndicationType
+     * @param dcList List of SetupDataCallResult identical to that returned by getDataCallList.
+     *               It is the complete list of current data contexts including new contexts that
+     *               have been activated.
+     */
+    public void dataCallListChanged(int indicationType,
+            android.hardware.radio.data.SetupDataCallResult[] dcList) {
+        mRil.processIndication(indicationType);
+
+        if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_DATA_CALL_LIST_CHANGED, dcList);
+        ArrayList<DataCallResponse> response = RILUtils.convertHalDataCallResultList(dcList);
+        mRil.mDataCallListChangedRegistrants.notifyRegistrants(
+                new AsyncResult(null, response, null));
+    }
+
+    /**
+     * Indicates a status update for an ongoing Keepalive session.
+     * @param indicationType RadioIndicationType
+     * @param halStatus Status of the ongoing Keepalive session
+     */
+    public void keepaliveStatus(int indicationType,
+            android.hardware.radio.data.KeepaliveStatus halStatus) {
+        mRil.processIndication(indicationType);
+
+        if (RIL.RILJ_LOGD) {
+            mRil.unsljLogRet(RIL_UNSOL_KEEPALIVE_STATUS,
+                    "handle=" + halStatus.sessionHandle + " code=" +  halStatus.code);
+        }
+
+        KeepaliveStatus ks = new KeepaliveStatus(halStatus.sessionHandle, halStatus.code);
+        mRil.mNattKeepaliveStatusRegistrants.notifyRegistrants(new AsyncResult(null, ks, null));
+    }
+
+    /**
+     * Indicates when there is new Carrier PCO data received for a data call.
+     * @param indicationType RadioIndicationType
+     * @param pco New PcoData
+     */
+    public void pcoData(int indicationType, android.hardware.radio.data.PcoDataInfo pco) {
+        mRil.processIndication(indicationType);
+
+        PcoData response = new PcoData(pco.cid, pco.bearerProto, pco.pcoId, pco.contents);
+
+        if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_PCO_DATA, response);
+
+        mRil.mPcoDataRegistrants.notifyRegistrants(new AsyncResult(null, response, null));
+    }
+
+    /**
+     * Stop throttling calls to setupDataCall for the given APN.
+     * @param indicationType RadioIndicationType
+     * @param apn APN to unthrottle
+     * @throws RemoteException
+     */
+    public void unthrottleApn(int indicationType, String apn) throws RemoteException {
+        mRil.processIndication(indicationType);
+
+        if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_UNTHROTTLE_APN, apn);
+
+        mRil.mApnUnthrottledRegistrants.notifyRegistrants(
+                new AsyncResult(null, apn, null));
+    }
+}
diff --git a/src/java/com/android/internal/telephony/DataResponse.java b/src/java/com/android/internal/telephony/DataResponse.java
new file mode 100644
index 0000000..1688513
--- /dev/null
+++ b/src/java/com/android/internal/telephony/DataResponse.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2021 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 com.android.internal.telephony;
+
+import android.hardware.radio.RadioError;
+import android.hardware.radio.RadioResponseInfo;
+import android.hardware.radio.data.IRadioDataResponse;
+import android.os.AsyncResult;
+import android.os.Message;
+import android.telephony.data.DataCallResponse;
+import android.telephony.data.SlicingConfig;
+
+import com.android.internal.telephony.dataconnection.KeepaliveStatus;
+
+import java.util.ArrayList;
+
+/**
+ * Interface declaring response functions to solicited radio requests for data APIs.
+ */
+public class DataResponse extends IRadioDataResponse.Stub {
+    private final RIL mRil;
+
+    public DataResponse(RIL ril) {
+        mRil = ril;
+    }
+
+    /**
+     * Helper function to send response msg
+     * @param msg Response message to be sent
+     * @param ret Return object to be included in the response message
+     */
+    private static void sendMessageResponse(Message msg, Object ret) {
+        if (msg != null) {
+            AsyncResult.forMessage(msg, ret, null);
+            msg.sendToTarget();
+        }
+    }
+
+    private void responseVoid(RadioResponseInfo responseInfo) {
+        RILRequest rr = mRil.processResponse(responseInfo);
+
+        if (rr != null) {
+            Object ret = null;
+            if (responseInfo.error == RadioError.NONE) {
+                sendMessageResponse(rr.mResult, ret);
+            }
+            mRil.processResponseDone(rr, responseInfo, ret);
+        }
+    }
+
+    /**
+     * Acknowledge the receipt of radio request sent to the vendor. This must be sent only for
+     * radio request which take long time to respond.
+     * For more details, refer https://source.android.com/devices/tech/connect/ril.html
+     * @param serial Serial no. of the request whose acknowledgement is sent.
+     */
+    public void acknowledgeRequest(int serial) {
+        mRil.processRequestAck(serial);
+    }
+
+    /**
+     * @param responseInfo Response info struct containing response type, serial no. and error
+     * @param id The pdu session id allocated
+     */
+    public void allocatePduSessionIdResponse(RadioResponseInfo responseInfo, int id) {
+        RILRequest rr = mRil.processResponse(responseInfo);
+        if (rr != null) {
+            if (responseInfo.error == RadioError.NONE) {
+                sendMessageResponse(rr.mResult, id);
+            }
+            mRil.processResponseDone(rr, responseInfo, id);
+        }
+    }
+
+    /**
+     * @param responseInfo Response info struct containing response type, serial no. and error
+     */
+    public void cancelHandoverResponse(RadioResponseInfo responseInfo) {
+        responseVoid(responseInfo);
+    }
+
+    /**
+     * @param responseInfo Response info struct containing response type, serial no. and error
+     */
+    public void deactivateDataCallResponse(RadioResponseInfo responseInfo) {
+        responseVoid(responseInfo);
+    }
+
+    /**
+     * @param responseInfo Response info struct containing response type, serial no. and error
+     * @param dataCallResultList Response to get data call list as defined by setupDataCallResult in
+     *                           types.hal
+     */
+    public void getDataCallListResponse(RadioResponseInfo responseInfo,
+            android.hardware.radio.data.SetupDataCallResult[] dataCallResultList) {
+        RILRequest rr = mRil.processResponse(responseInfo);
+
+        if (rr != null) {
+            ArrayList<DataCallResponse> response =
+                    RILUtils.convertHalDataCallResultList(dataCallResultList);
+            if (responseInfo.error == RadioError.NONE) {
+                sendMessageResponse(rr.mResult, response);
+            }
+            mRil.processResponseDone(rr, responseInfo, response);
+        }
+    }
+
+    /**
+     * @param responseInfo Response info struct containing response type, serial no. and error
+     * @param slicingConfig Current slicing configuration
+     */
+    public void getSlicingConfigResponse(RadioResponseInfo responseInfo,
+                android.hardware.radio.data.SlicingConfig slicingConfig) {
+        RILRequest rr = mRil.processResponse(responseInfo);
+
+        if (rr != null) {
+            SlicingConfig ret = RILUtils.convertHalSlicingConfig(slicingConfig);
+            if (responseInfo.error == RadioError.NONE) {
+                sendMessageResponse(rr.mResult, ret);
+            }
+            mRil.processResponseDone(rr, responseInfo, ret);
+        }
+    }
+
+    /**
+     * @param responseInfo Response info struct containing response type, serial no. and error
+     */
+    public void releasePduSessionIdResponse(RadioResponseInfo responseInfo) {
+        responseVoid(responseInfo);
+    }
+
+    /**
+     * @param responseInfo Response info struct containing response type, serial no. and error
+     */
+    public void setDataAllowedResponse(RadioResponseInfo responseInfo) {
+        responseVoid(responseInfo);
+    }
+
+    /**
+     * @param responseInfo Response info struct containing response type, serial no. and error
+     */
+    public void setDataProfileResponse(RadioResponseInfo responseInfo) {
+        responseVoid(responseInfo);
+    }
+
+    /**
+     * @param responseInfo Response info struct containing response type, serial no. and error
+     */
+    public void setDataThrottlingResponse(RadioResponseInfo responseInfo) {
+        responseVoid(responseInfo);
+    }
+
+    /**
+     * @param responseInfo Response info struct containing response type, serial no. and error
+     */
+    public void setInitialAttachApnResponse(RadioResponseInfo responseInfo) {
+        responseVoid(responseInfo);
+    }
+
+    /**
+     * @param responseInfo Response info struct containing response type, serial no. and error
+     * @param setupDataCallResult Response to data call setup as defined by SetupDataCallResult
+     */
+    public void setupDataCallResponse(RadioResponseInfo responseInfo,
+            android.hardware.radio.data.SetupDataCallResult setupDataCallResult) {
+        RILRequest rr = mRil.processResponse(responseInfo);
+
+        if (rr != null) {
+            DataCallResponse response = RILUtils.convertHalDataCallResult(setupDataCallResult);
+            if (responseInfo.error == RadioError.NONE) {
+                sendMessageResponse(rr.mResult, response);
+            }
+            mRil.processResponseDone(rr, responseInfo, response);
+        }
+    }
+
+    /**
+     * @param responseInfo Response info struct containing response type, serial no. and error
+     */
+    public void startHandoverResponse(RadioResponseInfo responseInfo) {
+        responseVoid(responseInfo);
+    }
+
+    /**
+     * @param responseInfo Response info struct containing response type, serial no. and error
+     * @param keepaliveStatus status of the keepalive with a handle for the session
+     */
+    public void startKeepaliveResponse(RadioResponseInfo responseInfo,
+            android.hardware.radio.data.KeepaliveStatus keepaliveStatus) {
+
+        RILRequest rr = mRil.processResponse(responseInfo);
+        if (rr == null) return;
+
+        KeepaliveStatus ret = null;
+        try {
+            switch(responseInfo.error) {
+                case RadioError.NONE:
+                    int convertedStatus = RILUtils.convertHalKeepaliveStatusCode(
+                            keepaliveStatus.code);
+                    if (convertedStatus < 0) {
+                        ret = new KeepaliveStatus(KeepaliveStatus.ERROR_UNSUPPORTED);
+                    } else {
+                        ret = new KeepaliveStatus(keepaliveStatus.sessionHandle, convertedStatus);
+                    }
+                    // If responseInfo.error is NONE, response function sends the response message
+                    // even if result is actually an error.
+                    sendMessageResponse(rr.mResult, ret);
+                    break;
+                case RadioError.REQUEST_NOT_SUPPORTED:
+                    ret = new KeepaliveStatus(KeepaliveStatus.ERROR_UNSUPPORTED);
+                    break;
+                case RadioError.NO_RESOURCES:
+                    ret = new KeepaliveStatus(KeepaliveStatus.ERROR_NO_RESOURCES);
+                    break;
+                default:
+                    ret = new KeepaliveStatus(KeepaliveStatus.ERROR_UNKNOWN);
+                    break;
+            }
+        } finally {
+            // If responseInfo.error != NONE, the processResponseDone sends the response message.
+            mRil.processResponseDone(rr, responseInfo, ret);
+        }
+    }
+
+    /**
+     * @param responseInfo Response info struct containing response type, serial no. and error
+     */
+    public void stopKeepaliveResponse(RadioResponseInfo responseInfo) {
+        RILRequest rr = mRil.processResponse(responseInfo);
+        if (rr == null) return;
+
+        try {
+            if (responseInfo.error == RadioError.NONE) {
+                sendMessageResponse(rr.mResult, null);
+            } else {
+                //TODO: Error code translation
+            }
+        } finally {
+            mRil.processResponseDone(rr, responseInfo, null);
+        }
+    }
+}
diff --git a/src/java/com/android/internal/telephony/OemHookIndication.java b/src/java/com/android/internal/telephony/OemHookIndication.java
index 122a70e..82648e1 100644
--- a/src/java/com/android/internal/telephony/OemHookIndication.java
+++ b/src/java/com/android/internal/telephony/OemHookIndication.java
@@ -16,13 +16,13 @@
 
 package com.android.internal.telephony;
 
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_OEM_HOOK_RAW;
+
 import android.hardware.radio.deprecated.V1_0.IOemHookIndication;
 import android.os.AsyncResult;
 
 import java.util.ArrayList;
 
-import static com.android.internal.telephony.RILConstants.RIL_UNSOL_OEM_HOOK_RAW;
-
 /**
  * Class containing oem hook indication callbacks
  */
@@ -40,7 +40,7 @@
     public void oemHookRaw(int indicationType, ArrayList<Byte> data) {
         mRil.processIndication(indicationType);
 
-        byte[] response = RIL.arrayListToPrimitiveArray(data);
+        byte[] response = RILUtils.arrayListToPrimitiveArray(data);
         if (RIL.RILJ_LOGD) {
             mRil.unsljLogvRet(RIL_UNSOL_OEM_HOOK_RAW,
                     com.android.internal.telephony.uicc.IccUtils.bytesToHexString(response));
diff --git a/src/java/com/android/internal/telephony/OemHookResponse.java b/src/java/com/android/internal/telephony/OemHookResponse.java
index 0afeac8..32e7dfb 100644
--- a/src/java/com/android/internal/telephony/OemHookResponse.java
+++ b/src/java/com/android/internal/telephony/OemHookResponse.java
@@ -16,9 +16,9 @@
 
 package com.android.internal.telephony;
 
-import android.hardware.radio.deprecated.V1_0.IOemHookResponse;
 import android.hardware.radio.V1_0.RadioError;
 import android.hardware.radio.V1_0.RadioResponseInfo;
+import android.hardware.radio.deprecated.V1_0.IOemHookResponse;
 
 import java.util.ArrayList;
 
@@ -42,7 +42,7 @@
         if (rr != null) {
             byte[] ret = null;
             if (responseInfo.error == RadioError.NONE) {
-                ret = RIL.arrayListToPrimitiveArray(data);
+                ret = RILUtils.arrayListToPrimitiveArray(data);
                 RadioResponse.sendMessageResponse(rr.mResult, ret);
             }
             mRil.processResponseDone(rr, responseInfo, ret);
diff --git a/src/java/com/android/internal/telephony/RIL.java b/src/java/com/android/internal/telephony/RIL.java
index 71a751c..af54eac 100644
--- a/src/java/com/android/internal/telephony/RIL.java
+++ b/src/java/com/android/internal/telephony/RIL.java
@@ -23,47 +23,38 @@
 import android.annotation.Nullable;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.Context;
-import android.hardware.radio.V1_0.Carrier;
 import android.hardware.radio.V1_0.CarrierRestrictions;
 import android.hardware.radio.V1_0.CdmaBroadcastSmsConfigInfo;
 import android.hardware.radio.V1_0.CdmaSmsAck;
 import android.hardware.radio.V1_0.CdmaSmsMessage;
 import android.hardware.radio.V1_0.CdmaSmsWriteArgs;
-import android.hardware.radio.V1_0.DataProfileId;
 import android.hardware.radio.V1_0.Dial;
 import android.hardware.radio.V1_0.GsmBroadcastSmsConfigInfo;
 import android.hardware.radio.V1_0.GsmSmsMessage;
-import android.hardware.radio.V1_0.HardwareConfigModem;
 import android.hardware.radio.V1_0.IRadio;
 import android.hardware.radio.V1_0.IccIo;
 import android.hardware.radio.V1_0.ImsSmsMessage;
-import android.hardware.radio.V1_0.LceDataInfo;
-import android.hardware.radio.V1_0.MvnoType;
 import android.hardware.radio.V1_0.NvWriteItem;
 import android.hardware.radio.V1_0.RadioError;
 import android.hardware.radio.V1_0.RadioIndicationType;
 import android.hardware.radio.V1_0.RadioResponseInfo;
 import android.hardware.radio.V1_0.RadioResponseType;
 import android.hardware.radio.V1_0.RadioTechnologyFamily;
-import android.hardware.radio.V1_0.ResetNvType;
 import android.hardware.radio.V1_0.SelectUiccSub;
 import android.hardware.radio.V1_0.SimApdu;
 import android.hardware.radio.V1_0.SmsWriteArgs;
 import android.hardware.radio.V1_0.UusInfo;
 import android.hardware.radio.V1_4.CarrierRestrictionsWithPriority;
 import android.hardware.radio.V1_4.SimLockMultiSimPolicy;
-import android.hardware.radio.V1_5.AccessNetwork;
 import android.hardware.radio.V1_5.IndicationFilter;
-import android.hardware.radio.V1_5.PersoSubstate;
-import android.hardware.radio.V1_5.RadioAccessNetworks;
-import android.hardware.radio.V1_6.OptionalDnn;
-import android.hardware.radio.V1_6.OptionalOsAppId;
-import android.hardware.radio.V1_6.OptionalSliceInfo;
-import android.hardware.radio.V1_6.OptionalTrafficDescriptor;
+import android.hardware.radio.data.IRadioData;
 import android.hardware.radio.deprecated.V1_0.IOemHook;
-import android.net.InetAddresses;
+import android.hardware.radio.messaging.IRadioMessaging;
+import android.hardware.radio.modem.IRadioModem;
+import android.hardware.radio.network.IRadioNetwork;
+import android.hardware.radio.sim.IRadioSim;
+import android.hardware.radio.voice.IRadioVoice;
 import android.net.KeepalivePacketData;
-import android.net.LinkAddress;
 import android.net.LinkProperties;
 import android.os.AsyncResult;
 import android.os.Build;
@@ -76,7 +67,6 @@
 import android.os.SystemClock;
 import android.os.WorkSource;
 import android.provider.Settings;
-import android.service.carrier.CarrierIdentifier;
 import android.sysprop.TelephonyProperties;
 import android.telephony.AccessNetworkConstants.AccessNetworkType;
 import android.telephony.CarrierRestrictionRules;
@@ -89,7 +79,6 @@
 import android.telephony.CellSignalStrengthWcdma;
 import android.telephony.ClientRequestStats;
 import android.telephony.ImsiEncryptionInfo;
-import android.telephony.LinkCapacityEstimate;
 import android.telephony.ModemActivityInfo;
 import android.telephony.NeighboringCellInfo;
 import android.telephony.NetworkScanRequest;
@@ -99,28 +88,19 @@
 import android.telephony.ServiceState;
 import android.telephony.SignalStrength;
 import android.telephony.SignalThresholdInfo;
-import android.telephony.SmsManager;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyHistogram;
 import android.telephony.TelephonyManager;
 import android.telephony.TelephonyManager.PrefNetworkMode;
-import android.telephony.data.ApnSetting;
-import android.telephony.data.DataCallResponse;
-import android.telephony.data.DataCallResponse.HandoverFailureMode;
 import android.telephony.data.DataProfile;
 import android.telephony.data.DataService;
 import android.telephony.data.NetworkSliceInfo;
-import android.telephony.data.Qos;
-import android.telephony.data.QosBearerSession;
 import android.telephony.data.TrafficDescriptor;
 import android.telephony.emergency.EmergencyNumber;
 import android.text.TextUtils;
-import android.util.Log;
 import android.util.SparseArray;
 
 import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.telephony.cat.ComprehensionTlv;
-import com.android.internal.telephony.cat.ComprehensionTlvTag;
 import com.android.internal.telephony.cdma.CdmaInformationRecords;
 import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo;
 import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
@@ -133,10 +113,7 @@
 import com.android.internal.telephony.util.TelephonyUtils;
 import com.android.telephony.Rlog;
 
-import java.io.ByteArrayInputStream;
-import java.io.DataInputStream;
 import java.io.FileDescriptor;
-import java.io.IOException;
 import java.io.PrintWriter;
 import java.net.Inet4Address;
 import java.net.Inet6Address;
@@ -283,6 +260,24 @@
     RadioResponse mRadioResponse;
     RadioIndication mRadioIndication;
     volatile IRadio mRadioProxy = null;
+    DataResponse mDataResponse;
+    DataIndication mDataIndication;
+    volatile IRadioData mDataProxy = null;
+    //MessagingResponse mMessagingResponse;
+    //MessagingIndication mMessagingIndication;
+    volatile IRadioMessaging mMessagingProxy = null;
+    //ModemResponse mModemResponse;
+    //ModemIndication mModemIndication;
+    volatile IRadioModem mModemProxy = null;
+    //NetworkResponse mNetworkResponse;
+    //NetworkIndication mNetworkIndication;
+    volatile IRadioNetwork mNetworkProxy = null;
+    //SimResponse mSimResponse;
+    //SimIndication mSimIndication;
+    volatile IRadioSim mSimProxy = null;
+    //VoiceResponse mVoiceResponse;
+    //VoiceIndication mVoiceIndication;
+    volatile IRadioVoice mVoiceProxy = null;
     OemHookResponse mOemHookResponse;
     OemHookIndication mOemHookIndication;
     volatile IOemHook mOemHookProxy = null;
@@ -358,7 +353,7 @@
                                 for (int i = 0; i < count; i++) {
                                     rr = mRequestList.valueAt(i);
                                     Rlog.d(RILJ_LOG_TAG, i + ": [" + rr.mSerial + "] "
-                                            + requestToString(rr.mRequest));
+                                            + RILUtils.requestToString(rr.mRequest));
                                 }
                             }
                         }
@@ -689,6 +684,8 @@
 
         mRadioResponse = new RadioResponse(this);
         mRadioIndication = new RadioIndication(this);
+        mDataResponse = new DataResponse(this);
+        mDataIndication = new DataIndication(this);
         mOemHookResponse = new OemHookResponse(this);
         mOemHookIndication = new OemHookIndication(this);
         mRilHandler = new RilHandler();
@@ -766,10 +763,6 @@
         resetProxyAndRequestList();
     }
 
-    private static String convertNullToEmptyString(String string) {
-        return string != null ? string : "";
-    }
-
     @Override
     public void getIccCardStatus(Message result) {
         IRadio radioProxy = getRadioProxy(result);
@@ -777,7 +770,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_GET_SIM_STATUS, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getIccCardStatus(rr.mSerial);
@@ -818,14 +813,14 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " aid = " + aid);
             }
 
             try {
                 radioProxy.supplyIccPinForApp(rr.mSerial,
-                        convertNullToEmptyString(pin),
-                        convertNullToEmptyString(aid));
+                        RILUtils.convertNullToEmptyString(pin),
+                        RILUtils.convertNullToEmptyString(aid));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "supplyIccPinForApp", e);
             }
@@ -844,18 +839,17 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_ENTER_SIM_PUK, result,
                     mRILDefaultWorkSource);
 
-            String pukStr = convertNullToEmptyString(puk);
+            String pukStr = RILUtils.convertNullToEmptyString(puk);
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
-                        + " isPukEmpty = " + pukStr.isEmpty()
-                        + " aid = " + aid);
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + " isPukEmpty = " + pukStr.isEmpty() + " aid = " + aid);
             }
 
             try {
                 radioProxy.supplyIccPukForApp(rr.mSerial,
                         pukStr,
-                        convertNullToEmptyString(newPin),
-                        convertNullToEmptyString(aid));
+                        RILUtils.convertNullToEmptyString(newPin),
+                        RILUtils.convertNullToEmptyString(aid));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "supplyIccPukForApp", e);
             }
@@ -875,14 +869,14 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " aid = " + aid);
             }
 
             try {
                 radioProxy.supplyIccPin2ForApp(rr.mSerial,
-                        convertNullToEmptyString(pin),
-                        convertNullToEmptyString(aid));
+                        RILUtils.convertNullToEmptyString(pin),
+                        RILUtils.convertNullToEmptyString(aid));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "supplyIccPin2ForApp", e);
             }
@@ -902,15 +896,15 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " aid = " + aid);
             }
 
             try {
                 radioProxy.supplyIccPuk2ForApp(rr.mSerial,
-                        convertNullToEmptyString(puk),
-                        convertNullToEmptyString(newPin2),
-                        convertNullToEmptyString(aid));
+                        RILUtils.convertNullToEmptyString(puk),
+                        RILUtils.convertNullToEmptyString(newPin2),
+                        RILUtils.convertNullToEmptyString(aid));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "supplyIccPuk2ForApp", e);
             }
@@ -930,15 +924,15 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " oldPin = "
-                        + oldPin + " newPin = " + newPin + " aid = " + aid);
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + " oldPin = " + oldPin + " newPin = " + newPin + " aid = " + aid);
             }
 
             try {
                 radioProxy.changeIccPinForApp(rr.mSerial,
-                        convertNullToEmptyString(oldPin),
-                        convertNullToEmptyString(newPin),
-                        convertNullToEmptyString(aid));
+                        RILUtils.convertNullToEmptyString(oldPin),
+                        RILUtils.convertNullToEmptyString(newPin),
+                        RILUtils.convertNullToEmptyString(aid));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "changeIccPinForApp", e);
             }
@@ -958,15 +952,15 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " oldPin = "
-                        + oldPin2 + " newPin = " + newPin2 + " aid = " + aid);
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + " oldPin = " + oldPin2 + " newPin = " + newPin2 + " aid = " + aid);
             }
 
             try {
                 radioProxy.changeIccPin2ForApp(rr.mSerial,
-                        convertNullToEmptyString(oldPin2),
-                        convertNullToEmptyString(newPin2),
-                        convertNullToEmptyString(aid));
+                        RILUtils.convertNullToEmptyString(oldPin2),
+                        RILUtils.convertNullToEmptyString(newPin2),
+                        RILUtils.convertNullToEmptyString(aid));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "changeIccPin2ForApp", e);
             }
@@ -981,13 +975,13 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " netpin = "
-                        + netpin);
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + " netpin = " + netpin);
             }
 
             try {
                 radioProxy.supplyNetworkDepersonalization(rr.mSerial,
-                        convertNullToEmptyString(netpin));
+                        RILUtils.convertNullToEmptyString(netpin));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "supplyNetworkDepersonalization", e);
             }
@@ -1006,13 +1000,13 @@
                 RILRequest rr = obtainRequest(RIL_REQUEST_ENTER_SIM_DEPERSONALIZATION, result,
                         mRILDefaultWorkSource);
                 if (RILJ_LOGD) {
-                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " controlKey = "
-                        + controlKey + " persoType" + persoType);
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                            + " controlKey = " + controlKey + " persoType" + persoType);
                 }
                 try {
                     radioProxy15.supplySimDepersonalization(rr.mSerial,
-                            convertPersoTypeToHalPersoType(persoType),
-                            convertNullToEmptyString(controlKey));
+                            RILUtils.convertToHalPersoType(persoType),
+                            RILUtils.convertNullToEmptyString(controlKey));
                 } catch (RemoteException | RuntimeException e) {
                     handleRadioProxyExceptionForRR(rr, "supplySimDepersonalization", e);
                 }
@@ -1026,83 +1020,6 @@
         }
     }
 
-    private static int convertPersoTypeToHalPersoType(PersoSubState persoType) {
-
-        switch(persoType) {
-
-            case PERSOSUBSTATE_IN_PROGRESS:
-                return PersoSubstate.IN_PROGRESS;
-            case  PERSOSUBSTATE_READY:
-                return PersoSubstate.READY;
-            case PERSOSUBSTATE_SIM_NETWORK:
-                return PersoSubstate.SIM_NETWORK;
-            case PERSOSUBSTATE_SIM_NETWORK_SUBSET:
-                return PersoSubstate.SIM_NETWORK_SUBSET;
-            case PERSOSUBSTATE_SIM_CORPORATE:
-                return PersoSubstate.SIM_CORPORATE;
-            case PERSOSUBSTATE_SIM_SERVICE_PROVIDER:
-                return PersoSubstate.SIM_SERVICE_PROVIDER;
-            case PERSOSUBSTATE_SIM_SIM:
-                return PersoSubstate.SIM_SIM;
-            case PERSOSUBSTATE_SIM_NETWORK_PUK:
-                return PersoSubstate.SIM_NETWORK_PUK;
-            case PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK:
-                return PersoSubstate.SIM_NETWORK_SUBSET_PUK;
-            case PERSOSUBSTATE_SIM_CORPORATE_PUK:
-                return PersoSubstate.SIM_CORPORATE_PUK;
-            case PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK:
-                return PersoSubstate.SIM_SERVICE_PROVIDER_PUK;
-            case PERSOSUBSTATE_SIM_SIM_PUK:
-                return PersoSubstate.SIM_SIM_PUK;
-            case PERSOSUBSTATE_RUIM_NETWORK1:
-                return PersoSubstate.RUIM_NETWORK1;
-            case PERSOSUBSTATE_RUIM_NETWORK2:
-                return PersoSubstate.RUIM_NETWORK2;
-            case PERSOSUBSTATE_RUIM_HRPD:
-                return PersoSubstate.RUIM_HRPD;
-            case PERSOSUBSTATE_RUIM_CORPORATE:
-                return PersoSubstate.RUIM_CORPORATE;
-            case PERSOSUBSTATE_RUIM_SERVICE_PROVIDER:
-                return PersoSubstate.RUIM_SERVICE_PROVIDER;
-            case PERSOSUBSTATE_RUIM_RUIM:
-                return PersoSubstate.RUIM_RUIM;
-            case PERSOSUBSTATE_RUIM_NETWORK1_PUK:
-                return PersoSubstate.RUIM_NETWORK1_PUK;
-            case PERSOSUBSTATE_RUIM_NETWORK2_PUK:
-                return PersoSubstate.RUIM_NETWORK2_PUK;
-            case PERSOSUBSTATE_RUIM_HRPD_PUK:
-                return PersoSubstate.RUIM_HRPD_PUK;
-            case PERSOSUBSTATE_RUIM_CORPORATE_PUK:
-                return PersoSubstate.RUIM_CORPORATE_PUK;
-            case PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK:
-                return PersoSubstate.RUIM_SERVICE_PROVIDER_PUK;
-            case PERSOSUBSTATE_RUIM_RUIM_PUK:
-                return PersoSubstate.RUIM_RUIM_PUK;
-            case PERSOSUBSTATE_SIM_SPN:
-                return PersoSubstate.SIM_SPN;
-            case PERSOSUBSTATE_SIM_SPN_PUK:
-                return PersoSubstate.SIM_SPN_PUK;
-            case PERSOSUBSTATE_SIM_SP_EHPLMN:
-                return PersoSubstate.SIM_SP_EHPLMN;
-            case PERSOSUBSTATE_SIM_SP_EHPLMN_PUK:
-                return PersoSubstate.SIM_SP_EHPLMN_PUK;
-            case PERSOSUBSTATE_SIM_ICCID:
-                return PersoSubstate.SIM_ICCID;
-            case PERSOSUBSTATE_SIM_ICCID_PUK:
-                return PersoSubstate.SIM_ICCID_PUK;
-            case PERSOSUBSTATE_SIM_IMPI:
-                return PersoSubstate.SIM_IMPI;
-            case PERSOSUBSTATE_SIM_IMPI_PUK:
-                return PersoSubstate.SIM_IMPI_PUK;
-            case PERSOSUBSTATE_SIM_NS_SP:
-                return PersoSubstate.SIM_NS_SP;
-            case PERSOSUBSTATE_SIM_NS_SP_PUK:
-                return PersoSubstate.SIM_NS_SP_PUK;
-            default:
-                return PersoSubstate.UNKNOWN;
-        }
-    }
-
     @Override
     public void getCurrentCalls(Message result) {
         IRadio radioProxy = getRadioProxy(result);
@@ -1111,7 +1028,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             try {
@@ -1156,8 +1073,8 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " enable = "
-                        + enable);
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + " enable = " + enable);
             }
 
             try {
@@ -1190,14 +1107,13 @@
                     (android.hardware.radio.V1_3.IRadio) radioProxy;
             if (radioProxy13 != null) {
                 if (RILJ_LOGD) {
-                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
-                            + " setSystemSelectionChannels_1.3= "
-                            + specifiers);
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                            + " setSystemSelectionChannels_1.3= " + specifiers);
                 }
 
                 ArrayList<android.hardware.radio.V1_1.RadioAccessSpecifier> halSpecifiers =
                         specifiers.stream()
-                                .map(this::convertRadioAccessSpecifierToRadioHAL)
+                                .map(RILUtils::convertToHalRadioAccessSpecifier11)
                                 .collect(Collectors.toCollection(ArrayList::new));
 
                 try {
@@ -1216,14 +1132,13 @@
 
             if (radioProxy15 != null) {
                 if (RILJ_LOGD) {
-                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
-                            + " setSystemSelectionChannels_1.5= "
-                            + specifiers);
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                            + " setSystemSelectionChannels_1.5= " + specifiers);
                 }
 
                 ArrayList<android.hardware.radio.V1_5.RadioAccessSpecifier> halSpecifiers =
                         specifiers.stream()
-                                .map(this::convertRadioAccessSpecifierToRadioHAL_1_5)
+                                .map(RILUtils::convertToHalRadioAccessSpecifier15)
                                 .collect(Collectors.toCollection(ArrayList::new));
 
                 try {
@@ -1258,7 +1173,7 @@
 
         if (radioProxy16 != null) {
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " getSystemSelectionChannels");
             }
 
@@ -1290,7 +1205,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             try {
@@ -1317,7 +1232,7 @@
                     mRILDefaultWorkSource);
 
             Dial dialInfo = new Dial();
-            dialInfo.address = convertNullToEmptyString(address);
+            dialInfo.address = RILUtils.convertNullToEmptyString(address);
             dialInfo.clir = clirMode;
             if (uusInfo != null) {
                 UusInfo info = new UusInfo();
@@ -1329,7 +1244,7 @@
 
             if (RILJ_LOGD) {
                 // Do not log function arg for privacy
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             try {
@@ -1347,7 +1262,7 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_EMERGENCY_DIAL, result,
                     mRILDefaultWorkSource);
             Dial dialInfo = new Dial();
-            dialInfo.address = convertNullToEmptyString(address);
+            dialInfo.address = RILUtils.convertNullToEmptyString(address);
             dialInfo.clir = clirMode;
             if (uusInfo != null) {
                 UusInfo info = new UusInfo();
@@ -1359,7 +1274,7 @@
 
             if (RILJ_LOGD) {
                 // Do not log function arg for privacy
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_6)) {
@@ -1413,11 +1328,11 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString()
-                        + ">  " + requestToString(rr.mRequest) + " aid = " + aid);
+                riljLog(rr.serialString() + ">  " + RILUtils.requestToString(rr.mRequest)
+                        + " aid = " + aid);
             }
             try {
-                radioProxy.getImsiForApp(rr.mSerial, convertNullToEmptyString(aid));
+                radioProxy.getImsiForApp(rr.mSerial, RILUtils.convertNullToEmptyString(aid));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "getIMSIForApp", e);
             }
@@ -1432,8 +1347,8 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " gsmIndex = "
-                        + gsmIndex);
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + " gsmIndex = " + gsmIndex);
             }
 
             try {
@@ -1452,7 +1367,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.hangupWaitingOrBackground(rr.mSerial);
@@ -1470,7 +1387,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.hangupForegroundResumeBackground(rr.mSerial);
@@ -1487,7 +1406,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.switchWaitingOrHoldingAndActive(rr.mSerial);
@@ -1504,7 +1425,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_CONFERENCE, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.conference(rr.mSerial);
@@ -1521,7 +1444,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_UDUB, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.rejectCall(rr.mSerial);
@@ -1538,7 +1463,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_LAST_CALL_FAIL_CAUSE, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getLastCallFailCause(rr.mSerial);
@@ -1555,7 +1482,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_SIGNAL_STRENGTH, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_6)) {
                 android.hardware.radio.V1_6.IRadio radioProxy16 =
@@ -1590,7 +1519,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_VOICE_REGISTRATION_STATE, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             HalVersion overrideHalVersion = getCompatVersion(RIL_REQUEST_VOICE_REGISTRATION_STATE);
             if (RILJ_LOGD) {
@@ -1634,7 +1565,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_DATA_REGISTRATION_STATE, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             HalVersion overrideHalVersion = getCompatVersion(RIL_REQUEST_DATA_REGISTRATION_STATE);
             if (RILJ_LOGD) {
@@ -1678,7 +1611,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_OPERATOR, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getOperator(rr.mSerial);
@@ -1698,7 +1633,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " on = " + on + " forEmergencyCall= " + forEmergencyCall
                         + " preferredForEmergencyCall="  + preferredForEmergencyCall);
             }
@@ -1740,7 +1675,7 @@
 
             if (RILJ_LOGD) {
                 // Do not log function arg for privacy
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             try {
@@ -1751,13 +1686,6 @@
         }
     }
 
-    private GsmSmsMessage constructGsmSendSmsRilRequest(String smscPdu, String pdu) {
-        GsmSmsMessage msg = new GsmSmsMessage();
-        msg.smscPdu = smscPdu == null ? "" : smscPdu;
-        msg.pdu = pdu == null ? "" : pdu;
-        return msg;
-    }
-
     @Override
     public void sendSMS(String smscPdu, String pdu, Message result) {
         IRadio radioProxy = getRadioProxy(result);
@@ -1766,9 +1694,11 @@
                     mRILDefaultWorkSource);
 
             // Do not log function args for privacy
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
-            GsmSmsMessage msg = constructGsmSendSmsRilRequest(smscPdu, pdu);
+            GsmSmsMessage msg = RILUtils.convertToHalGsmSmsMessage(smscPdu, pdu);
             if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_6)) {
                 try {
                     android.hardware.radio.V1_6.IRadio radioProxy16 =
@@ -1818,9 +1748,11 @@
                     mRILDefaultWorkSource);
 
             // Do not log function arg for privacy
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
-            GsmSmsMessage msg = constructGsmSendSmsRilRequest(smscPdu, pdu);
+            GsmSmsMessage msg = RILUtils.convertToHalGsmSmsMessage(smscPdu, pdu);
             if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_6)) {
                 try {
                     android.hardware.radio.V1_6.IRadio radioProxy16 =
@@ -1845,210 +1777,6 @@
         }
     }
 
-    /**
-     * Convert MVNO type string into MvnoType defined in types.hal.
-     * @param mvnoType MVNO type
-     * @return MVNO type in integer
-     */
-    private static int convertToHalMvnoType(String mvnoType) {
-        switch (mvnoType) {
-            case "imsi" : return MvnoType.IMSI;
-            case "gid" : return MvnoType.GID;
-            case "spn" : return MvnoType.SPN;
-            default: return MvnoType.NONE;
-        }
-    }
-
-    /**
-     * Convert to DataProfileInfo defined in radio/1.0/types.hal
-     * @param dp Data profile
-     * @return A converted data profile
-     */
-    private static android.hardware.radio.V1_0.DataProfileInfo convertToHalDataProfile10(
-            DataProfile dp) {
-        android.hardware.radio.V1_0.DataProfileInfo dpi =
-                new android.hardware.radio.V1_0.DataProfileInfo();
-
-        dpi.profileId = dp.getProfileId();
-        dpi.apn = dp.getApn();
-        dpi.protocol = ApnSetting.getProtocolStringFromInt(dp.getProtocolType());
-        dpi.roamingProtocol = ApnSetting.getProtocolStringFromInt(dp.getRoamingProtocolType());
-        dpi.authType = dp.getAuthType();
-        dpi.user = dp.getUserName();
-        dpi.password = dp.getPassword();
-        dpi.type = dp.getType();
-        dpi.maxConnsTime = dp.getMaxConnectionsTime();
-        dpi.maxConns = dp.getMaxConnections();
-        dpi.waitTime = dp.getWaitTime();
-        dpi.enabled = dp.isEnabled();
-        dpi.supportedApnTypesBitmap = dp.getSupportedApnTypesBitmask();
-        // Shift by 1 bit due to the discrepancy between
-        // android.hardware.radio.V1_0.RadioAccessFamily and the bitmask version of
-        // ServiceState.RIL_RADIO_TECHNOLOGY_XXXX.
-        dpi.bearerBitmap = ServiceState.convertNetworkTypeBitmaskToBearerBitmask(
-                dp.getBearerBitmask()) << 1;
-        dpi.mtu = dp.getMtuV4();
-        dpi.mvnoType = MvnoType.NONE;
-        dpi.mvnoMatchData = "";
-
-        return dpi;
-    }
-
-    /**
-     * Convert to DataProfileInfo defined in radio/1.4/types.hal
-     * @param dp Data profile
-     * @return A converted data profile
-     */
-    private static android.hardware.radio.V1_4.DataProfileInfo convertToHalDataProfile14(
-            DataProfile dp) {
-        android.hardware.radio.V1_4.DataProfileInfo dpi =
-                new android.hardware.radio.V1_4.DataProfileInfo();
-
-        dpi.apn = dp.getApn();
-        dpi.protocol = dp.getProtocolType();
-        dpi.roamingProtocol = dp.getRoamingProtocolType();
-        dpi.authType = dp.getAuthType();
-        dpi.user = dp.getUserName();
-        dpi.password = dp.getPassword();
-        dpi.type = dp.getType();
-        dpi.maxConnsTime = dp.getMaxConnectionsTime();
-        dpi.maxConns = dp.getMaxConnections();
-        dpi.waitTime = dp.getWaitTime();
-        dpi.enabled = dp.isEnabled();
-        dpi.supportedApnTypesBitmap = dp.getSupportedApnTypesBitmask();
-        // Shift by 1 bit due to the discrepancy between
-        // android.hardware.radio.V1_0.RadioAccessFamily and the bitmask version of
-        // ServiceState.RIL_RADIO_TECHNOLOGY_XXXX.
-        dpi.bearerBitmap = ServiceState.convertNetworkTypeBitmaskToBearerBitmask(
-                dp.getBearerBitmask()) << 1;
-        dpi.mtu = dp.getMtuV4();
-        dpi.persistent = dp.isPersistent();
-        dpi.preferred = dp.isPreferred();
-
-        // profile id is only meaningful when it's persistent on the modem.
-        dpi.profileId = (dpi.persistent) ? dp.getProfileId() : DataProfileId.INVALID;
-
-        return dpi;
-    }
-
-    private static OptionalSliceInfo convertToHalSliceInfo(@Nullable NetworkSliceInfo sliceInfo) {
-        OptionalSliceInfo optionalSliceInfo = new OptionalSliceInfo();
-        if (sliceInfo == null) {
-            return optionalSliceInfo;
-        }
-
-        android.hardware.radio.V1_6.SliceInfo si = new android.hardware.radio.V1_6.SliceInfo();
-        si.sst = (byte) sliceInfo.getSliceServiceType();
-        si.mappedHplmnSst = (byte) sliceInfo.getMappedHplmnSliceServiceType();
-        si.sliceDifferentiator = sliceInfo.getSliceDifferentiator();
-        si.mappedHplmnSD = sliceInfo.getMappedHplmnSliceDifferentiator();
-        optionalSliceInfo.value(si);
-        return optionalSliceInfo;
-    }
-
-    private static OptionalTrafficDescriptor convertToHalTrafficDescriptor(
-            @Nullable TrafficDescriptor trafficDescriptor) {
-        OptionalTrafficDescriptor optionalTrafficDescriptor = new OptionalTrafficDescriptor();
-        if (trafficDescriptor == null) {
-            return optionalTrafficDescriptor;
-        }
-
-        android.hardware.radio.V1_6.TrafficDescriptor td =
-                new android.hardware.radio.V1_6.TrafficDescriptor();
-
-        OptionalDnn optionalDnn = new OptionalDnn();
-        if (trafficDescriptor.getDataNetworkName() != null) {
-            optionalDnn.value(trafficDescriptor.getDataNetworkName());
-        }
-        td.dnn = optionalDnn;
-
-        OptionalOsAppId optionalOsAppId = new OptionalOsAppId();
-        if (trafficDescriptor.getOsAppId() != null) {
-            android.hardware.radio.V1_6.OsAppId osAppId = new android.hardware.radio.V1_6.OsAppId();
-            osAppId.osAppId = primitiveArrayToArrayList(trafficDescriptor.getOsAppId().getBytes());
-            optionalOsAppId.value(osAppId);
-        }
-        td.osAppId = optionalOsAppId;
-
-        optionalTrafficDescriptor.value(td);
-        return optionalTrafficDescriptor;
-    }
-
-    private static ArrayList<android.hardware.radio.V1_5.LinkAddress> convertToHalLinkProperties15(
-            LinkProperties linkProperties) {
-        ArrayList<android.hardware.radio.V1_5.LinkAddress> addresses15 = new ArrayList<>();
-        if (linkProperties != null) {
-            for (LinkAddress la : linkProperties.getAllLinkAddresses()) {
-                android.hardware.radio.V1_5.LinkAddress linkAddress =
-                        new android.hardware.radio.V1_5.LinkAddress();
-                linkAddress.address = la.getAddress().getHostAddress();
-                linkAddress.properties = la.getFlags();
-                linkAddress.deprecationTime = la.getDeprecationTime();
-                linkAddress.expirationTime = la.getExpirationTime();
-                addresses15.add(linkAddress);
-            }
-        }
-        return addresses15;
-    }
-
-    /**
-     * Convert to DataProfileInfo defined in radio/1.5/types.hal
-     * @param dp Data profile
-     * @return A converted data profile
-     */
-    private static android.hardware.radio.V1_5.DataProfileInfo convertToHalDataProfile15(
-            DataProfile dp) {
-        android.hardware.radio.V1_5.DataProfileInfo dpi =
-                new android.hardware.radio.V1_5.DataProfileInfo();
-
-        dpi.apn = dp.getApn();
-        dpi.protocol = dp.getProtocolType();
-        dpi.roamingProtocol = dp.getRoamingProtocolType();
-        dpi.authType = dp.getAuthType();
-        dpi.user = dp.getUserName();
-        dpi.password = dp.getPassword();
-        dpi.type = dp.getType();
-        dpi.maxConnsTime = dp.getMaxConnectionsTime();
-        dpi.maxConns = dp.getMaxConnections();
-        dpi.waitTime = dp.getWaitTime();
-        dpi.enabled = dp.isEnabled();
-        dpi.supportedApnTypesBitmap = dp.getSupportedApnTypesBitmask();
-        // Shift by 1 bit due to the discrepancy between
-        // android.hardware.radio.V1_0.RadioAccessFamily and the bitmask version of
-        // ServiceState.RIL_RADIO_TECHNOLOGY_XXXX.
-        dpi.bearerBitmap = ServiceState.convertNetworkTypeBitmaskToBearerBitmask(
-            dp.getBearerBitmask()) << 1;
-        dpi.mtuV4 = dp.getMtuV4();
-        dpi.mtuV6 = dp.getMtuV6();
-        dpi.persistent = dp.isPersistent();
-        dpi.preferred = dp.isPreferred();
-
-        // profile id is only meaningful when it's persistent on the modem.
-        dpi.profileId = (dpi.persistent) ? dp.getProfileId() : DataProfileId.INVALID;
-
-        return dpi;
-    }
-
-    /**
-     * Convert NV reset type into ResetNvType defined in types.hal.
-     * @param resetType NV reset type.
-     * @return Converted reset type in integer or -1 if param is invalid.
-     */
-    private static int convertToHalResetNvType(int resetType) {
-        /**
-         * resetType values
-         * 1 - reload all NV items
-         * 2 - erase NV reset (SCRTN)
-         * 3 - factory reset (RTN)
-         */
-        switch (resetType) {
-            case 1: return ResetNvType.RELOAD;
-            case 2: return ResetNvType.ERASE;
-            case 3: return ResetNvType.FACTORY_RESET;
-        }
-        return -1;
-    }
-
     @Override
     public void setupDataCall(int accessNetworkType, DataProfile dataProfile, boolean isRoaming,
             boolean allowRoaming, int reason, LinkProperties linkProperties, int pduSessionId,
@@ -2080,17 +1808,19 @@
 
                     // Convert to HAL data profile
                     android.hardware.radio.V1_5.DataProfileInfo dpi =
-                            convertToHalDataProfile15(dataProfile);
+                            RILUtils.convertToHalDataProfile15(dataProfile);
 
-                    OptionalSliceInfo si = convertToHalSliceInfo(sliceInfo);
+                    android.hardware.radio.V1_6.OptionalSliceInfo si =
+                            RILUtils.convertToHalSliceInfo(sliceInfo);
 
                     ArrayList<android.hardware.radio.V1_5.LinkAddress> addresses15 =
-                            convertToHalLinkProperties15(linkProperties);
+                            RILUtils.convertToHalLinkProperties15(linkProperties);
 
-                    OptionalTrafficDescriptor td = convertToHalTrafficDescriptor(trafficDescriptor);
+                    android.hardware.radio.V1_6.OptionalTrafficDescriptor td =
+                            RILUtils.convertToHalTrafficDescriptor(trafficDescriptor);
 
                     if (RILJ_LOGD) {
-                        riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                        riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                                 + ",accessNetworkType="
                                 + AccessNetworkType.toString(accessNetworkType) + ",isRoaming="
                                 + isRoaming + ",allowRoaming=" + allowRoaming + "," + dataProfile
@@ -2109,13 +1839,13 @@
 
                     // Convert to HAL data profile
                     android.hardware.radio.V1_5.DataProfileInfo dpi =
-                            convertToHalDataProfile15(dataProfile);
+                            RILUtils.convertToHalDataProfile15(dataProfile);
 
                     ArrayList<android.hardware.radio.V1_5.LinkAddress> addresses15 =
-                            convertToHalLinkProperties15(linkProperties);
+                            RILUtils.convertToHalLinkProperties15(linkProperties);
 
                     if (RILJ_LOGD) {
-                        riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                        riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                                 + ",accessNetworkType="
                                 + AccessNetworkType.toString(accessNetworkType) + ",isRoaming="
                                 + isRoaming + ",allowRoaming=" + allowRoaming + "," + dataProfile
@@ -2131,10 +1861,10 @@
 
                     // Convert to HAL data profile
                     android.hardware.radio.V1_4.DataProfileInfo dpi =
-                            convertToHalDataProfile14(dataProfile);
+                            RILUtils.convertToHalDataProfile14(dataProfile);
 
                     if (RILJ_LOGD) {
-                        riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                        riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                                 + ",accessNetworkType="
                                 + AccessNetworkType.toString(accessNetworkType) + ",isRoaming="
                                 + isRoaming + ",allowRoaming=" + allowRoaming + "," + dataProfile
@@ -2150,10 +1880,10 @@
 
                     // Convert to HAL data profile
                     android.hardware.radio.V1_0.DataProfileInfo dpi =
-                            convertToHalDataProfile10(dataProfile);
+                            RILUtils.convertToHalDataProfile10(dataProfile);
 
                     if (RILJ_LOGD) {
-                        riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                        riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                                 + ",accessNetworkType="
                                 + AccessNetworkType.toString(accessNetworkType) + ",isRoaming="
                                 + isRoaming + ",allowRoaming=" + allowRoaming + ","
@@ -2168,7 +1898,7 @@
 
                     // Convert to HAL data profile
                     android.hardware.radio.V1_0.DataProfileInfo dpi =
-                            convertToHalDataProfile10(dataProfile);
+                            RILUtils.convertToHalDataProfile10(dataProfile);
 
                     // Getting data RAT here is just a workaround to support the older 1.0
                     // vendor RIL. The new data service interface passes access network type
@@ -2184,7 +1914,7 @@
                         }
                     }
                     if (RILJ_LOGD) {
-                        riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                        riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                                 + ",dataRat=" + dataRat + ",isRoaming=" + isRoaming
                                 + ",allowRoaming=" + allowRoaming + "," + dataProfile);
                     }
@@ -2214,27 +1944,26 @@
 
             if (RILJ_LOGD) {
                 if (TelephonyUtils.IS_DEBUGGABLE) {
-                    riljLog(rr.serialString() + "> iccIO: "
-                            + requestToString(rr.mRequest) + " command = 0x"
-                            + Integer.toHexString(command) + " fileId = 0x"
-                            + Integer.toHexString(fileId) + " path = " + path + " p1 = "
-                            + p1 + " p2 = " + p2 + " p3 = " + " data = " + data
-                            + " aid = " + aid);
+                    riljLog(rr.serialString() + "> iccIO: " + RILUtils.requestToString(rr.mRequest)
+                            + " command = 0x" + Integer.toHexString(command) + " fileId = 0x"
+                            + Integer.toHexString(fileId) + " path = " + path + " p1 = " + p1
+                            + " p2 = " + p2 + " p3 = " + " data = " + data + " aid = " + aid);
                 } else {
-                    riljLog(rr.serialString() + "> iccIO: " + requestToString(rr.mRequest));
+                    riljLog(rr.serialString() + "> iccIO: "
+                            + RILUtils.requestToString(rr.mRequest));
                 }
             }
 
             IccIo iccIo = new IccIo();
             iccIo.command = command;
             iccIo.fileId = fileId;
-            iccIo.path = convertNullToEmptyString(path);
+            iccIo.path = RILUtils.convertNullToEmptyString(path);
             iccIo.p1 = p1;
             iccIo.p2 = p2;
             iccIo.p3 = p3;
-            iccIo.data = convertNullToEmptyString(data);
-            iccIo.pin2 = convertNullToEmptyString(pin2);
-            iccIo.aid = convertNullToEmptyString(aid);
+            iccIo.data = RILUtils.convertNullToEmptyString(data);
+            iccIo.pin2 = RILUtils.convertNullToEmptyString(pin2);
+            iccIo.aid = RILUtils.convertNullToEmptyString(aid);
 
             try {
                 radioProxy.iccIOForApp(rr.mSerial, iccIo);
@@ -2254,12 +1983,12 @@
             if (RILJ_LOGD) {
                 String logUssd = "*******";
                 if (RILJ_LOGV) logUssd = ussd;
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " ussd = " + logUssd);
             }
 
             try {
-                radioProxy.sendUssd(rr.mSerial, convertNullToEmptyString(ussd));
+                radioProxy.sendUssd(rr.mSerial, RILUtils.convertNullToEmptyString(ussd));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "sendUSSD", e);
             }
@@ -2274,8 +2003,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString()
-                        + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             try {
@@ -2293,7 +2021,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_GET_CLIR, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getClir(rr.mSerial);
@@ -2310,7 +2040,7 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_SET_CLIR, result, mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " clirMode = " + clirMode);
             }
 
@@ -2331,7 +2061,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " cfreason = " + cfReason + " serviceClass = " + serviceClass);
             }
 
@@ -2340,7 +2070,7 @@
             cfInfo.reason = cfReason;
             cfInfo.serviceClass = serviceClass;
             cfInfo.toa = PhoneNumberUtils.toaFromString(number);
-            cfInfo.number = convertNullToEmptyString(number);
+            cfInfo.number = RILUtils.convertNullToEmptyString(number);
             cfInfo.timeSeconds = 0;
 
             try {
@@ -2360,7 +2090,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " action = " + action + " cfReason = " + cfReason + " serviceClass = "
                         + serviceClass + " timeSeconds = " + timeSeconds);
             }
@@ -2371,7 +2101,7 @@
             cfInfo.reason = cfReason;
             cfInfo.serviceClass = serviceClass;
             cfInfo.toa = PhoneNumberUtils.toaFromString(number);
-            cfInfo.number = convertNullToEmptyString(number);
+            cfInfo.number = RILUtils.convertNullToEmptyString(number);
             cfInfo.timeSeconds = timeSeconds;
 
             try {
@@ -2391,7 +2121,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " serviceClass = " + serviceClass);
             }
 
@@ -2411,7 +2141,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " enable = " + enable + " serviceClass = " + serviceClass);
             }
 
@@ -2431,7 +2161,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " success = " + success + " cause = " + cause);
             }
 
@@ -2451,7 +2181,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             try {
@@ -2471,8 +2201,8 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> "
-                        + requestToString(rr.mRequest) + " cid = " + cid + " reason = " + reason);
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + " cid = " + cid + " reason = " + reason);
             }
 
             try {
@@ -2507,17 +2237,17 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " facility = " + facility + " serviceClass = " + serviceClass
                         + " appId = " + appId);
             }
 
             try {
                 radioProxy.getFacilityLockForApp(rr.mSerial,
-                        convertNullToEmptyString(facility),
-                        convertNullToEmptyString(password),
+                        RILUtils.convertNullToEmptyString(facility),
+                        RILUtils.convertNullToEmptyString(password),
                         serviceClass,
-                        convertNullToEmptyString(appId));
+                        RILUtils.convertNullToEmptyString(appId));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "getFacilityLockForApp", e);
             }
@@ -2539,18 +2269,18 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " facility = " + facility + " lockstate = " + lockState
                         + " serviceClass = " + serviceClass + " appId = " + appId);
             }
 
             try {
                 radioProxy.setFacilityLockForApp(rr.mSerial,
-                        convertNullToEmptyString(facility),
+                        RILUtils.convertNullToEmptyString(facility),
                         lockState,
-                        convertNullToEmptyString(password),
+                        RILUtils.convertNullToEmptyString(password),
                         serviceClass,
-                        convertNullToEmptyString(appId));
+                        RILUtils.convertNullToEmptyString(appId));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "setFacilityLockForApp", e);
             }
@@ -2567,15 +2297,15 @@
 
             // Do not log all function args for privacy
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + "facility = " + facility);
             }
 
             try {
                 radioProxy.setBarringPassword(rr.mSerial,
-                        convertNullToEmptyString(facility),
-                        convertNullToEmptyString(oldPwd),
-                        convertNullToEmptyString(newPwd));
+                        RILUtils.convertNullToEmptyString(facility),
+                        RILUtils.convertNullToEmptyString(oldPwd),
+                        RILUtils.convertNullToEmptyString(newPwd));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "changeBarringPassword", e);
             }
@@ -2589,7 +2319,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getNetworkSelectionMode(rr.mSerial);
@@ -2606,7 +2338,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.setNetworkSelectionModeAutomatic(rr.mSerial);
@@ -2623,24 +2357,23 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL, result,
                     mRILDefaultWorkSource);
             try {
-                int halRan = convertAntToRan(ran);
+                int halRan = RILUtils.convertToHalRadioAccessNetworks(ran);
                 if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_5)) {
                     android.hardware.radio.V1_5.IRadio radioProxy15 =
                             (android.hardware.radio.V1_5.IRadio) radioProxy;
                     if (RILJ_LOGD) {
-                        riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
-                                + " operatorNumeric = " + operatorNumeric
-                                + ", ran = " + halRan);
+                        riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                                + " operatorNumeric = " + operatorNumeric + ", ran = " + halRan);
                     }
                     radioProxy15.setNetworkSelectionModeManual_1_5(rr.mSerial,
-                            convertNullToEmptyString(operatorNumeric), halRan);
+                            RILUtils.convertNullToEmptyString(operatorNumeric), halRan);
                 } else {
                     if (RILJ_LOGD) {
-                        riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                        riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                                 + " operatorNumeric = " + operatorNumeric);
                     }
                     radioProxy.setNetworkSelectionModeManual(rr.mSerial,
-                            convertNullToEmptyString(operatorNumeric));
+                            RILUtils.convertNullToEmptyString(operatorNumeric));
                 }
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "setNetworkSelectionModeManual", e);
@@ -2655,7 +2388,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_QUERY_AVAILABLE_NETWORKS, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getAvailableNetworks(rr.mSerial);
@@ -2665,84 +2400,6 @@
         }
     }
 
-    private android.hardware.radio.V1_1.RadioAccessSpecifier convertRadioAccessSpecifierToRadioHAL(
-            RadioAccessSpecifier ras) {
-        android.hardware.radio.V1_1.RadioAccessSpecifier rasInHalFormat =
-                new android.hardware.radio.V1_1.RadioAccessSpecifier();
-        rasInHalFormat.radioAccessNetwork = ras.getRadioAccessNetwork();
-        ArrayList<Integer> bands = new ArrayList<>();
-        if (ras.getBands() != null) {
-            for (int band : ras.getBands()) {
-                bands.add(band);
-            }
-        }
-        switch (ras.getRadioAccessNetwork()) {
-            case AccessNetworkType.GERAN:
-                rasInHalFormat.geranBands = bands;
-                break;
-            case AccessNetworkType.UTRAN:
-                rasInHalFormat.utranBands = bands;
-                break;
-            case AccessNetworkType.EUTRAN:
-                rasInHalFormat.eutranBands = bands;
-                break;
-            default:
-                Log.wtf(RILJ_LOG_TAG, "radioAccessNetwork " + ras.getRadioAccessNetwork()
-                        + " not supported on IRadio < 1.5!");
-                return null;
-        }
-
-        if (ras.getChannels() != null) {
-            for (int channel : ras.getChannels()) {
-                rasInHalFormat.channels.add(channel);
-            }
-        }
-
-        return rasInHalFormat;
-    }
-
-    private android.hardware.radio.V1_5.RadioAccessSpecifier
-            convertRadioAccessSpecifierToRadioHAL_1_5(RadioAccessSpecifier ras) {
-        android.hardware.radio.V1_5.RadioAccessSpecifier rasInHalFormat =
-                new android.hardware.radio.V1_5.RadioAccessSpecifier();
-        android.hardware.radio.V1_5.RadioAccessSpecifier.Bands bandsInHalFormat =
-                new android.hardware.radio.V1_5.RadioAccessSpecifier.Bands();
-        rasInHalFormat.radioAccessNetwork = convertAntToRan(ras.getRadioAccessNetwork());
-        ArrayList<Integer> bands = new ArrayList<>();
-        if (ras.getBands() != null) {
-            for (int band : ras.getBands()) {
-                bands.add(band);
-            }
-        }
-        switch (ras.getRadioAccessNetwork()) {
-            case AccessNetworkType.GERAN:
-                bandsInHalFormat.geranBands(bands);
-                break;
-            case AccessNetworkType.UTRAN:
-                bandsInHalFormat.utranBands(bands);
-                break;
-            case AccessNetworkType.EUTRAN:
-                bandsInHalFormat.eutranBands(bands);
-                break;
-            case AccessNetworkType.NGRAN:
-                bandsInHalFormat.ngranBands(bands);
-                break;
-            default:
-                Log.wtf(RILJ_LOG_TAG, "radioAccessNetwork " + ras.getRadioAccessNetwork()
-                        + " not supported on IRadio 1.5!");
-                return null;
-        }
-        rasInHalFormat.bands = bandsInHalFormat;
-
-        if (ras.getChannels() != null) {
-            for (int channel : ras.getChannels()) {
-                rasInHalFormat.channels.add(channel);
-            }
-        }
-
-        return rasInHalFormat;
-    }
-
     /**
      * Radio HAL fallback compatibility feature (b/151106728) assumes that the input parameter
      * networkScanRequest is immutable (read-only) here. Once the caller invokes the method, the
@@ -2772,7 +2429,7 @@
 
                 for (RadioAccessSpecifier ras : nsr.getSpecifiers()) {
                     android.hardware.radio.V1_5.RadioAccessSpecifier rasInHalFormat =
-                            convertRadioAccessSpecifierToRadioHAL_1_5(ras);
+                            RILUtils.convertToHalRadioAccessSpecifier15(ras);
                     if (rasInHalFormat == null) {
                         AsyncResult.forMessage(result, null,
                                 CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
@@ -2787,7 +2444,7 @@
                         mRILDefaultWorkSource, nsr);
 
                 if (RILJ_LOGD) {
-                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
                 }
 
                 try {
@@ -2809,7 +2466,7 @@
                 for (RadioAccessSpecifier ras : nsr.getSpecifiers()) {
 
                     android.hardware.radio.V1_1.RadioAccessSpecifier rasInHalFormat =
-                            convertRadioAccessSpecifierToRadioHAL(ras);
+                            RILUtils.convertToHalRadioAccessSpecifier11(ras);
                     if (rasInHalFormat == null) {
                         AsyncResult.forMessage(result, null,
                                 CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
@@ -2825,7 +2482,7 @@
                         mRILDefaultWorkSource);
 
                 if (RILJ_LOGD) {
-                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
                 }
 
                 try {
@@ -2851,7 +2508,7 @@
                 request.interval = nsr.getSearchPeriodicity();
                 for (RadioAccessSpecifier ras : nsr.getSpecifiers()) {
                     android.hardware.radio.V1_1.RadioAccessSpecifier rasInHalFormat =
-                            convertRadioAccessSpecifierToRadioHAL(ras);
+                            RILUtils.convertToHalRadioAccessSpecifier11(ras);
                     if (rasInHalFormat == null) {
                         AsyncResult.forMessage(result, null,
                                 CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
@@ -2866,7 +2523,7 @@
                         mRILDefaultWorkSource);
 
                 if (RILJ_LOGD) {
-                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
                 }
 
                 try {
@@ -2894,7 +2551,7 @@
                         mRILDefaultWorkSource);
 
                 if (RILJ_LOGD) {
-                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
                 }
 
                 try {
@@ -2918,7 +2575,9 @@
                     mRILDefaultWorkSource);
 
             // Do not log function arg for privacy
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.startDtmf(rr.mSerial, c + "");
@@ -2935,7 +2594,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_DTMF_STOP, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.stopDtmf(rr.mSerial);
@@ -2953,7 +2614,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " gsmIndex = " + gsmIndex);
             }
 
@@ -2972,7 +2633,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_BASEBAND_VERSION, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getBasebandVersion(rr.mSerial);
@@ -2990,7 +2653,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " enableMute = " + enableMute);
             }
 
@@ -3009,7 +2672,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_GET_MUTE, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getMute(rr.mSerial);
@@ -3026,7 +2691,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_QUERY_CLIP, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getClip(rr.mSerial);
@@ -3052,7 +2719,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_DATA_CALL_LIST, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_6)) {
@@ -3077,12 +2746,12 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + "[" + IccUtils.bytesToHexString(data) + "]");
             }
 
             try {
-                oemHookProxy.sendRequestRaw(rr.mSerial, primitiveArrayToArrayList(data));
+                oemHookProxy.sendRequestRaw(rr.mSerial, RILUtils.primitiveArrayToArrayList(data));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "invokeOemRilRequestRaw", e);
             }
@@ -3105,8 +2774,8 @@
                 logStr = logStr + strings[i] + " ";
             }
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " strings = "
-                        + logStr);
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + " strings = " + logStr);
             }
 
             try {
@@ -3130,8 +2799,8 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " enable = "
-                        + enable);
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + " enable = " + enable);
             }
 
             try {
@@ -3144,7 +2813,7 @@
 
     @Override
     public void writeSmsToSim(int status, String smsc, String pdu, Message result) {
-        status = translateStatus(status);
+        status = RILUtils.convertToHalSmsWriteArgsStatus(status);
         IRadio radioProxy = getRadioProxy(result);
         if (radioProxy != null) {
             RILRequest rr = obtainRequest(RIL_REQUEST_WRITE_SMS_TO_SIM, result,
@@ -3152,14 +2821,14 @@
 
             if (RILJ_LOGV) {
                 riljLog(rr.serialString() + "> "
-                        + requestToString(rr.mRequest)
+                        + RILUtils.requestToString(rr.mRequest)
                         + " " + status);
             }
 
             SmsWriteArgs args = new SmsWriteArgs();
             args.status = status;
-            args.smsc = convertNullToEmptyString(smsc);
-            args.pdu = convertNullToEmptyString(pdu);
+            args.smsc = RILUtils.convertNullToEmptyString(smsc);
+            args.pdu = RILUtils.convertNullToEmptyString(pdu);
 
             try {
                 radioProxy.writeSmsToSim(rr.mSerial, args);
@@ -3178,7 +2847,7 @@
 
             if (RILJ_LOGV) {
                 riljLog(rr.serialString() + "> "
-                        + requestToString(rr.mRequest) + " index = " + index);
+                        + RILUtils.requestToString(rr.mRequest) + " index = " + index);
             }
 
             try {
@@ -3197,7 +2866,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " bandMode = " + bandMode);
             }
 
@@ -3216,7 +2885,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getAvailableBandModes(rr.mSerial);
@@ -3234,12 +2905,12 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " contents = "
-                        + contents);
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + " contents = " + contents);
             }
 
             try {
-                radioProxy.sendEnvelope(rr.mSerial, convertNullToEmptyString(contents));
+                radioProxy.sendEnvelope(rr.mSerial, RILUtils.convertNullToEmptyString(contents));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "sendEnvelope", e);
             }
@@ -3254,47 +2925,20 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " contents = "
-                        + (TelephonyUtils.IS_DEBUGGABLE
-                            ? contents : censoredTerminalResponse(contents)));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + " contents = " + (TelephonyUtils.IS_DEBUGGABLE
+                        ? contents : RILUtils.convertToCensoredTerminalResponse(contents)));
             }
 
             try {
                 radioProxy.sendTerminalResponseToSim(rr.mSerial,
-                        convertNullToEmptyString(contents));
+                        RILUtils.convertNullToEmptyString(contents));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "sendTerminalResponse", e);
             }
         }
     }
 
-    private String censoredTerminalResponse(String terminalResponse) {
-        try {
-            byte[] bytes = IccUtils.hexStringToBytes(terminalResponse);
-            if (bytes != null) {
-                List<ComprehensionTlv> ctlvs = ComprehensionTlv.decodeMany(bytes, 0);
-                int from = 0;
-                for (ComprehensionTlv ctlv : ctlvs) {
-                    // Find text strings which might be personal information input by user,
-                    // then replace it with "********".
-                    if (ComprehensionTlvTag.TEXT_STRING.value() == ctlv.getTag()) {
-                        byte[] target = Arrays.copyOfRange(ctlv.getRawValue(), from,
-                                ctlv.getValueIndex() + ctlv.getLength());
-                        terminalResponse = terminalResponse.toLowerCase().replace(
-                                IccUtils.bytesToHexString(target).toLowerCase(), "********");
-                    }
-                    // The text string tag and the length field should also be hidden.
-                    from = ctlv.getValueIndex() + ctlv.getLength();
-                }
-            }
-        } catch (Exception e) {
-            Rlog.e(RILJ_LOG_TAG, "Could not censor the terminal response: " + e);
-            terminalResponse = null;
-        }
-
-        return terminalResponse;
-    }
-
     @Override
     public void sendEnvelopeWithStatus(String contents, Message result) {
         IRadio radioProxy = getRadioProxy(result);
@@ -3303,12 +2947,13 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " contents = "
-                        + contents);
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + " contents = " + contents);
             }
 
             try {
-                radioProxy.sendEnvelopeWithStatus(rr.mSerial, convertNullToEmptyString(contents));
+                radioProxy.sendEnvelopeWithStatus(rr.mSerial,
+                        RILUtils.convertNullToEmptyString(contents));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "sendEnvelopeWithStatus", e);
             }
@@ -3322,7 +2967,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_EXPLICIT_CALL_TRANSFER, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.explicitCallTransfer(rr.mSerial);
@@ -3340,7 +2987,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " networkType = " + networkType);
             }
             mAllowedNetworkTypesBitmask = RadioAccessFamily.getRafFromNetworkType(networkType);
@@ -3350,8 +2997,8 @@
                 android.hardware.radio.V1_4.IRadio radioProxy14 =
                         (android.hardware.radio.V1_4.IRadio) radioProxy;
                 try {
-                    radioProxy14.setPreferredNetworkTypeBitmap(
-                            rr.mSerial, convertToHalRadioAccessFamily(mAllowedNetworkTypesBitmask));
+                    radioProxy14.setPreferredNetworkTypeBitmap(rr.mSerial,
+                            RILUtils.convertToHalRadioAccessFamily(mAllowedNetworkTypesBitmask));
                 } catch (RemoteException | RuntimeException e) {
                     handleRadioProxyExceptionForRR(rr, "setPreferredNetworkTypeBitmap", e);
                 }
@@ -3365,154 +3012,15 @@
         }
     }
 
-    /**
-     * convert RAF from {@link android.hardware.radio.V1_0.RadioAccessFamily} to
-     * {@link TelephonyManager.NetworkTypeBitMask}, the bitmask represented by
-     * {@link android.telephony.Annotation.NetworkType}.
-     *
-     * @param raf {@link android.hardware.radio.V1_0.RadioAccessFamily}
-     * @return {@link TelephonyManager.NetworkTypeBitMask}
-     */
-    @TelephonyManager.NetworkTypeBitMask
-    public static int convertToNetworkTypeBitMask(int raf) {
-        int networkTypeRaf = 0;
-
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.GSM) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_GSM;
-        }
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.GPRS) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_GPRS;
-        }
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EDGE) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EDGE;
-        }
-        // convert both IS95A/IS95B to CDMA as network mode doesn't support CDMA
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.IS95A) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
-        }
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.IS95B) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
-        }
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.ONE_X_RTT) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT;
-        }
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_0) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0;
-        }
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_A) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A;
-        }
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_B) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B;
-        }
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EHRPD) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD;
-        }
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSUPA) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA;
-        }
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSDPA) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA;
-        }
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSPA) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSPA;
-        }
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSPAP) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP;
-        }
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.UMTS) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_UMTS;
-        }
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.TD_SCDMA) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA;
-        }
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.LTE) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_LTE;
-        }
-        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.LTE_CA) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA;
-        }
-        if ((raf & android.hardware.radio.V1_4.RadioAccessFamily.NR) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_NR;
-        }
-        // TODO: need hal definition
-        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN)) != 0) {
-            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN;
-        }
-        return (networkTypeRaf == 0) ? TelephonyManager.NETWORK_TYPE_UNKNOWN : networkTypeRaf;
-    }
-
-    // convert to android.hardware.radio.V1_0.RadioAccessFamily
-    private static int convertToHalRadioAccessFamily(
-            @TelephonyManager.NetworkTypeBitMask int networkTypeBitmask) {
-        int raf = 0;
-
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_GSM) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.GSM;
-        }
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_GPRS) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.GPRS;
-        }
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EDGE) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.EDGE;
-        }
-        // convert CDMA to IS95A, consistent with ServiceState.networkTypeToRilRadioTechnology
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_CDMA) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.IS95A;
-        }
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.ONE_X_RTT;
-        }
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.EVDO_0;
-        }
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.EVDO_A;
-        }
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.EVDO_B;
-        }
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.EHRPD;
-        }
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.HSUPA;
-        }
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.HSDPA;
-        }
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSPA) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.HSPA;
-        }
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.HSPAP;
-        }
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_UMTS) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.UMTS;
-        }
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.TD_SCDMA;
-        }
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_LTE) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.LTE;
-        }
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA) != 0) {
-            raf |= android.hardware.radio.V1_0.RadioAccessFamily.LTE_CA;
-        }
-        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_NR) != 0) {
-            raf |= android.hardware.radio.V1_4.RadioAccessFamily.NR;
-        }
-        // TODO: need hal definition for IWLAN
-        return (raf == 0) ? android.hardware.radio.V1_4.RadioAccessFamily.UNKNOWN : raf;
-    }
-
     @Override
     public void getPreferredNetworkType(Message result) {
         IRadio radioProxy = getRadioProxy(result);
         if (radioProxy != null) {
             RILRequest rr = obtainRequest(RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE, result,
                     mRILDefaultWorkSource);
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
             if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_4)) {
                 android.hardware.radio.V1_4.IRadio radioProxy14 =
                         (android.hardware.radio.V1_4.IRadio) radioProxy;
@@ -3549,12 +3057,12 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
             mAllowedNetworkTypesBitmask = networkTypeBitmask;
             try {
                 radioProxy16.setAllowedNetworkTypesBitmap(rr.mSerial,
-                        convertToHalRadioAccessFamily(mAllowedNetworkTypesBitmask));
+                        RILUtils.convertToHalRadioAccessFamily(mAllowedNetworkTypesBitmask));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "setAllowedNetworkTypeBitmask", e);
             }
@@ -3577,7 +3085,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             try {
@@ -3597,7 +3105,7 @@
 
             if (RILJ_LOGD) {
                 riljLog(rr.serialString() + "> "
-                        + requestToString(rr.mRequest) + " enable = " + enable);
+                        + RILUtils.requestToString(rr.mRequest) + " enable = " + enable);
             }
 
             try {
@@ -3631,8 +3139,7 @@
                     workSource == null ? mRILDefaultWorkSource : workSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> "
-                        + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             try {
@@ -3674,8 +3181,8 @@
                     workSource == null ? mRILDefaultWorkSource : workSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> "
-                        + requestToString(rr.mRequest) + " enable = " + nrDualConnectivityState);
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + " enable = " + nrDualConnectivityState);
             }
 
             try {
@@ -3695,7 +3202,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " cdmaSubscription = " + cdmaSubscription);
             }
 
@@ -3714,7 +3221,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getCdmaRoamingPreference(rr.mSerial);
@@ -3732,7 +3241,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " cdmaRoamingType = " + cdmaRoamingType);
             }
 
@@ -3751,7 +3260,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_QUERY_TTY_MODE, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getTTYMode(rr.mSerial);
@@ -3769,7 +3280,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " ttyMode = " + ttyMode);
             }
 
@@ -3789,7 +3300,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " enable = " + enable);
             }
 
@@ -3808,7 +3319,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE,
                     result, mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getPreferredVoicePrivacy(rr.mSerial);
@@ -3826,12 +3339,13 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " featureCode = " + featureCode);
             }
 
             try {
-                radioProxy.sendCDMAFeatureCode(rr.mSerial, convertNullToEmptyString(featureCode));
+                radioProxy.sendCDMAFeatureCode(rr.mSerial,
+                        RILUtils.convertNullToEmptyString(featureCode));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "sendCDMAFeatureCode", e);
             }
@@ -3846,56 +3360,19 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " dtmfString = " + dtmfString + " on = " + on + " off = " + off);
             }
 
             try {
-                radioProxy.sendBurstDtmf(rr.mSerial, convertNullToEmptyString(dtmfString), on, off);
+                radioProxy.sendBurstDtmf(rr.mSerial, RILUtils.convertNullToEmptyString(dtmfString),
+                        on, off);
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "sendBurstDtmf", e);
             }
         }
     }
 
-    private void constructCdmaSendSmsRilRequest(CdmaSmsMessage msg, byte[] pdu) {
-        int addrNbrOfDigits;
-        int subaddrNbrOfDigits;
-        int bearerDataLength;
-        ByteArrayInputStream bais = new ByteArrayInputStream(pdu);
-        DataInputStream dis = new DataInputStream(bais);
-
-        try {
-            msg.teleserviceId = dis.readInt(); // teleServiceId
-            msg.isServicePresent = (byte) dis.readInt() == 1 ? true : false; // servicePresent
-            msg.serviceCategory = dis.readInt(); // serviceCategory
-            msg.address.digitMode = dis.read();  // address digit mode
-            msg.address.numberMode = dis.read(); // address number mode
-            msg.address.numberType = dis.read(); // address number type
-            msg.address.numberPlan = dis.read(); // address number plan
-            addrNbrOfDigits = (byte) dis.read();
-            for (int i = 0; i < addrNbrOfDigits; i++) {
-                msg.address.digits.add(dis.readByte()); // address_orig_bytes[i]
-            }
-            msg.subAddress.subaddressType = dis.read(); //subaddressType
-            msg.subAddress.odd = (byte) dis.read() == 1 ? true : false; //subaddr odd
-            subaddrNbrOfDigits = (byte) dis.read();
-            for (int i = 0; i < subaddrNbrOfDigits; i++) {
-                msg.subAddress.digits.add(dis.readByte()); //subaddr_orig_bytes[i]
-            }
-
-            bearerDataLength = dis.read();
-            for (int i = 0; i < bearerDataLength; i++) {
-                msg.bearerData.add(dis.readByte()); //bearerData[i]
-            }
-        } catch (IOException ex) {
-            if (RILJ_LOGD) {
-                riljLog("sendSmsCdma: conversion from input stream to object failed: "
-                        + ex);
-            }
-        }
-    }
-
     @Override
     public void sendCdmaSMSExpectMore(byte[] pdu, Message result) {
         IRadio radioProxy = getRadioProxy(result);
@@ -3904,10 +3381,11 @@
                     mRILDefaultWorkSource);
 
             // Do not log function arg for privacy
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
-            CdmaSmsMessage msg = new CdmaSmsMessage();
-            constructCdmaSendSmsRilRequest(msg, pdu);
+            CdmaSmsMessage msg = RILUtils.convertToHalCdmaSmsMessage(pdu);
             if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_6)) {
                 android.hardware.radio.V1_6.IRadio radioProxy16 =
                         (android.hardware.radio.V1_6.IRadio) radioProxy;
@@ -3944,10 +3422,11 @@
                     mRILDefaultWorkSource);
 
             // Do not log function arg for privacy
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
-            CdmaSmsMessage msg = new CdmaSmsMessage();
-            constructCdmaSendSmsRilRequest(msg, pdu);
+            CdmaSmsMessage msg = RILUtils.convertToHalCdmaSmsMessage(pdu);
             if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_6)) {
                 try {
                     android.hardware.radio.V1_6.IRadio radioProxy16 =
@@ -3980,7 +3459,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " success = " + success + " cause = " + cause);
             }
 
@@ -4003,7 +3482,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_GSM_GET_BROADCAST_CONFIG, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getGsmBroadcastConfig(rr.mSerial);
@@ -4021,7 +3502,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " with " + config.length + " configs : ");
                 for (int i = 0; i < config.length; i++) {
                     riljLog(config[i].toString());
@@ -4059,7 +3540,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " activate = " + activate);
             }
 
@@ -4078,7 +3559,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getCdmaBroadcastConfig(rr.mSerial);
@@ -4110,7 +3593,7 @@
             }
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " with " + halConfigs.size() + " configs : ");
                 for (CdmaBroadcastSmsConfigInfo config : halConfigs) {
                     riljLog(config.toString());
@@ -4133,7 +3616,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " activate = " + activate);
             }
 
@@ -4152,7 +3635,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_SUBSCRIPTION, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getCDMASubscription(rr.mSerial);
@@ -4164,7 +3649,7 @@
 
     @Override
     public void writeSmsToRuim(int status, byte[] pdu, Message result) {
-        status = translateStatus(status);
+        status = RILUtils.convertToHalSmsWriteArgsStatus(status);
         IRadio radioProxy = getRadioProxy(result);
         if (radioProxy != null) {
             RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM, result,
@@ -4172,13 +3657,13 @@
 
             if (RILJ_LOGV) {
                 riljLog(rr.serialString() + "> "
-                        + requestToString(rr.mRequest)
+                        + RILUtils.requestToString(rr.mRequest)
                         + " status = " + status);
             }
 
             CdmaSmsWriteArgs args = new CdmaSmsWriteArgs();
             args.status = status;
-            constructCdmaSendSmsRilRequest(args.message, pdu);
+            args.message = RILUtils.convertToHalCdmaSmsMessage(pdu);
 
             try {
                 radioProxy.writeSmsToRuim(rr.mSerial, args);
@@ -4197,7 +3682,7 @@
 
             if (RILJ_LOGV) {
                 riljLog(rr.serialString() + "> "
-                        + requestToString(rr.mRequest)
+                        + RILUtils.requestToString(rr.mRequest)
                         + " index = " + index);
             }
 
@@ -4216,7 +3701,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_DEVICE_IDENTITY, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getDeviceIdentity(rr.mSerial);
@@ -4233,7 +3720,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.exitEmergencyCallbackMode(rr.mSerial);
@@ -4250,7 +3739,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_GET_SMSC_ADDRESS, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getSmscAddress(rr.mSerial);
@@ -4268,12 +3759,12 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " address = " + address);
             }
 
             try {
-                radioProxy.setSmscAddress(rr.mSerial, convertNullToEmptyString(address));
+                radioProxy.setSmscAddress(rr.mSerial, RILUtils.convertNullToEmptyString(address));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "setSmscAddress", e);
             }
@@ -4289,7 +3780,7 @@
 
             if (RILJ_LOGD) {
                 riljLog(rr.serialString() + "> "
-                        + requestToString(rr.mRequest) + " available = " + available);
+                        + RILUtils.requestToString(rr.mRequest) + " available = " + available);
             }
 
             try {
@@ -4307,7 +3798,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.reportStkServiceIsRunning(rr.mSerial);
@@ -4324,7 +3817,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getCdmaSubscriptionSource(rr.mSerial);
@@ -4342,13 +3837,13 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " success = " + success);
             }
 
             try {
                 radioProxy.acknowledgeIncomingGsmSmsWithPdu(rr.mSerial, success,
-                        convertNullToEmptyString(ackPdu));
+                        RILUtils.convertNullToEmptyString(ackPdu));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "acknowledgeIncomingGsmSmsWithPdu", e);
             }
@@ -4362,7 +3857,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_VOICE_RADIO_TECH, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getVoiceRadioTechnology(rr.mSerial);
@@ -4381,7 +3878,7 @@
                     workSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             try {
@@ -4408,7 +3905,7 @@
                     workSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " rateInMillis = " + rateInMillis);
             }
 
@@ -4428,7 +3925,8 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + dataProfile);
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + dataProfile);
             }
 
             try {
@@ -4437,18 +3935,18 @@
                     android.hardware.radio.V1_5.IRadio radioProxy15 =
                             (android.hardware.radio.V1_5.IRadio) radioProxy;
                     radioProxy15.setInitialAttachApn_1_5(rr.mSerial,
-                            convertToHalDataProfile15(dataProfile));
+                            RILUtils.convertToHalDataProfile15(dataProfile));
                 } else if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_4)) {
                     // v1.4
                     android.hardware.radio.V1_4.IRadio radioProxy14 =
                             (android.hardware.radio.V1_4.IRadio) radioProxy;
                     radioProxy14.setInitialAttachApn_1_4(rr.mSerial,
-                            convertToHalDataProfile14(dataProfile));
+                            RILUtils.convertToHalDataProfile14(dataProfile));
                 } else {
                     // v1.3, v1.2, v1.1, and v1.0
                     radioProxy.setInitialAttachApn(rr.mSerial,
-                            convertToHalDataProfile10(dataProfile), dataProfile.isPersistent(),
-                            isRoaming);
+                            RILUtils.convertToHalDataProfile10(dataProfile),
+                            dataProfile.isPersistent(), isRoaming);
                 }
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "setInitialAttachApn", e);
@@ -4464,7 +3962,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             try {
@@ -4484,14 +3982,16 @@
                     mRILDefaultWorkSource);
 
             // Do not log function args for privacy
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             ImsSmsMessage msg = new ImsSmsMessage();
             msg.tech = RadioTechnologyFamily.THREE_GPP;
             msg.retry = (byte) retry >= 1 ? true : false;
             msg.messageRef = messageRef;
 
-            GsmSmsMessage gsmMsg = constructGsmSendSmsRilRequest(smscPdu, pdu);
+            GsmSmsMessage gsmMsg = RILUtils.convertToHalGsmSmsMessage(smscPdu, pdu);
             msg.gsmMessage.add(gsmMsg);
             try {
                 radioProxy.sendImsSms(rr.mSerial, msg);
@@ -4511,16 +4011,15 @@
                     mRILDefaultWorkSource);
 
             // Do not log function args for privacy
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             ImsSmsMessage msg = new ImsSmsMessage();
             msg.tech = RadioTechnologyFamily.THREE_GPP2;
             msg.retry = (byte) retry >= 1 ? true : false;
             msg.messageRef = messageRef;
-
-            CdmaSmsMessage cdmaMsg = new CdmaSmsMessage();
-            constructCdmaSendSmsRilRequest(cdmaMsg, pdu);
-            msg.cdmaMessage.add(cdmaMsg);
+            msg.cdmaMessage.add(RILUtils.convertToHalCdmaSmsMessage(pdu));
 
             try {
                 radioProxy.sendImsSms(rr.mSerial, msg);
@@ -4532,19 +4031,6 @@
         }
     }
 
-    private SimApdu createSimApdu(int channel, int cla, int instruction, int p1, int p2, int p3,
-                                  String data) {
-        SimApdu msg = new SimApdu();
-        msg.sessionId = channel;
-        msg.cla = cla;
-        msg.instruction = instruction;
-        msg.p1 = p1;
-        msg.p2 = p2;
-        msg.p3 = p3;
-        msg.data = convertNullToEmptyString(data);
-        return msg;
-    }
-
     @Override
     public void iccTransmitApduBasicChannel(int cla, int instruction, int p1, int p2,
                                             int p3, String data, Message result) {
@@ -4555,16 +4041,16 @@
 
             if (RILJ_LOGD) {
                 if (TelephonyUtils.IS_DEBUGGABLE) {
-                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                             + String.format(" cla = 0x%02X ins = 0x%02X", cla, instruction)
                             + String.format(" p1 = 0x%02X p2 = 0x%02X p3 = 0x%02X", p1, p2, p3)
                             + " data = " + data);
                 } else {
-                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
                 }
             }
 
-            SimApdu msg = createSimApdu(0, cla, instruction, p1, p2, p3, data);
+            SimApdu msg = RILUtils.convertToHalSimApdu(0, cla, instruction, p1, p2, p3, data);
             try {
                 radioProxy.iccTransmitApduBasicChannel(rr.mSerial, msg);
             } catch (RemoteException | RuntimeException e) {
@@ -4582,15 +4068,16 @@
 
             if (RILJ_LOGD) {
                 if (TelephonyUtils.IS_DEBUGGABLE) {
-                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " aid = " + aid
-                            + " p2 = " + p2);
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                            + " aid = " + aid + " p2 = " + p2);
                 } else {
-                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
                 }
             }
 
             try {
-                radioProxy.iccOpenLogicalChannel(rr.mSerial, convertNullToEmptyString(aid), p2);
+                radioProxy.iccOpenLogicalChannel(rr.mSerial, RILUtils.convertNullToEmptyString(aid),
+                        p2);
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "iccOpenLogicalChannel", e);
             }
@@ -4605,8 +4092,8 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " channel = "
-                        + channel);
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + " channel = " + channel);
             }
 
             try {
@@ -4633,17 +4120,17 @@
 
             if (RILJ_LOGD) {
                 if (TelephonyUtils.IS_DEBUGGABLE) {
-                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                             + String.format(" channel = %d", channel)
                             + String.format(" cla = 0x%02X ins = 0x%02X", cla, instruction)
                             + String.format(" p1 = 0x%02X p2 = 0x%02X p3 = 0x%02X", p1, p2, p3)
                             + " data = " + data);
                 } else {
-                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
                 }
             }
 
-            SimApdu msg = createSimApdu(channel, cla, instruction, p1, p2, p3, data);
+            SimApdu msg = RILUtils.convertToHalSimApdu(channel, cla, instruction, p1, p2, p3, data);
 
             try {
                 radioProxy.iccTransmitApduLogicalChannel(rr.mSerial, msg);
@@ -4662,7 +4149,7 @@
                     workSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " itemId = " + itemID);
             }
 
@@ -4683,13 +4170,13 @@
                     workSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " itemId = " + itemId + " itemValue = " + itemValue);
             }
 
             NvWriteItem item = new NvWriteItem();
             item.itemId = itemId;
-            item.value = convertNullToEmptyString(itemValue);
+            item.value = RILUtils.convertNullToEmptyString(itemValue);
 
             try {
                 radioProxy.nvWriteItem(rr.mSerial, item);
@@ -4707,7 +4194,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " PreferredRoamingList = 0x"
                         + IccUtils.bytesToHexString(preferredRoamingList));
             }
@@ -4733,12 +4220,12 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " resetType = " + resetType);
             }
 
             try {
-                radioProxy.nvResetConfig(rr.mSerial, convertToHalResetNvType(resetType));
+                radioProxy.nvResetConfig(rr.mSerial, RILUtils.convertToHalResetNvType(resetType));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "nvResetConfig", e);
             }
@@ -4754,7 +4241,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " slot = " + slotId + " appIndex = " + appIndex
                         + " subId = " + subId + " subStatus = " + subStatus);
             }
@@ -4781,7 +4268,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " allowed = " + allowed);
             }
 
@@ -4801,7 +4288,9 @@
                     mRILDefaultWorkSource);
 
             // Do not log function args for privacy
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.getHardwareConfig(rr.mSerial);
@@ -4820,13 +4309,15 @@
                     mRILDefaultWorkSource);
 
             // Do not log function args for privacy
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy.requestIccSimAuthentication(rr.mSerial,
                         authContext,
-                        convertNullToEmptyString(data),
-                        convertNullToEmptyString(aid));
+                        RILUtils.convertNullToEmptyString(data),
+                        RILUtils.convertNullToEmptyString(aid));
             } catch (RemoteException | RuntimeException e) {
                 handleRadioProxyExceptionForRR(rr, "requestIccSimAuthentication", e);
             }
@@ -4847,11 +4338,11 @@
 
                     ArrayList<android.hardware.radio.V1_5.DataProfileInfo> dpis = new ArrayList<>();
                     for (DataProfile dp : dps) {
-                        dpis.add(convertToHalDataProfile15(dp));
+                        dpis.add(RILUtils.convertToHalDataProfile15(dp));
                     }
 
                     if (RILJ_LOGD) {
-                        riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                        riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                                 + " with data profiles : ");
                         for (DataProfile profile : dps) {
                             riljLog(profile.toString());
@@ -4866,11 +4357,11 @@
 
                     ArrayList<android.hardware.radio.V1_4.DataProfileInfo> dpis = new ArrayList<>();
                     for (DataProfile dp : dps) {
-                        dpis.add(convertToHalDataProfile14(dp));
+                        dpis.add(RILUtils.convertToHalDataProfile14(dp));
                     }
 
                     if (RILJ_LOGD) {
-                        riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                        riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                                 + " with data profiles : ");
                         for (DataProfile profile : dps) {
                             riljLog(profile.toString());
@@ -4885,13 +4376,13 @@
                         // For v1.0 to v1.2, we only send data profiles that has the persistent
                         // (a.k.a modem cognitive) bit set to true.
                         if (dp.isPersistent()) {
-                            dpis.add(convertToHalDataProfile10(dp));
+                            dpis.add(RILUtils.convertToHalDataProfile10(dp));
                         }
                     }
 
                     if (!dpis.isEmpty()) {
                         if (RILJ_LOGD) {
-                            riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                            riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                                     + " with data profiles : ");
                             for (DataProfile profile : dps) {
                                 riljLog(profile.toString());
@@ -4915,7 +4406,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             try {
@@ -4934,7 +4425,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             try {
@@ -4953,7 +4444,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " RadioCapability = " + rc.toString());
             }
 
@@ -4963,7 +4454,7 @@
             halRc.session = rc.getSession();
             halRc.phase = rc.getPhase();
             halRc.raf = rc.getRadioAccessFamily();
-            halRc.logicalModemUuid = convertNullToEmptyString(rc.getLogicalModemUuid());
+            halRc.logicalModemUuid = RILUtils.convertNullToEmptyString(rc.getLogicalModemUuid());
             halRc.status = rc.getStatus();
 
             try {
@@ -4989,7 +4480,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " reportIntervalMs = " + reportIntervalMs + " pullMode = " + pullMode);
             }
 
@@ -5015,7 +4506,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             try {
@@ -5056,7 +4547,7 @@
 
             if (RILJ_LOGD) {
                 riljLog(rr.serialString() + "> "
-                        + requestToString(rr.mRequest)
+                        + RILUtils.requestToString(rr.mRequest)
                         + " dataThrottlingAction = " + dataThrottlingAction
                         + " completionWindowMillis " + completionWindowMillis);
             }
@@ -5089,7 +4580,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             try {
@@ -5109,7 +4600,7 @@
                     workSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             try {
@@ -5127,41 +4618,6 @@
 
     }
 
-    /**
-     * Convert a list of CarrierIdentifier into a list of Carrier defined in 1.0/types.hal.
-     * @param carriers List of CarrierIdentifier
-     * @return List of converted objects
-     */
-    @VisibleForTesting
-    public static ArrayList<Carrier> createCarrierRestrictionList(
-            List<CarrierIdentifier> carriers) {
-        ArrayList<Carrier> result = new ArrayList<>();
-        for (CarrierIdentifier ci : carriers) {
-            Carrier c = new Carrier();
-            c.mcc = convertNullToEmptyString(ci.getMcc());
-            c.mnc = convertNullToEmptyString(ci.getMnc());
-            int matchType = CarrierIdentifier.MatchType.ALL;
-            String matchData = null;
-            if (!TextUtils.isEmpty(ci.getSpn())) {
-                matchType = CarrierIdentifier.MatchType.SPN;
-                matchData = ci.getSpn();
-            } else if (!TextUtils.isEmpty(ci.getImsi())) {
-                matchType = CarrierIdentifier.MatchType.IMSI_PREFIX;
-                matchData = ci.getImsi();
-            } else if (!TextUtils.isEmpty(ci.getGid1())) {
-                matchType = CarrierIdentifier.MatchType.GID1;
-                matchData = ci.getGid1();
-            } else if (!TextUtils.isEmpty(ci.getGid2())) {
-                matchType = CarrierIdentifier.MatchType.GID2;
-                matchData = ci.getGid2();
-            }
-            c.matchType = matchType;
-            c.matchData = convertNullToEmptyString(matchData);
-            result.add(c);
-        }
-        return result;
-    }
-
     @Override
     public void setAllowedCarriers(CarrierRestrictionRules carrierRestrictionRules,
             Message result, WorkSource workSource) {
@@ -5176,7 +4632,7 @@
         RILRequest rr = obtainRequest(RIL_REQUEST_SET_ALLOWED_CARRIERS, result, workSource);
 
         if (RILJ_LOGD) {
-            riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " params: "
+            riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest) + " params: "
                     + carrierRestrictionRules);
         }
 
@@ -5197,10 +4653,10 @@
             // Prepare structure with allowed list, excluded list and priority
             CarrierRestrictionsWithPriority carrierRestrictions =
                     new CarrierRestrictionsWithPriority();
-            carrierRestrictions.allowedCarriers =
-                    createCarrierRestrictionList(carrierRestrictionRules.getAllowedCarriers());
-            carrierRestrictions.excludedCarriers =
-                    createCarrierRestrictionList(carrierRestrictionRules.getExcludedCarriers());
+            carrierRestrictions.allowedCarriers = RILUtils.convertToHalCarrierRestrictionList(
+                    carrierRestrictionRules.getAllowedCarriers());
+            carrierRestrictions.excludedCarriers = RILUtils.convertToHalCarrierRestrictionList(
+                    carrierRestrictionRules.getExcludedCarriers());
             carrierRestrictions.allowedCarriersPrioritized =
                     (carrierRestrictionRules.getDefaultCarrierRestriction()
                         == CarrierRestrictionRules.CARRIER_RESTRICTION_DEFAULT_NOT_ALLOWED);
@@ -5234,8 +4690,8 @@
 
             // Prepare structure with allowed list
             CarrierRestrictions carrierRestrictions = new CarrierRestrictions();
-            carrierRestrictions.allowedCarriers =
-                    createCarrierRestrictionList(carrierRestrictionRules.getAllowedCarriers());
+            carrierRestrictions.allowedCarriers = RILUtils.convertToHalCarrierRestrictionList(
+                    carrierRestrictionRules.getAllowedCarriers());
 
             try {
                 radioProxy.setAllowedCarriers(rr.mSerial, isAllCarriersAllowed,
@@ -5257,7 +4713,7 @@
                 workSource);
 
         if (RILJ_LOGD) {
-            riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
         }
 
         if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_4)) {
@@ -5291,7 +4747,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " "
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest) + " "
                         + stateType + ":" + state);
             }
 
@@ -5311,7 +4767,8 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " " + filter);
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + " " + filter);
             }
 
             if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_5)) {
@@ -5360,7 +4817,7 @@
                 RILRequest rr = obtainRequest(RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA,
                         result, mRILDefaultWorkSource);
                 if (RILJ_LOGD) {
-                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
                 }
                 try {
                     android.hardware.radio.V1_2.IRadio radioProxy12 =
@@ -5368,8 +4825,8 @@
                     radioProxy12.setSignalStrengthReportingCriteria(rr.mSerial,
                             signalThresholdInfo.getHysteresisMs(),
                             signalThresholdInfo.getHysteresisDb(),
-                            primitiveArrayToArrayList(signalThresholdInfo.getThresholds()),
-                            convertAntToHalAnt(ran));
+                            RILUtils.primitiveArrayToArrayList(signalThresholdInfo.getThresholds()),
+                            RILUtils.convertToHalAccessNetwork(ran));
                 } catch (RemoteException | RuntimeException e) {
                     handleRadioProxyExceptionForRR(rr, "setSignalStrengthReportingCriteria", e);
                 }
@@ -5378,14 +4835,14 @@
                 RILRequest rr = obtainRequest(RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA,
                         result, mRILDefaultWorkSource);
                 if (RILJ_LOGD) {
-                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
                 }
                 try {
                     android.hardware.radio.V1_5.IRadio radioProxy15 =
                             (android.hardware.radio.V1_5.IRadio) radioProxy;
                     radioProxy15.setSignalStrengthReportingCriteria_1_5(rr.mSerial,
-                            convertToHalSignalThresholdInfo(signalThresholdInfo),
-                            convertAntToHalAnt(ran));
+                            RILUtils.convertToHalSignalThresholdInfo(signalThresholdInfo),
+                            RILUtils.convertToHalAccessNetwork(ran));
                 } catch (RemoteException | RuntimeException e) {
                     handleRadioProxyExceptionForRR(
                             rr, "setSignalStrengthReportingCriteria_1_5", e);
@@ -5394,19 +4851,6 @@
         }
     }
 
-    private static android.hardware.radio.V1_5.SignalThresholdInfo convertToHalSignalThresholdInfo(
-            SignalThresholdInfo signalThresholdInfo) {
-        android.hardware.radio.V1_5.SignalThresholdInfo signalThresholdInfoHal =
-                new android.hardware.radio.V1_5.SignalThresholdInfo();
-        signalThresholdInfoHal.signalMeasurement = signalThresholdInfo.getSignalMeasurementType();
-        signalThresholdInfoHal.hysteresisMs = signalThresholdInfo.getHysteresisMs();
-        signalThresholdInfoHal.hysteresisDb = signalThresholdInfo.getHysteresisDb();
-        signalThresholdInfoHal.thresholds = primitiveArrayToArrayList(
-                signalThresholdInfo.getThresholds());
-        signalThresholdInfoHal.isEnabled = signalThresholdInfo.isEnabled();
-        return signalThresholdInfoHal;
-    }
-
     @Override
     public void setLinkCapacityReportingCriteria(int hysteresisMs, int hysteresisDlKbps,
             int hysteresisUlKbps, int[] thresholdsDlKbps, int[] thresholdsUlKbps, int ran,
@@ -5416,7 +4860,7 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA, result,
                     mRILDefaultWorkSource);
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
             try {
                 if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_5)) {
@@ -5424,8 +4868,9 @@
                             (android.hardware.radio.V1_5.IRadio) radioProxy;
                     radioProxy15.setLinkCapacityReportingCriteria_1_5(rr.mSerial, hysteresisMs,
                             hysteresisDlKbps, hysteresisUlKbps,
-                            primitiveArrayToArrayList(thresholdsDlKbps),
-                            primitiveArrayToArrayList(thresholdsUlKbps), convertAntToHalAnt(ran));
+                            RILUtils.primitiveArrayToArrayList(thresholdsDlKbps),
+                            RILUtils.primitiveArrayToArrayList(thresholdsUlKbps),
+                            RILUtils.convertToHalAccessNetwork(ran));
                 } else if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_2)) {
                     android.hardware.radio.V1_2.IRadio radioProxy12 =
                             (android.hardware.radio.V1_2.IRadio) radioProxy;
@@ -5434,8 +4879,9 @@
                     }
                     radioProxy12.setLinkCapacityReportingCriteria(rr.mSerial, hysteresisMs,
                             hysteresisDlKbps, hysteresisUlKbps,
-                            primitiveArrayToArrayList(thresholdsDlKbps),
-                            primitiveArrayToArrayList(thresholdsUlKbps), convertAntToHalAnt(ran));
+                            RILUtils.primitiveArrayToArrayList(thresholdsDlKbps),
+                            RILUtils.primitiveArrayToArrayList(thresholdsUlKbps),
+                            RILUtils.convertToHalAccessNetwork(ran));
                 } else {
                     riljLoge("setLinkCapacityReportingCriteria ignored on IRadio version less "
                             + "than 1.2");
@@ -5446,46 +4892,6 @@
         }
     }
 
-    /** Converts from AccessNetworkType in frameworks to AccessNetwork in HAL. */
-    private static int convertAntToHalAnt(int radioAccessNetwork) {
-        switch (radioAccessNetwork) {
-            case AccessNetworkType.GERAN:
-                return AccessNetwork.GERAN;
-            case AccessNetworkType.UTRAN:
-                return AccessNetwork.UTRAN;
-            case AccessNetworkType.EUTRAN:
-                return AccessNetwork.EUTRAN;
-            case AccessNetworkType.CDMA2000:
-                return AccessNetwork.CDMA2000;
-            case AccessNetworkType.IWLAN:
-                return AccessNetwork.IWLAN;
-            case AccessNetworkType.NGRAN:
-                return AccessNetwork.NGRAN;
-            case AccessNetworkType.UNKNOWN:
-            default:
-                return AccessNetwork.UNKNOWN;
-        }
-    }
-
-    /** Converts from AccessNetworkType in frameworks to RadioAccessNetworks in HAL. */
-    private static int convertAntToRan(int accessNetworkType) {
-        switch (accessNetworkType) {
-            case AccessNetworkType.GERAN:
-                return RadioAccessNetworks.GERAN;
-            case AccessNetworkType.UTRAN:
-                return RadioAccessNetworks.UTRAN;
-            case AccessNetworkType.EUTRAN:
-                return RadioAccessNetworks.EUTRAN;
-            case AccessNetworkType.NGRAN:
-                return RadioAccessNetworks.NGRAN;
-            case AccessNetworkType.CDMA2000:
-                return RadioAccessNetworks.CDMA2000;
-            case AccessNetworkType.UNKNOWN:
-            default:
-                return RadioAccessNetworks.UNKNOWN;
-        }
-    }
-
     @Override
     public void setSimCardPower(int state, Message result, WorkSource workSource) {
         workSource = getDefaultWorkSourceIfInvalid(workSource);
@@ -5495,7 +4901,8 @@
                     workSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " " + state);
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
+                        + " " + state);
             }
 
             if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_6)) {
@@ -5552,7 +4959,9 @@
 
                 RILRequest rr = obtainRequest(RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION, result,
                         mRILDefaultWorkSource);
-                if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                if (RILJ_LOGD) {
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+                }
 
                 try {
                     android.hardware.radio.V1_6.ImsiEncryptionInfo halImsiInfo =
@@ -5581,7 +4990,9 @@
 
                 RILRequest rr = obtainRequest(RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION, result,
                         mRILDefaultWorkSource);
-                if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                if (RILJ_LOGD) {
+                    riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+                }
 
                 try {
                     android.hardware.radio.V1_1.ImsiEncryptionInfo halImsiInfo =
@@ -5632,7 +5043,7 @@
         RILRequest rr = obtainRequest(
                 RIL_REQUEST_START_KEEPALIVE, result, mRILDefaultWorkSource);
 
-        if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+        if (RILJ_LOGD) riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
 
         try {
             android.hardware.radio.V1_1.KeepaliveRequest req =
@@ -5653,10 +5064,10 @@
 
             final InetAddress srcAddress = packetData.getSrcAddress();
             final InetAddress dstAddress = packetData.getDstAddress();
-            appendPrimitiveArrayToArrayList(
+            RILUtils.appendPrimitiveArrayToArrayList(
                     srcAddress.getAddress(), req.sourceAddress);
             req.sourcePort = packetData.getSrcPort();
-            appendPrimitiveArrayToArrayList(
+            RILUtils.appendPrimitiveArrayToArrayList(
                     dstAddress.getAddress(), req.destinationAddress);
             req.destinationPort = packetData.getDstPort();
             req.maxKeepaliveIntervalMillis = intervalMillis;
@@ -5687,7 +5098,7 @@
         RILRequest rr = obtainRequest(
                 RIL_REQUEST_STOP_KEEPALIVE, result, mRILDefaultWorkSource);
 
-        if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+        if (RILJ_LOGD) riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
 
         try {
             radioProxy11.stopKeepalive(rr.mSerial, sessionHandle);
@@ -5749,7 +5160,7 @@
         RILRequest rr = obtainRequest(RIL_REQUEST_ENABLE_UICC_APPLICATIONS,
                 onCompleteMessage, mRILDefaultWorkSource);
 
-        if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+        if (RILJ_LOGD) riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
 
         try {
             radioProxy15.enableUiccApplications(rr.mSerial, enable);
@@ -5783,7 +5194,7 @@
         RILRequest rr = obtainRequest(RIL_REQUEST_GET_UICC_APPLICATIONS_ENABLEMENT,
                 onCompleteMessage, mRILDefaultWorkSource);
 
-        if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+        if (RILJ_LOGD) riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
 
         try {
             radioProxy15.areUiccApplicationsEnabled(rr.mSerial);
@@ -5801,26 +5212,6 @@
                 .greaterOrEqual(RADIO_HAL_VERSION_1_5);
     }
 
-    /**
-     *  Translates EF_SMS status bits to a status value compatible with
-     *  SMS AT commands.  See TS 27.005 3.1.
-     */
-    private int translateStatus(int status) {
-        switch(status & 0x7) {
-            case SmsManager.STATUS_ON_ICC_READ:
-                return 1;
-            case SmsManager.STATUS_ON_ICC_UNREAD:
-                return 0;
-            case SmsManager.STATUS_ON_ICC_SENT:
-                return 3;
-            case SmsManager.STATUS_ON_ICC_UNSENT:
-                return 2;
-        }
-
-        // Default to READ.
-        return 1;
-    }
-
     @Override
     public void resetRadio(Message result) {
         throw new RuntimeException("resetRadio not expected to be called");
@@ -5837,7 +5228,7 @@
                     result, mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             try {
@@ -5871,7 +5262,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_GET_BARRING_INFO, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy15.getBarringInfo(rr.mSerial);
@@ -5891,7 +5284,9 @@
         if (radioProxy16 != null) {
             RILRequest rr = obtainRequest(RIL_REQUEST_ALLOCATE_PDU_SESSION_ID, result,
                     mRILDefaultWorkSource);
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy16.allocatePduSessionId(rr.mSerial);
@@ -5915,7 +5310,9 @@
         if (radioProxy16 != null) {
             RILRequest rr = obtainRequest(RIL_REQUEST_RELEASE_PDU_SESSION_ID, result,
                     mRILDefaultWorkSource);
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy16.releasePduSessionId(rr.mSerial, pduSessionId);
@@ -5939,7 +5336,9 @@
         if (radioProxy16 != null) {
             RILRequest rr = obtainRequest(RIL_REQUEST_START_HANDOVER, result,
                     mRILDefaultWorkSource);
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy16.startHandover(rr.mSerial, callId);
@@ -5964,7 +5363,9 @@
         if (radioProxy16 != null) {
             RILRequest rr = obtainRequest(RIL_REQUEST_CANCEL_HANDOVER, result,
                     mRILDefaultWorkSource);
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy16.cancelHandover(rr.mSerial, callId);
@@ -5987,7 +5388,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_6)) {
@@ -6017,7 +5418,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
             }
 
             if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_6)) {
@@ -6047,7 +5448,7 @@
                     mRILDefaultWorkSource);
 
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest)
                         + " with " + phonebookRecord.toString());
             }
 
@@ -6084,7 +5485,9 @@
             RILRequest rr = obtainRequest(RIL_REQUEST_GET_SLICING_CONFIG, result,
                     mRILDefaultWorkSource);
 
-            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+            if (RILJ_LOGD) {
+                riljLog(rr.serialString() + "> " + RILUtils.requestToString(rr.mRequest));
+            }
 
             try {
                 radioProxy16.getSlicingConfig(rr.mSerial);
@@ -6136,7 +5539,7 @@
         } else {
             decrementWakeLock(rr);
             if (RIL.RILJ_LOGD) {
-                riljLog(rr.serialString() + " Ack < " + RIL.requestToString(rr.mRequest));
+                riljLog(rr.serialString() + " Ack < " + RILUtils.requestToString(rr.mRequest));
             }
         }
     }
@@ -6167,6 +5570,19 @@
         return processResponseInternal(responseInfo.serial, responseInfo.error, responseInfo.type);
     }
 
+    /**
+     * This is a helper function for an AIDL RadioResponseInfo to be called when a RadioResponse
+     * callback is called.
+     * It takes care of acks, wakelocks, and finds and returns RILRequest corresponding to the
+     * response if one is found.
+     * @param responseInfo RadioResponseInfo received in response callback
+     * @return RILRequest corresponding to the response
+     */
+    @VisibleForTesting
+    public RILRequest processResponse(android.hardware.radio.RadioResponseInfo responseInfo) {
+        return processResponseInternal(responseInfo.serial, responseInfo.error, responseInfo.type);
+    }
+
     private RILRequest processResponseInternal(int serial, int error, int type) {
         RILRequest rr = null;
 
@@ -6182,7 +5598,7 @@
                     mRadioBugDetector.detectRadioBug(rr.mRequest, error);
                 }
                 if (RILJ_LOGD) {
-                    riljLog(rr.serialString() + " Ack < " + requestToString(rr.mRequest));
+                    riljLog(rr.serialString() + " Ack < " + RILUtils.requestToString(rr.mRequest));
                 }
             }
             return rr;
@@ -6204,7 +5620,7 @@
             sendAck();
             if (RIL.RILJ_LOGD) {
                 riljLog("Response received for " + rr.serialString() + " "
-                        + RIL.requestToString(rr.mRequest) + " Sending ack to ril.cpp");
+                        + RILUtils.requestToString(rr.mRequest) + " Sending ack to ril.cpp");
             }
         } else {
             // ack sent for SOLICITED_ACK_EXP above; nothing to do for SOLICITED response
@@ -6290,16 +5706,31 @@
         processResponseDoneInternal(rr, responseInfo.error, responseInfo.type, ret);
     }
 
+    /**
+     * This is a helper function to be called at the end of the RadioResponse callbacks using for
+     * RadioResponseInfo AIDL.
+     * It takes care of sending error response, logging, decrementing wakelock if needed, and
+     * releases the request from memory pool.
+     * @param rr RILRequest for which response callback was called
+     * @param responseInfo RadioResponseInfo received in the callback
+     * @param ret object to be returned to request sender
+     */
+    @VisibleForTesting
+    public void processResponseDone(RILRequest rr,
+            android.hardware.radio.RadioResponseInfo responseInfo, Object ret) {
+        processResponseDoneInternal(rr, responseInfo.error, responseInfo.type, ret);
+    }
+
     private void processResponseDoneInternal(
             RILRequest rr, int rilError, int responseType, Object ret) {
         if (rilError == 0) {
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "< " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "< " + RILUtils.requestToString(rr.mRequest)
                         + " " + retToString(rr.mRequest, ret));
             }
         } else {
             if (RILJ_LOGD) {
-                riljLog(rr.serialString() + "< " + requestToString(rr.mRequest)
+                riljLog(rr.serialString() + "< " + RILUtils.requestToString(rr.mRequest)
                         + " error " + rilError);
             }
             rr.onError(rilError, ret);
@@ -6319,7 +5750,7 @@
     @VisibleForTesting
     public void processResponseFallback(RILRequest rr, RadioResponseInfo responseInfo, Object ret) {
         if (responseInfo.error == REQUEST_NOT_SUPPORTED && RILJ_LOGD) {
-            riljLog(rr.serialString() + "< " + requestToString(rr.mRequest)
+            riljLog(rr.serialString() + "< " + RILUtils.requestToString(rr.mRequest)
                     + " request not supported, falling back");
         }
         processResponseCleanUp(rr, responseInfo.error, responseInfo.type, ret);
@@ -6515,7 +5946,7 @@
                 rr = mRequestList.valueAt(i);
                 if (RILJ_LOGD && loggable) {
                     Rlog.d(RILJ_LOG_TAG, i + ": [" + rr.mSerial + "] "
-                            + requestToString(rr.mRequest));
+                            + RILUtils.requestToString(rr.mRequest));
                 }
                 rr.onError(error, null);
                 decrementWakeLock(rr);
@@ -6692,8 +6123,7 @@
     }
 
     @UnsupportedAppUsage
-    void
-    notifyRegistrantsCdmaInfoRec(CdmaInformationRecords infoRec) {
+    void notifyRegistrantsCdmaInfoRec(CdmaInformationRecords infoRec) {
         int response = RIL_UNSOL_CDMA_INFO_REC;
         if (infoRec.record instanceof CdmaInformationRecords.CdmaDisplayInfoRec) {
             if (mDisplayInfoRegistrants != null) {
@@ -6743,493 +6173,6 @@
     }
 
     @UnsupportedAppUsage
-    static String requestToString(int request) {
-        switch(request) {
-            case RIL_REQUEST_GET_SIM_STATUS:
-                return "GET_SIM_STATUS";
-            case RIL_REQUEST_ENTER_SIM_PIN:
-                return "ENTER_SIM_PIN";
-            case RIL_REQUEST_ENTER_SIM_PUK:
-                return "ENTER_SIM_PUK";
-            case RIL_REQUEST_ENTER_SIM_PIN2:
-                return "ENTER_SIM_PIN2";
-            case RIL_REQUEST_ENTER_SIM_PUK2:
-                return "ENTER_SIM_PUK2";
-            case RIL_REQUEST_CHANGE_SIM_PIN:
-                return "CHANGE_SIM_PIN";
-            case RIL_REQUEST_CHANGE_SIM_PIN2:
-                return "CHANGE_SIM_PIN2";
-            case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION:
-                return "ENTER_NETWORK_DEPERSONALIZATION";
-            case RIL_REQUEST_GET_CURRENT_CALLS:
-                return "GET_CURRENT_CALLS";
-            case RIL_REQUEST_DIAL:
-                return "DIAL";
-            case RIL_REQUEST_GET_IMSI:
-                return "GET_IMSI";
-            case RIL_REQUEST_HANGUP:
-                return "HANGUP";
-            case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND:
-                return "HANGUP_WAITING_OR_BACKGROUND";
-            case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND:
-                return "HANGUP_FOREGROUND_RESUME_BACKGROUND";
-            case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE:
-                return "REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
-            case RIL_REQUEST_CONFERENCE:
-                return "CONFERENCE";
-            case RIL_REQUEST_UDUB:
-                return "UDUB";
-            case RIL_REQUEST_LAST_CALL_FAIL_CAUSE:
-                return "LAST_CALL_FAIL_CAUSE";
-            case RIL_REQUEST_SIGNAL_STRENGTH:
-                return "SIGNAL_STRENGTH";
-            case RIL_REQUEST_VOICE_REGISTRATION_STATE:
-                return "VOICE_REGISTRATION_STATE";
-            case RIL_REQUEST_DATA_REGISTRATION_STATE:
-                return "DATA_REGISTRATION_STATE";
-            case RIL_REQUEST_OPERATOR:
-                return "OPERATOR";
-            case RIL_REQUEST_RADIO_POWER:
-                return "RADIO_POWER";
-            case RIL_REQUEST_DTMF:
-                return "DTMF";
-            case RIL_REQUEST_SEND_SMS:
-                return "SEND_SMS";
-            case RIL_REQUEST_SEND_SMS_EXPECT_MORE:
-                return "SEND_SMS_EXPECT_MORE";
-            case RIL_REQUEST_SETUP_DATA_CALL:
-                return "SETUP_DATA_CALL";
-            case RIL_REQUEST_SIM_IO:
-                return "SIM_IO";
-            case RIL_REQUEST_SEND_USSD:
-                return "SEND_USSD";
-            case RIL_REQUEST_CANCEL_USSD:
-                return "CANCEL_USSD";
-            case RIL_REQUEST_GET_CLIR:
-                return "GET_CLIR";
-            case RIL_REQUEST_SET_CLIR:
-                return "SET_CLIR";
-            case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS:
-                return "QUERY_CALL_FORWARD_STATUS";
-            case RIL_REQUEST_SET_CALL_FORWARD:
-                return "SET_CALL_FORWARD";
-            case RIL_REQUEST_QUERY_CALL_WAITING:
-                return "QUERY_CALL_WAITING";
-            case RIL_REQUEST_SET_CALL_WAITING:
-                return "SET_CALL_WAITING";
-            case RIL_REQUEST_SMS_ACKNOWLEDGE:
-                return "SMS_ACKNOWLEDGE";
-            case RIL_REQUEST_GET_IMEI:
-                return "GET_IMEI";
-            case RIL_REQUEST_GET_IMEISV:
-                return "GET_IMEISV";
-            case RIL_REQUEST_ANSWER:
-                return "ANSWER";
-            case RIL_REQUEST_DEACTIVATE_DATA_CALL:
-                return "DEACTIVATE_DATA_CALL";
-            case RIL_REQUEST_QUERY_FACILITY_LOCK:
-                return "QUERY_FACILITY_LOCK";
-            case RIL_REQUEST_SET_FACILITY_LOCK:
-                return "SET_FACILITY_LOCK";
-            case RIL_REQUEST_CHANGE_BARRING_PASSWORD:
-                return "CHANGE_BARRING_PASSWORD";
-            case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE:
-                return "QUERY_NETWORK_SELECTION_MODE";
-            case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC:
-                return "SET_NETWORK_SELECTION_AUTOMATIC";
-            case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL:
-                return "SET_NETWORK_SELECTION_MANUAL";
-            case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS :
-                return "QUERY_AVAILABLE_NETWORKS ";
-            case RIL_REQUEST_DTMF_START:
-                return "DTMF_START";
-            case RIL_REQUEST_DTMF_STOP:
-                return "DTMF_STOP";
-            case RIL_REQUEST_BASEBAND_VERSION:
-                return "BASEBAND_VERSION";
-            case RIL_REQUEST_SEPARATE_CONNECTION:
-                return "SEPARATE_CONNECTION";
-            case RIL_REQUEST_SET_MUTE:
-                return "SET_MUTE";
-            case RIL_REQUEST_GET_MUTE:
-                return "GET_MUTE";
-            case RIL_REQUEST_QUERY_CLIP:
-                return "QUERY_CLIP";
-            case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE:
-                return "LAST_DATA_CALL_FAIL_CAUSE";
-            case RIL_REQUEST_DATA_CALL_LIST:
-                return "DATA_CALL_LIST";
-            case RIL_REQUEST_RESET_RADIO:
-                return "RESET_RADIO";
-            case RIL_REQUEST_OEM_HOOK_RAW:
-                return "OEM_HOOK_RAW";
-            case RIL_REQUEST_OEM_HOOK_STRINGS:
-                return "OEM_HOOK_STRINGS";
-            case RIL_REQUEST_SCREEN_STATE:
-                return "SCREEN_STATE";
-            case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION:
-                return "SET_SUPP_SVC_NOTIFICATION";
-            case RIL_REQUEST_WRITE_SMS_TO_SIM:
-                return "WRITE_SMS_TO_SIM";
-            case RIL_REQUEST_DELETE_SMS_ON_SIM:
-                return "DELETE_SMS_ON_SIM";
-            case RIL_REQUEST_SET_BAND_MODE:
-                return "SET_BAND_MODE";
-            case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE:
-                return "QUERY_AVAILABLE_BAND_MODE";
-            case RIL_REQUEST_STK_GET_PROFILE:
-                return "STK_GET_PROFILE";
-            case RIL_REQUEST_STK_SET_PROFILE:
-                return "STK_SET_PROFILE";
-            case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND:
-                return "STK_SEND_ENVELOPE_COMMAND";
-            case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE:
-                return "STK_SEND_TERMINAL_RESPONSE";
-            case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM:
-                return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
-            case RIL_REQUEST_EXPLICIT_CALL_TRANSFER:
-                return "EXPLICIT_CALL_TRANSFER";
-            case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE:
-                return "SET_PREFERRED_NETWORK_TYPE";
-            case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE:
-                return "GET_PREFERRED_NETWORK_TYPE";
-            case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS:
-                return "GET_NEIGHBORING_CELL_IDS";
-            case RIL_REQUEST_SET_LOCATION_UPDATES:
-                return "SET_LOCATION_UPDATES";
-            case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE:
-                return "CDMA_SET_SUBSCRIPTION_SOURCE";
-            case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:
-                return "CDMA_SET_ROAMING_PREFERENCE";
-            case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:
-                return "CDMA_QUERY_ROAMING_PREFERENCE";
-            case RIL_REQUEST_SET_TTY_MODE:
-                return "SET_TTY_MODE";
-            case RIL_REQUEST_QUERY_TTY_MODE:
-                return "QUERY_TTY_MODE";
-            case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:
-                return "CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
-            case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:
-                return "CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
-            case RIL_REQUEST_CDMA_FLASH:
-                return "CDMA_FLASH";
-            case RIL_REQUEST_CDMA_BURST_DTMF:
-                return "CDMA_BURST_DTMF";
-            case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY:
-                return "CDMA_VALIDATE_AND_WRITE_AKEY";
-            case RIL_REQUEST_CDMA_SEND_SMS:
-                return "CDMA_SEND_SMS";
-            case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:
-                return "CDMA_SMS_ACKNOWLEDGE";
-            case RIL_REQUEST_GSM_GET_BROADCAST_CONFIG:
-                return "GSM_GET_BROADCAST_CONFIG";
-            case RIL_REQUEST_GSM_SET_BROADCAST_CONFIG:
-                return "GSM_SET_BROADCAST_CONFIG";
-            case RIL_REQUEST_GSM_BROADCAST_ACTIVATION:
-                return "GSM_BROADCAST_ACTIVATION";
-            case RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG:
-                return "CDMA_GET_BROADCAST_CONFIG";
-            case RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG:
-                return "CDMA_SET_BROADCAST_CONFIG";
-            case RIL_REQUEST_CDMA_BROADCAST_ACTIVATION:
-                return "CDMA_BROADCAST_ACTIVATION";
-            case RIL_REQUEST_CDMA_SUBSCRIPTION:
-                return "CDMA_SUBSCRIPTION";
-            case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM:
-                return "CDMA_WRITE_SMS_TO_RUIM";
-            case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM:
-                return "CDMA_DELETE_SMS_ON_RUIM";
-            case RIL_REQUEST_DEVICE_IDENTITY:
-                return "DEVICE_IDENTITY";
-            case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE:
-                return "EXIT_EMERGENCY_CALLBACK_MODE";
-            case RIL_REQUEST_GET_SMSC_ADDRESS:
-                return "GET_SMSC_ADDRESS";
-            case RIL_REQUEST_SET_SMSC_ADDRESS:
-                return "SET_SMSC_ADDRESS";
-            case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS:
-                return "REPORT_SMS_MEMORY_STATUS";
-            case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING:
-                return "REPORT_STK_SERVICE_IS_RUNNING";
-            case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE:
-                return "CDMA_GET_SUBSCRIPTION_SOURCE";
-            case RIL_REQUEST_ISIM_AUTHENTICATION:
-                return "ISIM_AUTHENTICATION";
-            case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU:
-                return "ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU";
-            case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS:
-                return "STK_SEND_ENVELOPE_WITH_STATUS";
-            case RIL_REQUEST_VOICE_RADIO_TECH:
-                return "VOICE_RADIO_TECH";
-            case RIL_REQUEST_GET_CELL_INFO_LIST:
-                return "GET_CELL_INFO_LIST";
-            case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE:
-                return "SET_CELL_INFO_LIST_RATE";
-            case RIL_REQUEST_SET_INITIAL_ATTACH_APN:
-                return "SET_INITIAL_ATTACH_APN";
-            case RIL_REQUEST_IMS_REGISTRATION_STATE:
-                return "IMS_REGISTRATION_STATE";
-            case RIL_REQUEST_IMS_SEND_SMS:
-                return "IMS_SEND_SMS";
-            case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC:
-                return "SIM_TRANSMIT_APDU_BASIC";
-            case RIL_REQUEST_SIM_OPEN_CHANNEL:
-                return "SIM_OPEN_CHANNEL";
-            case RIL_REQUEST_SIM_CLOSE_CHANNEL:
-                return "SIM_CLOSE_CHANNEL";
-            case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL:
-                return "SIM_TRANSMIT_APDU_CHANNEL";
-            case RIL_REQUEST_NV_READ_ITEM:
-                return "NV_READ_ITEM";
-            case RIL_REQUEST_NV_WRITE_ITEM:
-                return "NV_WRITE_ITEM";
-            case RIL_REQUEST_NV_WRITE_CDMA_PRL:
-                return "NV_WRITE_CDMA_PRL";
-            case RIL_REQUEST_NV_RESET_CONFIG:
-                return "NV_RESET_CONFIG";
-            case RIL_REQUEST_SET_UICC_SUBSCRIPTION:
-                return "SET_UICC_SUBSCRIPTION";
-            case RIL_REQUEST_ALLOW_DATA:
-                return "ALLOW_DATA";
-            case RIL_REQUEST_GET_HARDWARE_CONFIG:
-                return "GET_HARDWARE_CONFIG";
-            case RIL_REQUEST_SIM_AUTHENTICATION:
-                return "SIM_AUTHENTICATION";
-            case RIL_REQUEST_GET_DC_RT_INFO:
-                return "GET_DC_RT_INFO";
-            case RIL_REQUEST_SET_DC_RT_INFO_RATE:
-                return "SET_DC_RT_INFO_RATE";
-            case RIL_REQUEST_SET_DATA_PROFILE:
-                return "SET_DATA_PROFILE";
-            case RIL_REQUEST_SHUTDOWN:
-                return "SHUTDOWN";
-            case RIL_REQUEST_GET_RADIO_CAPABILITY:
-                return "GET_RADIO_CAPABILITY";
-            case RIL_REQUEST_SET_RADIO_CAPABILITY:
-                return "SET_RADIO_CAPABILITY";
-            case RIL_REQUEST_START_LCE:
-                return "START_LCE";
-            case RIL_REQUEST_STOP_LCE:
-                return "STOP_LCE";
-            case RIL_REQUEST_PULL_LCEDATA:
-                return "PULL_LCEDATA";
-            case RIL_REQUEST_GET_ACTIVITY_INFO:
-                return "GET_ACTIVITY_INFO";
-            case RIL_REQUEST_SET_ALLOWED_CARRIERS:
-                return "SET_ALLOWED_CARRIERS";
-            case RIL_REQUEST_GET_ALLOWED_CARRIERS:
-                return "GET_ALLOWED_CARRIERS";
-            case RIL_REQUEST_SEND_DEVICE_STATE:
-                return "SEND_DEVICE_STATE";
-            case RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER:
-                return "SET_UNSOLICITED_RESPONSE_FILTER";
-            case RIL_REQUEST_SET_SIM_CARD_POWER:
-                return "SET_SIM_CARD_POWER";
-            case RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION:
-                return "SET_CARRIER_INFO_IMSI_ENCRYPTION";
-            case RIL_REQUEST_START_NETWORK_SCAN:
-                return "START_NETWORK_SCAN";
-            case RIL_REQUEST_STOP_NETWORK_SCAN:
-                return "STOP_NETWORK_SCAN";
-            case RIL_REQUEST_START_KEEPALIVE:
-                return "START_KEEPALIVE";
-            case RIL_REQUEST_STOP_KEEPALIVE:
-                return "STOP_KEEPALIVE";
-            case RIL_REQUEST_ENABLE_MODEM:
-                return "ENABLE_MODEM";
-            case RIL_REQUEST_GET_MODEM_STATUS:
-                return "GET_MODEM_STATUS";
-            case RIL_REQUEST_CDMA_SEND_SMS_EXPECT_MORE:
-                return "CDMA_SEND_SMS_EXPECT_MORE";
-            case RIL_REQUEST_GET_SIM_PHONEBOOK_CAPACITY:
-                return "GET_SIM_PHONEBOOK_CAPACITY";
-            case RIL_REQUEST_GET_SIM_PHONEBOOK_RECORDS:
-                return "GET_SIM_PHONEBOOK_RECORDS";
-            case RIL_REQUEST_UPDATE_SIM_PHONEBOOK_RECORD:
-                return "UPDATE_SIM_PHONEBOOK_RECORD";
-            case RIL_REQUEST_GET_SLOT_STATUS:
-                return "GET_SLOT_STATUS";
-            case RIL_REQUEST_SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING:
-                return "SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING";
-            case RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA:
-                return "SET_SIGNAL_STRENGTH_REPORTING_CRITERIA";
-            case RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA:
-                return "SET_LINK_CAPACITY_REPORTING_CRITERIA";
-            case RIL_REQUEST_SET_PREFERRED_DATA_MODEM:
-                return "SET_PREFERRED_DATA_MODEM";
-            case RIL_REQUEST_EMERGENCY_DIAL:
-                return "EMERGENCY_DIAL";
-            case RIL_REQUEST_GET_PHONE_CAPABILITY:
-                return "GET_PHONE_CAPABILITY";
-            case RIL_REQUEST_SWITCH_DUAL_SIM_CONFIG:
-                return "SWITCH_DUAL_SIM_CONFIG";
-            case RIL_REQUEST_ENABLE_UICC_APPLICATIONS:
-                return "ENABLE_UICC_APPLICATIONS";
-            case RIL_REQUEST_GET_UICC_APPLICATIONS_ENABLEMENT:
-                return "GET_UICC_APPLICATIONS_ENABLEMENT";
-            case RIL_REQUEST_SET_SYSTEM_SELECTION_CHANNELS:
-                return "SET_SYSTEM_SELECTION_CHANNELS";
-            case RIL_REQUEST_GET_BARRING_INFO:
-                return "GET_BARRING_INFO";
-            case RIL_REQUEST_ENTER_SIM_DEPERSONALIZATION:
-                return "ENTER_SIM_DEPERSONALIZATION";
-            case RIL_REQUEST_ENABLE_NR_DUAL_CONNECTIVITY:
-                return "ENABLE_NR_DUAL_CONNECTIVITY";
-            case RIL_REQUEST_IS_NR_DUAL_CONNECTIVITY_ENABLED:
-                return "IS_NR_DUAL_CONNECTIVITY_ENABLED";
-            case RIL_REQUEST_ALLOCATE_PDU_SESSION_ID:
-                return "ALLOCATE_PDU_SESSION_ID";
-            case RIL_REQUEST_RELEASE_PDU_SESSION_ID:
-                return "RELEASE_PDU_SESSION_ID";
-            case RIL_REQUEST_START_HANDOVER:
-                return "START_HANDOVER";
-            case RIL_REQUEST_CANCEL_HANDOVER:
-                return "CANCEL_HANDOVER";
-            case RIL_REQUEST_GET_SYSTEM_SELECTION_CHANNELS:
-                return "GET_SYSTEM_SELECTION_CHANNELS";
-            case RIL_REQUEST_GET_HAL_DEVICE_CAPABILITIES:
-                return "GET_HAL_DEVICE_CAPABILITIES";
-            case RIL_REQUEST_SET_DATA_THROTTLING:
-                return "SET_DATA_THROTTLING";
-            case RIL_REQUEST_SET_ALLOWED_NETWORK_TYPES_BITMAP:
-                return "SET_ALLOWED_NETWORK_TYPES_BITMAP";
-            case RIL_REQUEST_GET_ALLOWED_NETWORK_TYPES_BITMAP:
-                return "GET_ALLOWED_NETWORK_TYPES_BITMAP";
-            case RIL_REQUEST_GET_SLICING_CONFIG:
-                return "GET_SLICING_CONFIG";
-            default: return "<unknown request>";
-        }
-    }
-
-    @UnsupportedAppUsage
-    static String responseToString(int request) {
-        switch(request) {
-            case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
-                return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
-            case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:
-                return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
-            case RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED:
-                return "UNSOL_RESPONSE_NETWORK_STATE_CHANGED";
-            case RIL_UNSOL_RESPONSE_NEW_SMS:
-                return "UNSOL_RESPONSE_NEW_SMS";
-            case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT:
-                return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
-            case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM:
-                return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
-            case RIL_UNSOL_ON_USSD:
-                return "UNSOL_ON_USSD";
-            case RIL_UNSOL_ON_USSD_REQUEST:
-                return "UNSOL_ON_USSD_REQUEST";
-            case RIL_UNSOL_NITZ_TIME_RECEIVED:
-                return "UNSOL_NITZ_TIME_RECEIVED";
-            case RIL_UNSOL_SIGNAL_STRENGTH:
-                return "UNSOL_SIGNAL_STRENGTH";
-            case RIL_UNSOL_DATA_CALL_LIST_CHANGED:
-                return "UNSOL_DATA_CALL_LIST_CHANGED";
-            case RIL_UNSOL_SUPP_SVC_NOTIFICATION:
-                return "UNSOL_SUPP_SVC_NOTIFICATION";
-            case RIL_UNSOL_STK_SESSION_END:
-                return "UNSOL_STK_SESSION_END";
-            case RIL_UNSOL_STK_PROACTIVE_COMMAND:
-                return "UNSOL_STK_PROACTIVE_COMMAND";
-            case RIL_UNSOL_STK_EVENT_NOTIFY:
-                return "UNSOL_STK_EVENT_NOTIFY";
-            case RIL_UNSOL_STK_CALL_SETUP:
-                return "UNSOL_STK_CALL_SETUP";
-            case RIL_UNSOL_SIM_SMS_STORAGE_FULL:
-                return "UNSOL_SIM_SMS_STORAGE_FULL";
-            case RIL_UNSOL_SIM_REFRESH:
-                return "UNSOL_SIM_REFRESH";
-            case RIL_UNSOL_CALL_RING:
-                return "UNSOL_CALL_RING";
-            case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED:
-                return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
-            case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS:
-                return "UNSOL_RESPONSE_CDMA_NEW_SMS";
-            case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS:
-                return "UNSOL_RESPONSE_NEW_BROADCAST_SMS";
-            case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL:
-                return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
-            case RIL_UNSOL_RESTRICTED_STATE_CHANGED:
-                return "UNSOL_RESTRICTED_STATE_CHANGED";
-            case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE:
-                return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
-            case RIL_UNSOL_CDMA_CALL_WAITING:
-                return "UNSOL_CDMA_CALL_WAITING";
-            case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS:
-                return "UNSOL_CDMA_OTA_PROVISION_STATUS";
-            case RIL_UNSOL_CDMA_INFO_REC:
-                return "UNSOL_CDMA_INFO_REC";
-            case RIL_UNSOL_OEM_HOOK_RAW:
-                return "UNSOL_OEM_HOOK_RAW";
-            case RIL_UNSOL_RINGBACK_TONE:
-                return "UNSOL_RINGBACK_TONE";
-            case RIL_UNSOL_RESEND_INCALL_MUTE:
-                return "UNSOL_RESEND_INCALL_MUTE";
-            case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED:
-                return "UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED";
-            case RIL_UNSOl_CDMA_PRL_CHANGED:
-                return "UNSOL_CDMA_PRL_CHANGED";
-            case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE:
-                return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE";
-            case RIL_UNSOL_RIL_CONNECTED:
-                return "UNSOL_RIL_CONNECTED";
-            case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED:
-                return "UNSOL_VOICE_RADIO_TECH_CHANGED";
-            case RIL_UNSOL_CELL_INFO_LIST:
-                return "UNSOL_CELL_INFO_LIST";
-            case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
-                return "UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED";
-            case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED:
-                return "UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED";
-            case RIL_UNSOL_SRVCC_STATE_NOTIFY:
-                return "UNSOL_SRVCC_STATE_NOTIFY";
-            case RIL_UNSOL_HARDWARE_CONFIG_CHANGED:
-                return "UNSOL_HARDWARE_CONFIG_CHANGED";
-            case RIL_UNSOL_DC_RT_INFO_CHANGED:
-                return "UNSOL_DC_RT_INFO_CHANGED";
-            case RIL_UNSOL_RADIO_CAPABILITY:
-                return "UNSOL_RADIO_CAPABILITY";
-            case RIL_UNSOL_ON_SS:
-                return "UNSOL_ON_SS";
-            case RIL_UNSOL_STK_CC_ALPHA_NOTIFY:
-                return "UNSOL_STK_CC_ALPHA_NOTIFY";
-            case RIL_UNSOL_LCEDATA_RECV:
-                return "UNSOL_LCE_INFO_RECV";
-            case RIL_UNSOL_PCO_DATA:
-                return "UNSOL_PCO_DATA";
-            case RIL_UNSOL_MODEM_RESTART:
-                return "UNSOL_MODEM_RESTART";
-            case RIL_UNSOL_CARRIER_INFO_IMSI_ENCRYPTION:
-                return "UNSOL_CARRIER_INFO_IMSI_ENCRYPTION";
-            case RIL_UNSOL_NETWORK_SCAN_RESULT:
-                return "UNSOL_NETWORK_SCAN_RESULT";
-            case RIL_UNSOL_KEEPALIVE_STATUS:
-                return "UNSOL_KEEPALIVE_STATUS";
-            case RIL_UNSOL_UNTHROTTLE_APN:
-                return "UNSOL_UNTHROTTLE_APN";
-            case RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_CHANGED:
-                return "UNSOL_RESPONSE_SIM_PHONEBOOK_CHANGED";
-            case RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_RECORDS_RECEIVED:
-                return "UNSOL_RESPONSE_SIM_PHONEBOOK_RECORDS_RECEIVED";
-            case RIL_UNSOL_ICC_SLOT_STATUS:
-                return "UNSOL_ICC_SLOT_STATUS";
-            case RIL_UNSOL_PHYSICAL_CHANNEL_CONFIG:
-                return "UNSOL_PHYSICAL_CHANNEL_CONFIG";
-            case RIL_UNSOL_EMERGENCY_NUMBER_LIST:
-                return "UNSOL_EMERGENCY_NUMBER_LIST";
-            case RIL_UNSOL_UICC_APPLICATIONS_ENABLEMENT_CHANGED:
-                return "UNSOL_UICC_APPLICATIONS_ENABLEMENT_CHANGED";
-            case RIL_UNSOL_REGISTRATION_FAILED:
-                return "UNSOL_REGISTRATION_FAILED";
-            case RIL_UNSOL_BARRING_INFO_CHANGED:
-                return "UNSOL_BARRING_INFO_CHANGED";
-            default:
-                return "<unknown response>";
-        }
-    }
-
-    @UnsupportedAppUsage
     void riljLog(String msg) {
         Rlog.d(RILJ_LOG_TAG, msg + (" [PHONE" + mPhoneId + "]"));
     }
@@ -7238,32 +6181,30 @@
         Rlog.e(RILJ_LOG_TAG, msg + (" [PHONE" + mPhoneId + "]"));
     }
 
-    void riljLoge(String msg, Exception e) {
-        Rlog.e(RILJ_LOG_TAG, msg + (" [PHONE" + mPhoneId + "]"), e);
-    }
-
     void riljLogv(String msg) {
         Rlog.v(RILJ_LOG_TAG, msg + (" [PHONE" + mPhoneId + "]"));
     }
 
     @UnsupportedAppUsage
     void unsljLog(int response) {
-        riljLog("[UNSL]< " + responseToString(response));
+        riljLog("[UNSL]< " + RILUtils.responseToString(response));
     }
 
     @UnsupportedAppUsage
     void unsljLogMore(int response, String more) {
-        riljLog("[UNSL]< " + responseToString(response) + " " + more);
+        riljLog("[UNSL]< " + RILUtils.responseToString(response) + " " + more);
     }
 
     @UnsupportedAppUsage
     void unsljLogRet(int response, Object ret) {
-        riljLog("[UNSL]< " + responseToString(response) + " " + retToString(response, ret));
+        riljLog("[UNSL]< " + RILUtils.responseToString(response) + " "
+                + retToString(response, ret));
     }
 
     @UnsupportedAppUsage
     void unsljLogvRet(int response, Object ret) {
-        riljLogv("[UNSL]< " + responseToString(response) + " " + retToString(response, ret));
+        riljLogv("[UNSL]< " + RILUtils.responseToString(response) + " "
+                + retToString(response, ret));
     }
 
     @Override
@@ -7293,7 +6234,7 @@
             pw.println(" mRequestList count=" + count);
             for (int i = 0; i < count; i++) {
                 RILRequest rr = mRequestList.valueAt(i);
-                pw.println("  [" + rr.mSerial + "] " + requestToString(rr.mRequest));
+                pw.println("  [" + rr.mSerial + "] " + RILUtils.requestToString(rr.mRequest));
             }
         }
         pw.println(" mLastNITZTimeInfo=" + Arrays.toString(mLastNITZTimeInfo));
@@ -7306,180 +6247,6 @@
         return mClientWakelockTracker.getClientRequestStats();
     }
 
-    /** Append the data to the end of an ArrayList */
-    public static void appendPrimitiveArrayToArrayList(byte[] src, ArrayList<Byte> dst) {
-        for (byte b : src) {
-            dst.add(b);
-        }
-    }
-
-    public static ArrayList<Byte> primitiveArrayToArrayList(byte[] arr) {
-        ArrayList<Byte> arrayList = new ArrayList<>(arr.length);
-        for (byte b : arr) {
-            arrayList.add(b);
-        }
-        return arrayList;
-    }
-
-    /** Convert a primitive int array to an ArrayList<Integer>. */
-    public static ArrayList<Integer> primitiveArrayToArrayList(int[] arr) {
-        ArrayList<Integer> arrayList = new ArrayList<>(arr.length);
-        for (int i : arr) {
-            arrayList.add(i);
-        }
-        return arrayList;
-    }
-
-    /** Convert an ArrayList of Bytes to an exactly-sized primitive array */
-    public static byte[] arrayListToPrimitiveArray(ArrayList<Byte> bytes) {
-        byte[] ret = new byte[bytes.size()];
-        for (int i = 0; i < ret.length; i++) {
-            ret[i] = bytes.get(i);
-        }
-        return ret;
-    }
-
-    static ArrayList<HardwareConfig> convertHalHwConfigList(
-            ArrayList<android.hardware.radio.V1_0.HardwareConfig> hwListRil,
-            RIL ril) {
-        int num;
-        ArrayList<HardwareConfig> response;
-        HardwareConfig hw;
-
-        num = hwListRil.size();
-        response = new ArrayList<HardwareConfig>(num);
-
-        if (RILJ_LOGV) {
-            ril.riljLog("convertHalHwConfigList: num=" + num);
-        }
-        for (android.hardware.radio.V1_0.HardwareConfig hwRil : hwListRil) {
-            int type = hwRil.type;
-            switch(type) {
-                case HardwareConfig.DEV_HARDWARE_TYPE_MODEM: {
-                    hw = new HardwareConfig(type);
-                    HardwareConfigModem hwModem = hwRil.modem.get(0);
-                    hw.assignModem(hwRil.uuid, hwRil.state, hwModem.rilModel, hwModem.rat,
-                            hwModem.maxVoice, hwModem.maxData, hwModem.maxStandby);
-                    break;
-                }
-                case HardwareConfig.DEV_HARDWARE_TYPE_SIM: {
-                    hw = new HardwareConfig(type);
-                    hw.assignSim(hwRil.uuid, hwRil.state, hwRil.sim.get(0).modemUuid);
-                    break;
-                }
-                default: {
-                    throw new RuntimeException(
-                            "RIL_REQUEST_GET_HARDWARE_CONFIG invalid hardward type:" + type);
-                }
-            }
-
-            response.add(hw);
-        }
-
-        return response;
-    }
-
-    static RadioCapability convertHalRadioCapability(
-            android.hardware.radio.V1_0.RadioCapability rcRil, RIL ril) {
-        int session = rcRil.session;
-        int phase = rcRil.phase;
-        // convert to public bitmask {@link TelephonyManager.NetworkTypeBitMask}
-        int rat = convertToNetworkTypeBitMask(rcRil.raf);
-        String logicModemUuid = rcRil.logicalModemUuid;
-        int status = rcRil.status;
-
-        ril.riljLog("convertHalRadioCapability: session=" + session +
-                ", phase=" + phase +
-                ", rat=" + rat +
-                ", logicModemUuid=" + logicModemUuid +
-                ", status=" + status + ", rcRil.raf=" + rcRil.raf);
-        RadioCapability rc = new RadioCapability(
-                ril.mPhoneId, session, phase, rat, logicModemUuid, status);
-        return rc;
-    }
-
-    static List<LinkCapacityEstimate> convertHalLceData(LceDataInfo halData, RIL ril) {
-        final List<LinkCapacityEstimate> lceList = new ArrayList<>();
-        lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_COMBINED,
-                halData.lastHopCapacityKbps,
-                LinkCapacityEstimate.INVALID));
-        ril.riljLog("LCE capacity information received:" + lceList);
-        return lceList;
-    }
-
-    static List<LinkCapacityEstimate> convertHalLceData(
-            android.hardware.radio.V1_2.LinkCapacityEstimate halData, RIL ril) {
-        final List<LinkCapacityEstimate> lceList = new ArrayList<>();
-        lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_COMBINED,
-                halData.downlinkCapacityKbps,
-                halData.uplinkCapacityKbps));
-        ril.riljLog("LCE capacity information received:" + lceList);
-        return lceList;
-    }
-
-    static List<LinkCapacityEstimate> convertHalLceData(
-            android.hardware.radio.V1_6.LinkCapacityEstimate halData, RIL ril) {
-        final List<LinkCapacityEstimate> lceList = new ArrayList<>();
-        int primaryDownlinkCapacityKbps = halData.downlinkCapacityKbps;
-        int primaryUplinkCapacityKbps = halData.uplinkCapacityKbps;
-        if (primaryDownlinkCapacityKbps != LinkCapacityEstimate.INVALID
-                && halData.secondaryDownlinkCapacityKbps != LinkCapacityEstimate.INVALID) {
-            primaryDownlinkCapacityKbps =
-                    halData.downlinkCapacityKbps - halData.secondaryDownlinkCapacityKbps;
-        }
-        if (primaryUplinkCapacityKbps != LinkCapacityEstimate.INVALID
-                && halData.secondaryUplinkCapacityKbps != LinkCapacityEstimate.INVALID) {
-            primaryUplinkCapacityKbps =
-                    halData.uplinkCapacityKbps - halData.secondaryUplinkCapacityKbps;
-        }
-
-        lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_PRIMARY,
-                primaryDownlinkCapacityKbps,
-                primaryUplinkCapacityKbps));
-        lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_SECONDARY,
-                halData.secondaryDownlinkCapacityKbps,
-                halData.secondaryUplinkCapacityKbps));
-        ril.riljLog("LCE capacity information received:" + lceList);
-        return lceList;
-    }
-
-    /**
-     * Convert CellInfo defined in 1.0/types.hal to CellInfo type.
-     * @param records List of CellInfo defined in 1.0/types.hal
-     * @return List of converted CellInfo object
-     */
-    @VisibleForTesting
-    public static ArrayList<CellInfo> convertHalCellInfoList(
-            ArrayList<android.hardware.radio.V1_0.CellInfo> records) {
-        ArrayList<CellInfo> response = new ArrayList<CellInfo>(records.size());
-
-        final long nanotime = SystemClock.elapsedRealtimeNanos();
-        for (android.hardware.radio.V1_0.CellInfo record : records) {
-            record.timeStamp = nanotime;
-            response.add(CellInfo.create(record));
-        }
-
-        return response;
-    }
-
-    /**
-     * Convert CellInfo defined in 1.2/types.hal to CellInfo type.
-     * @param records List of CellInfo defined in 1.2/types.hal
-     * @return List of converted CellInfo object
-     */
-    @VisibleForTesting
-    public static ArrayList<CellInfo> convertHalCellInfoList_1_2(
-            ArrayList<android.hardware.radio.V1_2.CellInfo> records) {
-        ArrayList<CellInfo> response = new ArrayList<CellInfo>(records.size());
-
-        final long nanotime = SystemClock.elapsedRealtimeNanos();
-        for (android.hardware.radio.V1_2.CellInfo record : records) {
-            record.timeStamp = nanotime;
-            response.add(CellInfo.create(record));
-        }
-        return response;
-    }
-
     /**
      * Fixup for SignalStrength 1.0 to Assume GSM to WCDMA when
      * The current RAT type is one of the UMTS RATs.
@@ -7533,333 +6300,6 @@
     }
 
     /**
-     * Convert CellInfo defined in 1.4/types.hal to CellInfo type.
-     * @param records List of CellInfo defined in 1.4/types.hal.
-     * @return List of converted CellInfo object.
-     */
-    @VisibleForTesting
-    public static ArrayList<CellInfo> convertHalCellInfoList_1_4(
-            ArrayList<android.hardware.radio.V1_4.CellInfo> records) {
-        ArrayList<CellInfo> response = new ArrayList<CellInfo>(records.size());
-
-        final long nanotime = SystemClock.elapsedRealtimeNanos();
-        for (android.hardware.radio.V1_4.CellInfo record : records) {
-            response.add(CellInfo.create(record, nanotime));
-        }
-        return response;
-    }
-
-    /**
-     * Convert CellInfo defined in 1.5/types.hal to CellInfo type.
-     * @param records List of CellInfo defined in 1.5/types.hal.
-     * @return List of converted CellInfo object.
-     */
-    @VisibleForTesting
-    public static ArrayList<CellInfo> convertHalCellInfoList_1_5(
-            ArrayList<android.hardware.radio.V1_5.CellInfo> records) {
-        ArrayList<CellInfo> response = new ArrayList<>(records.size());
-
-        final long nanotime = SystemClock.elapsedRealtimeNanos();
-        for (android.hardware.radio.V1_5.CellInfo record : records) {
-            response.add(CellInfo.create(record, nanotime));
-        }
-        return response;
-    }
-
-    /**
-     * Convert CellInfo defined in 1.6/types.hal to CellInfo type.
-     * @param records List of CellInfo defined in 1.6/types.hal.
-     * @return List of converted CellInfo object.
-     */
-    @VisibleForTesting
-    public static ArrayList<CellInfo> convertHalCellInfoList_1_6(
-            ArrayList<android.hardware.radio.V1_6.CellInfo> records) {
-        ArrayList<CellInfo> response = new ArrayList<>(records.size());
-
-        final long nanotime = SystemClock.elapsedRealtimeNanos();
-        for (android.hardware.radio.V1_6.CellInfo record : records) {
-            response.add(CellInfo.create(record, nanotime));
-        }
-        return response;
-    }
-
-    private static LinkAddress createLinkAddressFromString(String addressString) {
-        return createLinkAddressFromString(addressString, 0, LinkAddress.LIFETIME_UNKNOWN,
-                LinkAddress.LIFETIME_UNKNOWN);
-    }
-
-    private static LinkAddress createLinkAddressFromString(String addressString, int properties,
-            long deprecationTime, long expirationTime) {
-        addressString = addressString.trim();
-        InetAddress address = null;
-        int prefixLength = -1;
-        try {
-            String[] pieces = addressString.split("/", 2);
-            address = InetAddresses.parseNumericAddress(pieces[0]);
-            if (pieces.length == 1) {
-                prefixLength = (address instanceof Inet4Address) ? 32 : 128;
-            } else if (pieces.length == 2) {
-                prefixLength = Integer.parseInt(pieces[1]);
-            }
-        } catch (NullPointerException e) {            // Null string.
-        } catch (ArrayIndexOutOfBoundsException e) {  // No prefix length.
-        } catch (NumberFormatException e) {           // Non-numeric prefix.
-        } catch (IllegalArgumentException e) {        // Invalid IP address.
-        }
-
-        if (address == null || prefixLength == -1) {
-            throw new IllegalArgumentException("Invalid link address " + addressString);
-        }
-
-        return new LinkAddress(address, prefixLength, properties, 0,
-                deprecationTime, expirationTime);
-    }
-
-    /**
-     * Convert SetupDataCallResult defined in 1.0, 1.4, 1.5 or 1.6 types.hal into DataCallResponse
-     * @param dcResult setup data call result
-     * @return converted DataCallResponse object
-     */
-    @VisibleForTesting
-    public static DataCallResponse convertDataCallResult(Object dcResult) {
-        if (dcResult == null) return null;
-
-        int cause, cid, active, mtu, mtuV4, mtuV6;
-        long suggestedRetryTime;
-        String ifname;
-        int protocolType;
-        String[] addresses = null;
-        String[] dnses = null;
-        String[] gateways = null;
-        String[] pcscfs = null;
-        Qos defaultQos = null;
-
-        @HandoverFailureMode
-        int handoverFailureMode = DataCallResponse.HANDOVER_FAILURE_MODE_LEGACY;
-
-        int pduSessionId = DataCallResponse.PDU_SESSION_ID_NOT_SET;
-
-        List<LinkAddress> laList = new ArrayList<>();
-        List<QosBearerSession> qosSessions = new ArrayList<>();
-        NetworkSliceInfo sliceInfo = null;
-        List<TrafficDescriptor> trafficDescriptors = new ArrayList<>();
-
-        if (dcResult instanceof android.hardware.radio.V1_0.SetupDataCallResult) {
-            final android.hardware.radio.V1_0.SetupDataCallResult result =
-                    (android.hardware.radio.V1_0.SetupDataCallResult) dcResult;
-            cause = result.status;
-            suggestedRetryTime = result.suggestedRetryTime;
-            cid = result.cid;
-            active = result.active;
-            protocolType = ApnSetting.getProtocolIntFromString(result.type);
-            ifname = result.ifname;
-            if (!TextUtils.isEmpty(result.addresses)) {
-                addresses = result.addresses.split("\\s+");
-            }
-            if (!TextUtils.isEmpty(result.dnses)) {
-                dnses = result.dnses.split("\\s+");
-            }
-            if (!TextUtils.isEmpty(result.gateways)) {
-                gateways = result.gateways.split("\\s+");
-            }
-            if (!TextUtils.isEmpty(result.pcscf)) {
-                pcscfs = result.pcscf.split("\\s+");
-            }
-            mtu = mtuV4 = mtuV6 = result.mtu;
-            if (addresses != null) {
-                for (String address : addresses) {
-                    laList.add(createLinkAddressFromString(address));
-                }
-            }
-        } else if (dcResult instanceof android.hardware.radio.V1_4.SetupDataCallResult) {
-            final android.hardware.radio.V1_4.SetupDataCallResult result =
-                    (android.hardware.radio.V1_4.SetupDataCallResult) dcResult;
-            cause = result.cause;
-            suggestedRetryTime = result.suggestedRetryTime;
-            cid = result.cid;
-            active = result.active;
-            protocolType = result.type;
-            ifname = result.ifname;
-            addresses = result.addresses.stream().toArray(String[]::new);
-            dnses = result.dnses.stream().toArray(String[]::new);
-            gateways = result.gateways.stream().toArray(String[]::new);
-            pcscfs = result.pcscf.stream().toArray(String[]::new);
-            mtu = mtuV4 = mtuV6 = result.mtu;
-            if (addresses != null) {
-                for (String address : addresses) {
-                    laList.add(createLinkAddressFromString(address));
-                }
-            }
-        } else if (dcResult instanceof android.hardware.radio.V1_5.SetupDataCallResult) {
-            final android.hardware.radio.V1_5.SetupDataCallResult result =
-                    (android.hardware.radio.V1_5.SetupDataCallResult) dcResult;
-            cause = result.cause;
-            suggestedRetryTime = result.suggestedRetryTime;
-            cid = result.cid;
-            active = result.active;
-            protocolType = result.type;
-            ifname = result.ifname;
-            laList = result.addresses.stream().map(la -> createLinkAddressFromString(
-                    la.address, la.properties, la.deprecationTime, la.expirationTime))
-                    .collect(Collectors.toList());
-
-            dnses = result.dnses.stream().toArray(String[]::new);
-            gateways = result.gateways.stream().toArray(String[]::new);
-            pcscfs = result.pcscf.stream().toArray(String[]::new);
-            mtu = Math.max(result.mtuV4, result.mtuV6);
-            mtuV4 = result.mtuV4;
-            mtuV6 = result.mtuV6;
-        } else if (dcResult instanceof android.hardware.radio.V1_6.SetupDataCallResult) {
-            final android.hardware.radio.V1_6.SetupDataCallResult result =
-                    (android.hardware.radio.V1_6.SetupDataCallResult) dcResult;
-            cause = result.cause;
-            suggestedRetryTime = result.suggestedRetryTime;
-            cid = result.cid;
-            active = result.active;
-            protocolType = result.type;
-            ifname = result.ifname;
-            laList = result.addresses.stream().map(la -> createLinkAddressFromString(
-                    la.address, la.properties, la.deprecationTime, la.expirationTime))
-                    .collect(Collectors.toList());
-            dnses = result.dnses.stream().toArray(String[]::new);
-            gateways = result.gateways.stream().toArray(String[]::new);
-            pcscfs = result.pcscf.stream().toArray(String[]::new);
-            mtu = Math.max(result.mtuV4, result.mtuV6);
-            mtuV4 = result.mtuV4;
-            mtuV6 = result.mtuV6;
-            handoverFailureMode = result.handoverFailureMode;
-            pduSessionId = result.pduSessionId;
-            defaultQos = Qos.create(result.defaultQos);
-            qosSessions = result.qosSessions.stream().map(session ->
-                    QosBearerSession.create(session)).collect(Collectors.toList());
-            sliceInfo = convertToSliceInfo(result.sliceInfo);
-            trafficDescriptors = result.trafficDescriptors.stream().map(td ->
-                    convertToTrafficDescriptor(td)).collect(Collectors.toList());
-        } else {
-            Rlog.e(RILJ_LOG_TAG, "Unsupported SetupDataCallResult " + dcResult);
-            return null;
-        }
-
-        // Process dns
-        List<InetAddress> dnsList = new ArrayList<>();
-        if (dnses != null) {
-            for (String dns : dnses) {
-                dns = dns.trim();
-                InetAddress ia;
-                try {
-                    ia = InetAddresses.parseNumericAddress(dns);
-                    dnsList.add(ia);
-                } catch (IllegalArgumentException e) {
-                    Rlog.e(RILJ_LOG_TAG, "Unknown dns: " + dns, e);
-                }
-            }
-        }
-
-        // Process gateway
-        List<InetAddress> gatewayList = new ArrayList<>();
-        if (gateways != null) {
-            for (String gateway : gateways) {
-                gateway = gateway.trim();
-                InetAddress ia;
-                try {
-                    ia = InetAddresses.parseNumericAddress(gateway);
-                    gatewayList.add(ia);
-                } catch (IllegalArgumentException e) {
-                    Rlog.e(RILJ_LOG_TAG, "Unknown gateway: " + gateway, e);
-                }
-            }
-        }
-
-        // Process gateway
-        List<InetAddress> pcscfList = new ArrayList<>();
-        if (pcscfs != null) {
-            for (String pcscf : pcscfs) {
-                pcscf = pcscf.trim();
-                InetAddress ia;
-                try {
-                    ia = InetAddresses.parseNumericAddress(pcscf);
-                    pcscfList.add(ia);
-                } catch (IllegalArgumentException e) {
-                    Rlog.e(RILJ_LOG_TAG, "Unknown pcscf: " + pcscf, e);
-                }
-            }
-        }
-
-        return new DataCallResponse.Builder()
-                .setCause(cause)
-                .setRetryDurationMillis(suggestedRetryTime)
-                .setId(cid)
-                .setLinkStatus(active)
-                .setProtocolType(protocolType)
-                .setInterfaceName(ifname)
-                .setAddresses(laList)
-                .setDnsAddresses(dnsList)
-                .setGatewayAddresses(gatewayList)
-                .setPcscfAddresses(pcscfList)
-                .setMtu(mtu)
-                .setMtuV4(mtuV4)
-                .setMtuV6(mtuV6)
-                .setHandoverFailureMode(handoverFailureMode)
-                .setPduSessionId(pduSessionId)
-                .setDefaultQos(defaultQos)
-                .setQosBearerSessions(qosSessions)
-                .setSliceInfo(sliceInfo)
-                .setTrafficDescriptors(trafficDescriptors)
-                .build();
-    }
-
-    private static NetworkSliceInfo convertToSliceInfo(OptionalSliceInfo optionalSliceInfo) {
-        if (optionalSliceInfo.getDiscriminator() == OptionalSliceInfo.hidl_discriminator.noinit) {
-            return null;
-        }
-
-        android.hardware.radio.V1_6.SliceInfo si = optionalSliceInfo.value();
-        NetworkSliceInfo.Builder builder =
-                new NetworkSliceInfo.Builder()
-                .setSliceServiceType(si.sst)
-                .setMappedHplmnSliceServiceType(si.mappedHplmnSst);
-        if (si.sliceDifferentiator != NetworkSliceInfo.SLICE_DIFFERENTIATOR_NO_SLICE) {
-            builder
-                .setSliceDifferentiator(si.sliceDifferentiator)
-                .setMappedHplmnSliceDifferentiator(si.mappedHplmnSD);
-        }
-        return builder.build();
-    }
-
-    private static TrafficDescriptor convertToTrafficDescriptor(
-            android.hardware.radio.V1_6.TrafficDescriptor td) {
-        String dnn = td.dnn.getDiscriminator() == OptionalDnn.hidl_discriminator.noinit
-                ? null : td.dnn.value();
-        String osAppId = td.osAppId.getDiscriminator() == OptionalOsAppId.hidl_discriminator.noinit
-                ? null : new String(arrayListToPrimitiveArray(td.osAppId.value().osAppId));
-        TrafficDescriptor.Builder builder = new TrafficDescriptor.Builder();
-        if (dnn != null) {
-            builder.setDataNetworkName(dnn);
-        }
-        if (osAppId != null) {
-            builder.setOsAppId(osAppId);
-        }
-        return builder.build();
-    }
-
-    /**
-     * Convert SetupDataCallResult defined in 1.0 or 1.4/types.hal into DataCallResponse
-     * @param dataCallResultList List of SetupDataCallResult defined in 1.0 or 1.4/types.hal
-     * @return List of converted DataCallResponse object
-     */
-    @VisibleForTesting
-    public static ArrayList<DataCallResponse> convertDataCallResultList(
-            List<? extends Object> dataCallResultList) {
-        ArrayList<DataCallResponse> response =
-                new ArrayList<DataCallResponse>(dataCallResultList.size());
-
-        for (Object obj : dataCallResultList) {
-            response.add(convertDataCallResult(obj));
-        }
-        return response;
-    }
-
-    /**
      * Get the HAL version.
      *
      * @return the current HalVersion
diff --git a/src/java/com/android/internal/telephony/RILRequest.java b/src/java/com/android/internal/telephony/RILRequest.java
index fff8de6..ca9531e 100644
--- a/src/java/com/android/internal/telephony/RILRequest.java
+++ b/src/java/com/android/internal/telephony/RILRequest.java
@@ -238,7 +238,7 @@
         final Message result = mResult;
         if (RIL.RILJ_LOGD) {
             Rlog.d(LOG_TAG, serialString() + "< "
-                    + RIL.requestToString(mRequest)
+                    + RILUtils.requestToString(mRequest)
                     + " error: " + ex + " ret=" + RIL.retToString(mRequest, ret)
                     + " result=" + result);
         }
diff --git a/src/java/com/android/internal/telephony/RILUtils.java b/src/java/com/android/internal/telephony/RILUtils.java
new file mode 100644
index 0000000..e44e5de
--- /dev/null
+++ b/src/java/com/android/internal/telephony/RILUtils.java
@@ -0,0 +1,2661 @@
+/*
+ * Copyright (C) 2021 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 com.android.internal.telephony;
+
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ALLOCATE_PDU_SESSION_ID;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ALLOW_DATA;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ANSWER;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_BASEBAND_VERSION;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CANCEL_HANDOVER;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CANCEL_USSD;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_BROADCAST_ACTIVATION;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_BURST_DTMF;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_FLASH;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SEND_SMS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SEND_SMS_EXPECT_MORE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_SUBSCRIPTION;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CHANGE_BARRING_PASSWORD;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CHANGE_SIM_PIN;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CHANGE_SIM_PIN2;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_CONFERENCE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DATA_CALL_LIST;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DATA_REGISTRATION_STATE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DEACTIVATE_DATA_CALL;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DELETE_SMS_ON_SIM;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DEVICE_IDENTITY;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DIAL;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DTMF;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DTMF_START;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DTMF_STOP;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_EMERGENCY_DIAL;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENABLE_MODEM;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENABLE_NR_DUAL_CONNECTIVITY;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENABLE_UICC_APPLICATIONS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_SIM_DEPERSONALIZATION;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_SIM_PIN;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_SIM_PIN2;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_SIM_PUK;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ENTER_SIM_PUK2;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_EXPLICIT_CALL_TRANSFER;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_ACTIVITY_INFO;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_ALLOWED_CARRIERS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_ALLOWED_NETWORK_TYPES_BITMAP;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_BARRING_INFO;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_CELL_INFO_LIST;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_CLIR;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_CURRENT_CALLS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_DC_RT_INFO;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_HAL_DEVICE_CAPABILITIES;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_HARDWARE_CONFIG;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_IMEI;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_IMEISV;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_IMSI;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_MODEM_STATUS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_MUTE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_NEIGHBORING_CELL_IDS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_PHONE_CAPABILITY;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_RADIO_CAPABILITY;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SIM_PHONEBOOK_CAPACITY;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SIM_PHONEBOOK_RECORDS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SIM_STATUS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SLICING_CONFIG;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SLOT_STATUS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SMSC_ADDRESS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_SYSTEM_SELECTION_CHANNELS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GET_UICC_APPLICATIONS_ENABLEMENT;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GSM_BROADCAST_ACTIVATION;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GSM_GET_BROADCAST_CONFIG;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_GSM_SET_BROADCAST_CONFIG;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_HANGUP;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_IMS_REGISTRATION_STATE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_IMS_SEND_SMS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_ISIM_AUTHENTICATION;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_IS_NR_DUAL_CONNECTIVITY_ENABLED;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_LAST_CALL_FAIL_CAUSE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_NV_READ_ITEM;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_NV_RESET_CONFIG;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_NV_WRITE_CDMA_PRL;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_NV_WRITE_ITEM;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_OEM_HOOK_RAW;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_OEM_HOOK_STRINGS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_OPERATOR;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_PULL_LCEDATA;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_AVAILABLE_NETWORKS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_CALL_FORWARD_STATUS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_CALL_WAITING;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_CLIP;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_FACILITY_LOCK;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_QUERY_TTY_MODE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_RADIO_POWER;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_RELEASE_PDU_SESSION_ID;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_REPORT_SMS_MEMORY_STATUS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_RESET_RADIO;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SCREEN_STATE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_DEVICE_STATE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_SMS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_SMS_EXPECT_MORE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_USSD;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEPARATE_CONNECTION;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SETUP_DATA_CALL;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_ALLOWED_CARRIERS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_ALLOWED_NETWORK_TYPES_BITMAP;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_BAND_MODE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_CALL_FORWARD;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_CALL_WAITING;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_CLIR;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_DATA_PROFILE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_DATA_THROTTLING;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_DC_RT_INFO_RATE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_FACILITY_LOCK;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_INITIAL_ATTACH_APN;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_LOCATION_UPDATES;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_MUTE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_PREFERRED_DATA_MODEM;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_RADIO_CAPABILITY;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_SIM_CARD_POWER;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_SMSC_ADDRESS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_SYSTEM_SELECTION_CHANNELS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_TTY_MODE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_UICC_SUBSCRIPTION;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SHUTDOWN;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIGNAL_STRENGTH;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_AUTHENTICATION;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_CLOSE_CHANNEL;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_IO;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_OPEN_CHANNEL;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SMS_ACKNOWLEDGE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_START_HANDOVER;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_START_KEEPALIVE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_START_LCE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_START_NETWORK_SCAN;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_GET_PROFILE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STK_SET_PROFILE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STOP_KEEPALIVE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STOP_LCE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_STOP_NETWORK_SCAN;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SWITCH_DUAL_SIM_CONFIG;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_UDUB;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_UPDATE_SIM_PHONEBOOK_RECORD;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_VOICE_RADIO_TECH;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_VOICE_REGISTRATION_STATE;
+import static com.android.internal.telephony.RILConstants.RIL_REQUEST_WRITE_SMS_TO_SIM;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_BARRING_INFO_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CALL_RING;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CARRIER_INFO_IMSI_ENCRYPTION;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_CALL_WAITING;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_INFO_REC;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_OTA_PROVISION_STATUS;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_PRL_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CELL_INFO_LIST;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_DATA_CALL_LIST_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_DC_RT_INFO_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_EMERGENCY_NUMBER_LIST;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_HARDWARE_CONFIG_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_ICC_SLOT_STATUS;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_KEEPALIVE_STATUS;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_LCEDATA_RECV;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_MODEM_RESTART;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_NETWORK_SCAN_RESULT;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_NITZ_TIME_RECEIVED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_OEM_HOOK_RAW;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_ON_SS;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_ON_USSD;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_ON_USSD_REQUEST;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_PCO_DATA;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_PHYSICAL_CHANNEL_CONFIG;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RADIO_CAPABILITY;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_REGISTRATION_FAILED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESEND_INCALL_MUTE;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_CDMA_NEW_SMS;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_SMS;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_RECORDS_RECEIVED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESTRICTED_STATE_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RIL_CONNECTED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RINGBACK_TONE;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SIGNAL_STRENGTH;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SIM_REFRESH;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SIM_SMS_STORAGE_FULL;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SRVCC_STATE_NOTIFY;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_STK_CALL_SETUP;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_STK_CC_ALPHA_NOTIFY;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_STK_EVENT_NOTIFY;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_STK_PROACTIVE_COMMAND;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_STK_SESSION_END;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_SUPP_SVC_NOTIFICATION;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_UICC_APPLICATIONS_ENABLEMENT_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_UNTHROTTLE_APN;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_VOICE_RADIO_TECH_CHANGED;
+
+import android.annotation.Nullable;
+import android.net.InetAddresses;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.os.SystemClock;
+import android.service.carrier.CarrierIdentifier;
+import android.telephony.AccessNetworkConstants;
+import android.telephony.Annotation;
+import android.telephony.CellInfo;
+import android.telephony.LinkCapacityEstimate;
+import android.telephony.PhoneNumberUtils;
+import android.telephony.PhysicalChannelConfig;
+import android.telephony.RadioAccessSpecifier;
+import android.telephony.ServiceState;
+import android.telephony.SignalThresholdInfo;
+import android.telephony.SmsManager;
+import android.telephony.TelephonyManager;
+import android.telephony.data.ApnSetting;
+import android.telephony.data.DataCallResponse;
+import android.telephony.data.DataProfile;
+import android.telephony.data.EpsQos;
+import android.telephony.data.NetworkSliceInfo;
+import android.telephony.data.NrQos;
+import android.telephony.data.Qos;
+import android.telephony.data.QosBearerFilter;
+import android.telephony.data.QosBearerSession;
+import android.telephony.data.RouteSelectionDescriptor;
+import android.telephony.data.SlicingConfig;
+import android.telephony.data.TrafficDescriptor;
+import android.telephony.data.UrspRule;
+import android.text.TextUtils;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.cat.ComprehensionTlv;
+import com.android.internal.telephony.cat.ComprehensionTlvTag;
+import com.android.internal.telephony.dataconnection.KeepaliveStatus;
+import com.android.internal.telephony.uicc.IccCardApplicationStatus;
+import com.android.internal.telephony.uicc.IccCardStatus;
+import com.android.internal.telephony.uicc.IccUtils;
+import com.android.telephony.Rlog;
+
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Utils class for HAL <-> RIL conversions
+ */
+public class RILUtils {
+    private static final String LOG_TAG = "RILUtils";
+
+    /**
+     * Convert to PersoSubstate defined in radio/1.5/types.hal
+     * @param persoType PersoSubState type
+     * @return The converted PersoSubstate
+     */
+    public static int convertToHalPersoType(
+            IccCardApplicationStatus.PersoSubState persoType) {
+        switch (persoType) {
+            case PERSOSUBSTATE_IN_PROGRESS:
+                return android.hardware.radio.V1_5.PersoSubstate.IN_PROGRESS;
+            case  PERSOSUBSTATE_READY:
+                return android.hardware.radio.V1_5.PersoSubstate.READY;
+            case PERSOSUBSTATE_SIM_NETWORK:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_NETWORK;
+            case PERSOSUBSTATE_SIM_NETWORK_SUBSET:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_NETWORK_SUBSET;
+            case PERSOSUBSTATE_SIM_CORPORATE:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_CORPORATE;
+            case PERSOSUBSTATE_SIM_SERVICE_PROVIDER:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_SERVICE_PROVIDER;
+            case PERSOSUBSTATE_SIM_SIM:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_SIM;
+            case PERSOSUBSTATE_SIM_NETWORK_PUK:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_NETWORK_PUK;
+            case PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_NETWORK_SUBSET_PUK;
+            case PERSOSUBSTATE_SIM_CORPORATE_PUK:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_CORPORATE_PUK;
+            case PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_SERVICE_PROVIDER_PUK;
+            case PERSOSUBSTATE_SIM_SIM_PUK:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_SIM_PUK;
+            case PERSOSUBSTATE_RUIM_NETWORK1:
+                return android.hardware.radio.V1_5.PersoSubstate.RUIM_NETWORK1;
+            case PERSOSUBSTATE_RUIM_NETWORK2:
+                return android.hardware.radio.V1_5.PersoSubstate.RUIM_NETWORK2;
+            case PERSOSUBSTATE_RUIM_HRPD:
+                return android.hardware.radio.V1_5.PersoSubstate.RUIM_HRPD;
+            case PERSOSUBSTATE_RUIM_CORPORATE:
+                return android.hardware.radio.V1_5.PersoSubstate.RUIM_CORPORATE;
+            case PERSOSUBSTATE_RUIM_SERVICE_PROVIDER:
+                return android.hardware.radio.V1_5.PersoSubstate.RUIM_SERVICE_PROVIDER;
+            case PERSOSUBSTATE_RUIM_RUIM:
+                return android.hardware.radio.V1_5.PersoSubstate.RUIM_RUIM;
+            case PERSOSUBSTATE_RUIM_NETWORK1_PUK:
+                return android.hardware.radio.V1_5.PersoSubstate.RUIM_NETWORK1_PUK;
+            case PERSOSUBSTATE_RUIM_NETWORK2_PUK:
+                return android.hardware.radio.V1_5.PersoSubstate.RUIM_NETWORK2_PUK;
+            case PERSOSUBSTATE_RUIM_HRPD_PUK:
+                return android.hardware.radio.V1_5.PersoSubstate.RUIM_HRPD_PUK;
+            case PERSOSUBSTATE_RUIM_CORPORATE_PUK:
+                return android.hardware.radio.V1_5.PersoSubstate.RUIM_CORPORATE_PUK;
+            case PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK:
+                return android.hardware.radio.V1_5.PersoSubstate.RUIM_SERVICE_PROVIDER_PUK;
+            case PERSOSUBSTATE_RUIM_RUIM_PUK:
+                return android.hardware.radio.V1_5.PersoSubstate.RUIM_RUIM_PUK;
+            case PERSOSUBSTATE_SIM_SPN:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_SPN;
+            case PERSOSUBSTATE_SIM_SPN_PUK:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_SPN_PUK;
+            case PERSOSUBSTATE_SIM_SP_EHPLMN:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_SP_EHPLMN;
+            case PERSOSUBSTATE_SIM_SP_EHPLMN_PUK:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_SP_EHPLMN_PUK;
+            case PERSOSUBSTATE_SIM_ICCID:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_ICCID;
+            case PERSOSUBSTATE_SIM_ICCID_PUK:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_ICCID_PUK;
+            case PERSOSUBSTATE_SIM_IMPI:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_IMPI;
+            case PERSOSUBSTATE_SIM_IMPI_PUK:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_IMPI_PUK;
+            case PERSOSUBSTATE_SIM_NS_SP:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_NS_SP;
+            case PERSOSUBSTATE_SIM_NS_SP_PUK:
+                return android.hardware.radio.V1_5.PersoSubstate.SIM_NS_SP_PUK;
+            default:
+                return android.hardware.radio.V1_5.PersoSubstate.UNKNOWN;
+        }
+    }
+
+    /**
+     * Convert to GsmSmsMessage defined in radio/1.0/types.hal
+     * @param smscPdu SMSD address
+     * @param pdu SMS in PDU format
+     * @return A converted GsmSmsMessage
+     */
+    public static android.hardware.radio.V1_0.GsmSmsMessage convertToHalGsmSmsMessage(
+            String smscPdu, String pdu) {
+        android.hardware.radio.V1_0.GsmSmsMessage msg =
+                new android.hardware.radio.V1_0.GsmSmsMessage();
+        msg.smscPdu = smscPdu == null ? "" : smscPdu;
+        msg.pdu = pdu == null ? "" : pdu;
+        return msg;
+    }
+
+    /**
+     * Convert to CdmaSmsMessage defined in radio/1.0/types.hal
+     * @param pdu SMS in PDU format
+     * @return A converted CdmaSmsMessage
+     */
+    public static android.hardware.radio.V1_0.CdmaSmsMessage convertToHalCdmaSmsMessage(
+            byte[] pdu) {
+        android.hardware.radio.V1_0.CdmaSmsMessage msg =
+                new android.hardware.radio.V1_0.CdmaSmsMessage();
+        int addrNbrOfDigits;
+        int subaddrNbrOfDigits;
+        int bearerDataLength;
+        ByteArrayInputStream bais = new ByteArrayInputStream(pdu);
+        DataInputStream dis = new DataInputStream(bais);
+
+        try {
+            msg.teleserviceId = dis.readInt(); // teleServiceId
+            msg.isServicePresent = (byte) dis.readInt() == 1; // servicePresent
+            msg.serviceCategory = dis.readInt(); // serviceCategory
+            msg.address.digitMode = dis.read();  // address digit mode
+            msg.address.numberMode = dis.read(); // address number mode
+            msg.address.numberType = dis.read(); // address number type
+            msg.address.numberPlan = dis.read(); // address number plan
+            addrNbrOfDigits = (byte) dis.read();
+            for (int i = 0; i < addrNbrOfDigits; i++) {
+                msg.address.digits.add(dis.readByte()); // address_orig_bytes[i]
+            }
+            msg.subAddress.subaddressType = dis.read(); //subaddressType
+            msg.subAddress.odd = (byte) dis.read() == 1; //subaddr odd
+            subaddrNbrOfDigits = (byte) dis.read();
+            for (int i = 0; i < subaddrNbrOfDigits; i++) {
+                msg.subAddress.digits.add(dis.readByte()); //subaddr_orig_bytes[i]
+            }
+
+            bearerDataLength = dis.read();
+            for (int i = 0; i < bearerDataLength; i++) {
+                msg.bearerData.add(dis.readByte()); //bearerData[i]
+            }
+        } catch (IOException ex) {
+        }
+        return msg;
+    }
+
+    /**
+     * Convert to DataProfileInfo defined in radio/1.0/types.hal
+     * @param dp Data profile
+     * @return The converted DataProfileInfo
+     */
+    public static android.hardware.radio.V1_0.DataProfileInfo convertToHalDataProfile10(
+            DataProfile dp) {
+        android.hardware.radio.V1_0.DataProfileInfo dpi =
+                new android.hardware.radio.V1_0.DataProfileInfo();
+
+        dpi.profileId = dp.getProfileId();
+        dpi.apn = dp.getApn();
+        dpi.protocol = ApnSetting.getProtocolStringFromInt(dp.getProtocolType());
+        dpi.roamingProtocol = ApnSetting.getProtocolStringFromInt(dp.getRoamingProtocolType());
+        dpi.authType = dp.getAuthType();
+        dpi.user = dp.getUserName();
+        dpi.password = dp.getPassword();
+        dpi.type = dp.getType();
+        dpi.maxConnsTime = dp.getMaxConnectionsTime();
+        dpi.maxConns = dp.getMaxConnections();
+        dpi.waitTime = dp.getWaitTime();
+        dpi.enabled = dp.isEnabled();
+        dpi.supportedApnTypesBitmap = dp.getSupportedApnTypesBitmask();
+        // Shift by 1 bit due to the discrepancy between
+        // android.hardware.radio.V1_0.RadioAccessFamily and the bitmask version of
+        // ServiceState.RIL_RADIO_TECHNOLOGY_XXXX.
+        dpi.bearerBitmap = ServiceState.convertNetworkTypeBitmaskToBearerBitmask(
+                dp.getBearerBitmask()) << 1;
+        dpi.mtu = dp.getMtuV4();
+        dpi.mvnoType = android.hardware.radio.V1_0.MvnoType.NONE;
+        dpi.mvnoMatchData = "";
+
+        return dpi;
+    }
+
+    /**
+     * Convert to DataProfileInfo defined in radio/1.4/types.hal
+     * @param dp Data profile
+     * @return The converted DataProfileInfo
+     */
+    public static android.hardware.radio.V1_4.DataProfileInfo convertToHalDataProfile14(
+            DataProfile dp) {
+        android.hardware.radio.V1_4.DataProfileInfo dpi =
+                new android.hardware.radio.V1_4.DataProfileInfo();
+
+        dpi.apn = dp.getApn();
+        dpi.protocol = dp.getProtocolType();
+        dpi.roamingProtocol = dp.getRoamingProtocolType();
+        dpi.authType = dp.getAuthType();
+        dpi.user = dp.getUserName();
+        dpi.password = dp.getPassword();
+        dpi.type = dp.getType();
+        dpi.maxConnsTime = dp.getMaxConnectionsTime();
+        dpi.maxConns = dp.getMaxConnections();
+        dpi.waitTime = dp.getWaitTime();
+        dpi.enabled = dp.isEnabled();
+        dpi.supportedApnTypesBitmap = dp.getSupportedApnTypesBitmask();
+        // Shift by 1 bit due to the discrepancy between
+        // android.hardware.radio.V1_0.RadioAccessFamily and the bitmask version of
+        // ServiceState.RIL_RADIO_TECHNOLOGY_XXXX.
+        dpi.bearerBitmap = ServiceState.convertNetworkTypeBitmaskToBearerBitmask(
+                dp.getBearerBitmask()) << 1;
+        dpi.mtu = dp.getMtuV4();
+        dpi.persistent = dp.isPersistent();
+        dpi.preferred = dp.isPreferred();
+
+        // profile id is only meaningful when it's persistent on the modem.
+        dpi.profileId = (dpi.persistent) ? dp.getProfileId()
+                : android.hardware.radio.V1_0.DataProfileId.INVALID;
+
+        return dpi;
+    }
+
+    /**
+     * Convert to DataProfileInfo defined in radio/1.5/types.hal
+     * @param dp Data profile
+     * @return The converted DataProfileInfo
+     */
+    public static android.hardware.radio.V1_5.DataProfileInfo convertToHalDataProfile15(
+            DataProfile dp) {
+        android.hardware.radio.V1_5.DataProfileInfo dpi =
+                new android.hardware.radio.V1_5.DataProfileInfo();
+
+        dpi.apn = dp.getApn();
+        dpi.protocol = dp.getProtocolType();
+        dpi.roamingProtocol = dp.getRoamingProtocolType();
+        dpi.authType = dp.getAuthType();
+        dpi.user = dp.getUserName();
+        dpi.password = dp.getPassword();
+        dpi.type = dp.getType();
+        dpi.maxConnsTime = dp.getMaxConnectionsTime();
+        dpi.maxConns = dp.getMaxConnections();
+        dpi.waitTime = dp.getWaitTime();
+        dpi.enabled = dp.isEnabled();
+        dpi.supportedApnTypesBitmap = dp.getSupportedApnTypesBitmask();
+        // Shift by 1 bit due to the discrepancy between
+        // android.hardware.radio.V1_0.RadioAccessFamily and the bitmask version of
+        // ServiceState.RIL_RADIO_TECHNOLOGY_XXXX.
+        dpi.bearerBitmap = ServiceState.convertNetworkTypeBitmaskToBearerBitmask(
+                dp.getBearerBitmask()) << 1;
+        dpi.mtuV4 = dp.getMtuV4();
+        dpi.mtuV6 = dp.getMtuV6();
+        dpi.persistent = dp.isPersistent();
+        dpi.preferred = dp.isPreferred();
+
+        // profile id is only meaningful when it's persistent on the modem.
+        dpi.profileId = (dpi.persistent) ? dp.getProfileId()
+                : android.hardware.radio.V1_0.DataProfileId.INVALID;
+
+        return dpi;
+    }
+
+    /**
+     * Convert to OptionalSliceInfo defined in radio/1.6/types.hal
+     * @param sliceInfo Slice info
+     * @return The converted OptionalSliceInfo
+     */
+    public static android.hardware.radio.V1_6.OptionalSliceInfo convertToHalSliceInfo(
+            @Nullable NetworkSliceInfo sliceInfo) {
+        android.hardware.radio.V1_6.OptionalSliceInfo optionalSliceInfo =
+                new android.hardware.radio.V1_6.OptionalSliceInfo();
+        if (sliceInfo == null) {
+            return optionalSliceInfo;
+        }
+
+        android.hardware.radio.V1_6.SliceInfo si = new android.hardware.radio.V1_6.SliceInfo();
+        si.sst = (byte) sliceInfo.getSliceServiceType();
+        si.mappedHplmnSst = (byte) sliceInfo.getMappedHplmnSliceServiceType();
+        si.sliceDifferentiator = sliceInfo.getSliceDifferentiator();
+        si.mappedHplmnSD = sliceInfo.getMappedHplmnSliceDifferentiator();
+        optionalSliceInfo.value(si);
+        return optionalSliceInfo;
+    }
+
+    /**
+     * Convert to OptionalTrafficDescriptor defined in radio/1.6/types.hal
+     * @param trafficDescriptor Traffic descriptor
+     * @return The converted OptionalTrafficDescriptor
+     */
+    public static android.hardware.radio.V1_6.OptionalTrafficDescriptor
+            convertToHalTrafficDescriptor(@Nullable TrafficDescriptor trafficDescriptor) {
+        android.hardware.radio.V1_6.OptionalTrafficDescriptor optionalTrafficDescriptor =
+                new android.hardware.radio.V1_6.OptionalTrafficDescriptor();
+        if (trafficDescriptor == null) {
+            return optionalTrafficDescriptor;
+        }
+
+        android.hardware.radio.V1_6.TrafficDescriptor td =
+                new android.hardware.radio.V1_6.TrafficDescriptor();
+
+        android.hardware.radio.V1_6.OptionalDnn optionalDnn =
+                new android.hardware.radio.V1_6.OptionalDnn();
+        if (trafficDescriptor.getDataNetworkName() != null) {
+            optionalDnn.value(trafficDescriptor.getDataNetworkName());
+        }
+        td.dnn = optionalDnn;
+
+        android.hardware.radio.V1_6.OptionalOsAppId optionalOsAppId =
+                new android.hardware.radio.V1_6.OptionalOsAppId();
+        if (trafficDescriptor.getOsAppId() != null) {
+            android.hardware.radio.V1_6.OsAppId osAppId = new android.hardware.radio.V1_6.OsAppId();
+            osAppId.osAppId = primitiveArrayToArrayList(trafficDescriptor.getOsAppId().getBytes());
+            optionalOsAppId.value(osAppId);
+        }
+        td.osAppId = optionalOsAppId;
+
+        optionalTrafficDescriptor.value(td);
+        return optionalTrafficDescriptor;
+    }
+
+    /**
+     * Convert to ResetNvType defined in radio/1.0/types.hal
+     * @param resetType NV reset type
+     * @return The converted reset type in integer or -1 if param is invalid
+     */
+    public static int convertToHalResetNvType(int resetType) {
+        /**
+         * resetType values
+         * 1 - reload all NV items
+         * 2 - erase NV reset (SCRTN)
+         * 3 - factory reset (RTN)
+         */
+        switch (resetType) {
+            case 1: return android.hardware.radio.V1_0.ResetNvType.RELOAD;
+            case 2: return android.hardware.radio.V1_0.ResetNvType.ERASE;
+            case 3: return android.hardware.radio.V1_0.ResetNvType.FACTORY_RESET;
+        }
+        return -1;
+    }
+
+    /**
+     * Convert to a list of LinkAddress defined in radio/1.5/types.hal
+     * @param linkProperties Link properties
+     * @return The converted list of LinkAddresses
+     */
+    public static ArrayList<android.hardware.radio.V1_5.LinkAddress> convertToHalLinkProperties15(
+            LinkProperties linkProperties) {
+        ArrayList<android.hardware.radio.V1_5.LinkAddress> addresses15 = new ArrayList<>();
+        if (linkProperties != null) {
+            for (android.net.LinkAddress la : linkProperties.getAllLinkAddresses()) {
+                android.hardware.radio.V1_5.LinkAddress linkAddress =
+                        new android.hardware.radio.V1_5.LinkAddress();
+                linkAddress.address = la.getAddress().getHostAddress();
+                linkAddress.properties = la.getFlags();
+                linkAddress.deprecationTime = la.getDeprecationTime();
+                linkAddress.expirationTime = la.getExpirationTime();
+                addresses15.add(linkAddress);
+            }
+        }
+        return addresses15;
+    }
+
+    /**
+     * Convert to RadioAccessSpecifier defined in radio/1.1/types.hal
+     * @param ras Radio access specifier
+     * @return The converted RadioAccessSpecifier
+     */
+    public static android.hardware.radio.V1_1.RadioAccessSpecifier
+            convertToHalRadioAccessSpecifier11(RadioAccessSpecifier ras) {
+        android.hardware.radio.V1_1.RadioAccessSpecifier rasInHalFormat =
+                new android.hardware.radio.V1_1.RadioAccessSpecifier();
+        rasInHalFormat.radioAccessNetwork = ras.getRadioAccessNetwork();
+        ArrayList<Integer> bands = new ArrayList<>();
+        if (ras.getBands() != null) {
+            for (int band : ras.getBands()) {
+                bands.add(band);
+            }
+        }
+        switch (ras.getRadioAccessNetwork()) {
+            case AccessNetworkConstants.AccessNetworkType.GERAN:
+                rasInHalFormat.geranBands = bands;
+                break;
+            case AccessNetworkConstants.AccessNetworkType.UTRAN:
+                rasInHalFormat.utranBands = bands;
+                break;
+            case AccessNetworkConstants.AccessNetworkType.EUTRAN:
+                rasInHalFormat.eutranBands = bands;
+                break;
+            default:
+                return null;
+        }
+
+        if (ras.getChannels() != null) {
+            for (int channel : ras.getChannels()) {
+                rasInHalFormat.channels.add(channel);
+            }
+        }
+
+        return rasInHalFormat;
+    }
+
+    /**
+     * Convert to RadioAccessSpecifier defined in radio/1.5/types.hal
+     * @param ras Radio access specifier
+     * @return The converted RadioAccessSpecifier
+     */
+    public static android.hardware.radio.V1_5.RadioAccessSpecifier
+            convertToHalRadioAccessSpecifier15(RadioAccessSpecifier ras) {
+        android.hardware.radio.V1_5.RadioAccessSpecifier rasInHalFormat =
+                new android.hardware.radio.V1_5.RadioAccessSpecifier();
+        android.hardware.radio.V1_5.RadioAccessSpecifier.Bands bandsInHalFormat =
+                new android.hardware.radio.V1_5.RadioAccessSpecifier.Bands();
+        rasInHalFormat.radioAccessNetwork = convertToHalRadioAccessNetworks(
+                ras.getRadioAccessNetwork());
+        ArrayList<Integer> bands = new ArrayList<>();
+        if (ras.getBands() != null) {
+            for (int band : ras.getBands()) {
+                bands.add(band);
+            }
+        }
+        switch (ras.getRadioAccessNetwork()) {
+            case AccessNetworkConstants.AccessNetworkType.GERAN:
+                bandsInHalFormat.geranBands(bands);
+                break;
+            case AccessNetworkConstants.AccessNetworkType.UTRAN:
+                bandsInHalFormat.utranBands(bands);
+                break;
+            case AccessNetworkConstants.AccessNetworkType.EUTRAN:
+                bandsInHalFormat.eutranBands(bands);
+                break;
+            case AccessNetworkConstants.AccessNetworkType.NGRAN:
+                bandsInHalFormat.ngranBands(bands);
+                break;
+            default:
+                return null;
+        }
+        rasInHalFormat.bands = bandsInHalFormat;
+
+        if (ras.getChannels() != null) {
+            for (int channel : ras.getChannels()) {
+                rasInHalFormat.channels.add(channel);
+            }
+        }
+
+        return rasInHalFormat;
+    }
+
+    /**
+     * Convert to censored terminal response
+     * @param terminalResponse Terminal response
+     * @return The converted censored terminal response
+     */
+    public static String convertToCensoredTerminalResponse(String terminalResponse) {
+        try {
+            byte[] bytes = IccUtils.hexStringToBytes(terminalResponse);
+            if (bytes != null) {
+                List<ComprehensionTlv> ctlvs = ComprehensionTlv.decodeMany(bytes, 0);
+                int from = 0;
+                for (ComprehensionTlv ctlv : ctlvs) {
+                    // Find text strings which might be personal information input by user,
+                    // then replace it with "********".
+                    if (ComprehensionTlvTag.TEXT_STRING.value() == ctlv.getTag()) {
+                        byte[] target = Arrays.copyOfRange(ctlv.getRawValue(), from,
+                                ctlv.getValueIndex() + ctlv.getLength());
+                        terminalResponse = terminalResponse.toLowerCase().replace(
+                                IccUtils.bytesToHexString(target).toLowerCase(), "********");
+                    }
+                    // The text string tag and the length field should also be hidden.
+                    from = ctlv.getValueIndex() + ctlv.getLength();
+                }
+            }
+        } catch (Exception e) {
+            terminalResponse = null;
+        }
+
+        return terminalResponse;
+    }
+
+    /**
+     * Convert to {@link TelephonyManager.NetworkTypeBitMask}, the bitmask represented by
+     * {@link android.telephony.Annotation.NetworkType}.
+     *
+     * @param raf {@link android.hardware.radio.V1_0.RadioAccessFamily}
+     * @return {@link TelephonyManager.NetworkTypeBitMask}
+     */
+    @TelephonyManager.NetworkTypeBitMask
+    public static int convertHalNetworkTypeBitMask(int raf) {
+        int networkTypeRaf = 0;
+
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.GSM) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_GSM;
+        }
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.GPRS) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_GPRS;
+        }
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EDGE) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EDGE;
+        }
+        // convert both IS95A/IS95B to CDMA as network mode doesn't support CDMA
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.IS95A) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
+        }
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.IS95B) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_CDMA;
+        }
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.ONE_X_RTT) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT;
+        }
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_0) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0;
+        }
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_A) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A;
+        }
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_B) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B;
+        }
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EHRPD) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD;
+        }
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSUPA) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA;
+        }
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSDPA) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA;
+        }
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSPA) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSPA;
+        }
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSPAP) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP;
+        }
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.UMTS) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_UMTS;
+        }
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.TD_SCDMA) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA;
+        }
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.LTE) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_LTE;
+        }
+        if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.LTE_CA) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA;
+        }
+        if ((raf & android.hardware.radio.V1_4.RadioAccessFamily.NR) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_NR;
+        }
+        // TODO: need hal definition
+        if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN)) != 0) {
+            networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN;
+        }
+        return (networkTypeRaf == 0) ? TelephonyManager.NETWORK_TYPE_UNKNOWN : networkTypeRaf;
+    }
+
+    /**
+     * Convert to RadioAccessFamily defined in radio/1.4/types.hal
+     * @param networkTypeBitmask {@link TelephonyManager.NetworkTypeBitMask}, the bitmask
+     *        represented by {@link android.telephony.Annotation.NetworkType}
+     * @return The converted RadioAccessFamily
+     */
+    public static int convertToHalRadioAccessFamily(
+            @TelephonyManager.NetworkTypeBitMask int networkTypeBitmask) {
+        int raf = 0;
+
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_GSM) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.GSM;
+        }
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_GPRS) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.GPRS;
+        }
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EDGE) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.EDGE;
+        }
+        // convert CDMA to IS95A, consistent with ServiceState.networkTypeToRilRadioTechnology
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_CDMA) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.IS95A;
+        }
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.ONE_X_RTT;
+        }
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.EVDO_0;
+        }
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.EVDO_A;
+        }
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.EVDO_B;
+        }
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.EHRPD;
+        }
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.HSUPA;
+        }
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.HSDPA;
+        }
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSPA) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.HSPA;
+        }
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.HSPAP;
+        }
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_UMTS) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.UMTS;
+        }
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.TD_SCDMA;
+        }
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_LTE) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.LTE;
+        }
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA) != 0) {
+            raf |= android.hardware.radio.V1_0.RadioAccessFamily.LTE_CA;
+        }
+        if ((networkTypeBitmask & TelephonyManager.NETWORK_TYPE_BITMASK_NR) != 0) {
+            raf |= android.hardware.radio.V1_4.RadioAccessFamily.NR;
+        }
+        // TODO: need hal definition for IWLAN
+        return (raf == 0) ? android.hardware.radio.V1_4.RadioAccessFamily.UNKNOWN : raf;
+    }
+
+    /**
+     * Convert AccessNetworkType to AccessNetwork defined in radio/1.5/types.hal
+     * @param accessNetworkType Access networkt ype
+     * @return The converted AccessNetwork
+     */
+    public static int convertToHalAccessNetwork(int accessNetworkType) {
+        switch (accessNetworkType) {
+            case AccessNetworkConstants.AccessNetworkType.GERAN:
+                return android.hardware.radio.V1_5.AccessNetwork.GERAN;
+            case AccessNetworkConstants.AccessNetworkType.UTRAN:
+                return android.hardware.radio.V1_5.AccessNetwork.UTRAN;
+            case AccessNetworkConstants.AccessNetworkType.EUTRAN:
+                return android.hardware.radio.V1_5.AccessNetwork.EUTRAN;
+            case AccessNetworkConstants.AccessNetworkType.CDMA2000:
+                return android.hardware.radio.V1_5.AccessNetwork.CDMA2000;
+            case AccessNetworkConstants.AccessNetworkType.IWLAN:
+                return android.hardware.radio.V1_5.AccessNetwork.IWLAN;
+            case AccessNetworkConstants.AccessNetworkType.NGRAN:
+                return android.hardware.radio.V1_5.AccessNetwork.NGRAN;
+            case AccessNetworkConstants.AccessNetworkType.UNKNOWN:
+            default:
+                return android.hardware.radio.V1_5.AccessNetwork.UNKNOWN;
+        }
+    }
+
+    /**
+     * Convert AccessNetworkType to RadioAccessNetwork defined in radio/1.1/types.hal
+     * @param accessNetworkType Access network type
+     * @return The converted RadioAccessNetwork
+     */
+    public static int convertToHalRadioAccessNetworks(int accessNetworkType) {
+        switch (accessNetworkType) {
+            case AccessNetworkConstants.AccessNetworkType.GERAN:
+                return android.hardware.radio.V1_1.RadioAccessNetworks.GERAN;
+            case AccessNetworkConstants.AccessNetworkType.UTRAN:
+                return android.hardware.radio.V1_1.RadioAccessNetworks.UTRAN;
+            case AccessNetworkConstants.AccessNetworkType.EUTRAN:
+                return android.hardware.radio.V1_1.RadioAccessNetworks.EUTRAN;
+            case AccessNetworkConstants.AccessNetworkType.NGRAN:
+                return android.hardware.radio.V1_5.RadioAccessNetworks.NGRAN;
+            case AccessNetworkConstants.AccessNetworkType.CDMA2000:
+                return android.hardware.radio.V1_5.RadioAccessNetworks.CDMA2000;
+            case AccessNetworkConstants.AccessNetworkType.UNKNOWN:
+            default:
+                return android.hardware.radio.V1_5.RadioAccessNetworks.UNKNOWN;
+        }
+    }
+
+    /**
+     * Convert RadioAccessNetworks defined in radio/1.5/types.hal to AccessNetworkType
+     * @param ran RadioAccessNetwork defined in radio/1.5/types.hal
+     * @return The converted AccessNetworkType
+     */
+    public static int convertHalRadioAccessNetworks(int ran) {
+        switch (ran) {
+            case android.hardware.radio.V1_5.RadioAccessNetworks.GERAN:
+                return AccessNetworkConstants.AccessNetworkType.GERAN;
+            case android.hardware.radio.V1_5.RadioAccessNetworks.UTRAN:
+                return AccessNetworkConstants.AccessNetworkType.UTRAN;
+            case android.hardware.radio.V1_5.RadioAccessNetworks.EUTRAN:
+                return AccessNetworkConstants.AccessNetworkType.EUTRAN;
+            case android.hardware.radio.V1_5.RadioAccessNetworks.NGRAN:
+                return AccessNetworkConstants.AccessNetworkType.NGRAN;
+            case android.hardware.radio.V1_5.RadioAccessNetworks.CDMA2000:
+                return AccessNetworkConstants.AccessNetworkType.CDMA2000;
+            case android.hardware.radio.V1_5.RadioAccessNetworks.UNKNOWN:
+            default:
+                return AccessNetworkConstants.AccessNetworkType.UNKNOWN;
+        }
+    }
+
+    /**
+     * Convert to SimApdu defined in radio/1.0/types.hal
+     * @param channel channel
+     * @param cla cla
+     * @param instruction instruction
+     * @param p1 p1
+     * @param p2 p2
+     * @param p3 p3
+     * @param data data
+     * @return The converted SimApdu
+     */
+    public static android.hardware.radio.V1_0.SimApdu convertToHalSimApdu(int channel, int cla,
+            int instruction, int p1, int p2, int p3, String data) {
+        android.hardware.radio.V1_0.SimApdu msg = new android.hardware.radio.V1_0.SimApdu();
+        msg.sessionId = channel;
+        msg.cla = cla;
+        msg.instruction = instruction;
+        msg.p1 = p1;
+        msg.p2 = p2;
+        msg.p3 = p3;
+        msg.data = convertNullToEmptyString(data);
+        return msg;
+    }
+
+    /**
+     * Convert a list of CarrierIdentifiers into a list of Carrier defined in radio/1.0/types.hal
+     * @param carriers List of CarrierIdentifiers
+     * @return The converted list of Carriers
+     */
+    public static ArrayList<android.hardware.radio.V1_0.Carrier> convertToHalCarrierRestrictionList(
+            List<CarrierIdentifier> carriers) {
+        ArrayList<android.hardware.radio.V1_0.Carrier> result = new ArrayList<>();
+        for (CarrierIdentifier ci : carriers) {
+            android.hardware.radio.V1_0.Carrier c = new android.hardware.radio.V1_0.Carrier();
+            c.mcc = convertNullToEmptyString(ci.getMcc());
+            c.mnc = convertNullToEmptyString(ci.getMnc());
+            int matchType = CarrierIdentifier.MatchType.ALL;
+            String matchData = null;
+            if (!TextUtils.isEmpty(ci.getSpn())) {
+                matchType = CarrierIdentifier.MatchType.SPN;
+                matchData = ci.getSpn();
+            } else if (!TextUtils.isEmpty(ci.getImsi())) {
+                matchType = CarrierIdentifier.MatchType.IMSI_PREFIX;
+                matchData = ci.getImsi();
+            } else if (!TextUtils.isEmpty(ci.getGid1())) {
+                matchType = CarrierIdentifier.MatchType.GID1;
+                matchData = ci.getGid1();
+            } else if (!TextUtils.isEmpty(ci.getGid2())) {
+                matchType = CarrierIdentifier.MatchType.GID2;
+                matchData = ci.getGid2();
+            }
+            c.matchType = matchType;
+            c.matchData = convertNullToEmptyString(matchData);
+            result.add(c);
+        }
+        return result;
+    }
+
+    /**
+     * Convert to SignalThresholdInfo defined in radio/1.5/types.hal
+     * @param signalThresholdInfo Signal threshold info
+     * @return The converted SignalThresholdInfo
+     */
+    public static android.hardware.radio.V1_5.SignalThresholdInfo convertToHalSignalThresholdInfo(
+            SignalThresholdInfo signalThresholdInfo) {
+        android.hardware.radio.V1_5.SignalThresholdInfo signalThresholdInfoHal =
+                new android.hardware.radio.V1_5.SignalThresholdInfo();
+        signalThresholdInfoHal.signalMeasurement = signalThresholdInfo.getSignalMeasurementType();
+        signalThresholdInfoHal.hysteresisMs = signalThresholdInfo.getHysteresisMs();
+        signalThresholdInfoHal.hysteresisDb = signalThresholdInfo.getHysteresisDb();
+        signalThresholdInfoHal.thresholds = primitiveArrayToArrayList(
+                signalThresholdInfo.getThresholds());
+        signalThresholdInfoHal.isEnabled = signalThresholdInfo.isEnabled();
+        return signalThresholdInfoHal;
+    }
+
+    /**
+     * Convert StatusOnIcc to SmsWriteArgsStatus defined in radio/1.0/types.hal
+     * @param status StatusOnIcc
+     * @return The converted SmsWriteArgsStatus defined in radio/1.0/types.hal
+     */
+    public static int convertToHalSmsWriteArgsStatus(int status) {
+        switch(status & 0x7) {
+            case SmsManager.STATUS_ON_ICC_READ:
+                return android.hardware.radio.V1_0.SmsWriteArgsStatus.REC_READ;
+            case SmsManager.STATUS_ON_ICC_UNREAD:
+                return android.hardware.radio.V1_0.SmsWriteArgsStatus.REC_UNREAD;
+            case SmsManager.STATUS_ON_ICC_SENT:
+                return android.hardware.radio.V1_0.SmsWriteArgsStatus.STO_SENT;
+            case SmsManager.STATUS_ON_ICC_UNSENT:
+                return android.hardware.radio.V1_0.SmsWriteArgsStatus.STO_UNSENT;
+            default:
+                return android.hardware.radio.V1_0.SmsWriteArgsStatus.REC_READ;
+        }
+    }
+
+    /**
+     * Convert a list of HardwareConfig defined in radio/1.0/types.hal to a list of HardwareConfig
+     * @param hwListRil List of HardwareConfig defined in radio/1.0/types.hal
+     * @return The converted list of HardwareConfig
+     */
+    @TelephonyManager.NetworkTypeBitMask
+    public static ArrayList<HardwareConfig> convertHalHardwareConfigList(
+            ArrayList<android.hardware.radio.V1_0.HardwareConfig> hwListRil) {
+        int num;
+        ArrayList<HardwareConfig> response;
+        HardwareConfig hw;
+
+        num = hwListRil.size();
+        response = new ArrayList<>(num);
+
+        for (android.hardware.radio.V1_0.HardwareConfig hwRil : hwListRil) {
+            int type = hwRil.type;
+            switch(type) {
+                case HardwareConfig.DEV_HARDWARE_TYPE_MODEM: {
+                    hw = new HardwareConfig(type);
+                    android.hardware.radio.V1_0.HardwareConfigModem hwModem = hwRil.modem.get(0);
+                    hw.assignModem(hwRil.uuid, hwRil.state, hwModem.rilModel, hwModem.rat,
+                            hwModem.maxVoice, hwModem.maxData, hwModem.maxStandby);
+                    break;
+                }
+                case HardwareConfig.DEV_HARDWARE_TYPE_SIM: {
+                    hw = new HardwareConfig(type);
+                    hw.assignSim(hwRil.uuid, hwRil.state, hwRil.sim.get(0).modemUuid);
+                    break;
+                }
+                default: {
+                    throw new RuntimeException(
+                            "RIL_REQUEST_GET_HARDWARE_CONFIG invalid hardware type:" + type);
+                }
+            }
+            response.add(hw);
+        }
+        return response;
+    }
+
+    /**
+     * Convert RadioCapability defined in radio/1.0/types.hal to RadioCapability
+     * @param rc RadioCapability defined in radio/1.0/types.hal
+     * @param ril RIL
+     * @return The converted RadioCapability
+     */
+    public static RadioCapability convertHalRadioCapability(
+            android.hardware.radio.V1_0.RadioCapability rc, RIL ril) {
+        int session = rc.session;
+        int phase = rc.phase;
+        int rat = convertHalNetworkTypeBitMask(rc.raf);
+        String logicModemUuid = rc.logicalModemUuid;
+        int status = rc.status;
+
+        ril.riljLog("convertHalRadioCapability: session=" + session + ", phase=" + phase + ", rat="
+                + rat + ", logicModemUuid=" + logicModemUuid + ", status=" + status + ", rcRil.raf="
+                + rc.raf);
+        return new RadioCapability(ril.mPhoneId, session, phase, rat, logicModemUuid, status);
+    }
+
+    /**
+     * Convert LceDataInfo defined in radio/1.0/types.hal to a list of LinkCapacityEstimates
+     * @param lce LceDataInfo defined in radio/1.0/types.hal
+     * @return The converted list of LinkCapacityEstimates
+     */
+    public static List<LinkCapacityEstimate> convertHalLceData(
+            android.hardware.radio.V1_0.LceDataInfo lce) {
+        final List<LinkCapacityEstimate> lceList = new ArrayList<>();
+        lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_COMBINED,
+                lce.lastHopCapacityKbps, LinkCapacityEstimate.INVALID));
+        return lceList;
+    }
+
+    /**
+     * Convert LinkCapacityEstimate defined in radio/1.2/types.hal to a list of
+     * LinkCapacityEstimates
+     * @param lce LinkCapacityEstimate defined in radio/1.2/types.hal
+     * @return The converted list of LinkCapacityEstimates
+     */
+    public static List<LinkCapacityEstimate> convertHalLceData(
+            android.hardware.radio.V1_2.LinkCapacityEstimate lce) {
+        final List<LinkCapacityEstimate> lceList = new ArrayList<>();
+        lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_COMBINED,
+                lce.downlinkCapacityKbps, lce.uplinkCapacityKbps));
+        return lceList;
+    }
+
+    /**
+     * Convert LinkCapacityEstimate defined in radio/1.6/types.hal to a list of
+     * LinkCapacityEstimates
+     * @param lce LinkCapacityEstimate defined in radio/1.6/types.hal
+     * @return The converted list of LinkCapacityEstimates
+     */
+    public static List<LinkCapacityEstimate> convertHalLceData(
+            android.hardware.radio.V1_6.LinkCapacityEstimate lce) {
+        final List<LinkCapacityEstimate> lceList = new ArrayList<>();
+        int primaryDownlinkCapacityKbps = lce.downlinkCapacityKbps;
+        int primaryUplinkCapacityKbps = lce.uplinkCapacityKbps;
+        if (primaryDownlinkCapacityKbps != LinkCapacityEstimate.INVALID
+                && lce.secondaryDownlinkCapacityKbps != LinkCapacityEstimate.INVALID) {
+            primaryDownlinkCapacityKbps =
+                    lce.downlinkCapacityKbps - lce.secondaryDownlinkCapacityKbps;
+        }
+        if (primaryUplinkCapacityKbps != LinkCapacityEstimate.INVALID
+                && lce.secondaryUplinkCapacityKbps != LinkCapacityEstimate.INVALID) {
+            primaryUplinkCapacityKbps =
+                    lce.uplinkCapacityKbps - lce.secondaryUplinkCapacityKbps;
+        }
+        lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_PRIMARY,
+                primaryDownlinkCapacityKbps, primaryUplinkCapacityKbps));
+        lceList.add(new LinkCapacityEstimate(LinkCapacityEstimate.LCE_TYPE_SECONDARY,
+                lce.secondaryDownlinkCapacityKbps, lce.secondaryUplinkCapacityKbps));
+        return lceList;
+    }
+
+    /**
+     * Convert a list of CellInfo defined in radio/1.0, 1.2, 1.4, 1.5, 1.6/types.hal to a list of
+     * CellInfos
+     * @param records List of CellInfo defined in radio/1.0, 1.2, 1.4, 1.5, 1.6/types.hal
+     * @return The converted list of CellInfos
+     */
+    public static ArrayList<CellInfo> convertHalCellInfoList(ArrayList<Object> records) {
+        ArrayList<CellInfo> response = new ArrayList<>(records.size());
+        if (records.isEmpty()) return response;
+        final long nanotime = SystemClock.elapsedRealtimeNanos();
+        for (Object obj : records) {
+            response.add(convertHalCellInfo(obj, nanotime));
+        }
+        return response;
+    }
+
+    private static CellInfo convertHalCellInfo(Object cellInfo, long nanotime) {
+        if (cellInfo == null) return null;
+        if (cellInfo instanceof android.hardware.radio.V1_0.CellInfo) {
+            final android.hardware.radio.V1_0.CellInfo record =
+                    (android.hardware.radio.V1_0.CellInfo) cellInfo;
+            record.timeStamp = nanotime;
+            return CellInfo.create(record);
+        } else if (cellInfo instanceof android.hardware.radio.V1_2.CellInfo) {
+            final android.hardware.radio.V1_2.CellInfo record =
+                    (android.hardware.radio.V1_2.CellInfo) cellInfo;
+            record.timeStamp = nanotime;
+            return CellInfo.create(record);
+        } else if (cellInfo instanceof android.hardware.radio.V1_4.CellInfo) {
+            final android.hardware.radio.V1_4.CellInfo record =
+                    (android.hardware.radio.V1_4.CellInfo) cellInfo;
+            return CellInfo.create(record, nanotime);
+        } else if (cellInfo instanceof android.hardware.radio.V1_5.CellInfo) {
+            final android.hardware.radio.V1_5.CellInfo record =
+                    (android.hardware.radio.V1_5.CellInfo) cellInfo;
+            return CellInfo.create(record, nanotime);
+        } else if (cellInfo instanceof android.hardware.radio.V1_6.CellInfo) {
+            final android.hardware.radio.V1_6.CellInfo record =
+                    (android.hardware.radio.V1_6.CellInfo) cellInfo;
+            return CellInfo.create(record, nanotime);
+        } else {
+            return null;
+        }
+    }
+
+    private static LinkAddress convertToLinkAddress(String addressString) {
+        return convertToLinkAddress(addressString, 0, LinkAddress.LIFETIME_UNKNOWN,
+                LinkAddress.LIFETIME_UNKNOWN);
+    }
+
+    private static LinkAddress convertToLinkAddress(String addressString, int properties,
+            long deprecationTime, long expirationTime) {
+        addressString = addressString.trim();
+        InetAddress address = null;
+        int prefixLength = -1;
+        try {
+            String[] pieces = addressString.split("/", 2);
+            address = InetAddresses.parseNumericAddress(pieces[0]);
+            if (pieces.length == 1) {
+                prefixLength = (address instanceof Inet4Address) ? 32 : 128;
+            } else if (pieces.length == 2) {
+                prefixLength = Integer.parseInt(pieces[1]);
+            }
+        } catch (NullPointerException e) {            // Null string.
+        } catch (ArrayIndexOutOfBoundsException e) {  // No prefix length.
+        } catch (NumberFormatException e) {           // Non-numeric prefix.
+        } catch (IllegalArgumentException e) {        // Invalid IP address.
+        }
+
+        if (address == null || prefixLength == -1) {
+            throw new IllegalArgumentException("Invalid link address " + addressString);
+        }
+
+        return new LinkAddress(address, prefixLength, properties, 0, deprecationTime,
+                expirationTime);
+    }
+
+    /**
+     * Convert SetupDataCallResult defined in radio/1.0, 1.4, 1.5, 1.6/types.hal into
+     * DataCallResponse
+     * @param dcResult SetupDataCallResult defined in radio/1.0, 1.4, 1.5, 1.6/types.hal
+     * @return The converted DataCallResponse
+     */
+    @VisibleForTesting
+    public static DataCallResponse convertHalDataCallResult(Object dcResult) {
+        if (dcResult == null) return null;
+
+        int cause, cid, active, mtu, mtuV4, mtuV6;
+        long suggestedRetryTime;
+        String ifname;
+        int protocolType;
+        String[] addresses = null;
+        String[] dnses = null;
+        String[] gateways = null;
+        String[] pcscfs = null;
+        Qos defaultQos = null;
+        @DataCallResponse.HandoverFailureMode
+        int handoverFailureMode = DataCallResponse.HANDOVER_FAILURE_MODE_LEGACY;
+        int pduSessionId = DataCallResponse.PDU_SESSION_ID_NOT_SET;
+        List<LinkAddress> laList = new ArrayList<>();
+        List<QosBearerSession> qosSessions = new ArrayList<>();
+        NetworkSliceInfo sliceInfo = null;
+        List<TrafficDescriptor> trafficDescriptors = new ArrayList<>();
+
+        if (dcResult instanceof android.hardware.radio.V1_0.SetupDataCallResult) {
+            final android.hardware.radio.V1_0.SetupDataCallResult result =
+                    (android.hardware.radio.V1_0.SetupDataCallResult) dcResult;
+            cause = result.status;
+            suggestedRetryTime = result.suggestedRetryTime;
+            cid = result.cid;
+            active = result.active;
+            protocolType = ApnSetting.getProtocolIntFromString(result.type);
+            ifname = result.ifname;
+            if (!TextUtils.isEmpty(result.addresses)) {
+                addresses = result.addresses.split("\\s+");
+            }
+            if (!TextUtils.isEmpty(result.dnses)) {
+                dnses = result.dnses.split("\\s+");
+            }
+            if (!TextUtils.isEmpty(result.gateways)) {
+                gateways = result.gateways.split("\\s+");
+            }
+            if (!TextUtils.isEmpty(result.pcscf)) {
+                pcscfs = result.pcscf.split("\\s+");
+            }
+            mtu = mtuV4 = mtuV6 = result.mtu;
+            if (addresses != null) {
+                for (String address : addresses) {
+                    laList.add(convertToLinkAddress(address));
+                }
+            }
+        } else if (dcResult instanceof android.hardware.radio.V1_4.SetupDataCallResult) {
+            final android.hardware.radio.V1_4.SetupDataCallResult result =
+                    (android.hardware.radio.V1_4.SetupDataCallResult) dcResult;
+            cause = result.cause;
+            suggestedRetryTime = result.suggestedRetryTime;
+            cid = result.cid;
+            active = result.active;
+            protocolType = result.type;
+            ifname = result.ifname;
+            addresses = result.addresses.toArray(new String[0]);
+            dnses = result.dnses.toArray(new String[0]);
+            gateways = result.gateways.toArray(new String[0]);
+            pcscfs = result.pcscf.toArray(new String[0]);
+            mtu = mtuV4 = mtuV6 = result.mtu;
+            if (addresses != null) {
+                for (String address : addresses) {
+                    laList.add(convertToLinkAddress(address));
+                }
+            }
+        } else if (dcResult instanceof android.hardware.radio.V1_5.SetupDataCallResult) {
+            final android.hardware.radio.V1_5.SetupDataCallResult result =
+                    (android.hardware.radio.V1_5.SetupDataCallResult) dcResult;
+            cause = result.cause;
+            suggestedRetryTime = result.suggestedRetryTime;
+            cid = result.cid;
+            active = result.active;
+            protocolType = result.type;
+            ifname = result.ifname;
+            laList = result.addresses.stream().map(la -> convertToLinkAddress(
+                    la.address, la.properties, la.deprecationTime, la.expirationTime))
+                    .collect(Collectors.toList());
+            dnses = result.dnses.toArray(new String[0]);
+            gateways = result.gateways.toArray(new String[0]);
+            pcscfs = result.pcscf.toArray(new String[0]);
+            mtu = Math.max(result.mtuV4, result.mtuV6);
+            mtuV4 = result.mtuV4;
+            mtuV6 = result.mtuV6;
+        } else if (dcResult instanceof android.hardware.radio.V1_6.SetupDataCallResult) {
+            final android.hardware.radio.V1_6.SetupDataCallResult result =
+                    (android.hardware.radio.V1_6.SetupDataCallResult) dcResult;
+            cause = result.cause;
+            suggestedRetryTime = result.suggestedRetryTime;
+            cid = result.cid;
+            active = result.active;
+            protocolType = result.type;
+            ifname = result.ifname;
+            laList = result.addresses.stream().map(la -> convertToLinkAddress(
+                    la.address, la.properties, la.deprecationTime, la.expirationTime))
+                    .collect(Collectors.toList());
+            dnses = result.dnses.toArray(new String[0]);
+            gateways = result.gateways.toArray(new String[0]);
+            pcscfs = result.pcscf.toArray(new String[0]);
+            mtu = Math.max(result.mtuV4, result.mtuV6);
+            mtuV4 = result.mtuV4;
+            mtuV6 = result.mtuV6;
+            handoverFailureMode = result.handoverFailureMode;
+            pduSessionId = result.pduSessionId;
+            defaultQos = convertHalQos(result.defaultQos);
+            qosSessions = result.qosSessions.stream().map(RILUtils::convertHalQosBearerSession)
+                    .collect(Collectors.toList());
+            sliceInfo = result.sliceInfo.getDiscriminator()
+                    == android.hardware.radio.V1_6.OptionalSliceInfo.hidl_discriminator.noinit
+                    ? null : convertHalSliceInfo(result.sliceInfo.value());
+            trafficDescriptors = result.trafficDescriptors.stream().map(
+                    RILUtils::convertHalTrafficDescriptor).collect(Collectors.toList());
+        } else {
+            Rlog.e(LOG_TAG, "Unsupported SetupDataCallResult " + dcResult);
+            return null;
+        }
+
+        // Process dns
+        List<InetAddress> dnsList = new ArrayList<>();
+        if (dnses != null) {
+            for (String dns : dnses) {
+                dns = dns.trim();
+                InetAddress ia;
+                try {
+                    ia = InetAddresses.parseNumericAddress(dns);
+                    dnsList.add(ia);
+                } catch (IllegalArgumentException e) {
+                    Rlog.e(LOG_TAG, "Unknown dns: " + dns, e);
+                }
+            }
+        }
+
+        // Process gateway
+        List<InetAddress> gatewayList = new ArrayList<>();
+        if (gateways != null) {
+            for (String gateway : gateways) {
+                gateway = gateway.trim();
+                InetAddress ia;
+                try {
+                    ia = InetAddresses.parseNumericAddress(gateway);
+                    gatewayList.add(ia);
+                } catch (IllegalArgumentException e) {
+                    Rlog.e(LOG_TAG, "Unknown gateway: " + gateway, e);
+                }
+            }
+        }
+
+        // Process gateway
+        List<InetAddress> pcscfList = new ArrayList<>();
+        if (pcscfs != null) {
+            for (String pcscf : pcscfs) {
+                pcscf = pcscf.trim();
+                InetAddress ia;
+                try {
+                    ia = InetAddresses.parseNumericAddress(pcscf);
+                    pcscfList.add(ia);
+                } catch (IllegalArgumentException e) {
+                    Rlog.e(LOG_TAG, "Unknown pcscf: " + pcscf, e);
+                }
+            }
+        }
+
+        return new DataCallResponse.Builder()
+                .setCause(cause)
+                .setRetryDurationMillis(suggestedRetryTime)
+                .setId(cid)
+                .setLinkStatus(active)
+                .setProtocolType(protocolType)
+                .setInterfaceName(ifname)
+                .setAddresses(laList)
+                .setDnsAddresses(dnsList)
+                .setGatewayAddresses(gatewayList)
+                .setPcscfAddresses(pcscfList)
+                .setMtu(mtu)
+                .setMtuV4(mtuV4)
+                .setMtuV6(mtuV6)
+                .setHandoverFailureMode(handoverFailureMode)
+                .setPduSessionId(pduSessionId)
+                .setDefaultQos(defaultQos)
+                .setQosBearerSessions(qosSessions)
+                .setSliceInfo(sliceInfo)
+                .setTrafficDescriptors(trafficDescriptors)
+                .build();
+    }
+
+    /**
+     * Convert SetupDataCallResult defined in SetupDataCallResult.aidl into DataCallResponse
+     * @param result SetupDataCallResult defined in SetupDataCallResult.aidl
+     * @return The converted DataCallResponse
+     */
+    @VisibleForTesting
+    public static DataCallResponse convertHalDataCallResult(
+            android.hardware.radio.data.SetupDataCallResult result) {
+        if (result == null) return null;
+        List<LinkAddress> laList = new ArrayList<>();
+        for (android.hardware.radio.data.LinkAddress la : result.addresses) {
+            laList.add(convertToLinkAddress(la.address, la.addressProperties,
+                    la.deprecationTime, la.expirationTime));
+        }
+        List<InetAddress> dnsList = new ArrayList<>();
+        if (result.dnses != null) {
+            for (String dns : result.dnses) {
+                dns = dns.trim();
+                InetAddress ia;
+                try {
+                    ia = InetAddresses.parseNumericAddress(dns);
+                    dnsList.add(ia);
+                } catch (IllegalArgumentException e) {
+                    Rlog.e(LOG_TAG, "Unknown dns: " + dns, e);
+                }
+            }
+        }
+        List<InetAddress> gatewayList = new ArrayList<>();
+        if (result.gateways != null) {
+            for (String gateway : result.gateways) {
+                gateway = gateway.trim();
+                InetAddress ia;
+                try {
+                    ia = InetAddresses.parseNumericAddress(gateway);
+                    gatewayList.add(ia);
+                } catch (IllegalArgumentException e) {
+                    Rlog.e(LOG_TAG, "Unknown gateway: " + gateway, e);
+                }
+            }
+        }
+        List<InetAddress> pcscfList = new ArrayList<>();
+        if (result.pcscf != null) {
+            for (String pcscf : result.pcscf) {
+                pcscf = pcscf.trim();
+                InetAddress ia;
+                try {
+                    ia = InetAddresses.parseNumericAddress(pcscf);
+                    pcscfList.add(ia);
+                } catch (IllegalArgumentException e) {
+                    Rlog.e(LOG_TAG, "Unknown pcscf: " + pcscf, e);
+                }
+            }
+        }
+        List<QosBearerSession> qosSessions = new ArrayList<>();
+        for (android.hardware.radio.data.QosSession session : result.qosSessions) {
+            qosSessions.add(convertHalQosBearerSession(session));
+        }
+        List<TrafficDescriptor> trafficDescriptors = new ArrayList<>();
+        for (android.hardware.radio.data.TrafficDescriptor td : result.trafficDescriptors) {
+            trafficDescriptors.add(convertHalTrafficDescriptor(td));
+        }
+
+        return new DataCallResponse.Builder()
+                .setCause(result.cause)
+                .setRetryDurationMillis(result.suggestedRetryTime)
+                .setId(result.cid)
+                .setLinkStatus(result.active)
+                .setProtocolType(result.type)
+                .setInterfaceName(result.ifname)
+                .setAddresses(laList)
+                .setDnsAddresses(dnsList)
+                .setGatewayAddresses(gatewayList)
+                .setPcscfAddresses(pcscfList)
+                .setMtu(Math.max(result.mtuV4, result.mtuV6))
+                .setMtuV4(result.mtuV4)
+                .setMtuV6(result.mtuV6)
+                .setHandoverFailureMode(result.handoverFailureMode)
+                .setPduSessionId(result.pduSessionId)
+                .setDefaultQos(convertHalQos(result.defaultQos))
+                .setQosBearerSessions(qosSessions)
+                .setSliceInfo(convertHalSliceInfo(result.sliceInfo))
+                .setTrafficDescriptors(trafficDescriptors)
+                .build();
+    }
+
+    private static NetworkSliceInfo convertHalSliceInfo(android.hardware.radio.V1_6.SliceInfo si) {
+        NetworkSliceInfo.Builder builder = new NetworkSliceInfo.Builder()
+                .setSliceServiceType(si.sst)
+                .setMappedHplmnSliceServiceType(si.mappedHplmnSst);
+        if (si.sliceDifferentiator != NetworkSliceInfo.SLICE_DIFFERENTIATOR_NO_SLICE) {
+            builder.setSliceDifferentiator(si.sliceDifferentiator)
+                    .setMappedHplmnSliceDifferentiator(si.mappedHplmnSD);
+        }
+        return builder.build();
+    }
+
+    private static NetworkSliceInfo convertHalSliceInfo(android.hardware.radio.data.SliceInfo si) {
+        NetworkSliceInfo.Builder builder = new NetworkSliceInfo.Builder()
+                .setSliceServiceType(si.sliceServiceType)
+                .setMappedHplmnSliceServiceType(si.mappedHplmnSst);
+        if (si.sliceDifferentiator != NetworkSliceInfo.SLICE_DIFFERENTIATOR_NO_SLICE) {
+            builder.setSliceDifferentiator(si.sliceDifferentiator)
+                    .setMappedHplmnSliceDifferentiator(si.mappedHplmnSD);
+        }
+        return builder.build();
+    }
+
+    private static TrafficDescriptor convertHalTrafficDescriptor(
+            android.hardware.radio.V1_6.TrafficDescriptor td) {
+        String dnn = td.dnn.getDiscriminator()
+                == android.hardware.radio.V1_6.OptionalDnn.hidl_discriminator.noinit
+                ? null : td.dnn.value();
+        String osAppId = td.osAppId.getDiscriminator()
+                == android.hardware.radio.V1_6.OptionalOsAppId.hidl_discriminator.noinit
+                ? null : new String(arrayListToPrimitiveArray(td.osAppId.value().osAppId));
+        TrafficDescriptor.Builder builder = new TrafficDescriptor.Builder();
+        if (dnn != null) {
+            builder.setDataNetworkName(dnn);
+        }
+        if (osAppId != null) {
+            builder.setOsAppId(osAppId);
+        }
+        return builder.build();
+    }
+
+    private static TrafficDescriptor convertHalTrafficDescriptor(
+            android.hardware.radio.data.TrafficDescriptor td) {
+        String dnn = td.dnn;
+        String osAppId = td.osAppId == null ? null : new String(td.osAppId.osAppId);
+        TrafficDescriptor.Builder builder = new TrafficDescriptor.Builder();
+        if (dnn != null) {
+            builder.setDataNetworkName(dnn);
+        }
+        if (osAppId != null) {
+            builder.setOsAppId(osAppId);
+        }
+        return builder.build();
+    }
+
+    /**
+     * Convert SlicingConfig defined in radio/1.6/types.hal to SlicingConfig
+     * @param sc SlicingConfig defined in radio/1.6/types.hal
+     * @return The converted SlicingConfig
+     */
+    public static SlicingConfig convertHalSlicingConfig(
+            android.hardware.radio.V1_6.SlicingConfig sc) {
+        List<UrspRule> urspRules = sc.urspRules.stream().map(ur -> new UrspRule(ur.precedence,
+                ur.trafficDescriptors.stream().map(RILUtils::convertHalTrafficDescriptor)
+                        .collect(Collectors.toList()),
+                ur.routeSelectionDescriptor.stream().map(rsd -> new RouteSelectionDescriptor(
+                        rsd.precedence, rsd.sessionType.value(), rsd.sscMode.value(),
+                        rsd.sliceInfo.stream().map(RILUtils::convertHalSliceInfo)
+                                .collect(Collectors.toList()),
+                        rsd.dnn)).collect(Collectors.toList())))
+                .collect(Collectors.toList());
+        return new SlicingConfig(urspRules, sc.sliceInfo.stream().map(RILUtils::convertHalSliceInfo)
+                .collect(Collectors.toList()));
+    }
+
+    /**
+     * Convert SlicingConfig defined in SlicingConfig.aidl to SlicingConfig
+     * @param sc SlicingConfig defined in SlicingConfig.aidl
+     * @return The converted SlicingConfig
+     */
+    public static SlicingConfig convertHalSlicingConfig(
+            android.hardware.radio.data.SlicingConfig sc) {
+        List<UrspRule> urspRules = new ArrayList<>();
+        for (android.hardware.radio.data.UrspRule ur : sc.urspRules) {
+            List<TrafficDescriptor> tds = new ArrayList<>();
+            for (android.hardware.radio.data.TrafficDescriptor td : ur.trafficDescriptors) {
+                tds.add(convertHalTrafficDescriptor(td));
+            }
+            List<RouteSelectionDescriptor> rsds = new ArrayList<>();
+            for (android.hardware.radio.data.RouteSelectionDescriptor rsd
+                    : ur.routeSelectionDescriptor) {
+                List<NetworkSliceInfo> sliceInfo = new ArrayList<>();
+                for (android.hardware.radio.data.SliceInfo si : rsd.sliceInfo) {
+                    sliceInfo.add(convertHalSliceInfo(si));
+                }
+                rsds.add(new RouteSelectionDescriptor(rsd.precedence, rsd.sessionType, rsd.sscMode,
+                        sliceInfo, primitiveArrayToArrayList(rsd.dnn)));
+            }
+            urspRules.add(new UrspRule(ur.precedence, tds, rsds));
+        }
+        List<NetworkSliceInfo> sliceInfo = new ArrayList<>();
+        for (android.hardware.radio.data.SliceInfo si : sc.sliceInfo) {
+            sliceInfo.add(convertHalSliceInfo(si));
+        }
+        return new SlicingConfig(urspRules, sliceInfo);
+    }
+
+    private static Qos.QosBandwidth convertHalQosBandwidth(
+            android.hardware.radio.V1_6.QosBandwidth bandwidth) {
+        return new Qos.QosBandwidth(bandwidth.maxBitrateKbps, bandwidth.guaranteedBitrateKbps);
+    }
+
+    private static Qos.QosBandwidth convertHalQosBandwidth(
+            android.hardware.radio.data.QosBandwidth bandwidth) {
+        return new Qos.QosBandwidth(bandwidth.maxBitrateKbps, bandwidth.guaranteedBitrateKbps);
+    }
+
+    private static Qos convertHalQos(android.hardware.radio.V1_6.Qos qos) {
+        switch (qos.getDiscriminator()) {
+            case android.hardware.radio.V1_6.Qos.hidl_discriminator.eps:
+                android.hardware.radio.V1_6.EpsQos eps = qos.eps();
+                return new EpsQos(convertHalQosBandwidth(eps.downlink),
+                        convertHalQosBandwidth(eps.uplink), eps.qci);
+            case android.hardware.radio.V1_6.Qos.hidl_discriminator.nr:
+                android.hardware.radio.V1_6.NrQos nr = qos.nr();
+                return new NrQos(convertHalQosBandwidth(nr.downlink),
+                        convertHalQosBandwidth(nr.uplink), nr.qfi, nr.fiveQi, nr.averagingWindowMs);
+            default:
+                return null;
+        }
+    }
+
+    private static Qos convertHalQos(android.hardware.radio.data.Qos qos) {
+        switch (qos.getTag()) {
+            case android.hardware.radio.data.Qos.eps:
+                android.hardware.radio.data.EpsQos eps = qos.getEps();
+                return new EpsQos(convertHalQosBandwidth(eps.downlink),
+                        convertHalQosBandwidth(eps.uplink), eps.qci);
+            case android.hardware.radio.data.Qos.nr:
+                android.hardware.radio.data.NrQos nr = qos.getNr();
+                return new NrQos(convertHalQosBandwidth(nr.downlink),
+                        convertHalQosBandwidth(nr.uplink), nr.qfi, nr.fiveQi,
+                        nr.averagingWindowMs);
+            default:
+                return null;
+        }
+    }
+
+    private static QosBearerFilter convertHalQosBearerFilter(
+            android.hardware.radio.V1_6.QosFilter qosFilter) {
+        List<LinkAddress> localAddressList = new ArrayList<>();
+        String[] localAddresses = qosFilter.localAddresses.toArray(new String[0]);
+        if (localAddresses != null) {
+            for (String address : localAddresses) {
+                localAddressList.add(convertToLinkAddress(address));
+            }
+        }
+        List<LinkAddress> remoteAddressList = new ArrayList<>();
+        String[] remoteAddresses = qosFilter.remoteAddresses.toArray(new String[0]);
+        if (remoteAddresses != null) {
+            for (String address : remoteAddresses) {
+                remoteAddressList.add(convertToLinkAddress(address));
+            }
+        }
+        QosBearerFilter.PortRange localPort = null;
+        if (qosFilter.localPort != null) {
+            if (qosFilter.localPort.getDiscriminator()
+                    == android.hardware.radio.V1_6.MaybePort.hidl_discriminator.range) {
+                final android.hardware.radio.V1_6.PortRange portRange = qosFilter.localPort.range();
+                localPort = new QosBearerFilter.PortRange(portRange.start, portRange.end);
+            }
+        }
+        QosBearerFilter.PortRange remotePort = null;
+        if (qosFilter.remotePort != null) {
+            if (qosFilter.remotePort.getDiscriminator()
+                    == android.hardware.radio.V1_6.MaybePort.hidl_discriminator.range) {
+                final android.hardware.radio.V1_6.PortRange portRange =
+                        qosFilter.remotePort.range();
+                remotePort = new QosBearerFilter.PortRange(portRange.start, portRange.end);
+            }
+        }
+        int tos = -1;
+        if (qosFilter.tos != null) {
+            if (qosFilter.tos.getDiscriminator() == android.hardware.radio.V1_6.QosFilter
+                    .TypeOfService.hidl_discriminator.value) {
+                tos = qosFilter.tos.value();
+            }
+        }
+        long flowLabel = -1;
+        if (qosFilter.flowLabel != null) {
+            if (qosFilter.flowLabel.getDiscriminator() == android.hardware.radio.V1_6.QosFilter
+                    .Ipv6FlowLabel.hidl_discriminator.value) {
+                flowLabel = qosFilter.flowLabel.value();
+            }
+        }
+        long spi = -1;
+        if (qosFilter.spi != null) {
+            if (qosFilter.spi.getDiscriminator()
+                    == android.hardware.radio.V1_6.QosFilter.IpsecSpi.hidl_discriminator.value) {
+                spi = qosFilter.spi.value();
+            }
+        }
+        return new QosBearerFilter(localAddressList, remoteAddressList, localPort, remotePort,
+                qosFilter.protocol, tos, flowLabel, spi, qosFilter.direction, qosFilter.precedence);
+    }
+
+    private static QosBearerFilter convertHalQosBearerFilter(
+            android.hardware.radio.data.QosFilter qosFilter) {
+        List<LinkAddress> localAddressList = new ArrayList<>();
+        String[] localAddresses = qosFilter.localAddresses;
+        if (localAddresses != null) {
+            for (String address : localAddresses) {
+                localAddressList.add(convertToLinkAddress(address));
+            }
+        }
+        List<LinkAddress> remoteAddressList = new ArrayList<>();
+        String[] remoteAddresses = qosFilter.remoteAddresses;
+        if (remoteAddresses != null) {
+            for (String address : remoteAddresses) {
+                remoteAddressList.add(convertToLinkAddress(address));
+            }
+        }
+        QosBearerFilter.PortRange localPort = null;
+        if (qosFilter.localPort != null) {
+            localPort = new QosBearerFilter.PortRange(
+                    qosFilter.localPort.start, qosFilter.localPort.end);
+        }
+        QosBearerFilter.PortRange remotePort = null;
+        if (qosFilter.remotePort != null) {
+            remotePort = new QosBearerFilter.PortRange(
+                    qosFilter.remotePort.start, qosFilter.remotePort.end);
+        }
+        int tos = -1;
+        if (qosFilter.tos != null) {
+            if (qosFilter.tos.getTag()
+                    == android.hardware.radio.data.QosFilterTypeOfService.value) {
+                tos = qosFilter.tos.value;
+            }
+        }
+        long flowLabel = -1;
+        if (qosFilter.flowLabel != null) {
+            if (qosFilter.flowLabel.getTag()
+                    == android.hardware.radio.data.QosFilterIpv6FlowLabel.value) {
+                flowLabel = qosFilter.flowLabel.value;
+            }
+        }
+        long spi = -1;
+        if (qosFilter.spi != null) {
+            if (qosFilter.spi.getTag()
+                    == android.hardware.radio.data.QosFilterIpsecSpi.value) {
+                spi = qosFilter.spi.value;
+            }
+        }
+        return new QosBearerFilter(localAddressList, remoteAddressList, localPort, remotePort,
+                qosFilter.protocol, tos, flowLabel, spi, qosFilter.direction, qosFilter.precedence);
+    }
+
+    private static QosBearerSession convertHalQosBearerSession(
+            android.hardware.radio.V1_6.QosSession qosSession) {
+        List<QosBearerFilter> qosBearerFilters = new ArrayList<>();
+        if (qosSession.qosFilters != null) {
+            for (android.hardware.radio.V1_6.QosFilter filter : qosSession.qosFilters) {
+                qosBearerFilters.add(convertHalQosBearerFilter(filter));
+            }
+        }
+        return new QosBearerSession(qosSession.qosSessionId, convertHalQos(qosSession.qos),
+                qosBearerFilters);
+    }
+
+    private static QosBearerSession convertHalQosBearerSession(
+            android.hardware.radio.data.QosSession qosSession) {
+        List<QosBearerFilter> qosBearerFilters = new ArrayList<>();
+        if (qosSession.qosFilters != null) {
+            for (android.hardware.radio.data.QosFilter filter : qosSession.qosFilters) {
+                qosBearerFilters.add(convertHalQosBearerFilter(filter));
+            }
+        }
+        return new QosBearerSession(qosSession.qosSessionId, convertHalQos(qosSession.qos),
+                qosBearerFilters);
+    }
+
+    /**
+     * Convert a list of SetupDataCallResult defined in radio/1.0, 1.4, 1.5, 1.6/types.hal into
+     * a list of DataCallResponse
+     * @param dataCallResultList List of SetupDataCallResult defined in
+     *        radio/1.0, 1.4, 1.5, 1.6/types.hal
+     * @return The converted list of DataCallResponses
+     */
+    @VisibleForTesting
+    public static ArrayList<DataCallResponse> convertHalDataCallResultList(
+            List<? extends Object> dataCallResultList) {
+        ArrayList<DataCallResponse> response = new ArrayList<>(dataCallResultList.size());
+
+        for (Object obj : dataCallResultList) {
+            response.add(convertHalDataCallResult(obj));
+        }
+        return response;
+    }
+
+    /**
+     * Convert a list of SetupDataCallResult defined in SetupDataCallResult.aidl into a list of
+     * DataCallResponse
+     * @param dataCallResultList Array of SetupDataCallResult defined in SetupDataCallResult.aidl
+     * @return The converted list of DataCallResponses
+     */
+    @VisibleForTesting
+    public static ArrayList<DataCallResponse> convertHalDataCallResultList(
+            android.hardware.radio.data.SetupDataCallResult[] dataCallResultList) {
+        ArrayList<DataCallResponse> response = new ArrayList<>(dataCallResultList.length);
+
+        for (android.hardware.radio.data.SetupDataCallResult result : dataCallResultList) {
+            response.add(convertHalDataCallResult(result));
+        }
+        return response;
+    }
+
+    /**
+     * Convert KeepaliveStatusCode defined in radio/1.1/types.hal and KeepaliveStatus.aidl
+     * to KeepaliveStatus
+     * @param halCode KeepaliveStatus code defined in radio/1.1/types.hal or KeepaliveStatus.aidl
+     * @return The converted KeepaliveStatus
+     */
+    public static int convertHalKeepaliveStatusCode(int halCode) {
+        switch (halCode) {
+            case android.hardware.radio.V1_1.KeepaliveStatusCode.ACTIVE:
+                return KeepaliveStatus.STATUS_ACTIVE;
+            case android.hardware.radio.V1_1.KeepaliveStatusCode.INACTIVE:
+                return KeepaliveStatus.STATUS_INACTIVE;
+            case android.hardware.radio.V1_1.KeepaliveStatusCode.PENDING:
+                return KeepaliveStatus.STATUS_PENDING;
+            default:
+                return -1;
+        }
+    }
+
+    /**
+     * Convert RadioState defined in radio/1.0/types.hal to RadioPowerState
+     * @param stateInt Radio state defined in radio/1.0/types.hal
+     * @return The converted {@link Annotation.RadioPowerState RadioPowerState}
+     */
+    public static @Annotation.RadioPowerState int convertHalRadioState(int stateInt) {
+        int state;
+        switch(stateInt) {
+            case android.hardware.radio.V1_0.RadioState.OFF:
+                state = TelephonyManager.RADIO_POWER_OFF;
+                break;
+            case android.hardware.radio.V1_0.RadioState.UNAVAILABLE:
+                state = TelephonyManager.RADIO_POWER_UNAVAILABLE;
+                break;
+            case android.hardware.radio.V1_0.RadioState.ON:
+                state = TelephonyManager.RADIO_POWER_ON;
+                break;
+            default:
+                throw new RuntimeException("Unrecognized RadioState: " + stateInt);
+        }
+        return state;
+    }
+
+    /**
+     * Convert CellConnectionStatus defined in radio/1.2/types.hal to ConnectionStatus
+     * @param status Cell connection status defined in radio/1.2/types.hal
+     * @return The converted ConnectionStatus
+     */
+    public static int convertHalCellConnectionStatus(int status) {
+        switch (status) {
+            case android.hardware.radio.V1_2.CellConnectionStatus.PRIMARY_SERVING:
+                return PhysicalChannelConfig.CONNECTION_PRIMARY_SERVING;
+            case android.hardware.radio.V1_2.CellConnectionStatus.SECONDARY_SERVING:
+                return PhysicalChannelConfig.CONNECTION_SECONDARY_SERVING;
+            default:
+                return PhysicalChannelConfig.CONNECTION_UNKNOWN;
+        }
+    }
+
+    /**
+     * Convert Call defined in radio/1.0, 1.2, 1.6/types.hal to DriverCall
+     * @param halCall Call defined in radio/1.0, 1.2, 1.6/types.hal
+     * @return The converted DriverCall
+     */
+    public static DriverCall convertToDriverCall(Object halCall) {
+        DriverCall dc = new DriverCall();
+        final android.hardware.radio.V1_6.Call call16;
+        final android.hardware.radio.V1_2.Call call12;
+        final android.hardware.radio.V1_0.Call call10;
+        if (halCall instanceof android.hardware.radio.V1_6.Call) {
+            call16 = (android.hardware.radio.V1_6.Call) halCall;
+            call12 = call16.base;
+            call10 = call12.base;
+        } else if (halCall instanceof android.hardware.radio.V1_2.Call) {
+            call16 = null;
+            call12 = (android.hardware.radio.V1_2.Call) halCall;
+            call10 = call12.base;
+        } else if (halCall instanceof android.hardware.radio.V1_0.Call) {
+            call16 = null;
+            call12 = null;
+            call10 = (android.hardware.radio.V1_0.Call) halCall;
+        } else {
+            call16 = null;
+            call12 = null;
+            call10 = null;
+        }
+        if (call10 != null) {
+            dc.state = DriverCall.stateFromCLCC((int) (call10.state));
+            dc.index = call10.index;
+            dc.TOA = call10.toa;
+            dc.isMpty = call10.isMpty;
+            dc.isMT = call10.isMT;
+            dc.als = call10.als;
+            dc.isVoice = call10.isVoice;
+            dc.isVoicePrivacy = call10.isVoicePrivacy;
+            dc.number = call10.number;
+            dc.numberPresentation = DriverCall.presentationFromCLIP(
+                    (int) (call10.numberPresentation));
+            dc.name = call10.name;
+            dc.namePresentation = DriverCall.presentationFromCLIP((int) (call10.namePresentation));
+            if (call10.uusInfo.size() == 1) {
+                dc.uusInfo = new UUSInfo();
+                dc.uusInfo.setType(call10.uusInfo.get(0).uusType);
+                dc.uusInfo.setDcs(call10.uusInfo.get(0).uusDcs);
+                if (!TextUtils.isEmpty(call10.uusInfo.get(0).uusData)) {
+                    byte[] userData = call10.uusInfo.get(0).uusData.getBytes();
+                    dc.uusInfo.setUserData(userData);
+                }
+            }
+            // Make sure there's a leading + on addresses with a TOA of 145
+            dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA);
+        }
+        if (call12 != null) {
+            dc.audioQuality = (int) (call12.audioQuality);
+        }
+        if (call16 != null) {
+            dc.forwardedNumber = call16.forwardedNumber;
+        }
+        return dc;
+    }
+
+    /**
+     * Convert OperatorStatus defined in radio/1.0/types.hal to OperatorInfo.State
+     * @param status Operator status defined in radio/1.0/types.hal
+     * @return The converted OperatorStatus as a String
+     */
+    public static String convertHalOperatorStatus(int status) {
+        if (status == android.hardware.radio.V1_0.OperatorStatus.UNKNOWN) {
+            return "unknown";
+        } else if (status == android.hardware.radio.V1_0.OperatorStatus.AVAILABLE) {
+            return "available";
+        } else if (status == android.hardware.radio.V1_0.OperatorStatus.CURRENT) {
+            return "current";
+        } else if (status == android.hardware.radio.V1_0.OperatorStatus.FORBIDDEN) {
+            return "forbidden";
+        } else {
+            return "";
+        }
+    }
+
+    /**
+     * Convert a list of Carriers defined in radio/1.0/types.hal to a list of CarrierIdentifiers
+     * @param carrierList List of Carriers defined in radio/1.0/types.hal
+     * @return The converted list of CarrierIdentifiers
+     */
+    public static List<CarrierIdentifier> convertHalCarrierList(
+            List<android.hardware.radio.V1_0.Carrier> carrierList) {
+        List<CarrierIdentifier> ret = new ArrayList<>();
+        for (int i = 0; i < carrierList.size(); i++) {
+            String mcc = carrierList.get(i).mcc;
+            String mnc = carrierList.get(i).mnc;
+            String spn = null, imsi = null, gid1 = null, gid2 = null;
+            int matchType = carrierList.get(i).matchType;
+            String matchData = carrierList.get(i).matchData;
+            if (matchType == CarrierIdentifier.MatchType.SPN) {
+                spn = matchData;
+            } else if (matchType == CarrierIdentifier.MatchType.IMSI_PREFIX) {
+                imsi = matchData;
+            } else if (matchType == CarrierIdentifier.MatchType.GID1) {
+                gid1 = matchData;
+            } else if (matchType == CarrierIdentifier.MatchType.GID2) {
+                gid2 = matchData;
+            }
+            ret.add(new CarrierIdentifier(mcc, mnc, spn, imsi, gid1, gid2));
+        }
+        return ret;
+    }
+
+    /**
+     * Convert CardStatus defined in radio/1.0, 1.5/types.hal to IccCardStatus
+     * @param cardStatus CardStatus defined in radio/1.0, 1.5/types.hal
+     * @return The converted IccCardStatus
+     */
+    public static IccCardStatus convertHalCardStatus(Object cardStatus) {
+        final android.hardware.radio.V1_0.CardStatus cardStatus10;
+        final android.hardware.radio.V1_5.CardStatus cardStatus15;
+        if (cardStatus instanceof android.hardware.radio.V1_5.CardStatus) {
+            cardStatus15 = (android.hardware.radio.V1_5.CardStatus) cardStatus;
+            cardStatus10 = cardStatus15.base.base.base;
+        } else if (cardStatus instanceof android.hardware.radio.V1_0.CardStatus) {
+            cardStatus15 = null;
+            cardStatus10 = (android.hardware.radio.V1_0.CardStatus) cardStatus;
+        } else {
+            cardStatus15 = null;
+            cardStatus10 = null;
+        }
+
+        IccCardStatus iccCardStatus = new IccCardStatus();
+        if (cardStatus10 != null) {
+            iccCardStatus.setCardState(cardStatus10.cardState);
+            iccCardStatus.setUniversalPinState(cardStatus10.universalPinState);
+            iccCardStatus.mGsmUmtsSubscriptionAppIndex = cardStatus10.gsmUmtsSubscriptionAppIndex;
+            iccCardStatus.mCdmaSubscriptionAppIndex = cardStatus10.cdmaSubscriptionAppIndex;
+            iccCardStatus.mImsSubscriptionAppIndex = cardStatus10.imsSubscriptionAppIndex;
+            int numApplications = cardStatus10.applications.size();
+
+            // limit to maximum allowed applications
+            if (numApplications > com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS) {
+                numApplications = com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS;
+            }
+            iccCardStatus.mApplications = new IccCardApplicationStatus[numApplications];
+            for (int i = 0; i < numApplications; i++) {
+                android.hardware.radio.V1_0.AppStatus rilAppStatus =
+                        cardStatus10.applications.get(i);
+                IccCardApplicationStatus appStatus = new IccCardApplicationStatus();
+                appStatus.app_type = appStatus.AppTypeFromRILInt(rilAppStatus.appType);
+                appStatus.app_state = appStatus.AppStateFromRILInt(rilAppStatus.appState);
+                appStatus.perso_substate = appStatus.PersoSubstateFromRILInt(
+                        rilAppStatus.persoSubstate);
+                appStatus.aid = rilAppStatus.aidPtr;
+                appStatus.app_label = rilAppStatus.appLabelPtr;
+                appStatus.pin1_replaced = rilAppStatus.pin1Replaced;
+                appStatus.pin1 = appStatus.PinStateFromRILInt(rilAppStatus.pin1);
+                appStatus.pin2 = appStatus.PinStateFromRILInt(rilAppStatus.pin2);
+                iccCardStatus.mApplications[i] = appStatus;
+            }
+        }
+        if (cardStatus15 != null) {
+            iccCardStatus.physicalSlotIndex = cardStatus15.base.base.physicalSlotId;
+            iccCardStatus.atr = cardStatus15.base.base.atr;
+            iccCardStatus.iccid = cardStatus15.base.base.iccid;
+            iccCardStatus.eid = cardStatus15.base.eid;
+            int numApplications = cardStatus15.applications.size();
+
+            // limit to maximum allowed applications
+            if (numApplications > com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS) {
+                numApplications = com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS;
+            }
+            iccCardStatus.mApplications = new IccCardApplicationStatus[numApplications];
+            for (int i = 0; i < numApplications; i++) {
+                android.hardware.radio.V1_5.AppStatus rilAppStatus =
+                        cardStatus15.applications.get(i);
+                IccCardApplicationStatus appStatus = new IccCardApplicationStatus();
+                appStatus.app_type = appStatus.AppTypeFromRILInt(rilAppStatus.base.appType);
+                appStatus.app_state = appStatus.AppStateFromRILInt(rilAppStatus.base.appState);
+                appStatus.perso_substate = appStatus.PersoSubstateFromRILInt(
+                        rilAppStatus.persoSubstate);
+                appStatus.aid = rilAppStatus.base.aidPtr;
+                appStatus.app_label = rilAppStatus.base.appLabelPtr;
+                appStatus.pin1_replaced = rilAppStatus.base.pin1Replaced;
+                appStatus.pin1 = appStatus.PinStateFromRILInt(rilAppStatus.base.pin1);
+                appStatus.pin2 = appStatus.PinStateFromRILInt(rilAppStatus.base.pin2);
+                iccCardStatus.mApplications[i] = appStatus;
+            }
+        }
+        return iccCardStatus;
+    }
+
+    /** Append the data to the end of an ArrayList */
+    public static void appendPrimitiveArrayToArrayList(byte[] src, ArrayList<Byte> dst) {
+        for (byte b : src) {
+            dst.add(b);
+        }
+    }
+
+    /** Convert a primitive byte array to an ArrayList<Integer>. */
+    public static ArrayList<Byte> primitiveArrayToArrayList(byte[] arr) {
+        ArrayList<Byte> arrayList = new ArrayList<>(arr.length);
+        for (byte b : arr) {
+            arrayList.add(b);
+        }
+        return arrayList;
+    }
+
+    /** Convert a primitive int array to an ArrayList<Integer>. */
+    public static ArrayList<Integer> primitiveArrayToArrayList(int[] arr) {
+        ArrayList<Integer> arrayList = new ArrayList<>(arr.length);
+        for (int i : arr) {
+            arrayList.add(i);
+        }
+        return arrayList;
+    }
+
+    /** Convert a primitive String array to an ArrayList<String>. */
+    public static ArrayList<String> primitiveArrayToArrayList(String[] arr) {
+        return new ArrayList<>(Arrays.asList(arr));
+    }
+
+    /** Convert an ArrayList of Bytes to an exactly-sized primitive array */
+    public static byte[] arrayListToPrimitiveArray(ArrayList<Byte> bytes) {
+        byte[] ret = new byte[bytes.size()];
+        for (int i = 0; i < ret.length; i++) {
+            ret[i] = bytes.get(i);
+        }
+        return ret;
+    }
+
+    /** Convert null to an empty String */
+    public static String convertNullToEmptyString(String string) {
+        return string != null ? string : "";
+    }
+
+    /**
+     * RIL request to String
+     * @param request request
+     * @return The converted String request
+     */
+    public static String requestToString(int request) {
+        switch(request) {
+            case RIL_REQUEST_GET_SIM_STATUS:
+                return "GET_SIM_STATUS";
+            case RIL_REQUEST_ENTER_SIM_PIN:
+                return "ENTER_SIM_PIN";
+            case RIL_REQUEST_ENTER_SIM_PUK:
+                return "ENTER_SIM_PUK";
+            case RIL_REQUEST_ENTER_SIM_PIN2:
+                return "ENTER_SIM_PIN2";
+            case RIL_REQUEST_ENTER_SIM_PUK2:
+                return "ENTER_SIM_PUK2";
+            case RIL_REQUEST_CHANGE_SIM_PIN:
+                return "CHANGE_SIM_PIN";
+            case RIL_REQUEST_CHANGE_SIM_PIN2:
+                return "CHANGE_SIM_PIN2";
+            case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION:
+                return "ENTER_NETWORK_DEPERSONALIZATION";
+            case RIL_REQUEST_GET_CURRENT_CALLS:
+                return "GET_CURRENT_CALLS";
+            case RIL_REQUEST_DIAL:
+                return "DIAL";
+            case RIL_REQUEST_GET_IMSI:
+                return "GET_IMSI";
+            case RIL_REQUEST_HANGUP:
+                return "HANGUP";
+            case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND:
+                return "HANGUP_WAITING_OR_BACKGROUND";
+            case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND:
+                return "HANGUP_FOREGROUND_RESUME_BACKGROUND";
+            case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE:
+                return "REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
+            case RIL_REQUEST_CONFERENCE:
+                return "CONFERENCE";
+            case RIL_REQUEST_UDUB:
+                return "UDUB";
+            case RIL_REQUEST_LAST_CALL_FAIL_CAUSE:
+                return "LAST_CALL_FAIL_CAUSE";
+            case RIL_REQUEST_SIGNAL_STRENGTH:
+                return "SIGNAL_STRENGTH";
+            case RIL_REQUEST_VOICE_REGISTRATION_STATE:
+                return "VOICE_REGISTRATION_STATE";
+            case RIL_REQUEST_DATA_REGISTRATION_STATE:
+                return "DATA_REGISTRATION_STATE";
+            case RIL_REQUEST_OPERATOR:
+                return "OPERATOR";
+            case RIL_REQUEST_RADIO_POWER:
+                return "RADIO_POWER";
+            case RIL_REQUEST_DTMF:
+                return "DTMF";
+            case RIL_REQUEST_SEND_SMS:
+                return "SEND_SMS";
+            case RIL_REQUEST_SEND_SMS_EXPECT_MORE:
+                return "SEND_SMS_EXPECT_MORE";
+            case RIL_REQUEST_SETUP_DATA_CALL:
+                return "SETUP_DATA_CALL";
+            case RIL_REQUEST_SIM_IO:
+                return "SIM_IO";
+            case RIL_REQUEST_SEND_USSD:
+                return "SEND_USSD";
+            case RIL_REQUEST_CANCEL_USSD:
+                return "CANCEL_USSD";
+            case RIL_REQUEST_GET_CLIR:
+                return "GET_CLIR";
+            case RIL_REQUEST_SET_CLIR:
+                return "SET_CLIR";
+            case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS:
+                return "QUERY_CALL_FORWARD_STATUS";
+            case RIL_REQUEST_SET_CALL_FORWARD:
+                return "SET_CALL_FORWARD";
+            case RIL_REQUEST_QUERY_CALL_WAITING:
+                return "QUERY_CALL_WAITING";
+            case RIL_REQUEST_SET_CALL_WAITING:
+                return "SET_CALL_WAITING";
+            case RIL_REQUEST_SMS_ACKNOWLEDGE:
+                return "SMS_ACKNOWLEDGE";
+            case RIL_REQUEST_GET_IMEI:
+                return "GET_IMEI";
+            case RIL_REQUEST_GET_IMEISV:
+                return "GET_IMEISV";
+            case RIL_REQUEST_ANSWER:
+                return "ANSWER";
+            case RIL_REQUEST_DEACTIVATE_DATA_CALL:
+                return "DEACTIVATE_DATA_CALL";
+            case RIL_REQUEST_QUERY_FACILITY_LOCK:
+                return "QUERY_FACILITY_LOCK";
+            case RIL_REQUEST_SET_FACILITY_LOCK:
+                return "SET_FACILITY_LOCK";
+            case RIL_REQUEST_CHANGE_BARRING_PASSWORD:
+                return "CHANGE_BARRING_PASSWORD";
+            case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE:
+                return "QUERY_NETWORK_SELECTION_MODE";
+            case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC:
+                return "SET_NETWORK_SELECTION_AUTOMATIC";
+            case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL:
+                return "SET_NETWORK_SELECTION_MANUAL";
+            case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS :
+                return "QUERY_AVAILABLE_NETWORKS ";
+            case RIL_REQUEST_DTMF_START:
+                return "DTMF_START";
+            case RIL_REQUEST_DTMF_STOP:
+                return "DTMF_STOP";
+            case RIL_REQUEST_BASEBAND_VERSION:
+                return "BASEBAND_VERSION";
+            case RIL_REQUEST_SEPARATE_CONNECTION:
+                return "SEPARATE_CONNECTION";
+            case RIL_REQUEST_SET_MUTE:
+                return "SET_MUTE";
+            case RIL_REQUEST_GET_MUTE:
+                return "GET_MUTE";
+            case RIL_REQUEST_QUERY_CLIP:
+                return "QUERY_CLIP";
+            case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE:
+                return "LAST_DATA_CALL_FAIL_CAUSE";
+            case RIL_REQUEST_DATA_CALL_LIST:
+                return "DATA_CALL_LIST";
+            case RIL_REQUEST_RESET_RADIO:
+                return "RESET_RADIO";
+            case RIL_REQUEST_OEM_HOOK_RAW:
+                return "OEM_HOOK_RAW";
+            case RIL_REQUEST_OEM_HOOK_STRINGS:
+                return "OEM_HOOK_STRINGS";
+            case RIL_REQUEST_SCREEN_STATE:
+                return "SCREEN_STATE";
+            case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION:
+                return "SET_SUPP_SVC_NOTIFICATION";
+            case RIL_REQUEST_WRITE_SMS_TO_SIM:
+                return "WRITE_SMS_TO_SIM";
+            case RIL_REQUEST_DELETE_SMS_ON_SIM:
+                return "DELETE_SMS_ON_SIM";
+            case RIL_REQUEST_SET_BAND_MODE:
+                return "SET_BAND_MODE";
+            case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE:
+                return "QUERY_AVAILABLE_BAND_MODE";
+            case RIL_REQUEST_STK_GET_PROFILE:
+                return "STK_GET_PROFILE";
+            case RIL_REQUEST_STK_SET_PROFILE:
+                return "STK_SET_PROFILE";
+            case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND:
+                return "STK_SEND_ENVELOPE_COMMAND";
+            case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE:
+                return "STK_SEND_TERMINAL_RESPONSE";
+            case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM:
+                return "STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
+            case RIL_REQUEST_EXPLICIT_CALL_TRANSFER:
+                return "EXPLICIT_CALL_TRANSFER";
+            case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE:
+                return "SET_PREFERRED_NETWORK_TYPE";
+            case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE:
+                return "GET_PREFERRED_NETWORK_TYPE";
+            case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS:
+                return "GET_NEIGHBORING_CELL_IDS";
+            case RIL_REQUEST_SET_LOCATION_UPDATES:
+                return "SET_LOCATION_UPDATES";
+            case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE:
+                return "CDMA_SET_SUBSCRIPTION_SOURCE";
+            case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:
+                return "CDMA_SET_ROAMING_PREFERENCE";
+            case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:
+                return "CDMA_QUERY_ROAMING_PREFERENCE";
+            case RIL_REQUEST_SET_TTY_MODE:
+                return "SET_TTY_MODE";
+            case RIL_REQUEST_QUERY_TTY_MODE:
+                return "QUERY_TTY_MODE";
+            case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:
+                return "CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
+            case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:
+                return "CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
+            case RIL_REQUEST_CDMA_FLASH:
+                return "CDMA_FLASH";
+            case RIL_REQUEST_CDMA_BURST_DTMF:
+                return "CDMA_BURST_DTMF";
+            case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY:
+                return "CDMA_VALIDATE_AND_WRITE_AKEY";
+            case RIL_REQUEST_CDMA_SEND_SMS:
+                return "CDMA_SEND_SMS";
+            case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:
+                return "CDMA_SMS_ACKNOWLEDGE";
+            case RIL_REQUEST_GSM_GET_BROADCAST_CONFIG:
+                return "GSM_GET_BROADCAST_CONFIG";
+            case RIL_REQUEST_GSM_SET_BROADCAST_CONFIG:
+                return "GSM_SET_BROADCAST_CONFIG";
+            case RIL_REQUEST_GSM_BROADCAST_ACTIVATION:
+                return "GSM_BROADCAST_ACTIVATION";
+            case RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG:
+                return "CDMA_GET_BROADCAST_CONFIG";
+            case RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG:
+                return "CDMA_SET_BROADCAST_CONFIG";
+            case RIL_REQUEST_CDMA_BROADCAST_ACTIVATION:
+                return "CDMA_BROADCAST_ACTIVATION";
+            case RIL_REQUEST_CDMA_SUBSCRIPTION:
+                return "CDMA_SUBSCRIPTION";
+            case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM:
+                return "CDMA_WRITE_SMS_TO_RUIM";
+            case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM:
+                return "CDMA_DELETE_SMS_ON_RUIM";
+            case RIL_REQUEST_DEVICE_IDENTITY:
+                return "DEVICE_IDENTITY";
+            case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE:
+                return "EXIT_EMERGENCY_CALLBACK_MODE";
+            case RIL_REQUEST_GET_SMSC_ADDRESS:
+                return "GET_SMSC_ADDRESS";
+            case RIL_REQUEST_SET_SMSC_ADDRESS:
+                return "SET_SMSC_ADDRESS";
+            case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS:
+                return "REPORT_SMS_MEMORY_STATUS";
+            case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING:
+                return "REPORT_STK_SERVICE_IS_RUNNING";
+            case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE:
+                return "CDMA_GET_SUBSCRIPTION_SOURCE";
+            case RIL_REQUEST_ISIM_AUTHENTICATION:
+                return "ISIM_AUTHENTICATION";
+            case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU:
+                return "ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU";
+            case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS:
+                return "STK_SEND_ENVELOPE_WITH_STATUS";
+            case RIL_REQUEST_VOICE_RADIO_TECH:
+                return "VOICE_RADIO_TECH";
+            case RIL_REQUEST_GET_CELL_INFO_LIST:
+                return "GET_CELL_INFO_LIST";
+            case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE:
+                return "SET_CELL_INFO_LIST_RATE";
+            case RIL_REQUEST_SET_INITIAL_ATTACH_APN:
+                return "SET_INITIAL_ATTACH_APN";
+            case RIL_REQUEST_IMS_REGISTRATION_STATE:
+                return "IMS_REGISTRATION_STATE";
+            case RIL_REQUEST_IMS_SEND_SMS:
+                return "IMS_SEND_SMS";
+            case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC:
+                return "SIM_TRANSMIT_APDU_BASIC";
+            case RIL_REQUEST_SIM_OPEN_CHANNEL:
+                return "SIM_OPEN_CHANNEL";
+            case RIL_REQUEST_SIM_CLOSE_CHANNEL:
+                return "SIM_CLOSE_CHANNEL";
+            case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL:
+                return "SIM_TRANSMIT_APDU_CHANNEL";
+            case RIL_REQUEST_NV_READ_ITEM:
+                return "NV_READ_ITEM";
+            case RIL_REQUEST_NV_WRITE_ITEM:
+                return "NV_WRITE_ITEM";
+            case RIL_REQUEST_NV_WRITE_CDMA_PRL:
+                return "NV_WRITE_CDMA_PRL";
+            case RIL_REQUEST_NV_RESET_CONFIG:
+                return "NV_RESET_CONFIG";
+            case RIL_REQUEST_SET_UICC_SUBSCRIPTION:
+                return "SET_UICC_SUBSCRIPTION";
+            case RIL_REQUEST_ALLOW_DATA:
+                return "ALLOW_DATA";
+            case RIL_REQUEST_GET_HARDWARE_CONFIG:
+                return "GET_HARDWARE_CONFIG";
+            case RIL_REQUEST_SIM_AUTHENTICATION:
+                return "SIM_AUTHENTICATION";
+            case RIL_REQUEST_GET_DC_RT_INFO:
+                return "GET_DC_RT_INFO";
+            case RIL_REQUEST_SET_DC_RT_INFO_RATE:
+                return "SET_DC_RT_INFO_RATE";
+            case RIL_REQUEST_SET_DATA_PROFILE:
+                return "SET_DATA_PROFILE";
+            case RIL_REQUEST_SHUTDOWN:
+                return "SHUTDOWN";
+            case RIL_REQUEST_GET_RADIO_CAPABILITY:
+                return "GET_RADIO_CAPABILITY";
+            case RIL_REQUEST_SET_RADIO_CAPABILITY:
+                return "SET_RADIO_CAPABILITY";
+            case RIL_REQUEST_START_LCE:
+                return "START_LCE";
+            case RIL_REQUEST_STOP_LCE:
+                return "STOP_LCE";
+            case RIL_REQUEST_PULL_LCEDATA:
+                return "PULL_LCEDATA";
+            case RIL_REQUEST_GET_ACTIVITY_INFO:
+                return "GET_ACTIVITY_INFO";
+            case RIL_REQUEST_SET_ALLOWED_CARRIERS:
+                return "SET_ALLOWED_CARRIERS";
+            case RIL_REQUEST_GET_ALLOWED_CARRIERS:
+                return "GET_ALLOWED_CARRIERS";
+            case RIL_REQUEST_SEND_DEVICE_STATE:
+                return "SEND_DEVICE_STATE";
+            case RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER:
+                return "SET_UNSOLICITED_RESPONSE_FILTER";
+            case RIL_REQUEST_SET_SIM_CARD_POWER:
+                return "SET_SIM_CARD_POWER";
+            case RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION:
+                return "SET_CARRIER_INFO_IMSI_ENCRYPTION";
+            case RIL_REQUEST_START_NETWORK_SCAN:
+                return "START_NETWORK_SCAN";
+            case RIL_REQUEST_STOP_NETWORK_SCAN:
+                return "STOP_NETWORK_SCAN";
+            case RIL_REQUEST_START_KEEPALIVE:
+                return "START_KEEPALIVE";
+            case RIL_REQUEST_STOP_KEEPALIVE:
+                return "STOP_KEEPALIVE";
+            case RIL_REQUEST_ENABLE_MODEM:
+                return "ENABLE_MODEM";
+            case RIL_REQUEST_GET_MODEM_STATUS:
+                return "GET_MODEM_STATUS";
+            case RIL_REQUEST_CDMA_SEND_SMS_EXPECT_MORE:
+                return "CDMA_SEND_SMS_EXPECT_MORE";
+            case RIL_REQUEST_GET_SIM_PHONEBOOK_CAPACITY:
+                return "GET_SIM_PHONEBOOK_CAPACITY";
+            case RIL_REQUEST_GET_SIM_PHONEBOOK_RECORDS:
+                return "GET_SIM_PHONEBOOK_RECORDS";
+            case RIL_REQUEST_UPDATE_SIM_PHONEBOOK_RECORD:
+                return "UPDATE_SIM_PHONEBOOK_RECORD";
+            case RIL_REQUEST_GET_SLOT_STATUS:
+                return "GET_SLOT_STATUS";
+            case RIL_REQUEST_SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING:
+                return "SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING";
+            case RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA:
+                return "SET_SIGNAL_STRENGTH_REPORTING_CRITERIA";
+            case RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA:
+                return "SET_LINK_CAPACITY_REPORTING_CRITERIA";
+            case RIL_REQUEST_SET_PREFERRED_DATA_MODEM:
+                return "SET_PREFERRED_DATA_MODEM";
+            case RIL_REQUEST_EMERGENCY_DIAL:
+                return "EMERGENCY_DIAL";
+            case RIL_REQUEST_GET_PHONE_CAPABILITY:
+                return "GET_PHONE_CAPABILITY";
+            case RIL_REQUEST_SWITCH_DUAL_SIM_CONFIG:
+                return "SWITCH_DUAL_SIM_CONFIG";
+            case RIL_REQUEST_ENABLE_UICC_APPLICATIONS:
+                return "ENABLE_UICC_APPLICATIONS";
+            case RIL_REQUEST_GET_UICC_APPLICATIONS_ENABLEMENT:
+                return "GET_UICC_APPLICATIONS_ENABLEMENT";
+            case RIL_REQUEST_SET_SYSTEM_SELECTION_CHANNELS:
+                return "SET_SYSTEM_SELECTION_CHANNELS";
+            case RIL_REQUEST_GET_BARRING_INFO:
+                return "GET_BARRING_INFO";
+            case RIL_REQUEST_ENTER_SIM_DEPERSONALIZATION:
+                return "ENTER_SIM_DEPERSONALIZATION";
+            case RIL_REQUEST_ENABLE_NR_DUAL_CONNECTIVITY:
+                return "ENABLE_NR_DUAL_CONNECTIVITY";
+            case RIL_REQUEST_IS_NR_DUAL_CONNECTIVITY_ENABLED:
+                return "IS_NR_DUAL_CONNECTIVITY_ENABLED";
+            case RIL_REQUEST_ALLOCATE_PDU_SESSION_ID:
+                return "ALLOCATE_PDU_SESSION_ID";
+            case RIL_REQUEST_RELEASE_PDU_SESSION_ID:
+                return "RELEASE_PDU_SESSION_ID";
+            case RIL_REQUEST_START_HANDOVER:
+                return "START_HANDOVER";
+            case RIL_REQUEST_CANCEL_HANDOVER:
+                return "CANCEL_HANDOVER";
+            case RIL_REQUEST_GET_SYSTEM_SELECTION_CHANNELS:
+                return "GET_SYSTEM_SELECTION_CHANNELS";
+            case RIL_REQUEST_GET_HAL_DEVICE_CAPABILITIES:
+                return "GET_HAL_DEVICE_CAPABILITIES";
+            case RIL_REQUEST_SET_DATA_THROTTLING:
+                return "SET_DATA_THROTTLING";
+            case RIL_REQUEST_SET_ALLOWED_NETWORK_TYPES_BITMAP:
+                return "SET_ALLOWED_NETWORK_TYPES_BITMAP";
+            case RIL_REQUEST_GET_ALLOWED_NETWORK_TYPES_BITMAP:
+                return "GET_ALLOWED_NETWORK_TYPES_BITMAP";
+            case RIL_REQUEST_GET_SLICING_CONFIG:
+                return "GET_SLICING_CONFIG";
+            default: return "<unknown request>";
+        }
+    }
+
+    /**
+     * RIL response to String
+     * @param response response
+     * @return The converted String response
+     */
+    public static String responseToString(int response) {
+        switch(response) {
+            case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
+                return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
+            case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:
+                return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
+            case RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED:
+                return "UNSOL_RESPONSE_NETWORK_STATE_CHANGED";
+            case RIL_UNSOL_RESPONSE_NEW_SMS:
+                return "UNSOL_RESPONSE_NEW_SMS";
+            case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT:
+                return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
+            case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM:
+                return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
+            case RIL_UNSOL_ON_USSD:
+                return "UNSOL_ON_USSD";
+            case RIL_UNSOL_ON_USSD_REQUEST:
+                return "UNSOL_ON_USSD_REQUEST";
+            case RIL_UNSOL_NITZ_TIME_RECEIVED:
+                return "UNSOL_NITZ_TIME_RECEIVED";
+            case RIL_UNSOL_SIGNAL_STRENGTH:
+                return "UNSOL_SIGNAL_STRENGTH";
+            case RIL_UNSOL_DATA_CALL_LIST_CHANGED:
+                return "UNSOL_DATA_CALL_LIST_CHANGED";
+            case RIL_UNSOL_SUPP_SVC_NOTIFICATION:
+                return "UNSOL_SUPP_SVC_NOTIFICATION";
+            case RIL_UNSOL_STK_SESSION_END:
+                return "UNSOL_STK_SESSION_END";
+            case RIL_UNSOL_STK_PROACTIVE_COMMAND:
+                return "UNSOL_STK_PROACTIVE_COMMAND";
+            case RIL_UNSOL_STK_EVENT_NOTIFY:
+                return "UNSOL_STK_EVENT_NOTIFY";
+            case RIL_UNSOL_STK_CALL_SETUP:
+                return "UNSOL_STK_CALL_SETUP";
+            case RIL_UNSOL_SIM_SMS_STORAGE_FULL:
+                return "UNSOL_SIM_SMS_STORAGE_FULL";
+            case RIL_UNSOL_SIM_REFRESH:
+                return "UNSOL_SIM_REFRESH";
+            case RIL_UNSOL_CALL_RING:
+                return "UNSOL_CALL_RING";
+            case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED:
+                return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
+            case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS:
+                return "UNSOL_RESPONSE_CDMA_NEW_SMS";
+            case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS:
+                return "UNSOL_RESPONSE_NEW_BROADCAST_SMS";
+            case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL:
+                return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
+            case RIL_UNSOL_RESTRICTED_STATE_CHANGED:
+                return "UNSOL_RESTRICTED_STATE_CHANGED";
+            case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE:
+                return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
+            case RIL_UNSOL_CDMA_CALL_WAITING:
+                return "UNSOL_CDMA_CALL_WAITING";
+            case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS:
+                return "UNSOL_CDMA_OTA_PROVISION_STATUS";
+            case RIL_UNSOL_CDMA_INFO_REC:
+                return "UNSOL_CDMA_INFO_REC";
+            case RIL_UNSOL_OEM_HOOK_RAW:
+                return "UNSOL_OEM_HOOK_RAW";
+            case RIL_UNSOL_RINGBACK_TONE:
+                return "UNSOL_RINGBACK_TONE";
+            case RIL_UNSOL_RESEND_INCALL_MUTE:
+                return "UNSOL_RESEND_INCALL_MUTE";
+            case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED:
+                return "UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED";
+            case RIL_UNSOL_CDMA_PRL_CHANGED:
+                return "UNSOL_CDMA_PRL_CHANGED";
+            case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE:
+                return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE";
+            case RIL_UNSOL_RIL_CONNECTED:
+                return "UNSOL_RIL_CONNECTED";
+            case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED:
+                return "UNSOL_VOICE_RADIO_TECH_CHANGED";
+            case RIL_UNSOL_CELL_INFO_LIST:
+                return "UNSOL_CELL_INFO_LIST";
+            case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
+                return "UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED";
+            case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED:
+                return "UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED";
+            case RIL_UNSOL_SRVCC_STATE_NOTIFY:
+                return "UNSOL_SRVCC_STATE_NOTIFY";
+            case RIL_UNSOL_HARDWARE_CONFIG_CHANGED:
+                return "UNSOL_HARDWARE_CONFIG_CHANGED";
+            case RIL_UNSOL_DC_RT_INFO_CHANGED:
+                return "UNSOL_DC_RT_INFO_CHANGED";
+            case RIL_UNSOL_RADIO_CAPABILITY:
+                return "UNSOL_RADIO_CAPABILITY";
+            case RIL_UNSOL_ON_SS:
+                return "UNSOL_ON_SS";
+            case RIL_UNSOL_STK_CC_ALPHA_NOTIFY:
+                return "UNSOL_STK_CC_ALPHA_NOTIFY";
+            case RIL_UNSOL_LCEDATA_RECV:
+                return "UNSOL_LCE_INFO_RECV";
+            case RIL_UNSOL_PCO_DATA:
+                return "UNSOL_PCO_DATA";
+            case RIL_UNSOL_MODEM_RESTART:
+                return "UNSOL_MODEM_RESTART";
+            case RIL_UNSOL_CARRIER_INFO_IMSI_ENCRYPTION:
+                return "UNSOL_CARRIER_INFO_IMSI_ENCRYPTION";
+            case RIL_UNSOL_NETWORK_SCAN_RESULT:
+                return "UNSOL_NETWORK_SCAN_RESULT";
+            case RIL_UNSOL_KEEPALIVE_STATUS:
+                return "UNSOL_KEEPALIVE_STATUS";
+            case RIL_UNSOL_UNTHROTTLE_APN:
+                return "UNSOL_UNTHROTTLE_APN";
+            case RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_CHANGED:
+                return "UNSOL_RESPONSE_SIM_PHONEBOOK_CHANGED";
+            case RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_RECORDS_RECEIVED:
+                return "UNSOL_RESPONSE_SIM_PHONEBOOK_RECORDS_RECEIVED";
+            case RIL_UNSOL_ICC_SLOT_STATUS:
+                return "UNSOL_ICC_SLOT_STATUS";
+            case RIL_UNSOL_PHYSICAL_CHANNEL_CONFIG:
+                return "UNSOL_PHYSICAL_CHANNEL_CONFIG";
+            case RIL_UNSOL_EMERGENCY_NUMBER_LIST:
+                return "UNSOL_EMERGENCY_NUMBER_LIST";
+            case RIL_UNSOL_UICC_APPLICATIONS_ENABLEMENT_CHANGED:
+                return "UNSOL_UICC_APPLICATIONS_ENABLEMENT_CHANGED";
+            case RIL_UNSOL_REGISTRATION_FAILED:
+                return "UNSOL_REGISTRATION_FAILED";
+            case RIL_UNSOL_BARRING_INFO_CHANGED:
+                return "UNSOL_BARRING_INFO_CHANGED";
+            default:
+                return "<unknown response>";
+        }
+    }
+}
diff --git a/src/java/com/android/internal/telephony/RadioIndication.java b/src/java/com/android/internal/telephony/RadioIndication.java
index 0a3bdd4..c2f569c 100644
--- a/src/java/com/android/internal/telephony/RadioIndication.java
+++ b/src/java/com/android/internal/telephony/RadioIndication.java
@@ -21,6 +21,7 @@
 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_CALL_WAITING;
 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_INFO_REC;
 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_OTA_PROVISION_STATUS;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_PRL_CHANGED;
 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL;
 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED;
 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_CELL_INFO_LIST;
@@ -49,6 +50,8 @@
 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM;
 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT;
 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_CHANGED;
+import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_RECORDS_RECEIVED;
 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED;
 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESTRICTED_STATE_CHANGED;
 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RIL_CONNECTED;
@@ -67,9 +70,6 @@
 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED;
 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_UNTHROTTLE_APN;
 import static com.android.internal.telephony.RILConstants.RIL_UNSOL_VOICE_RADIO_TECH_CHANGED;
-import static com.android.internal.telephony.RILConstants.RIL_UNSOl_CDMA_PRL_CHANGED;
-import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_RECORDS_RECEIVED;
-import static com.android.internal.telephony.RILConstants.RIL_UNSOL_RESPONSE_SIM_PHONEBOOK_CHANGED;
 
 import android.hardware.radio.V1_0.CdmaCallWaiting;
 import android.hardware.radio.V1_0.CdmaInformationRecord;
@@ -86,14 +86,12 @@
 import android.hardware.radio.V1_0.SsInfoData;
 import android.hardware.radio.V1_0.StkCcUnsolSsResult;
 import android.hardware.radio.V1_0.SuppSvcNotification;
-import android.hardware.radio.V1_2.CellConnectionStatus;
 import android.hardware.radio.V1_6.IRadioIndication;
-import android.hardware.radio.V1_6.PhysicalChannelConfig.Band;
 import android.hardware.radio.V1_6.PhonebookRecordInfo;
+import android.hardware.radio.V1_6.PhysicalChannelConfig.Band;
 import android.os.AsyncResult;
 import android.os.RemoteException;
 import android.sysprop.TelephonyProperties;
-import android.telephony.Annotation.RadioPowerState;
 import android.telephony.AnomalyReporter;
 import android.telephony.BarringInfo;
 import android.telephony.CellIdentity;
@@ -105,7 +103,6 @@
 import android.telephony.ServiceState;
 import android.telephony.SignalStrength;
 import android.telephony.SmsMessage;
-import android.telephony.TelephonyManager;
 import android.telephony.data.DataCallResponse;
 import android.telephony.emergency.EmergencyNumber;
 import android.text.TextUtils;
@@ -116,9 +113,9 @@
 import com.android.internal.telephony.dataconnection.KeepaliveStatus;
 import com.android.internal.telephony.gsm.SsData;
 import com.android.internal.telephony.gsm.SuppServiceNotification;
-import com.android.internal.telephony.uicc.ReceivedPhonebookRecords;
 import com.android.internal.telephony.uicc.IccRefreshResponse;
 import com.android.internal.telephony.uicc.IccUtils;
+import com.android.internal.telephony.uicc.ReceivedPhonebookRecords;
 import com.android.internal.telephony.uicc.SimPhonebookRecord;
 
 import java.util.ArrayList;
@@ -140,7 +137,7 @@
     public void radioStateChanged(int indicationType, int radioState) {
         mRil.processIndication(indicationType);
 
-        int state = getRadioStateFromInt(radioState);
+        int state = RILUtils.convertHalRadioState(radioState);
         if (RIL.RILJ_LOGD) {
             mRil.unsljLogMore(RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, "radioStateChanged: " +
                     state);
@@ -172,7 +169,7 @@
     public void newSms(int indicationType, ArrayList<Byte> pdu) {
         mRil.processIndication(indicationType);
 
-        byte[] pduArray = RIL.arrayListToPrimitiveArray(pdu);
+        byte[] pduArray = RILUtils.arrayListToPrimitiveArray(pdu);
         if (RIL.RILJ_LOGD) mRil.unsljLog(RIL_UNSOL_RESPONSE_NEW_SMS);
 
         SmsMessageBase smsb = com.android.internal.telephony.gsm.SmsMessage.createFromPdu(pduArray);
@@ -185,7 +182,7 @@
     public void newSmsStatusReport(int indicationType, ArrayList<Byte> pdu) {
         mRil.processIndication(indicationType);
 
-        byte[] pduArray = RIL.arrayListToPrimitiveArray(pdu);
+        byte[] pduArray = RILUtils.arrayListToPrimitiveArray(pdu);
         if (RIL.RILJ_LOGD) mRil.unsljLog(RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT);
 
         if (mRil.mSmsStatusRegistrant != null) {
@@ -263,7 +260,7 @@
                                             android.hardware.radio.V1_2.LinkCapacityEstimate lce) {
         mRil.processIndication(indicationType);
 
-        List<LinkCapacityEstimate> response = RIL.convertHalLceData(lce, mRil);
+        List<LinkCapacityEstimate> response = RILUtils.convertHalLceData(lce);
 
         if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_LCEDATA_RECV, response);
 
@@ -279,7 +276,7 @@
             android.hardware.radio.V1_6.LinkCapacityEstimate lce) {
         mRil.processIndication(indicationType);
 
-        List<LinkCapacityEstimate> response = RIL.convertHalLceData(lce, mRil);
+        List<LinkCapacityEstimate> response = RILUtils.convertHalLceData(lce);
 
         if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_LCEDATA_RECV, response);
 
@@ -549,7 +546,7 @@
     public void newBroadcastSms(int indicationType, ArrayList<Byte> data) {
         mRil.processIndication(indicationType);
 
-        byte response[] = RIL.arrayListToPrimitiveArray(data);
+        byte[] response = RILUtils.arrayListToPrimitiveArray(data);
         if (RIL.RILJ_LOGD) {
             mRil.unsljLogvRet(RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS,
                     IccUtils.bytesToHexString(response));
@@ -754,7 +751,7 @@
         int response[] = new int[1];
         response[0] = version;
 
-        if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOl_CDMA_PRL_CHANGED, response);
+        if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_CDMA_PRL_CHANGED, response);
 
         mRil.mCdmaPrlChangedRegistrants.notifyRegistrants(
                 new AsyncResult (null, response, null));
@@ -795,61 +792,42 @@
 
     /** Get unsolicited message for cellInfoList */
     public void cellInfoList(int indicationType,
-                             ArrayList<android.hardware.radio.V1_0.CellInfo> records) {
+            ArrayList<android.hardware.radio.V1_0.CellInfo> records) {
         mRil.processIndication(indicationType);
-
-        ArrayList<CellInfo> response = RIL.convertHalCellInfoList(records);
-
-        if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_CELL_INFO_LIST, response);
-
-        mRil.mRilCellInfoListRegistrants.notifyRegistrants(new AsyncResult(null, response, null));
+        responseCellInfoList(records);
     }
 
     /** Get unsolicited message for cellInfoList using HAL V1_2 */
     public void cellInfoList_1_2(int indicationType,
-                                 ArrayList<android.hardware.radio.V1_2.CellInfo> records) {
+            ArrayList<android.hardware.radio.V1_2.CellInfo> records) {
         mRil.processIndication(indicationType);
-
-        ArrayList<CellInfo> response = RIL.convertHalCellInfoList_1_2(records);
-
-        if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_CELL_INFO_LIST, response);
-
-        mRil.mRilCellInfoListRegistrants.notifyRegistrants(new AsyncResult(null, response, null));
+        responseCellInfoList(records);
     }
 
     /** Get unsolicited message for cellInfoList using HAL V1_4 */
     public void cellInfoList_1_4(int indicationType,
-                                 ArrayList<android.hardware.radio.V1_4.CellInfo> records) {
+            ArrayList<android.hardware.radio.V1_4.CellInfo> records) {
         mRil.processIndication(indicationType);
-
-        ArrayList<CellInfo> response = RIL.convertHalCellInfoList_1_4(records);
-
-        if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_CELL_INFO_LIST, response);
-
-        mRil.mRilCellInfoListRegistrants.notifyRegistrants(new AsyncResult(null, response, null));
+        responseCellInfoList(records);
     }
 
     /** Get unsolicited message for cellInfoList using HAL V1_5 */
     public void cellInfoList_1_5(int indicationType,
             ArrayList<android.hardware.radio.V1_5.CellInfo> records) {
         mRil.processIndication(indicationType);
-
-        ArrayList<CellInfo> response = RIL.convertHalCellInfoList_1_5(records);
-
-        if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_CELL_INFO_LIST, response);
-
-        mRil.mRilCellInfoListRegistrants.notifyRegistrants(new AsyncResult(null, response, null));
+        responseCellInfoList(records);
     }
 
     /** Get unsolicited message for cellInfoList using HAL V1_5 */
     public void cellInfoList_1_6(int indicationType,
             ArrayList<android.hardware.radio.V1_6.CellInfo> records) {
         mRil.processIndication(indicationType);
+        responseCellInfoList(records);
+    }
 
-        ArrayList<CellInfo> response = RIL.convertHalCellInfoList_1_6(records);
-
+    private void responseCellInfoList(ArrayList<? extends Object> records) {
+        ArrayList<CellInfo> response = RILUtils.convertHalCellInfoList((ArrayList<Object>) records);
         if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_CELL_INFO_LIST, response);
-
         mRil.mRilCellInfoListRegistrants.notifyRegistrants(new AsyncResult(null, response, null));
     }
 
@@ -933,7 +911,7 @@
             ArrayList<android.hardware.radio.V1_0.HardwareConfig> configs) {
         mRil.processIndication(indicationType);
 
-        ArrayList<HardwareConfig> response = RIL.convertHalHwConfigList(configs, mRil);
+        ArrayList<HardwareConfig> response = RILUtils.convertHalHardwareConfigList(configs);
 
         if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_HARDWARE_CONFIG_CHANGED, response);
 
@@ -945,7 +923,7 @@
                                           android.hardware.radio.V1_0.RadioCapability rc) {
         mRil.processIndication(indicationType);
 
-        RadioCapability response = RIL.convertHalRadioCapability(rc, mRil);
+        RadioCapability response = RILUtils.convertHalRadioCapability(rc, mRil);
 
         if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_RADIO_CAPABILITY, response);
 
@@ -1014,7 +992,7 @@
     public void lceData(int indicationType, LceDataInfo lce) {
         mRil.processIndication(indicationType);
 
-        List<LinkCapacityEstimate> response = RIL.convertHalLceData(lce, mRil);
+        List<LinkCapacityEstimate> response = RILUtils.convertHalLceData(lce);
 
         if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_LCEDATA_RECV, response);
 
@@ -1029,7 +1007,7 @@
         PcoData response = new PcoData(pco.cid,
                 pco.bearerProto,
                 pco.pcoId,
-                RIL.arrayListToPrimitiveArray(pco.contents));
+                RILUtils.arrayListToPrimitiveArray(pco.contents));
 
         if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_PCO_DATA, response);
 
@@ -1184,30 +1162,6 @@
     }
 
     /**
-     * @param stateInt
-     * @return {@link RadioPowerState RadioPowerState}
-     */
-    private @RadioPowerState int getRadioStateFromInt(int stateInt) {
-        int state;
-
-        switch(stateInt) {
-            case android.hardware.radio.V1_0.RadioState.OFF:
-                state = TelephonyManager.RADIO_POWER_OFF;
-                break;
-            case android.hardware.radio.V1_0.RadioState.UNAVAILABLE:
-                state = TelephonyManager.RADIO_POWER_UNAVAILABLE;
-                break;
-            case android.hardware.radio.V1_0.RadioState.ON:
-                state = TelephonyManager.RADIO_POWER_ON;
-                break;
-            default:
-                throw new RuntimeException("Unrecognized RadioState: " + stateInt);
-        }
-        return state;
-    }
-
-
-    /**
      * Set the frequency range or channel number from the physical channel config. Only one of them
      * is valid, we should set the other to the unknown value.
      * @param builder the builder of {@link PhysicalChannelConfig}.
@@ -1228,20 +1182,6 @@
         }
     }
 
-    private int convertConnectionStatusFromCellConnectionStatus(int status) {
-        switch (status) {
-            case CellConnectionStatus.PRIMARY_SERVING:
-                return PhysicalChannelConfig.CONNECTION_PRIMARY_SERVING;
-            case CellConnectionStatus.SECONDARY_SERVING:
-                return PhysicalChannelConfig.CONNECTION_SECONDARY_SERVING;
-            default:
-                // only PRIMARY_SERVING and SECONDARY_SERVING are supported.
-                mRil.riljLoge("Unsupported CellConnectionStatus in PhysicalChannelConfig: "
-                        + status);
-                return PhysicalChannelConfig.CONNECTION_UNKNOWN;
-        }
-    }
-
     /**
      * Set the band from the physical channel config.
      *
@@ -1280,8 +1220,8 @@
                             (android.hardware.radio.V1_2.PhysicalChannelConfig) obj;
 
                     response.add(new PhysicalChannelConfig.Builder()
-                            .setCellConnectionStatus(
-                                    convertConnectionStatusFromCellConnectionStatus(config.status))
+                            .setCellConnectionStatus(RILUtils.convertHalCellConnectionStatus(
+                                    config.status))
                             .setCellBandwidthDownlinkKhz(config.cellBandwidthDownlink)
                             .build());
                 } else if (obj instanceof android.hardware.radio.V1_4.PhysicalChannelConfig) {
@@ -1290,7 +1230,7 @@
                     PhysicalChannelConfig.Builder builder = new PhysicalChannelConfig.Builder();
                     setFrequencyRangeOrChannelNumber(builder, config);
                     response.add(builder.setCellConnectionStatus(
-                            convertConnectionStatusFromCellConnectionStatus(config.base.status))
+                            RILUtils.convertHalCellConnectionStatus(config.base.status))
                             .setCellBandwidthDownlinkKhz(config.base.cellBandwidthDownlink)
                             .setNetworkType(
                                     ServiceState.rilRadioTechnologyToNetworkType(config.rat))
@@ -1303,7 +1243,7 @@
                     PhysicalChannelConfig.Builder builder = new PhysicalChannelConfig.Builder();
                     setBandToBuilder(builder, config);
                     response.add(builder.setCellConnectionStatus(
-                            convertConnectionStatusFromCellConnectionStatus(config.status))
+                            RILUtils.convertHalCellConnectionStatus(config.status))
                             .setDownlinkChannelNumber(config.downlinkChannelNumber)
                             .setUplinkChannelNumber(config.uplinkChannelNumber)
                             .setCellBandwidthDownlinkKhz(config.cellBandwidthDownlinkKhz)
@@ -1332,32 +1272,33 @@
     }
 
     private void responseNetworkScan(int indicationType,
-                                     android.hardware.radio.V1_1.NetworkScanResult result) {
+            android.hardware.radio.V1_1.NetworkScanResult result) {
         mRil.processIndication(indicationType);
 
-        NetworkScanResult nsr = null;
-        ArrayList<CellInfo> infos = RIL.convertHalCellInfoList(result.networkInfos);
-        nsr = new NetworkScanResult(result.status, result.error, infos);
+        ArrayList<CellInfo> cellInfos =
+                RILUtils.convertHalCellInfoList(new ArrayList<>(result.networkInfos));
+        NetworkScanResult nsr = new NetworkScanResult(result.status, result.error, cellInfos);
         if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_NETWORK_SCAN_RESULT, nsr);
         mRil.mRilNetworkScanResultRegistrants.notifyRegistrants(new AsyncResult(null, nsr, null));
     }
 
     private void responseNetworkScan_1_2(int indicationType,
-                                         android.hardware.radio.V1_2.NetworkScanResult result) {
+            android.hardware.radio.V1_2.NetworkScanResult result) {
         mRil.processIndication(indicationType);
 
-        NetworkScanResult nsr = null;
-        ArrayList<CellInfo> infos = RIL.convertHalCellInfoList_1_2(result.networkInfos);
-        nsr = new NetworkScanResult(result.status, result.error, infos);
+        ArrayList<CellInfo> cellInfos =
+                RILUtils.convertHalCellInfoList(new ArrayList<>(result.networkInfos));
+        NetworkScanResult nsr = new NetworkScanResult(result.status, result.error, cellInfos);
         if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_NETWORK_SCAN_RESULT, nsr);
         mRil.mRilNetworkScanResultRegistrants.notifyRegistrants(new AsyncResult(null, nsr, null));
     }
 
     private void responseNetworkScan_1_4(int indicationType,
-                                         android.hardware.radio.V1_4.NetworkScanResult result) {
+            android.hardware.radio.V1_4.NetworkScanResult result) {
         mRil.processIndication(indicationType);
 
-        ArrayList<CellInfo> cellInfos = RIL.convertHalCellInfoList_1_4(result.networkInfos);
+        ArrayList<CellInfo> cellInfos =
+                RILUtils.convertHalCellInfoList(new ArrayList<>(result.networkInfos));
         NetworkScanResult nsr = new NetworkScanResult(result.status, result.error, cellInfos);
         if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_NETWORK_SCAN_RESULT, nsr);
         mRil.mRilNetworkScanResultRegistrants.notifyRegistrants(new AsyncResult(null, nsr, null));
@@ -1367,7 +1308,8 @@
             android.hardware.radio.V1_5.NetworkScanResult result) {
         mRil.processIndication(indicationType);
 
-        ArrayList<CellInfo> cellInfos = RIL.convertHalCellInfoList_1_5(result.networkInfos);
+        ArrayList<CellInfo> cellInfos =
+                RILUtils.convertHalCellInfoList(new ArrayList<>(result.networkInfos));
         NetworkScanResult nsr = new NetworkScanResult(result.status, result.error, cellInfos);
         if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_NETWORK_SCAN_RESULT, nsr);
         mRil.mRilNetworkScanResultRegistrants.notifyRegistrants(new AsyncResult(null, nsr, null));
@@ -1377,7 +1319,8 @@
             android.hardware.radio.V1_6.NetworkScanResult result) {
         mRil.processIndication(indicationType);
 
-        ArrayList<CellInfo> cellInfos = RIL.convertHalCellInfoList_1_6(result.networkInfos);
+        ArrayList<CellInfo> cellInfos =
+                RILUtils.convertHalCellInfoList(new ArrayList<>(result.networkInfos));
         NetworkScanResult nsr = new NetworkScanResult(result.status, result.error, cellInfos);
         if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_NETWORK_SCAN_RESULT, nsr);
         mRil.mRilNetworkScanResultRegistrants.notifyRegistrants(new AsyncResult(null, nsr, null));
@@ -1388,7 +1331,7 @@
 
         if (RIL.RILJ_LOGD) mRil.unsljLogRet(RIL_UNSOL_DATA_CALL_LIST_CHANGED, dcList);
 
-        ArrayList<DataCallResponse> response = RIL.convertDataCallResultList(dcList);
+        ArrayList<DataCallResponse> response = RILUtils.convertHalDataCallResultList(dcList);
         mRil.mDataCallListChangedRegistrants.notifyRegistrants(
                 new AsyncResult(null, response, null));
     }
diff --git a/src/java/com/android/internal/telephony/RadioResponse.java b/src/java/com/android/internal/telephony/RadioResponse.java
index c81dd3a..89005fe 100644
--- a/src/java/com/android/internal/telephony/RadioResponse.java
+++ b/src/java/com/android/internal/telephony/RadioResponse.java
@@ -18,9 +18,7 @@
 
 import android.content.Context;
 import android.hardware.radio.V1_0.ActivityStatsInfo;
-import android.hardware.radio.V1_0.AppStatus;
 import android.hardware.radio.V1_0.CardStatus;
-import android.hardware.radio.V1_0.Carrier;
 import android.hardware.radio.V1_0.CarrierRestrictions;
 import android.hardware.radio.V1_0.CdmaBroadcastSmsConfigInfo;
 import android.hardware.radio.V1_0.DataRegStateResult;
@@ -41,8 +39,6 @@
 import android.os.AsyncResult;
 import android.os.Message;
 import android.os.SystemClock;
-import android.service.carrier.CarrierIdentifier;
-import android.telephony.AccessNetworkConstants;
 import android.telephony.AnomalyReporter;
 import android.telephony.BarringInfo;
 import android.telephony.CarrierRestrictionRules;
@@ -51,7 +47,6 @@
 import android.telephony.ModemActivityInfo;
 import android.telephony.NeighboringCellInfo;
 import android.telephony.NetworkScanRequest;
-import android.telephony.PhoneNumberUtils;
 import android.telephony.RadioAccessFamily;
 import android.telephony.RadioAccessSpecifier;
 import android.telephony.SignalStrength;
@@ -64,10 +59,8 @@
 import com.android.internal.telephony.dataconnection.KeepaliveStatus;
 import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
 import com.android.internal.telephony.uicc.AdnCapacity;
-import com.android.internal.telephony.uicc.IccCardApplicationStatus;
 import com.android.internal.telephony.uicc.IccCardStatus;
 import com.android.internal.telephony.uicc.IccIoResult;
-import com.android.internal.telephony.uicc.IccUtils;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -540,9 +533,7 @@
      * @param numeric is 5 or 6 digit numeric code (MCC + MNC) or empty string if unregistered
      */
     public void getOperatorResponse(RadioResponseInfo responseInfo,
-            String longName,
-            String shortName,
-            String numeric) {
+            String longName, String shortName, String numeric) {
         responseStrings(responseInfo, longName, shortName, numeric);
     }
 
@@ -595,8 +586,7 @@
      * @param sms Response to sms sent as defined by SendSmsResult in 1.6/types.hal
      */
     public void sendSmsExpectMoreResponse_1_6(
-            android.hardware.radio.V1_6.RadioResponseInfo responseInfo,
-            SendSmsResult sms) {
+            android.hardware.radio.V1_6.RadioResponseInfo responseInfo, SendSmsResult sms) {
         responseSms_1_6(responseInfo, sms);
     }
 
@@ -661,9 +651,8 @@
 
     @Override
     public void getAllowedNetworkTypesBitmapResponse(
-            android.hardware.radio.V1_6.RadioResponseInfo info,
-            int halRadioAccessFamilyBitmap) {
-        int networkTypeBitmask = RIL.convertToNetworkTypeBitMask(halRadioAccessFamilyBitmap);
+            android.hardware.radio.V1_6.RadioResponseInfo info, int halRadioAccessFamilyBitmap) {
+        int networkTypeBitmask = RILUtils.convertHalNetworkTypeBitMask(halRadioAccessFamilyBitmap);
         mRil.mAllowedNetworkTypesBitmask = networkTypeBitmask;
         responseInts_1_6(info, networkTypeBitmask);
     }
@@ -713,8 +702,7 @@
      *        each distinct registered phone number.
      */
     public void getCallForwardStatusResponse(RadioResponseInfo responseInfo,
-            ArrayList<android.hardware.radio.V1_0.CallForwardInfo>
-                    callForwardInfos) {
+            ArrayList<android.hardware.radio.V1_0.CallForwardInfo> callForwardInfos) {
         responseCallForwardInfo(responseInfo, callForwardInfos);
     }
 
@@ -736,8 +724,7 @@
      *        and voice and disabled for everything else.
      */
     public void getCallWaitingResponse(RadioResponseInfo responseInfo,
-            boolean enable,
-            int serviceClass) {
+            boolean enable, int serviceClass) {
         responseInts(responseInfo, enable ? 1 : 0, serviceClass);
     }
 
@@ -833,8 +820,7 @@
      *                     types.hal
      */
     public void getAvailableNetworksResponse(RadioResponseInfo responseInfo,
-            ArrayList<android.hardware.radio.V1_0.OperatorInfo>
-                    networkInfos) {
+            ArrayList<android.hardware.radio.V1_0.OperatorInfo> networkInfos) {
         responseOperatorInfos(responseInfo, networkInfos);
     }
 
@@ -1065,7 +1051,7 @@
     public void getPreferredNetworkTypeBitmapResponse(
             RadioResponseInfo responseInfo, int halRadioAccessFamilyBitmap) {
 
-        int networkTypeBitmask = RIL.convertToNetworkTypeBitMask(halRadioAccessFamilyBitmap);
+        int networkTypeBitmask = RILUtils.convertHalNetworkTypeBitMask(halRadioAccessFamilyBitmap);
         mRil.mAllowedNetworkTypesBitmask = networkTypeBitmask;
         responseInts(responseInfo, networkTypeBitmask);
     }
@@ -1398,7 +1384,7 @@
     public void getCellInfoListResponse_1_2(
             RadioResponseInfo responseInfo,
             ArrayList<android.hardware.radio.V1_2.CellInfo> cellInfo) {
-        responseCellInfoList_1_2(responseInfo, cellInfo);
+        responseCellInfoList(responseInfo, cellInfo);
     }
 
     /**
@@ -1408,7 +1394,7 @@
     public void getCellInfoListResponse_1_4(
             RadioResponseInfo responseInfo,
             ArrayList<android.hardware.radio.V1_4.CellInfo> cellInfo) {
-        responseCellInfoList_1_4(responseInfo, cellInfo);
+        responseCellInfoList(responseInfo, cellInfo);
     }
 
     /**
@@ -1418,7 +1404,7 @@
     public void getCellInfoListResponse_1_5(
             RadioResponseInfo responseInfo,
             ArrayList<android.hardware.radio.V1_5.CellInfo> cellInfo) {
-        responseCellInfoList_1_5(responseInfo, cellInfo);
+        responseCellInfoList(responseInfo, cellInfo);
     }
 
     /**
@@ -1623,7 +1609,7 @@
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
-            RadioCapability ret = RIL.convertHalRadioCapability(rc, mRil);
+            RadioCapability ret = RILUtils.convertHalRadioCapability(rc, mRil);
             if (responseInfo.error == RadioError.REQUEST_NOT_SUPPORTED
                     || responseInfo.error == RadioError.GENERIC_FAILURE) {
                 // we should construct the RAF bitmask the radio
@@ -1851,7 +1837,6 @@
         responseVoid(responseInfo);
     }
 
-
     /**
      * @param responseInfo Response info struct containing response type, serial no. and error
      * @param keepaliveStatus status of the keepalive with a handle for the session
@@ -1866,7 +1851,8 @@
         try {
             switch(responseInfo.error) {
                 case RadioError.NONE:
-                    int convertedStatus = convertHalKeepaliveStatusCode(keepaliveStatus.code);
+                    int convertedStatus = RILUtils.convertHalKeepaliveStatusCode(
+                            keepaliveStatus.code);
                     if (convertedStatus < 0) {
                         ret = new KeepaliveStatus(KeepaliveStatus.ERROR_UNSUPPORTED);
                     } else {
@@ -1910,96 +1896,6 @@
         }
     }
 
-    private int convertHalKeepaliveStatusCode(int halCode) {
-        switch (halCode) {
-            case android.hardware.radio.V1_1.KeepaliveStatusCode.ACTIVE:
-                return KeepaliveStatus.STATUS_ACTIVE;
-            case android.hardware.radio.V1_1.KeepaliveStatusCode.INACTIVE:
-                return KeepaliveStatus.STATUS_INACTIVE;
-            case android.hardware.radio.V1_1.KeepaliveStatusCode.PENDING:
-                return KeepaliveStatus.STATUS_PENDING;
-            default:
-                mRil.riljLog("Invalid Keepalive Status" + halCode);
-                return -1;
-        }
-    }
-
-    private IccCardStatus convertHalCardStatus(CardStatus cardStatus) {
-        IccCardStatus iccCardStatus = new IccCardStatus();
-        iccCardStatus.setCardState(cardStatus.cardState);
-        iccCardStatus.setUniversalPinState(cardStatus.universalPinState);
-        iccCardStatus.mGsmUmtsSubscriptionAppIndex = cardStatus.gsmUmtsSubscriptionAppIndex;
-        iccCardStatus.mCdmaSubscriptionAppIndex = cardStatus.cdmaSubscriptionAppIndex;
-        iccCardStatus.mImsSubscriptionAppIndex = cardStatus.imsSubscriptionAppIndex;
-        int numApplications = cardStatus.applications.size();
-
-        // limit to maximum allowed applications
-        if (numApplications
-                > com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS) {
-            numApplications =
-                    com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS;
-        }
-        iccCardStatus.mApplications = new IccCardApplicationStatus[numApplications];
-        for (int i = 0; i < numApplications; i++) {
-            AppStatus rilAppStatus = cardStatus.applications.get(i);
-            IccCardApplicationStatus appStatus = new IccCardApplicationStatus();
-            appStatus.app_type       = appStatus.AppTypeFromRILInt(rilAppStatus.appType);
-            appStatus.app_state      = appStatus.AppStateFromRILInt(rilAppStatus.appState);
-            appStatus.perso_substate = appStatus.PersoSubstateFromRILInt(
-                    rilAppStatus.persoSubstate);
-            appStatus.aid            = rilAppStatus.aidPtr;
-            appStatus.app_label      = rilAppStatus.appLabelPtr;
-            appStatus.pin1_replaced  = rilAppStatus.pin1Replaced;
-            appStatus.pin1           = appStatus.PinStateFromRILInt(rilAppStatus.pin1);
-            appStatus.pin2           = appStatus.PinStateFromRILInt(rilAppStatus.pin2);
-            iccCardStatus.mApplications[i] = appStatus;
-            mRil.riljLog("IccCardApplicationStatus " + i + ":" + appStatus.toString());
-        }
-        return iccCardStatus;
-    }
-
-    private IccCardStatus convertHalCardStatus_1_5(
-            android.hardware.radio.V1_5.CardStatus cardStatus) {
-        IccCardStatus iccCardStatus = new IccCardStatus();
-        iccCardStatus.setCardState(cardStatus.base.base.base.cardState);
-        iccCardStatus.setUniversalPinState(cardStatus.base.base.base.universalPinState);
-        iccCardStatus.mGsmUmtsSubscriptionAppIndex =
-                cardStatus.base.base.base.gsmUmtsSubscriptionAppIndex;
-        iccCardStatus.mCdmaSubscriptionAppIndex =
-                cardStatus.base.base.base.cdmaSubscriptionAppIndex;
-        iccCardStatus.mImsSubscriptionAppIndex =
-                cardStatus.base.base.base.imsSubscriptionAppIndex;
-        iccCardStatus.physicalSlotIndex = cardStatus.base.base.physicalSlotId;
-        iccCardStatus.atr = cardStatus.base.base.atr;
-        iccCardStatus.iccid = cardStatus.base.base.iccid;
-        iccCardStatus.eid = cardStatus.base.eid;
-        int numApplications = cardStatus.applications.size();
-
-        // limit to maximum allowed applications
-        if (numApplications
-                > com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS) {
-            numApplications =
-                    com.android.internal.telephony.uicc.IccCardStatus.CARD_MAX_APPS;
-        }
-        iccCardStatus.mApplications = new IccCardApplicationStatus[numApplications];
-        for (int i = 0; i < numApplications; i++) {
-            android.hardware.radio.V1_5.AppStatus rilAppStatus = cardStatus.applications.get(i);
-            IccCardApplicationStatus appStatus = new IccCardApplicationStatus();
-            appStatus.app_type       = appStatus.AppTypeFromRILInt(rilAppStatus.base.appType);
-            appStatus.app_state      = appStatus.AppStateFromRILInt(rilAppStatus.base.appState);
-            appStatus.perso_substate = appStatus.PersoSubstateFromRILInt(
-                    rilAppStatus.persoSubstate);
-            appStatus.aid            = rilAppStatus.base.aidPtr;
-            appStatus.app_label      = rilAppStatus.base.appLabelPtr;
-            appStatus.pin1_replaced  = rilAppStatus.base.pin1Replaced;
-            appStatus.pin1           = appStatus.PinStateFromRILInt(rilAppStatus.base.pin1);
-            appStatus.pin2           = appStatus.PinStateFromRILInt(rilAppStatus.base.pin2);
-            iccCardStatus.mApplications[i] = appStatus;
-            mRil.riljLog("IccCardApplicationStatus " + i + ":" + appStatus.toString());
-        }
-        return iccCardStatus;
-    }
-
     /**
      * @param responseInfo Response info struct containing response type, serial no. and error.
      */
@@ -2045,7 +1941,7 @@
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
-            IccCardStatus iccCardStatus = convertHalCardStatus(cardStatus);
+            IccCardStatus iccCardStatus = RILUtils.convertHalCardStatus(cardStatus);
             mRil.riljLog("responseIccCardStatus: from HIDL: " + iccCardStatus);
             if (responseInfo.error == RadioError.NONE) {
                 sendMessageResponse(rr.mResult, iccCardStatus);
@@ -2059,7 +1955,7 @@
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
-            IccCardStatus iccCardStatus = convertHalCardStatus(cardStatus.base);
+            IccCardStatus iccCardStatus = RILUtils.convertHalCardStatus(cardStatus.base);
             iccCardStatus.physicalSlotIndex = cardStatus.physicalSlotId;
             iccCardStatus.atr = cardStatus.atr;
             iccCardStatus.iccid = cardStatus.iccid;
@@ -2076,7 +1972,7 @@
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
-            IccCardStatus iccCardStatus = convertHalCardStatus(cardStatus.base.base);
+            IccCardStatus iccCardStatus = RILUtils.convertHalCardStatus(cardStatus.base.base);
             iccCardStatus.physicalSlotIndex = cardStatus.base.physicalSlotId;
             iccCardStatus.atr = cardStatus.base.atr;
             iccCardStatus.iccid = cardStatus.base.iccid;
@@ -2094,7 +1990,7 @@
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
-            IccCardStatus iccCardStatus = convertHalCardStatus_1_5(cardStatus);
+            IccCardStatus iccCardStatus = RILUtils.convertHalCardStatus(cardStatus);
             mRil.riljLog("responseIccCardStatus: from HIDL: " + iccCardStatus);
             if (responseInfo.error == RadioError.NONE) {
                 sendMessageResponse(rr.mResult, iccCardStatus);
@@ -2168,7 +2064,7 @@
             DriverCall dc;
 
             for (int i = 0; i < num; i++) {
-                dc = convertToDriverCall(calls.get(i));
+                dc = RILUtils.convertToDriverCall(calls.get(i));
 
                 dcCalls.add(dc);
 
@@ -2208,7 +2104,7 @@
             DriverCall dc;
 
             for (int i = 0; i < num; i++) {
-                dc = convertToDriverCall_1_2(calls.get(i));
+                dc = RILUtils.convertToDriverCall(calls.get(i));
 
                 dcCalls.add(dc);
 
@@ -2249,7 +2145,7 @@
             DriverCall dc;
 
             for (int i = 0; i < num; i++) {
-                dc = convertToDriverCall_1_6(calls.get(i));
+                dc = RILUtils.convertToDriverCall(calls.get(i));
 
                 dcCalls.add(dc);
 
@@ -2279,62 +2175,6 @@
         }
     }
 
-    private DriverCall convertToDriverCall(android.hardware.radio.V1_0.Call call) {
-        DriverCall dc = new DriverCall();
-        // TODO: change name of function stateFromCLCC() in DriverCall.java to name
-        // clarifying what is CLCC
-        dc.state = DriverCall.stateFromCLCC((int) (call.state));
-        dc.index = call.index;
-        dc.TOA = call.toa;
-        dc.isMpty = call.isMpty;
-        dc.isMT = call.isMT;
-        dc.als = call.als;
-        dc.isVoice = call.isVoice;
-        dc.isVoicePrivacy = call.isVoicePrivacy;
-        dc.number = call.number;
-        dc.numberPresentation = DriverCall.presentationFromCLIP((int) (call.numberPresentation));
-        dc.name = call.name;
-        dc.namePresentation = DriverCall.presentationFromCLIP((int) (call.namePresentation));
-        if (call.uusInfo.size() == 1) {
-            dc.uusInfo = new UUSInfo();
-            dc.uusInfo.setType(call.uusInfo.get(0).uusType);
-            dc.uusInfo.setDcs(call.uusInfo.get(0).uusDcs);
-            if (!TextUtils.isEmpty(call.uusInfo.get(0).uusData)) {
-                byte[] userData = call.uusInfo.get(0).uusData.getBytes();
-                dc.uusInfo.setUserData(userData);
-            } else {
-                mRil.riljLog("convertToDriverCall: uusInfo data is null or empty");
-            }
-
-            mRil.riljLogv(String.format("Incoming UUS : type=%d, dcs=%d, length=%d",
-                    dc.uusInfo.getType(), dc.uusInfo.getDcs(),
-                    dc.uusInfo.getUserData().length));
-            mRil.riljLogv("Incoming UUS : data (hex): "
-                    + IccUtils.bytesToHexString(dc.uusInfo.getUserData()));
-        } else {
-            mRil.riljLogv("Incoming UUS : NOT present!");
-        }
-
-        // Make sure there's a leading + on addresses with a TOA of 145
-        dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA);
-
-        return dc;
-    }
-
-    private DriverCall convertToDriverCall_1_2(android.hardware.radio.V1_2.Call call) {
-        android.hardware.radio.V1_0.Call earlierVersionCall = call.base;
-        DriverCall dc = convertToDriverCall(earlierVersionCall);
-        dc.audioQuality = (int) (call.audioQuality);
-        return dc;
-    }
-
-    private DriverCall convertToDriverCall_1_6(android.hardware.radio.V1_6.Call call) {
-        android.hardware.radio.V1_2.Call earlierVersionCall = call.base;
-        DriverCall dc = convertToDriverCall_1_2(earlierVersionCall);
-        dc.forwardedNumber = call.forwardedNumber;
-        return dc;
-    }
-
     private void responseVoid(RadioResponseInfo responseInfo) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
@@ -2497,7 +2337,7 @@
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
-            DataCallResponse response = RIL.convertDataCallResult(setupDataCallResult);
+            DataCallResponse response = RILUtils.convertHalDataCallResult(setupDataCallResult);
             if (responseInfo.error == RadioError.NONE) {
                 sendMessageResponse(rr.mResult, response);
             }
@@ -2511,7 +2351,7 @@
         RILRequest rr = mRil.processResponse_1_6(responseInfo);
 
         if (rr != null) {
-            DataCallResponse response = RIL.convertDataCallResult(setupDataCallResult);
+            DataCallResponse response = RILUtils.convertHalDataCallResult(setupDataCallResult);
             if (responseInfo.error == RadioError.NONE) {
                 sendMessageResponse(rr.mResult, response);
             }
@@ -2554,20 +2394,6 @@
         }
     }
 
-    private static String convertOpertatorInfoToString(int status) {
-        if (status == android.hardware.radio.V1_0.OperatorStatus.UNKNOWN) {
-            return "unknown";
-        } else if (status == android.hardware.radio.V1_0.OperatorStatus.AVAILABLE) {
-            return "available";
-        } else if (status == android.hardware.radio.V1_0.OperatorStatus.CURRENT) {
-            return "current";
-        } else if (status == android.hardware.radio.V1_0.OperatorStatus.FORBIDDEN) {
-            return "forbidden";
-        } else {
-            return "";
-        }
-    }
-
     private void responseOperatorInfos(RadioResponseInfo responseInfo,
             ArrayList<android.hardware.radio.V1_0.OperatorInfo>
                     networkInfos) {
@@ -2578,7 +2404,7 @@
             for (int i = 0; i < networkInfos.size(); i++) {
                 ret.add(new OperatorInfo(networkInfos.get(i).alphaLong,
                         networkInfos.get(i).alphaShort, networkInfos.get(i).operatorNumeric,
-                        convertOpertatorInfoToString(networkInfos.get(i).status)));
+                        RILUtils.convertHalOperatorStatus(networkInfos.get(i).status)));
             }
             if (responseInfo.error == RadioError.NONE) {
                 sendMessageResponse(rr.mResult, ret);
@@ -2626,7 +2452,7 @@
 
         if (rr != null) {
             ArrayList<DataCallResponse> response =
-                    RIL.convertDataCallResultList(dataCallResultList);
+                    RILUtils.convertHalDataCallResultList(dataCallResultList);
             if (responseInfo.error == RadioError.NONE) {
                 sendMessageResponse(rr.mResult, response);
             }
@@ -2640,7 +2466,7 @@
 
         if (rr != null) {
             ArrayList<DataCallResponse> response =
-                    RIL.convertDataCallResultList(dataCallResultList);
+                    RILUtils.convertHalDataCallResultList(dataCallResultList);
             if (responseInfo.error == RadioError.NONE) {
                 sendMessageResponse(rr.mResult, response);
             }
@@ -2745,52 +2571,11 @@
     }
 
     private void responseCellInfoList(RadioResponseInfo responseInfo,
-            ArrayList<android.hardware.radio.V1_0.CellInfo> cellInfo) {
+            ArrayList<? extends Object> cellInfo) {
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
-            ArrayList<CellInfo> ret = RIL.convertHalCellInfoList(cellInfo);
-            if (responseInfo.error == RadioError.NONE) {
-                sendMessageResponse(rr.mResult, ret);
-            }
-            mRil.processResponseDone(rr, responseInfo, ret);
-        }
-    }
-
-    private void responseCellInfoList_1_2(
-            RadioResponseInfo responseInfo,
-            ArrayList<android.hardware.radio.V1_2.CellInfo> cellInfo) {
-        RILRequest rr = mRil.processResponse(responseInfo);
-
-        if (rr != null) {
-            ArrayList<CellInfo> ret = RIL.convertHalCellInfoList_1_2(cellInfo);
-            if (responseInfo.error == RadioError.NONE) {
-                sendMessageResponse(rr.mResult, ret);
-            }
-            mRil.processResponseDone(rr, responseInfo, ret);
-        }
-    }
-
-    private void responseCellInfoList_1_4(
-            RadioResponseInfo responseInfo,
-            ArrayList<android.hardware.radio.V1_4.CellInfo> cellInfo) {
-        RILRequest rr = mRil.processResponse(responseInfo);
-
-        if (rr != null) {
-            ArrayList<CellInfo> ret = RIL.convertHalCellInfoList_1_4(cellInfo);
-            if (responseInfo.error == RadioError.NONE) {
-                sendMessageResponse(rr.mResult, ret);
-            }
-            mRil.processResponseDone(rr, responseInfo, ret);
-        }
-    }
-
-    private void responseCellInfoList_1_5(RadioResponseInfo responseInfo,
-            ArrayList<android.hardware.radio.V1_5.CellInfo> cellInfo) {
-        RILRequest rr = mRil.processResponse(responseInfo);
-
-        if (rr != null) {
-            ArrayList<CellInfo> ret = RIL.convertHalCellInfoList_1_5(cellInfo);
+            ArrayList<CellInfo> ret = RILUtils.convertHalCellInfoList((ArrayList<Object>) cellInfo);
             if (responseInfo.error == RadioError.NONE) {
                 sendMessageResponse(rr.mResult, ret);
             }
@@ -2800,11 +2585,11 @@
 
     private void responseCellInfoList_1_6(
             android.hardware.radio.V1_6.RadioResponseInfo responseInfo,
-            ArrayList<android.hardware.radio.V1_6.CellInfo> cellInfo) {
+            ArrayList<? extends Object> cellInfo) {
         RILRequest rr = mRil.processResponse_1_6(responseInfo);
 
         if (rr != null) {
-            ArrayList<CellInfo> ret = RIL.convertHalCellInfoList_1_6(cellInfo);
+            ArrayList<CellInfo> ret = RILUtils.convertHalCellInfoList((ArrayList<Object>) cellInfo);
             if (responseInfo.error == RadioError.NONE) {
                 sendMessageResponse(rr.mResult, ret);
             }
@@ -2844,7 +2629,7 @@
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
-            ArrayList<HardwareConfig> ret = RIL.convertHalHwConfigList(config, mRil);
+            ArrayList<HardwareConfig> ret = RILUtils.convertHalHardwareConfigList(config);
             if (responseInfo.error == RadioError.NONE) {
                 sendMessageResponse(rr.mResult, ret);
             }
@@ -2857,7 +2642,7 @@
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
-            RadioCapability ret = RIL.convertHalRadioCapability(rc, mRil);
+            RadioCapability ret = RILUtils.convertHalRadioCapability(rc, mRil);
             if (responseInfo.error == RadioError.NONE) {
                 sendMessageResponse(rr.mResult, ret);
             }
@@ -2869,7 +2654,7 @@
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
-            ArrayList<Integer> ret = new ArrayList<Integer>();
+            ArrayList<Integer> ret = new ArrayList<>();
             ret.add(statusInfo.lceStatus);
             ret.add(Byte.toUnsignedInt(statusInfo.actualIntervalMs));
             if (responseInfo.error == RadioError.NONE) {
@@ -2883,7 +2668,7 @@
         RILRequest rr = mRil.processResponse(responseInfo);
 
         if (rr != null) {
-            List<LinkCapacityEstimate> ret = RIL.convertHalLceData(lceInfo, mRil);
+            List<LinkCapacityEstimate> ret = RILUtils.convertHalLceData(lceInfo);
             if (responseInfo.error == RadioError.NONE) {
                 sendMessageResponse(rr.mResult, ret);
             }
@@ -2891,28 +2676,6 @@
         }
     }
 
-    private static List<CarrierIdentifier> convertCarrierList(List<Carrier> carrierList) {
-        List<CarrierIdentifier> ret = new ArrayList<>();
-        for (int i = 0; i < carrierList.size(); i++) {
-            String mcc = carrierList.get(i).mcc;
-            String mnc = carrierList.get(i).mnc;
-            String spn = null, imsi = null, gid1 = null, gid2 = null;
-            int matchType = carrierList.get(i).matchType;
-            String matchData = carrierList.get(i).matchData;
-            if (matchType == CarrierIdentifier.MatchType.SPN) {
-                spn = matchData;
-            } else if (matchType == CarrierIdentifier.MatchType.IMSI_PREFIX) {
-                imsi = matchData;
-            } else if (matchType == CarrierIdentifier.MatchType.GID1) {
-                gid1 = matchData;
-            } else if (matchType == CarrierIdentifier.MatchType.GID2) {
-                gid2 = matchData;
-            }
-            ret.add(new CarrierIdentifier(mcc, mnc, spn, imsi, gid1, gid2));
-        }
-        return ret;
-    }
-
     private void responseCarrierRestrictions(RadioResponseInfo responseInfo, boolean allAllowed,
             CarrierRestrictionsWithPriority carriers,
             int multiSimPolicy) {
@@ -2938,8 +2701,8 @@
             }
 
             ret = CarrierRestrictionRules.newBuilder()
-                    .setAllowedCarriers(convertCarrierList(carriers.allowedCarriers))
-                    .setExcludedCarriers(convertCarrierList(carriers.excludedCarriers))
+                    .setAllowedCarriers(RILUtils.convertHalCarrierList(carriers.allowedCarriers))
+                    .setExcludedCarriers(RILUtils.convertHalCarrierList(carriers.excludedCarriers))
                     .setDefaultCarrierRestriction(carrierRestrictionDefault)
                     .setMultiSimPolicy(policy)
                     .build();
@@ -3087,29 +2850,12 @@
                 halBands = specifier.bands.ngranBands();
                 break;
         }
-        return new RadioAccessSpecifier(convertRanToAnt(specifier.radioAccessNetwork),
+        return new RadioAccessSpecifier(
+                RILUtils.convertHalRadioAccessNetworks(specifier.radioAccessNetwork),
                 halBands.stream().mapToInt(Integer::intValue).toArray(),
                 specifier.channels.stream().mapToInt(Integer::intValue).toArray());
     }
 
-    private static int convertRanToAnt(int ran) {
-        switch (ran) {
-            case android.hardware.radio.V1_5.RadioAccessNetworks.GERAN:
-                return AccessNetworkConstants.AccessNetworkType.GERAN;
-            case android.hardware.radio.V1_5.RadioAccessNetworks.UTRAN:
-                return AccessNetworkConstants.AccessNetworkType.UTRAN;
-            case android.hardware.radio.V1_5.RadioAccessNetworks.EUTRAN:
-                return AccessNetworkConstants.AccessNetworkType.EUTRAN;
-            case android.hardware.radio.V1_5.RadioAccessNetworks.NGRAN:
-                return AccessNetworkConstants.AccessNetworkType.NGRAN;
-            case android.hardware.radio.V1_5.RadioAccessNetworks.CDMA2000:
-                return AccessNetworkConstants.AccessNetworkType.CDMA2000;
-            case android.hardware.radio.V1_5.RadioAccessNetworks.UNKNOWN:
-            default:
-                return AccessNetworkConstants.AccessNetworkType.UNKNOWN;
-        }
-    }
-
     /**
      * @param responseInfo Response info struct containing response type, serial no. and error.
      * @param cellIdentity CellIdentity for the barringInfos.
@@ -3177,7 +2923,7 @@
         RILRequest rr = mRil.processResponse_1_6(info);
 
         if (rr != null) {
-            SlicingConfig ret = new SlicingConfig(slicingConfig);
+            SlicingConfig ret = RILUtils.convertHalSlicingConfig(slicingConfig);
             if (info.error == RadioError.NONE) {
                 sendMessageResponse(rr.mResult, ret);
             }
diff --git a/tests/telephonytests/src/com/android/internal/telephony/RILTest.java b/tests/telephonytests/src/com/android/internal/telephony/RILTest.java
index d8b601b..5b98660 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/RILTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/RILTest.java
@@ -159,6 +159,7 @@
 import android.telephony.data.DataCallResponse;
 import android.telephony.data.DataProfile;
 import android.telephony.data.EpsQos;
+import android.telephony.data.Qos;
 import android.telephony.data.QosBearerFilter;
 import android.telephony.data.QosBearerSession;
 import android.telephony.data.TrafficDescriptor;
@@ -299,8 +300,7 @@
         } catch (RuntimeException e) {
         }
         Context context = new ContextFixture().getTestDouble();
-        doReturn(true).when(mConnectionManager)
-            .isNetworkSupported(ConnectivityManager.TYPE_MOBILE);
+        doReturn(true).when(mConnectionManager).isNetworkSupported(ConnectivityManager.TYPE_MOBILE);
         doReturn(mConnectionManager).when(context)
             .getSystemService(Context.CONNECTIVITY_SERVICE);
         doReturn(mTelephonyManager).when(context)
@@ -311,9 +311,8 @@
         doReturn(powerManager).when(context).getSystemService(Context.POWER_SERVICE);
         doReturn(new ApplicationInfo()).when(context).getApplicationInfo();
 
-        mRILInstance = new RIL(context,
-                RadioAccessFamily.getRafFromNetworkType(RILConstants.PREFERRED_NETWORK_MODE),
-            Phone.PREFERRED_CDMA_SUBSCRIPTION, 0);
+        mRILInstance = new RIL(context, RadioAccessFamily.getRafFromNetworkType(
+                RILConstants.PREFERRED_NETWORK_MODE), Phone.PREFERRED_CDMA_SUBSCRIPTION, 0);
         mRILUnderTest = spy(mRILInstance);
         doReturn(mRadioProxy).when(mRILUnderTest).getRadioProxy(any());
         doReturn(mOemHookProxy).when(mRILUnderTest).getOemHookProxy(any());
@@ -1396,7 +1395,7 @@
         byte[] data = new byte[]{1, 2, 3};
         mRILUnderTest.invokeOemRilRequestRaw(data, obtainMessage());
         verify(mOemHookProxy).sendRequestRaw(
-                mSerialNumberCaptor.capture(), eq(mRILUnderTest.primitiveArrayToArrayList(data)));
+                mSerialNumberCaptor.capture(), eq(RILUtils.primitiveArrayToArrayList(data)));
     }
 
     private Message obtainMessage() {
@@ -1512,11 +1511,10 @@
         record.timeStampType = RIL_TIMESTAMP_TYPE_OEM_RIL;
         record.timeStamp = TIMESTAMP;
         record.lte.add(lte);
-        ArrayList<android.hardware.radio.V1_0.CellInfo> records =
-                new ArrayList<android.hardware.radio.V1_0.CellInfo>();
+        ArrayList<Object> records = new ArrayList<>();
         records.add(record);
 
-        ArrayList<CellInfo> ret = RIL.convertHalCellInfoList(records);
+        ArrayList<CellInfo> ret = RILUtils.convertHalCellInfoList(records);
 
         assertEquals(1, ret.size());
         CellInfoLte cellInfoLte = (CellInfoLte) ret.get(0);
@@ -1554,11 +1552,10 @@
         record.timeStampType = RIL_TIMESTAMP_TYPE_OEM_RIL;
         record.timeStamp = TIMESTAMP;
         record.gsm.add(cellinfo);
-        ArrayList<android.hardware.radio.V1_0.CellInfo> records =
-                new ArrayList<android.hardware.radio.V1_0.CellInfo>();
+        ArrayList<Object> records = new ArrayList<>();
         records.add(record);
 
-        ArrayList<CellInfo> ret = RIL.convertHalCellInfoList(records);
+        ArrayList<CellInfo> ret = RILUtils.convertHalCellInfoList(records);
 
         assertEquals(1, ret.size());
         CellInfoGsm cellInfoGsm = (CellInfoGsm) ret.get(0);
@@ -1595,11 +1592,10 @@
         record.timeStampType = RIL_TIMESTAMP_TYPE_OEM_RIL;
         record.timeStamp = TIMESTAMP;
         record.wcdma.add(cellinfo);
-        ArrayList<android.hardware.radio.V1_0.CellInfo> records =
-                new ArrayList<android.hardware.radio.V1_0.CellInfo>();
+        ArrayList<Object> records = new ArrayList<>();
         records.add(record);
 
-        ArrayList<CellInfo> ret = RIL.convertHalCellInfoList(records);
+        ArrayList<CellInfo> ret = RILUtils.convertHalCellInfoList(records);
 
         assertEquals(1, ret.size());
         CellInfoWcdma cellInfoWcdma = (CellInfoWcdma) ret.get(0);
@@ -1645,11 +1641,10 @@
         record.timeStampType = RIL_TIMESTAMP_TYPE_OEM_RIL;
         record.timeStamp = TIMESTAMP;
         record.tdscdma.add(cellinfo);
-        ArrayList<android.hardware.radio.V1_2.CellInfo> records =
-                new ArrayList<android.hardware.radio.V1_2.CellInfo>();
+        ArrayList<Object> records = new ArrayList<>();
         records.add(record);
 
-        ArrayList<CellInfo> ret = RIL.convertHalCellInfoList_1_2(records);
+        ArrayList<CellInfo> ret = RILUtils.convertHalCellInfoList(records);
 
         assertEquals(1, ret.size());
         CellInfoTdscdma cellInfoTdscdma = (CellInfoTdscdma) ret.get(0);
@@ -1688,11 +1683,10 @@
         record.timeStampType = RIL_TIMESTAMP_TYPE_OEM_RIL;
         record.timeStamp = TIMESTAMP;
         record.cdma.add(cellinfo);
-        ArrayList<android.hardware.radio.V1_0.CellInfo> records =
-                new ArrayList<android.hardware.radio.V1_0.CellInfo>();
+        ArrayList<Object> records = new ArrayList<>();
         records.add(record);
 
-        ArrayList<CellInfo> ret = RIL.convertHalCellInfoList(records);
+        ArrayList<CellInfo> ret = RILUtils.convertHalCellInfoList(records);
 
         assertEquals(1, ret.size());
         CellInfoCdma cellInfoCdma = (CellInfoCdma) ret.get(0);
@@ -1975,10 +1969,10 @@
         android.hardware.radio.V1_4.CellInfo record = new android.hardware.radio.V1_4.CellInfo();
         record.info.nr(cellinfo);
 
-        ArrayList<android.hardware.radio.V1_4.CellInfo> records = new ArrayList<>();
+        ArrayList<Object> records = new ArrayList<>();
         records.add(record);
 
-        ArrayList<CellInfo> ret = RIL.convertHalCellInfoList_1_4(records);
+        ArrayList<CellInfo> ret = RILUtils.convertHalCellInfoList(records);
 
         CellInfoNr cellInfoNr = (CellInfoNr) ret.get(0);
         CellIdentityNr cellIdentityNr = (CellIdentityNr) cellInfoNr.getCellIdentity();
@@ -2059,8 +2053,7 @@
         initializeCellIdentityWcdma_1_2(id.base);
 
         if (addAdditionalPlmns) {
-            id.additionalPlmns = new ArrayList<>(
-                    Arrays.asList(ADDITIONAL_PLMNS));
+            id.additionalPlmns = new ArrayList<>(Arrays.asList(ADDITIONAL_PLMNS));
         }
 
         if (addCsgInfo) {
@@ -2105,8 +2098,7 @@
         initializeCellIdentityTdscdma_1_2(id.base);
 
         if (addAdditionalPlmns) {
-            id.additionalPlmns = new ArrayList<>(
-                    Arrays.asList(ADDITIONAL_PLMNS));
+            id.additionalPlmns = new ArrayList<>(Arrays.asList(ADDITIONAL_PLMNS));
         }
 
         if (addCsgInfo) {
@@ -2186,7 +2178,7 @@
                 .setTrafficDescriptors(new ArrayList<>())
                 .build();
 
-        assertEquals(response, RIL.convertDataCallResult(result10));
+        assertEquals(response, RILUtils.convertHalDataCallResult(result10));
 
         // Test V1.4 SetupDataCallResult
         android.hardware.radio.V1_4.SetupDataCallResult result14 =
@@ -2205,7 +2197,7 @@
                 "fd00:976a:c206:20::6", "fd00:976a:c206:20::9", "fd00:976a:c202:1d::9"));
         result14.mtu = 1500;
 
-        assertEquals(response, RIL.convertDataCallResult(result14));
+        assertEquals(response, RILUtils.convertHalDataCallResult(result14));
 
         // Test V1.5 SetupDataCallResult
         android.hardware.radio.V1_5.SetupDataCallResult result15 =
@@ -2261,7 +2253,7 @@
                 .setTrafficDescriptors(new ArrayList<>())
                 .build();
 
-        assertEquals(response, RIL.convertDataCallResult(result15));
+        assertEquals(response, RILUtils.convertHalDataCallResult(result15));
 
         // Test V1.6 SetupDataCallResult
         android.hardware.radio.V1_6.SetupDataCallResult result16 =
@@ -2325,7 +2317,7 @@
 
         result16.qosSessions = new ArrayList<>(Arrays.asList(halQosSession));
 
-        EpsQos epsQos = new EpsQos(halEpsQos);
+        EpsQos epsQos = new EpsQos(new Qos.QosBandwidth(4, 7), new Qos.QosBandwidth(5, 8), 4);
         QosBearerFilter qosFilter = new QosBearerFilter(
                 Arrays.asList(
                         new LinkAddress(InetAddresses.parseNumericAddress("122.22.22.22"), 32)),
@@ -2350,7 +2342,7 @@
         android.hardware.radio.V1_6.OptionalOsAppId halOsAppId =
                 new android.hardware.radio.V1_6.OptionalOsAppId();
         android.hardware.radio.V1_6.OsAppId osAppId = new android.hardware.radio.V1_6.OsAppId();
-        osAppId.osAppId = mRILUnderTest.primitiveArrayToArrayList("OS_APP_ID".getBytes());
+        osAppId.osAppId = RILUtils.primitiveArrayToArrayList("OS_APP_ID".getBytes());
         halOsAppId.value(osAppId);
 
         halTrafficDescriptor.dnn = halDnn;
@@ -2386,7 +2378,7 @@
                 .setTrafficDescriptors(trafficDescriptors)
                 .build();
 
-        assertEquals(response, RIL.convertDataCallResult(result16));
+        assertEquals(response, RILUtils.convertHalDataCallResult(result16));
     }
 
     @Test
@@ -2415,8 +2407,7 @@
 
     @Test
     public void testCellInfoTimestamp_1_4() {
-        ArrayList<android.hardware.radio.V1_4.CellInfo> records =
-                new ArrayList<android.hardware.radio.V1_4.CellInfo>();
+        ArrayList<Object> records = new ArrayList<>();
 
         for (int i = 0; i < 5 /* arbitrary */; i++) {
             android.hardware.radio.V1_4.CellInfo record =
@@ -2428,7 +2419,7 @@
 
             records.add(record);
         }
-        List<CellInfo> cil = RIL.convertHalCellInfoList_1_4(records);
+        List<CellInfo> cil = RILUtils.convertHalCellInfoList(records);
 
         // Check that all timestamps are set to a valid number and are equal
         final long ts = cil.get(0).getTimeStamp();
@@ -2440,8 +2431,7 @@
 
     @Test
     public void testCellInfoTimestamp_1_2() {
-        ArrayList<android.hardware.radio.V1_2.CellInfo> records =
-                new ArrayList<android.hardware.radio.V1_2.CellInfo>();
+        ArrayList<Object> records = new ArrayList<>();
 
         for (int i = 0; i < 5 /* arbitrary */; i++) {
             android.hardware.radio.V1_2.CellInfo record =
@@ -2456,7 +2446,7 @@
 
             records.add(record);
         }
-        List<CellInfo> cil = RIL.convertHalCellInfoList_1_2(records);
+        List<CellInfo> cil = RILUtils.convertHalCellInfoList(records);
 
         // Check that all timestamps are set to a valid number and are equal
         final long ts = cil.get(0).getTimeStamp();
@@ -2511,10 +2501,9 @@
         record.timeStamp = TIMESTAMP;
         record.lte.add(lte);
         record.connectionStatus = 0;
-        ArrayList<android.hardware.radio.V1_2.CellInfo> records =
-                new ArrayList<android.hardware.radio.V1_2.CellInfo>();
+        ArrayList<Object> records = new ArrayList<>();
         records.add(record);
-        return RIL.convertHalCellInfoList_1_2(records);
+        return RILUtils.convertHalCellInfoList(records);
     }
 
     private ArrayList<CellInfo> getCellInfoListForGSM(
@@ -2539,11 +2528,10 @@
         record.timeStamp = TIMESTAMP;
         record.gsm.add(cellinfo);
         record.connectionStatus = 0;
-        ArrayList<android.hardware.radio.V1_2.CellInfo> records =
-                new ArrayList<android.hardware.radio.V1_2.CellInfo>();
+        ArrayList<Object> records = new ArrayList<>();
         records.add(record);
 
-        return RIL.convertHalCellInfoList_1_2(records);
+        return RILUtils.convertHalCellInfoList(records);
     }
 
     private static void initializeCellIdentityWcdma_1_2(
@@ -2582,11 +2570,10 @@
         record.timeStamp = TIMESTAMP;
         record.wcdma.add(cellinfo);
         record.connectionStatus = 0;
-        ArrayList<android.hardware.radio.V1_2.CellInfo> records =
-                new ArrayList<android.hardware.radio.V1_2.CellInfo>();
+        ArrayList<Object> records = new ArrayList<>();
         records.add(record);
 
-        return RIL.convertHalCellInfoList_1_2(records);
+        return RILUtils.convertHalCellInfoList(records);
     }
 
     private ArrayList<CellInfo> getCellInfoListForCdma(String alphaLong, String alphaShort) {
@@ -2611,11 +2598,10 @@
         record.timeStamp = TIMESTAMP;
         record.cdma.add(cellinfo);
         record.connectionStatus = 0;
-        ArrayList<android.hardware.radio.V1_2.CellInfo> records =
-                new ArrayList<android.hardware.radio.V1_2.CellInfo>();
+        ArrayList<Object> records = new ArrayList<>();
         records.add(record);
 
-        return RIL.convertHalCellInfoList_1_2(records);
+        return RILUtils.convertHalCellInfoList(records);
     }
 
     @Test
@@ -2750,7 +2736,7 @@
         expected.add(c4);
         expected.add(c5);
 
-        ArrayList<Carrier> result = RIL.createCarrierRestrictionList(carriers);
+        ArrayList<Carrier> result = RILUtils.convertToHalCarrierRestrictionList(carriers);
 
         assertTrue(result.equals(expected));
     }
diff --git a/tests/telephonytests/src/com/android/internal/telephony/SimulatedCommands.java b/tests/telephonytests/src/com/android/internal/telephony/SimulatedCommands.java
index 95e2f06..7669090 100755
--- a/tests/telephonytests/src/com/android/internal/telephony/SimulatedCommands.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/SimulatedCommands.java
@@ -61,7 +61,7 @@
 import com.android.internal.telephony.LastCallFailCause;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneConstants;
-import com.android.internal.telephony.RIL;
+import com.android.internal.telephony.RILUtils;
 import com.android.internal.telephony.RadioCapability;
 import com.android.internal.telephony.SmsResponse;
 import com.android.internal.telephony.UUSInfo;
@@ -69,12 +69,12 @@
 import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
 import com.android.internal.telephony.gsm.SuppServiceNotification;
 import com.android.internal.telephony.uicc.AdnCapacity;
-import com.android.internal.telephony.uicc.ReceivedPhonebookRecords;
-import com.android.internal.telephony.uicc.SimPhonebookRecord;
 import com.android.internal.telephony.uicc.IccCardApplicationStatus.PersoSubState;
 import com.android.internal.telephony.uicc.IccCardStatus;
 import com.android.internal.telephony.uicc.IccIoResult;
 import com.android.internal.telephony.uicc.IccSlotStatus;
+import com.android.internal.telephony.uicc.ReceivedPhonebookRecords;
+import com.android.internal.telephony.uicc.SimPhonebookRecord;
 import com.android.telephony.Rlog;
 
 import java.util.ArrayList;
@@ -1218,7 +1218,7 @@
             }
         }
 
-        DataCallResponse response = RIL.convertDataCallResult(mSetupDataCallResult);
+        DataCallResponse response = RILUtils.convertHalDataCallResult(mSetupDataCallResult);
         if (mDcSuccess) {
             resultSuccess(result, response);
         } else {
diff --git a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataCallResponseTest.java b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataCallResponseTest.java
index d28c2e8..3a0e056 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataCallResponseTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataCallResponseTest.java
@@ -28,6 +28,7 @@
 import android.telephony.data.ApnSetting;
 import android.telephony.data.DataCallResponse;
 import android.telephony.data.EpsQos;
+import android.telephony.data.Qos;
 import android.telephony.data.TrafficDescriptor;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
@@ -56,7 +57,8 @@
                         Arrays.asList(InetAddresses.parseNumericAddress(FAKE_PCSCF_ADDRESS)))
                 .setMtuV4(1440)
                 .setMtuV6(1440)
-                .setDefaultQos(new EpsQos())
+                .setDefaultQos(new EpsQos(
+                        new Qos.QosBandwidth(-1, -1), new Qos.QosBandwidth(-1, -1), -1))
                 .setQosBearerSessions(new ArrayList<>())
                 .setTrafficDescriptors(
                         Arrays.asList(new TrafficDescriptor(FAKE_DNN, FAKE_OS_APP_ID)))
diff --git a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/QosCallbackTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/QosCallbackTrackerTest.java
index e7c4db4..85ea1b2 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/QosCallbackTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/QosCallbackTrackerTest.java
@@ -16,12 +16,8 @@
 
 package com.android.internal.telephony.dataconnection;
 
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.anyInt;
 import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.times;
@@ -30,13 +26,11 @@
 import android.annotation.NonNull;
 import android.net.InetAddresses;
 import android.net.LinkAddress;
-import android.net.Network;
-import android.net.NetworkAgent;
 import android.telephony.data.EpsBearerQosSessionAttributes;
 import android.telephony.data.EpsQos;
+import android.telephony.data.Qos;
 import android.telephony.data.QosBearerFilter;
 import android.telephony.data.QosBearerSession;
-
 import android.test.suitebuilder.annotation.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
@@ -47,15 +41,12 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 
-import java.lang.reflect.Field;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.List;
 
 @RunWith(AndroidTestingRunner.class)
 @TestableLooper.RunWithLooper
@@ -118,7 +109,8 @@
         halEpsQos.uplink.maxBitrateKbps = ulMbr;
         halEpsQos.uplink.guaranteedBitrateKbps = ulGbr;
 
-        return new EpsQos(halEpsQos);
+        return new EpsQos(
+                new Qos.QosBandwidth(dlMbr, dlGbr), new Qos.QosBandwidth(ulMbr, ulGbr), 4);
     }
 
     private QosBearerFilter createIpv4QosFilter(String localAddress,
@@ -126,7 +118,7 @@
         return new QosBearerFilter(
                 Arrays.asList(
                         new LinkAddress(InetAddresses.parseNumericAddress(localAddress), 32)),
-                new ArrayList<LinkAddress>(), localPort, null, QosBearerFilter.QOS_PROTOCOL_TCP,
+                new ArrayList<>(), localPort, null, QosBearerFilter.QOS_PROTOCOL_TCP,
                 7, 987, 678, QosBearerFilter.QOS_FILTER_DIRECTION_BIDIRECTIONAL, precedence);
     }