Home | History | Annotate | Download | only in telephony
      1 /*
      2  * Copyright (C) 2006 The Android Open Source Project
      3  * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 package com.android.internal.telephony;
     19 
     20 import static com.android.internal.telephony.RILConstants.*;
     21 import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;
     22 import static android.telephony.TelephonyManager.NETWORK_TYPE_EDGE;
     23 import static android.telephony.TelephonyManager.NETWORK_TYPE_GPRS;
     24 import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS;
     25 import static android.telephony.TelephonyManager.NETWORK_TYPE_HSDPA;
     26 import static android.telephony.TelephonyManager.NETWORK_TYPE_HSUPA;
     27 import static android.telephony.TelephonyManager.NETWORK_TYPE_HSPA;
     28 
     29 import android.content.BroadcastReceiver;
     30 import android.content.Context;
     31 import android.content.Intent;
     32 import android.content.IntentFilter;
     33 import android.net.ConnectivityManager;
     34 import android.net.LocalSocket;
     35 import android.net.LocalSocketAddress;
     36 import android.os.AsyncResult;
     37 import android.os.Handler;
     38 import android.os.HandlerThread;
     39 import android.os.Looper;
     40 import android.os.Message;
     41 import android.os.Parcel;
     42 import android.os.PowerManager;
     43 import android.os.SystemProperties;
     44 import android.os.PowerManager.WakeLock;
     45 import android.telephony.CellInfo;
     46 import android.telephony.NeighboringCellInfo;
     47 import android.telephony.PhoneNumberUtils;
     48 import android.telephony.Rlog;
     49 import android.telephony.SignalStrength;
     50 import android.telephony.SmsManager;
     51 import android.telephony.SmsMessage;
     52 import android.text.TextUtils;
     53 import android.util.SparseArray;
     54 
     55 import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
     56 import com.android.internal.telephony.gsm.SuppServiceNotification;
     57 import com.android.internal.telephony.uicc.IccCardApplicationStatus;
     58 import com.android.internal.telephony.uicc.IccCardStatus;
     59 import com.android.internal.telephony.uicc.IccIoResult;
     60 import com.android.internal.telephony.uicc.IccRefreshResponse;
     61 import com.android.internal.telephony.uicc.IccUtils;
     62 import com.android.internal.telephony.cdma.CdmaCallWaitingNotification;
     63 import com.android.internal.telephony.cdma.CdmaInformationRecords;
     64 import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo;
     65 import com.android.internal.telephony.dataconnection.DcFailCause;
     66 import com.android.internal.telephony.dataconnection.DataCallResponse;
     67 
     68 import java.io.ByteArrayInputStream;
     69 import java.io.DataInputStream;
     70 import java.io.FileDescriptor;
     71 import java.io.IOException;
     72 import java.io.InputStream;
     73 import java.io.PrintWriter;
     74 import java.util.ArrayList;
     75 import java.util.Collections;
     76 import java.util.concurrent.atomic.AtomicBoolean;
     77 import java.util.concurrent.atomic.AtomicInteger;
     78 import java.util.Random;
     79 
     80 /**
     81  * {@hide}
     82  */
     83 class RILRequest {
     84     static final String LOG_TAG = "RilRequest";
     85 
     86     //***** Class Variables
     87     static Random sRandom = new Random();
     88     static AtomicInteger sNextSerial = new AtomicInteger(0);
     89     private static Object sPoolSync = new Object();
     90     private static RILRequest sPool = null;
     91     private static int sPoolSize = 0;
     92     private static final int MAX_POOL_SIZE = 4;
     93 
     94     //***** Instance Variables
     95     int mSerial;
     96     int mRequest;
     97     Message mResult;
     98     Parcel mParcel;
     99     RILRequest mNext;
    100 
    101     /**
    102      * Retrieves a new RILRequest instance from the pool.
    103      *
    104      * @param request RIL_REQUEST_*
    105      * @param result sent when operation completes
    106      * @return a RILRequest instance from the pool.
    107      */
    108     static RILRequest obtain(int request, Message result) {
    109         RILRequest rr = null;
    110 
    111         synchronized(sPoolSync) {
    112             if (sPool != null) {
    113                 rr = sPool;
    114                 sPool = rr.mNext;
    115                 rr.mNext = null;
    116                 sPoolSize--;
    117             }
    118         }
    119 
    120         if (rr == null) {
    121             rr = new RILRequest();
    122         }
    123 
    124         rr.mSerial = sNextSerial.getAndIncrement();
    125 
    126         rr.mRequest = request;
    127         rr.mResult = result;
    128         rr.mParcel = Parcel.obtain();
    129 
    130         if (result != null && result.getTarget() == null) {
    131             throw new NullPointerException("Message target must not be null");
    132         }
    133 
    134         // first elements in any RIL Parcel
    135         rr.mParcel.writeInt(request);
    136         rr.mParcel.writeInt(rr.mSerial);
    137 
    138         return rr;
    139     }
    140 
    141     /**
    142      * Returns a RILRequest instance to the pool.
    143      *
    144      * Note: This should only be called once per use.
    145      */
    146     void release() {
    147         synchronized (sPoolSync) {
    148             if (sPoolSize < MAX_POOL_SIZE) {
    149                 mNext = sPool;
    150                 sPool = this;
    151                 sPoolSize++;
    152                 mResult = null;
    153             }
    154         }
    155     }
    156 
    157     private RILRequest() {
    158     }
    159 
    160     static void
    161     resetSerial() {
    162         // use a random so that on recovery we probably don't mix old requests
    163         // with new.
    164         sNextSerial.set(sRandom.nextInt());
    165     }
    166 
    167     String
    168     serialString() {
    169         //Cheesy way to do %04d
    170         StringBuilder sb = new StringBuilder(8);
    171         String sn;
    172 
    173         long adjustedSerial = (((long)mSerial) - Integer.MIN_VALUE)%10000;
    174 
    175         sn = Long.toString(adjustedSerial);
    176 
    177         //sb.append("J[");
    178         sb.append('[');
    179         for (int i = 0, s = sn.length() ; i < 4 - s; i++) {
    180             sb.append('0');
    181         }
    182 
    183         sb.append(sn);
    184         sb.append(']');
    185         return sb.toString();
    186     }
    187 
    188     void
    189     onError(int error, Object ret) {
    190         CommandException ex;
    191 
    192         ex = CommandException.fromRilErrno(error);
    193 
    194         if (RIL.RILJ_LOGD) Rlog.d(LOG_TAG, serialString() + "< "
    195             + RIL.requestToString(mRequest)
    196             + " error: " + ex);
    197 
    198         if (mResult != null) {
    199             AsyncResult.forMessage(mResult, ret, ex);
    200             mResult.sendToTarget();
    201         }
    202 
    203         if (mParcel != null) {
    204             mParcel.recycle();
    205             mParcel = null;
    206         }
    207     }
    208 }
    209 
    210 
    211 /**
    212  * RIL implementation of the CommandsInterface.
    213  *
    214  * {@hide}
    215  */
    216 public final class RIL extends BaseCommands implements CommandsInterface {
    217     static final String RILJ_LOG_TAG = "RILJ";
    218     static final boolean RILJ_LOGD = true;
    219     static final boolean RILJ_LOGV = false; // STOPSHIP if true
    220 
    221     /**
    222      * Wake lock timeout should be longer than the longest timeout in
    223      * the vendor ril.
    224      */
    225     private static final int DEFAULT_WAKE_LOCK_TIMEOUT = 60000;
    226 
    227     //***** Instance Variables
    228 
    229     LocalSocket mSocket;
    230     HandlerThread mSenderThread;
    231     RILSender mSender;
    232     Thread mReceiverThread;
    233     RILReceiver mReceiver;
    234     WakeLock mWakeLock;
    235     final int mWakeLockTimeout;
    236     // The number of wakelock requests currently active.  Don't release the lock
    237     // until dec'd to 0
    238     int mWakeLockCount;
    239 
    240     SparseArray<RILRequest> mRequestList = new SparseArray<RILRequest>();
    241 
    242     Object     mLastNITZTimeInfo;
    243 
    244     // When we are testing emergency calls
    245     AtomicBoolean mTestingEmergencyCall = new AtomicBoolean(false);
    246 
    247     //***** Events
    248 
    249     static final int EVENT_SEND                 = 1;
    250     static final int EVENT_WAKE_LOCK_TIMEOUT    = 2;
    251 
    252     //***** Constants
    253 
    254     // match with constant in ril.cpp
    255     static final int RIL_MAX_COMMAND_BYTES = (8 * 1024);
    256     static final int RESPONSE_SOLICITED = 0;
    257     static final int RESPONSE_UNSOLICITED = 1;
    258 
    259     static final String SOCKET_NAME_RIL = "rild";
    260 
    261     static final int SOCKET_OPEN_RETRY_MILLIS = 4 * 1000;
    262 
    263     // The number of the required config values for broadcast SMS stored in the C struct
    264     // RIL_CDMA_BroadcastServiceInfo
    265     private static final int CDMA_BSI_NO_OF_INTS_STRUCT = 3;
    266 
    267     private static final int CDMA_BROADCAST_SMS_NO_OF_SERVICE_CATEGORIES = 31;
    268 
    269     BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
    270         @Override
    271         public void onReceive(Context context, Intent intent) {
    272             if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
    273                 sendScreenState(true);
    274             } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
    275                 sendScreenState(false);
    276             } else {
    277                 Rlog.w(RILJ_LOG_TAG, "RIL received unexpected Intent: " + intent.getAction());
    278             }
    279         }
    280     };
    281 
    282     class RILSender extends Handler implements Runnable {
    283         public RILSender(Looper looper) {
    284             super(looper);
    285         }
    286 
    287         // Only allocated once
    288         byte[] dataLength = new byte[4];
    289 
    290         //***** Runnable implementation
    291         @Override
    292         public void
    293         run() {
    294             //setup if needed
    295         }
    296 
    297 
    298         //***** Handler implementation
    299         @Override public void
    300         handleMessage(Message msg) {
    301             RILRequest rr = (RILRequest)(msg.obj);
    302             RILRequest req = null;
    303 
    304             switch (msg.what) {
    305                 case EVENT_SEND:
    306                     try {
    307                         LocalSocket s;
    308 
    309                         s = mSocket;
    310 
    311                         if (s == null) {
    312                             rr.onError(RADIO_NOT_AVAILABLE, null);
    313                             rr.release();
    314                             decrementWakeLock();
    315                             return;
    316                         }
    317 
    318                         synchronized (mRequestList) {
    319                             mRequestList.append(rr.mSerial, rr);
    320                         }
    321 
    322                         byte[] data;
    323 
    324                         data = rr.mParcel.marshall();
    325                         rr.mParcel.recycle();
    326                         rr.mParcel = null;
    327 
    328                         if (data.length > RIL_MAX_COMMAND_BYTES) {
    329                             throw new RuntimeException(
    330                                     "Parcel larger than max bytes allowed! "
    331                                                           + data.length);
    332                         }
    333 
    334                         // parcel length in big endian
    335                         dataLength[0] = dataLength[1] = 0;
    336                         dataLength[2] = (byte)((data.length >> 8) & 0xff);
    337                         dataLength[3] = (byte)((data.length) & 0xff);
    338 
    339                         //Rlog.v(RILJ_LOG_TAG, "writing packet: " + data.length + " bytes");
    340 
    341                         s.getOutputStream().write(dataLength);
    342                         s.getOutputStream().write(data);
    343                     } catch (IOException ex) {
    344                         Rlog.e(RILJ_LOG_TAG, "IOException", ex);
    345                         req = findAndRemoveRequestFromList(rr.mSerial);
    346                         // make sure this request has not already been handled,
    347                         // eg, if RILReceiver cleared the list.
    348                         if (req != null) {
    349                             rr.onError(RADIO_NOT_AVAILABLE, null);
    350                             rr.release();
    351                             decrementWakeLock();
    352                         }
    353                     } catch (RuntimeException exc) {
    354                         Rlog.e(RILJ_LOG_TAG, "Uncaught exception ", exc);
    355                         req = findAndRemoveRequestFromList(rr.mSerial);
    356                         // make sure this request has not already been handled,
    357                         // eg, if RILReceiver cleared the list.
    358                         if (req != null) {
    359                             rr.onError(GENERIC_FAILURE, null);
    360                             rr.release();
    361                             decrementWakeLock();
    362                         }
    363                     }
    364 
    365                     break;
    366 
    367                 case EVENT_WAKE_LOCK_TIMEOUT:
    368                     // Haven't heard back from the last request.  Assume we're
    369                     // not getting a response and  release the wake lock.
    370 
    371                     // The timer of WAKE_LOCK_TIMEOUT is reset with each
    372                     // new send request. So when WAKE_LOCK_TIMEOUT occurs
    373                     // all requests in mRequestList already waited at
    374                     // least DEFAULT_WAKE_LOCK_TIMEOUT but no response.
    375                     //
    376                     // Note: Keep mRequestList so that delayed response
    377                     // can still be handled when response finally comes.
    378 
    379                     synchronized (mRequestList) {
    380                         if (clearWakeLock()) {
    381                             if (RILJ_LOGD) {
    382                                 int count = mRequestList.size();
    383                                 Rlog.d(RILJ_LOG_TAG, "WAKE_LOCK_TIMEOUT " +
    384                                         " mRequestList=" + count);
    385                                 for (int i = 0; i < count; i++) {
    386                                     rr = mRequestList.valueAt(i);
    387                                     Rlog.d(RILJ_LOG_TAG, i + ": [" + rr.mSerial + "] "
    388                                             + requestToString(rr.mRequest));
    389                                 }
    390                             }
    391                         }
    392                     }
    393                     break;
    394             }
    395         }
    396     }
    397 
    398     /**
    399      * Reads in a single RIL message off the wire. A RIL message consists
    400      * of a 4-byte little-endian length and a subsequent series of bytes.
    401      * The final message (length header omitted) is read into
    402      * <code>buffer</code> and the length of the final message (less header)
    403      * is returned. A return value of -1 indicates end-of-stream.
    404      *
    405      * @param is non-null; Stream to read from
    406      * @param buffer Buffer to fill in. Must be as large as maximum
    407      * message size, or an ArrayOutOfBounds exception will be thrown.
    408      * @return Length of message less header, or -1 on end of stream.
    409      * @throws IOException
    410      */
    411     private static int readRilMessage(InputStream is, byte[] buffer)
    412             throws IOException {
    413         int countRead;
    414         int offset;
    415         int remaining;
    416         int messageLength;
    417 
    418         // First, read in the length of the message
    419         offset = 0;
    420         remaining = 4;
    421         do {
    422             countRead = is.read(buffer, offset, remaining);
    423 
    424             if (countRead < 0 ) {
    425                 Rlog.e(RILJ_LOG_TAG, "Hit EOS reading message length");
    426                 return -1;
    427             }
    428 
    429             offset += countRead;
    430             remaining -= countRead;
    431         } while (remaining > 0);
    432 
    433         messageLength = ((buffer[0] & 0xff) << 24)
    434                 | ((buffer[1] & 0xff) << 16)
    435                 | ((buffer[2] & 0xff) << 8)
    436                 | (buffer[3] & 0xff);
    437 
    438         // Then, re-use the buffer and read in the message itself
    439         offset = 0;
    440         remaining = messageLength;
    441         do {
    442             countRead = is.read(buffer, offset, remaining);
    443 
    444             if (countRead < 0 ) {
    445                 Rlog.e(RILJ_LOG_TAG, "Hit EOS reading message.  messageLength=" + messageLength
    446                         + " remaining=" + remaining);
    447                 return -1;
    448             }
    449 
    450             offset += countRead;
    451             remaining -= countRead;
    452         } while (remaining > 0);
    453 
    454         return messageLength;
    455     }
    456 
    457     class RILReceiver implements Runnable {
    458         byte[] buffer;
    459 
    460         RILReceiver() {
    461             buffer = new byte[RIL_MAX_COMMAND_BYTES];
    462         }
    463 
    464         @Override
    465         public void
    466         run() {
    467             int retryCount = 0;
    468 
    469             try {for (;;) {
    470                 LocalSocket s = null;
    471                 LocalSocketAddress l;
    472 
    473                 try {
    474                     s = new LocalSocket();
    475                     l = new LocalSocketAddress(SOCKET_NAME_RIL,
    476                             LocalSocketAddress.Namespace.RESERVED);
    477                     s.connect(l);
    478                 } catch (IOException ex){
    479                     try {
    480                         if (s != null) {
    481                             s.close();
    482                         }
    483                     } catch (IOException ex2) {
    484                         //ignore failure to close after failure to connect
    485                     }
    486 
    487                     // don't print an error message after the the first time
    488                     // or after the 8th time
    489 
    490                     if (retryCount == 8) {
    491                         Rlog.e (RILJ_LOG_TAG,
    492                             "Couldn't find '" + SOCKET_NAME_RIL
    493                             + "' socket after " + retryCount
    494                             + " times, continuing to retry silently");
    495                     } else if (retryCount > 0 && retryCount < 8) {
    496                         Rlog.i (RILJ_LOG_TAG,
    497                             "Couldn't find '" + SOCKET_NAME_RIL
    498                             + "' socket; retrying after timeout");
    499                     }
    500 
    501                     try {
    502                         Thread.sleep(SOCKET_OPEN_RETRY_MILLIS);
    503                     } catch (InterruptedException er) {
    504                     }
    505 
    506                     retryCount++;
    507                     continue;
    508                 }
    509 
    510                 retryCount = 0;
    511 
    512                 mSocket = s;
    513                 Rlog.i(RILJ_LOG_TAG, "Connected to '" + SOCKET_NAME_RIL + "' socket");
    514 
    515                 int length = 0;
    516                 try {
    517                     InputStream is = mSocket.getInputStream();
    518 
    519                     for (;;) {
    520                         Parcel p;
    521 
    522                         length = readRilMessage(is, buffer);
    523 
    524                         if (length < 0) {
    525                             // End-of-stream reached
    526                             break;
    527                         }
    528 
    529                         p = Parcel.obtain();
    530                         p.unmarshall(buffer, 0, length);
    531                         p.setDataPosition(0);
    532 
    533                         //Rlog.v(RILJ_LOG_TAG, "Read packet: " + length + " bytes");
    534 
    535                         processResponse(p);
    536                         p.recycle();
    537                     }
    538                 } catch (java.io.IOException ex) {
    539                     Rlog.i(RILJ_LOG_TAG, "'" + SOCKET_NAME_RIL + "' socket closed",
    540                           ex);
    541                 } catch (Throwable tr) {
    542                     Rlog.e(RILJ_LOG_TAG, "Uncaught exception read length=" + length +
    543                         "Exception:" + tr.toString());
    544                 }
    545 
    546                 Rlog.i(RILJ_LOG_TAG, "Disconnected from '" + SOCKET_NAME_RIL
    547                       + "' socket");
    548 
    549                 setRadioState (RadioState.RADIO_UNAVAILABLE);
    550 
    551                 try {
    552                     mSocket.close();
    553                 } catch (IOException ex) {
    554                 }
    555 
    556                 mSocket = null;
    557                 RILRequest.resetSerial();
    558 
    559                 // Clear request list on close
    560                 clearRequestList(RADIO_NOT_AVAILABLE, false);
    561             }} catch (Throwable tr) {
    562                 Rlog.e(RILJ_LOG_TAG,"Uncaught exception", tr);
    563             }
    564 
    565             /* We're disconnected so we don't know the ril version */
    566             notifyRegistrantsRilConnectionChanged(-1);
    567         }
    568     }
    569 
    570 
    571 
    572     //***** Constructors
    573 
    574     public RIL(Context context, int preferredNetworkType, int cdmaSubscription) {
    575         super(context);
    576         if (RILJ_LOGD) {
    577             riljLog("RIL(context, preferredNetworkType=" + preferredNetworkType +
    578                     " cdmaSubscription=" + cdmaSubscription + ")");
    579         }
    580 
    581         mCdmaSubscription  = cdmaSubscription;
    582         mPreferredNetworkType = preferredNetworkType;
    583         mPhoneType = RILConstants.NO_PHONE;
    584 
    585         PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
    586         mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, RILJ_LOG_TAG);
    587         mWakeLock.setReferenceCounted(false);
    588         mWakeLockTimeout = SystemProperties.getInt(TelephonyProperties.PROPERTY_WAKE_LOCK_TIMEOUT,
    589                 DEFAULT_WAKE_LOCK_TIMEOUT);
    590         mWakeLockCount = 0;
    591 
    592         mSenderThread = new HandlerThread("RILSender");
    593         mSenderThread.start();
    594 
    595         Looper looper = mSenderThread.getLooper();
    596         mSender = new RILSender(looper);
    597 
    598         ConnectivityManager cm = (ConnectivityManager)context.getSystemService(
    599                 Context.CONNECTIVITY_SERVICE);
    600         if (cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE) == false) {
    601             riljLog("Not starting RILReceiver: wifi-only");
    602         } else {
    603             riljLog("Starting RILReceiver");
    604             mReceiver = new RILReceiver();
    605             mReceiverThread = new Thread(mReceiver, "RILReceiver");
    606             mReceiverThread.start();
    607 
    608             IntentFilter filter = new IntentFilter();
    609             filter.addAction(Intent.ACTION_SCREEN_ON);
    610             filter.addAction(Intent.ACTION_SCREEN_OFF);
    611             context.registerReceiver(mIntentReceiver, filter);
    612         }
    613     }
    614 
    615     //***** CommandsInterface implementation
    616 
    617     @Override
    618     public void getVoiceRadioTechnology(Message result) {
    619         RILRequest rr = RILRequest.obtain(RIL_REQUEST_VOICE_RADIO_TECH, result);
    620 
    621         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    622 
    623         send(rr);
    624     }
    625 
    626 
    627     public void getImsRegistrationState(Message result) {
    628         RILRequest rr = RILRequest.obtain(RIL_REQUEST_IMS_REGISTRATION_STATE, result);
    629 
    630         if (RILJ_LOGD) {
    631             riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    632         }
    633         send(rr);
    634     }
    635 
    636     @Override public void
    637     setOnNITZTime(Handler h, int what, Object obj) {
    638         super.setOnNITZTime(h, what, obj);
    639 
    640         // Send the last NITZ time if we have it
    641         if (mLastNITZTimeInfo != null) {
    642             mNITZTimeRegistrant
    643                 .notifyRegistrant(
    644                     new AsyncResult (null, mLastNITZTimeInfo, null));
    645             mLastNITZTimeInfo = null;
    646         }
    647     }
    648 
    649     @Override
    650     public void
    651     getIccCardStatus(Message result) {
    652         //Note: This RIL request has not been renamed to ICC,
    653         //       but this request is also valid for SIM and RUIM
    654         RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_SIM_STATUS, result);
    655 
    656         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    657 
    658         send(rr);
    659     }
    660 
    661     @Override public void
    662     supplyIccPin(String pin, Message result) {
    663         supplyIccPinForApp(pin, null, result);
    664     }
    665 
    666     @Override public void
    667     supplyIccPinForApp(String pin, String aid, Message result) {
    668         //Note: This RIL request has not been renamed to ICC,
    669         //       but this request is also valid for SIM and RUIM
    670         RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PIN, result);
    671 
    672         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    673 
    674         rr.mParcel.writeInt(2);
    675         rr.mParcel.writeString(pin);
    676         rr.mParcel.writeString(aid);
    677 
    678         send(rr);
    679     }
    680 
    681     @Override public void
    682     supplyIccPuk(String puk, String newPin, Message result) {
    683         supplyIccPukForApp(puk, newPin, null, result);
    684     }
    685 
    686     @Override public void
    687     supplyIccPukForApp(String puk, String newPin, String aid, Message result) {
    688         //Note: This RIL request has not been renamed to ICC,
    689         //       but this request is also valid for SIM and RUIM
    690         RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PUK, result);
    691 
    692         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    693 
    694         rr.mParcel.writeInt(3);
    695         rr.mParcel.writeString(puk);
    696         rr.mParcel.writeString(newPin);
    697         rr.mParcel.writeString(aid);
    698 
    699         send(rr);
    700     }
    701 
    702     @Override public void
    703     supplyIccPin2(String pin, Message result) {
    704         supplyIccPin2ForApp(pin, null, result);
    705     }
    706 
    707     @Override public void
    708     supplyIccPin2ForApp(String pin, String aid, Message result) {
    709         //Note: This RIL request has not been renamed to ICC,
    710         //       but this request is also valid for SIM and RUIM
    711         RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PIN2, result);
    712 
    713         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    714 
    715         rr.mParcel.writeInt(2);
    716         rr.mParcel.writeString(pin);
    717         rr.mParcel.writeString(aid);
    718 
    719         send(rr);
    720     }
    721 
    722     @Override public void
    723     supplyIccPuk2(String puk2, String newPin2, Message result) {
    724         supplyIccPuk2ForApp(puk2, newPin2, null, result);
    725     }
    726 
    727     @Override public void
    728     supplyIccPuk2ForApp(String puk, String newPin2, String aid, Message result) {
    729         //Note: This RIL request has not been renamed to ICC,
    730         //       but this request is also valid for SIM and RUIM
    731         RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_SIM_PUK2, result);
    732 
    733         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    734 
    735         rr.mParcel.writeInt(3);
    736         rr.mParcel.writeString(puk);
    737         rr.mParcel.writeString(newPin2);
    738         rr.mParcel.writeString(aid);
    739 
    740         send(rr);
    741     }
    742 
    743     @Override public void
    744     changeIccPin(String oldPin, String newPin, Message result) {
    745         changeIccPinForApp(oldPin, newPin, null, result);
    746     }
    747 
    748     @Override public void
    749     changeIccPinForApp(String oldPin, String newPin, String aid, Message result) {
    750         //Note: This RIL request has not been renamed to ICC,
    751         //       but this request is also valid for SIM and RUIM
    752         RILRequest rr = RILRequest.obtain(RIL_REQUEST_CHANGE_SIM_PIN, result);
    753 
    754         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    755 
    756         rr.mParcel.writeInt(3);
    757         rr.mParcel.writeString(oldPin);
    758         rr.mParcel.writeString(newPin);
    759         rr.mParcel.writeString(aid);
    760 
    761         send(rr);
    762     }
    763 
    764     @Override public void
    765     changeIccPin2(String oldPin2, String newPin2, Message result) {
    766         changeIccPin2ForApp(oldPin2, newPin2, null, result);
    767     }
    768 
    769     @Override public void
    770     changeIccPin2ForApp(String oldPin2, String newPin2, String aid, Message result) {
    771         //Note: This RIL request has not been renamed to ICC,
    772         //       but this request is also valid for SIM and RUIM
    773         RILRequest rr = RILRequest.obtain(RIL_REQUEST_CHANGE_SIM_PIN2, result);
    774 
    775         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    776 
    777         rr.mParcel.writeInt(3);
    778         rr.mParcel.writeString(oldPin2);
    779         rr.mParcel.writeString(newPin2);
    780         rr.mParcel.writeString(aid);
    781 
    782         send(rr);
    783     }
    784 
    785     @Override
    786     public void
    787     changeBarringPassword(String facility, String oldPwd, String newPwd, Message result) {
    788         RILRequest rr = RILRequest.obtain(RIL_REQUEST_CHANGE_BARRING_PASSWORD, result);
    789 
    790         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    791 
    792         rr.mParcel.writeInt(3);
    793         rr.mParcel.writeString(facility);
    794         rr.mParcel.writeString(oldPwd);
    795         rr.mParcel.writeString(newPwd);
    796 
    797         send(rr);
    798     }
    799 
    800     @Override
    801     public void
    802     supplyNetworkDepersonalization(String netpin, Message result) {
    803         RILRequest rr = RILRequest.obtain(RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, result);
    804 
    805         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    806 
    807         rr.mParcel.writeInt(1);
    808         rr.mParcel.writeString(netpin);
    809 
    810         send(rr);
    811     }
    812 
    813     @Override
    814     public void
    815     getCurrentCalls (Message result) {
    816         RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_CURRENT_CALLS, result);
    817 
    818         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    819 
    820         send(rr);
    821     }
    822 
    823     @Override
    824     @Deprecated public void
    825     getPDPContextList(Message result) {
    826         getDataCallList(result);
    827     }
    828 
    829     @Override
    830     public void
    831     getDataCallList(Message result) {
    832         RILRequest rr = RILRequest.obtain(RIL_REQUEST_DATA_CALL_LIST, result);
    833 
    834         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    835 
    836         send(rr);
    837     }
    838 
    839     @Override
    840     public void
    841     dial (String address, int clirMode, Message result) {
    842         dial(address, clirMode, null, result);
    843     }
    844 
    845     @Override
    846     public void
    847     dial(String address, int clirMode, UUSInfo uusInfo, Message result) {
    848         RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);
    849 
    850         rr.mParcel.writeString(address);
    851         rr.mParcel.writeInt(clirMode);
    852 
    853         if (uusInfo == null) {
    854             rr.mParcel.writeInt(0); // UUS information is absent
    855         } else {
    856             rr.mParcel.writeInt(1); // UUS information is present
    857             rr.mParcel.writeInt(uusInfo.getType());
    858             rr.mParcel.writeInt(uusInfo.getDcs());
    859             rr.mParcel.writeByteArray(uusInfo.getUserData());
    860         }
    861 
    862         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    863 
    864         send(rr);
    865     }
    866 
    867     @Override
    868     public void
    869     getIMSI(Message result) {
    870         getIMSIForApp(null, result);
    871     }
    872 
    873     @Override
    874     public void
    875     getIMSIForApp(String aid, Message result) {
    876         RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_IMSI, result);
    877 
    878         rr.mParcel.writeInt(1);
    879         rr.mParcel.writeString(aid);
    880 
    881         if (RILJ_LOGD) riljLog(rr.serialString() +
    882                               "> getIMSI: " + requestToString(rr.mRequest)
    883                               + " aid: " + aid);
    884 
    885         send(rr);
    886     }
    887 
    888     @Override
    889     public void
    890     getIMEI(Message result) {
    891         RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_IMEI, result);
    892 
    893         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    894 
    895         send(rr);
    896     }
    897 
    898     @Override
    899     public void
    900     getIMEISV(Message result) {
    901         RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_IMEISV, result);
    902 
    903         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    904 
    905         send(rr);
    906     }
    907 
    908 
    909     @Override
    910     public void
    911     hangupConnection (int gsmIndex, Message result) {
    912         if (RILJ_LOGD) riljLog("hangupConnection: gsmIndex=" + gsmIndex);
    913 
    914         RILRequest rr = RILRequest.obtain(RIL_REQUEST_HANGUP, result);
    915 
    916         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " " +
    917                 gsmIndex);
    918 
    919         rr.mParcel.writeInt(1);
    920         rr.mParcel.writeInt(gsmIndex);
    921 
    922         send(rr);
    923     }
    924 
    925     @Override
    926     public void
    927     hangupWaitingOrBackground (Message result) {
    928         RILRequest rr = RILRequest.obtain(RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND,
    929                                         result);
    930 
    931         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    932 
    933         send(rr);
    934     }
    935 
    936     @Override
    937     public void
    938     hangupForegroundResumeBackground (Message result) {
    939         RILRequest rr
    940                 = RILRequest.obtain(
    941                         RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND,
    942                                         result);
    943         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    944 
    945         send(rr);
    946     }
    947 
    948     @Override
    949     public void
    950     switchWaitingOrHoldingAndActive (Message result) {
    951         RILRequest rr
    952                 = RILRequest.obtain(
    953                         RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE,
    954                                         result);
    955         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    956 
    957         send(rr);
    958     }
    959 
    960     @Override
    961     public void
    962     conference (Message result) {
    963         RILRequest rr
    964                 = RILRequest.obtain(RIL_REQUEST_CONFERENCE, result);
    965 
    966         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    967 
    968         send(rr);
    969     }
    970 
    971 
    972     @Override
    973     public void setPreferredVoicePrivacy(boolean enable, Message result) {
    974         RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE,
    975                 result);
    976 
    977         rr.mParcel.writeInt(1);
    978         rr.mParcel.writeInt(enable ? 1:0);
    979 
    980         send(rr);
    981     }
    982 
    983     @Override
    984     public void getPreferredVoicePrivacy(Message result) {
    985         RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE,
    986                 result);
    987         send(rr);
    988     }
    989 
    990     @Override
    991     public void
    992     separateConnection (int gsmIndex, Message result) {
    993         RILRequest rr
    994                 = RILRequest.obtain(RIL_REQUEST_SEPARATE_CONNECTION, result);
    995 
    996         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
    997                             + " " + gsmIndex);
    998 
    999         rr.mParcel.writeInt(1);
   1000         rr.mParcel.writeInt(gsmIndex);
   1001 
   1002         send(rr);
   1003     }
   1004 
   1005     @Override
   1006     public void
   1007     acceptCall (Message result) {
   1008         RILRequest rr
   1009                 = RILRequest.obtain(RIL_REQUEST_ANSWER, result);
   1010 
   1011         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1012 
   1013         send(rr);
   1014     }
   1015 
   1016     @Override
   1017     public void
   1018     rejectCall (Message result) {
   1019         RILRequest rr
   1020                 = RILRequest.obtain(RIL_REQUEST_UDUB, result);
   1021 
   1022         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1023 
   1024         send(rr);
   1025     }
   1026 
   1027     @Override
   1028     public void
   1029     explicitCallTransfer (Message result) {
   1030         RILRequest rr
   1031                 = RILRequest.obtain(RIL_REQUEST_EXPLICIT_CALL_TRANSFER, result);
   1032 
   1033         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1034 
   1035         send(rr);
   1036     }
   1037 
   1038     @Override
   1039     public void
   1040     getLastCallFailCause (Message result) {
   1041         RILRequest rr
   1042                 = RILRequest.obtain(RIL_REQUEST_LAST_CALL_FAIL_CAUSE, result);
   1043 
   1044         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1045 
   1046         send(rr);
   1047     }
   1048 
   1049     /**
   1050      * @deprecated
   1051      */
   1052     @Deprecated
   1053     @Override
   1054     public void
   1055     getLastPdpFailCause (Message result) {
   1056         getLastDataCallFailCause (result);
   1057     }
   1058 
   1059     /**
   1060      * The preferred new alternative to getLastPdpFailCause
   1061      */
   1062     @Override
   1063     public void
   1064     getLastDataCallFailCause (Message result) {
   1065         RILRequest rr
   1066                 = RILRequest.obtain(RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE, result);
   1067 
   1068         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1069 
   1070         send(rr);
   1071     }
   1072 
   1073     @Override
   1074     public void
   1075     setMute (boolean enableMute, Message response) {
   1076         RILRequest rr
   1077                 = RILRequest.obtain(RIL_REQUEST_SET_MUTE, response);
   1078 
   1079         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1080                             + " " + enableMute);
   1081 
   1082         rr.mParcel.writeInt(1);
   1083         rr.mParcel.writeInt(enableMute ? 1 : 0);
   1084 
   1085         send(rr);
   1086     }
   1087 
   1088     @Override
   1089     public void
   1090     getMute (Message response) {
   1091         RILRequest rr
   1092                 = RILRequest.obtain(RIL_REQUEST_GET_MUTE, response);
   1093 
   1094         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1095 
   1096         send(rr);
   1097     }
   1098 
   1099     @Override
   1100     public void
   1101     getSignalStrength (Message result) {
   1102         RILRequest rr
   1103                 = RILRequest.obtain(RIL_REQUEST_SIGNAL_STRENGTH, result);
   1104 
   1105         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1106 
   1107         send(rr);
   1108     }
   1109 
   1110     @Override
   1111     public void
   1112     getVoiceRegistrationState (Message result) {
   1113         RILRequest rr
   1114                 = RILRequest.obtain(RIL_REQUEST_VOICE_REGISTRATION_STATE, result);
   1115 
   1116         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1117 
   1118         send(rr);
   1119     }
   1120 
   1121     @Override
   1122     public void
   1123     getDataRegistrationState (Message result) {
   1124         RILRequest rr
   1125                 = RILRequest.obtain(RIL_REQUEST_DATA_REGISTRATION_STATE, result);
   1126 
   1127         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1128 
   1129         send(rr);
   1130     }
   1131 
   1132     @Override
   1133     public void
   1134     getOperator(Message result) {
   1135         RILRequest rr
   1136                 = RILRequest.obtain(RIL_REQUEST_OPERATOR, result);
   1137 
   1138         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1139 
   1140         send(rr);
   1141     }
   1142 
   1143     @Override
   1144     public void
   1145     sendDtmf(char c, Message result) {
   1146         RILRequest rr
   1147                 = RILRequest.obtain(RIL_REQUEST_DTMF, result);
   1148 
   1149         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1150 
   1151         rr.mParcel.writeString(Character.toString(c));
   1152 
   1153         send(rr);
   1154     }
   1155 
   1156     @Override
   1157     public void
   1158     startDtmf(char c, Message result) {
   1159         RILRequest rr
   1160                 = RILRequest.obtain(RIL_REQUEST_DTMF_START, result);
   1161 
   1162         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1163 
   1164         rr.mParcel.writeString(Character.toString(c));
   1165 
   1166         send(rr);
   1167     }
   1168 
   1169     @Override
   1170     public void
   1171     stopDtmf(Message result) {
   1172         RILRequest rr
   1173                 = RILRequest.obtain(RIL_REQUEST_DTMF_STOP, result);
   1174 
   1175         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1176 
   1177         send(rr);
   1178     }
   1179 
   1180     @Override
   1181     public void
   1182     sendBurstDtmf(String dtmfString, int on, int off, Message result) {
   1183         RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_BURST_DTMF, result);
   1184 
   1185         rr.mParcel.writeInt(3);
   1186         rr.mParcel.writeString(dtmfString);
   1187         rr.mParcel.writeString(Integer.toString(on));
   1188         rr.mParcel.writeString(Integer.toString(off));
   1189 
   1190         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1191                 + " : " + dtmfString);
   1192 
   1193         send(rr);
   1194     }
   1195 
   1196     private void
   1197     constructGsmSendSmsRilRequest (RILRequest rr, String smscPDU, String pdu) {
   1198         rr.mParcel.writeInt(2);
   1199         rr.mParcel.writeString(smscPDU);
   1200         rr.mParcel.writeString(pdu);
   1201     }
   1202 
   1203     public void
   1204     sendSMS (String smscPDU, String pdu, Message result) {
   1205         RILRequest rr
   1206                 = RILRequest.obtain(RIL_REQUEST_SEND_SMS, result);
   1207 
   1208         constructGsmSendSmsRilRequest(rr, smscPDU, pdu);
   1209 
   1210         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1211 
   1212         send(rr);
   1213     }
   1214 
   1215     private void
   1216     constructCdmaSendSmsRilRequest(RILRequest rr, byte[] pdu) {
   1217         int address_nbr_of_digits;
   1218         int subaddr_nbr_of_digits;
   1219         int bearerDataLength;
   1220         ByteArrayInputStream bais = new ByteArrayInputStream(pdu);
   1221         DataInputStream dis = new DataInputStream(bais);
   1222 
   1223         try {
   1224             rr.mParcel.writeInt(dis.readInt()); //teleServiceId
   1225             rr.mParcel.writeByte((byte) dis.readInt()); //servicePresent
   1226             rr.mParcel.writeInt(dis.readInt()); //serviceCategory
   1227             rr.mParcel.writeInt(dis.read()); //address_digit_mode
   1228             rr.mParcel.writeInt(dis.read()); //address_nbr_mode
   1229             rr.mParcel.writeInt(dis.read()); //address_ton
   1230             rr.mParcel.writeInt(dis.read()); //address_nbr_plan
   1231             address_nbr_of_digits = (byte) dis.read();
   1232             rr.mParcel.writeByte((byte) address_nbr_of_digits);
   1233             for(int i=0; i < address_nbr_of_digits; i++){
   1234                 rr.mParcel.writeByte(dis.readByte()); // address_orig_bytes[i]
   1235             }
   1236             rr.mParcel.writeInt(dis.read()); //subaddressType
   1237             rr.mParcel.writeByte((byte) dis.read()); //subaddr_odd
   1238             subaddr_nbr_of_digits = (byte) dis.read();
   1239             rr.mParcel.writeByte((byte) subaddr_nbr_of_digits);
   1240             for(int i=0; i < subaddr_nbr_of_digits; i++){
   1241                 rr.mParcel.writeByte(dis.readByte()); //subaddr_orig_bytes[i]
   1242             }
   1243 
   1244             bearerDataLength = dis.read();
   1245             rr.mParcel.writeInt(bearerDataLength);
   1246             for(int i=0; i < bearerDataLength; i++){
   1247                 rr.mParcel.writeByte(dis.readByte()); //bearerData[i]
   1248             }
   1249         }catch (IOException ex){
   1250             if (RILJ_LOGD) riljLog("sendSmsCdma: conversion from input stream to object failed: "
   1251                     + ex);
   1252         }
   1253     }
   1254 
   1255     public void
   1256     sendCdmaSms(byte[] pdu, Message result) {
   1257         RILRequest rr
   1258                 = RILRequest.obtain(RIL_REQUEST_CDMA_SEND_SMS, result);
   1259 
   1260         constructCdmaSendSmsRilRequest(rr, pdu);
   1261 
   1262         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1263 
   1264         send(rr);
   1265     }
   1266 
   1267     public void
   1268     sendImsGsmSms (String smscPDU, String pdu, int retry, int messageRef,
   1269             Message result) {
   1270         RILRequest rr = RILRequest.obtain(RIL_REQUEST_IMS_SEND_SMS, result);
   1271 
   1272         rr.mParcel.writeInt(1); //RIL_IMS_SMS_Format.FORMAT_3GPP
   1273         rr.mParcel.writeByte((byte)retry);
   1274         rr.mParcel.writeInt(messageRef);
   1275 
   1276         constructGsmSendSmsRilRequest(rr, smscPDU, pdu);
   1277 
   1278         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1279 
   1280         send(rr);
   1281     }
   1282 
   1283     public void
   1284     sendImsCdmaSms(byte[] pdu, int retry, int messageRef, Message result) {
   1285         RILRequest rr = RILRequest.obtain(RIL_REQUEST_IMS_SEND_SMS, result);
   1286 
   1287         rr.mParcel.writeInt(2); //RIL_IMS_SMS_Format.FORMAT_3GPP2
   1288         rr.mParcel.writeByte((byte)retry);
   1289         rr.mParcel.writeInt(messageRef);
   1290 
   1291         constructCdmaSendSmsRilRequest(rr, pdu);
   1292 
   1293         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1294 
   1295         send(rr);
   1296     }
   1297 
   1298     @Override
   1299     public void deleteSmsOnSim(int index, Message response) {
   1300         RILRequest rr = RILRequest.obtain(RIL_REQUEST_DELETE_SMS_ON_SIM,
   1301                 response);
   1302 
   1303         rr.mParcel.writeInt(1);
   1304         rr.mParcel.writeInt(index);
   1305 
   1306         if (RILJ_LOGV) riljLog(rr.serialString() + "> "
   1307                 + requestToString(rr.mRequest)
   1308                 + " " + index);
   1309 
   1310         send(rr);
   1311     }
   1312 
   1313     @Override
   1314     public void deleteSmsOnRuim(int index, Message response) {
   1315         RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM,
   1316                 response);
   1317 
   1318         rr.mParcel.writeInt(1);
   1319         rr.mParcel.writeInt(index);
   1320 
   1321         if (RILJ_LOGV) riljLog(rr.serialString() + "> "
   1322                 + requestToString(rr.mRequest)
   1323                 + " " + index);
   1324 
   1325         send(rr);
   1326     }
   1327 
   1328     @Override
   1329     public void writeSmsToSim(int status, String smsc, String pdu, Message response) {
   1330         status = translateStatus(status);
   1331 
   1332         RILRequest rr = RILRequest.obtain(RIL_REQUEST_WRITE_SMS_TO_SIM,
   1333                 response);
   1334 
   1335         rr.mParcel.writeInt(status);
   1336         rr.mParcel.writeString(pdu);
   1337         rr.mParcel.writeString(smsc);
   1338 
   1339         if (RILJ_LOGV) riljLog(rr.serialString() + "> "
   1340                 + requestToString(rr.mRequest)
   1341                 + " " + status);
   1342 
   1343         send(rr);
   1344     }
   1345 
   1346     @Override
   1347     public void writeSmsToRuim(int status, String pdu, Message response) {
   1348         status = translateStatus(status);
   1349 
   1350         RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM,
   1351                 response);
   1352 
   1353         rr.mParcel.writeInt(status);
   1354         rr.mParcel.writeString(pdu);
   1355 
   1356         if (RILJ_LOGV) riljLog(rr.serialString() + "> "
   1357                 + requestToString(rr.mRequest)
   1358                 + " " + status);
   1359 
   1360         send(rr);
   1361     }
   1362 
   1363     /**
   1364      *  Translates EF_SMS status bits to a status value compatible with
   1365      *  SMS AT commands.  See TS 27.005 3.1.
   1366      */
   1367     private int translateStatus(int status) {
   1368         switch(status & 0x7) {
   1369             case SmsManager.STATUS_ON_ICC_READ:
   1370                 return 1;
   1371             case SmsManager.STATUS_ON_ICC_UNREAD:
   1372                 return 0;
   1373             case SmsManager.STATUS_ON_ICC_SENT:
   1374                 return 3;
   1375             case SmsManager.STATUS_ON_ICC_UNSENT:
   1376                 return 2;
   1377         }
   1378 
   1379         // Default to READ.
   1380         return 1;
   1381     }
   1382 
   1383     @Override
   1384     public void
   1385     setupDataCall(String radioTechnology, String profile, String apn,
   1386             String user, String password, String authType, String protocol,
   1387             Message result) {
   1388         RILRequest rr
   1389                 = RILRequest.obtain(RIL_REQUEST_SETUP_DATA_CALL, result);
   1390 
   1391         rr.mParcel.writeInt(7);
   1392 
   1393         rr.mParcel.writeString(radioTechnology);
   1394         rr.mParcel.writeString(profile);
   1395         rr.mParcel.writeString(apn);
   1396         rr.mParcel.writeString(user);
   1397         rr.mParcel.writeString(password);
   1398         rr.mParcel.writeString(authType);
   1399         rr.mParcel.writeString(protocol);
   1400 
   1401         if (RILJ_LOGD) riljLog(rr.serialString() + "> "
   1402                 + requestToString(rr.mRequest) + " " + radioTechnology + " "
   1403                 + profile + " " + apn + " " + user + " "
   1404                 + password + " " + authType + " " + protocol);
   1405 
   1406         send(rr);
   1407     }
   1408 
   1409     @Override
   1410     public void
   1411     deactivateDataCall(int cid, int reason, Message result) {
   1412         RILRequest rr
   1413                 = RILRequest.obtain(RIL_REQUEST_DEACTIVATE_DATA_CALL, result);
   1414 
   1415         rr.mParcel.writeInt(2);
   1416         rr.mParcel.writeString(Integer.toString(cid));
   1417         rr.mParcel.writeString(Integer.toString(reason));
   1418 
   1419         if (RILJ_LOGD) riljLog(rr.serialString() + "> " +
   1420                 requestToString(rr.mRequest) + " " + cid + " " + reason);
   1421 
   1422         send(rr);
   1423     }
   1424 
   1425     @Override
   1426     public void
   1427     setRadioPower(boolean on, Message result) {
   1428         RILRequest rr = RILRequest.obtain(RIL_REQUEST_RADIO_POWER, result);
   1429 
   1430         rr.mParcel.writeInt(1);
   1431         rr.mParcel.writeInt(on ? 1 : 0);
   1432 
   1433         if (RILJ_LOGD) {
   1434             riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1435                     + (on ? " on" : " off"));
   1436         }
   1437 
   1438         send(rr);
   1439     }
   1440 
   1441     @Override
   1442     public void
   1443     setSuppServiceNotifications(boolean enable, Message result) {
   1444         RILRequest rr
   1445                 = RILRequest.obtain(RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, result);
   1446 
   1447         rr.mParcel.writeInt(1);
   1448         rr.mParcel.writeInt(enable ? 1 : 0);
   1449 
   1450         if (RILJ_LOGD) riljLog(rr.serialString() + "> "
   1451                 + requestToString(rr.mRequest));
   1452 
   1453         send(rr);
   1454     }
   1455 
   1456     @Override
   1457     public void
   1458     acknowledgeLastIncomingGsmSms(boolean success, int cause, Message result) {
   1459         RILRequest rr
   1460                 = RILRequest.obtain(RIL_REQUEST_SMS_ACKNOWLEDGE, result);
   1461 
   1462         rr.mParcel.writeInt(2);
   1463         rr.mParcel.writeInt(success ? 1 : 0);
   1464         rr.mParcel.writeInt(cause);
   1465 
   1466         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1467                 + " " + success + " " + cause);
   1468 
   1469         send(rr);
   1470     }
   1471 
   1472     @Override
   1473     public void
   1474     acknowledgeLastIncomingCdmaSms(boolean success, int cause, Message result) {
   1475         RILRequest rr
   1476                 = RILRequest.obtain(RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE, result);
   1477 
   1478         rr.mParcel.writeInt(success ? 0 : 1); //RIL_CDMA_SMS_ErrorClass
   1479         // cause code according to X.S004-550E
   1480         rr.mParcel.writeInt(cause);
   1481 
   1482         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1483                 + " " + success + " " + cause);
   1484 
   1485         send(rr);
   1486     }
   1487 
   1488     @Override
   1489     public void
   1490     acknowledgeIncomingGsmSmsWithPdu(boolean success, String ackPdu, Message result) {
   1491         RILRequest rr
   1492                 = RILRequest.obtain(RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU, result);
   1493 
   1494         rr.mParcel.writeInt(2);
   1495         rr.mParcel.writeString(success ? "1" : "0");
   1496         rr.mParcel.writeString(ackPdu);
   1497 
   1498         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1499                 + ' ' + success + " [" + ackPdu + ']');
   1500 
   1501         send(rr);
   1502     }
   1503 
   1504     @Override
   1505     public void
   1506     iccIO (int command, int fileid, String path, int p1, int p2, int p3,
   1507             String data, String pin2, Message result) {
   1508         iccIOForApp(command, fileid, path, p1, p2, p3, data, pin2, null, result);
   1509     }
   1510     @Override
   1511     public void
   1512     iccIOForApp (int command, int fileid, String path, int p1, int p2, int p3,
   1513             String data, String pin2, String aid, Message result) {
   1514         //Note: This RIL request has not been renamed to ICC,
   1515         //       but this request is also valid for SIM and RUIM
   1516         RILRequest rr
   1517                 = RILRequest.obtain(RIL_REQUEST_SIM_IO, result);
   1518 
   1519         rr.mParcel.writeInt(command);
   1520         rr.mParcel.writeInt(fileid);
   1521         rr.mParcel.writeString(path);
   1522         rr.mParcel.writeInt(p1);
   1523         rr.mParcel.writeInt(p2);
   1524         rr.mParcel.writeInt(p3);
   1525         rr.mParcel.writeString(data);
   1526         rr.mParcel.writeString(pin2);
   1527         rr.mParcel.writeString(aid);
   1528 
   1529         if (RILJ_LOGD) riljLog(rr.serialString() + "> iccIO: "
   1530                 + requestToString(rr.mRequest)
   1531                 + " 0x" + Integer.toHexString(command)
   1532                 + " 0x" + Integer.toHexString(fileid) + " "
   1533                 + " path: " + path + ","
   1534                 + p1 + "," + p2 + "," + p3
   1535                 + " aid: " + aid);
   1536 
   1537         send(rr);
   1538     }
   1539 
   1540     @Override
   1541     public void
   1542     getCLIR(Message result) {
   1543         RILRequest rr
   1544                 = RILRequest.obtain(RIL_REQUEST_GET_CLIR, result);
   1545 
   1546         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1547 
   1548         send(rr);
   1549     }
   1550 
   1551     @Override
   1552     public void
   1553     setCLIR(int clirMode, Message result) {
   1554         RILRequest rr
   1555                 = RILRequest.obtain(RIL_REQUEST_SET_CLIR, result);
   1556 
   1557         // count ints
   1558         rr.mParcel.writeInt(1);
   1559 
   1560         rr.mParcel.writeInt(clirMode);
   1561 
   1562         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1563                     + " " + clirMode);
   1564 
   1565         send(rr);
   1566     }
   1567 
   1568     @Override
   1569     public void
   1570     queryCallWaiting(int serviceClass, Message response) {
   1571         RILRequest rr
   1572                 = RILRequest.obtain(RIL_REQUEST_QUERY_CALL_WAITING, response);
   1573 
   1574         rr.mParcel.writeInt(1);
   1575         rr.mParcel.writeInt(serviceClass);
   1576 
   1577         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1578                     + " " + serviceClass);
   1579 
   1580         send(rr);
   1581     }
   1582 
   1583     @Override
   1584     public void
   1585     setCallWaiting(boolean enable, int serviceClass, Message response) {
   1586         RILRequest rr
   1587                 = RILRequest.obtain(RIL_REQUEST_SET_CALL_WAITING, response);
   1588 
   1589         rr.mParcel.writeInt(2);
   1590         rr.mParcel.writeInt(enable ? 1 : 0);
   1591         rr.mParcel.writeInt(serviceClass);
   1592 
   1593         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1594                 + " " + enable + ", " + serviceClass);
   1595 
   1596         send(rr);
   1597     }
   1598 
   1599     @Override
   1600     public void
   1601     setNetworkSelectionModeAutomatic(Message response) {
   1602         RILRequest rr
   1603                 = RILRequest.obtain(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC,
   1604                                     response);
   1605 
   1606         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1607 
   1608         send(rr);
   1609     }
   1610 
   1611     @Override
   1612     public void
   1613     setNetworkSelectionModeManual(String operatorNumeric, Message response) {
   1614         RILRequest rr
   1615                 = RILRequest.obtain(RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,
   1616                                     response);
   1617 
   1618         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1619                     + " " + operatorNumeric);
   1620 
   1621         rr.mParcel.writeString(operatorNumeric);
   1622 
   1623         send(rr);
   1624     }
   1625 
   1626     @Override
   1627     public void
   1628     getNetworkSelectionMode(Message response) {
   1629         RILRequest rr
   1630                 = RILRequest.obtain(RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE,
   1631                                     response);
   1632 
   1633         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1634 
   1635         send(rr);
   1636     }
   1637 
   1638     @Override
   1639     public void
   1640     getAvailableNetworks(Message response) {
   1641         RILRequest rr
   1642                 = RILRequest.obtain(RIL_REQUEST_QUERY_AVAILABLE_NETWORKS,
   1643                                     response);
   1644 
   1645         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1646 
   1647         send(rr);
   1648     }
   1649 
   1650     @Override
   1651     public void
   1652     setCallForward(int action, int cfReason, int serviceClass,
   1653                 String number, int timeSeconds, Message response) {
   1654         RILRequest rr
   1655                 = RILRequest.obtain(RIL_REQUEST_SET_CALL_FORWARD, response);
   1656 
   1657         rr.mParcel.writeInt(action);
   1658         rr.mParcel.writeInt(cfReason);
   1659         rr.mParcel.writeInt(serviceClass);
   1660         rr.mParcel.writeInt(PhoneNumberUtils.toaFromString(number));
   1661         rr.mParcel.writeString(number);
   1662         rr.mParcel.writeInt (timeSeconds);
   1663 
   1664         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1665                     + " " + action + " " + cfReason + " " + serviceClass
   1666                     + timeSeconds);
   1667 
   1668         send(rr);
   1669     }
   1670 
   1671     @Override
   1672     public void
   1673     queryCallForwardStatus(int cfReason, int serviceClass,
   1674                 String number, Message response) {
   1675         RILRequest rr
   1676             = RILRequest.obtain(RIL_REQUEST_QUERY_CALL_FORWARD_STATUS, response);
   1677 
   1678         rr.mParcel.writeInt(2); // 2 is for query action, not in used anyway
   1679         rr.mParcel.writeInt(cfReason);
   1680         rr.mParcel.writeInt(serviceClass);
   1681         rr.mParcel.writeInt(PhoneNumberUtils.toaFromString(number));
   1682         rr.mParcel.writeString(number);
   1683         rr.mParcel.writeInt (0);
   1684 
   1685         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1686                 + " " + cfReason + " " + serviceClass);
   1687 
   1688         send(rr);
   1689     }
   1690 
   1691     @Override
   1692     public void
   1693     queryCLIP(Message response) {
   1694         RILRequest rr
   1695             = RILRequest.obtain(RIL_REQUEST_QUERY_CLIP, response);
   1696 
   1697         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1698 
   1699         send(rr);
   1700     }
   1701 
   1702 
   1703     @Override
   1704     public void
   1705     getBasebandVersion (Message response) {
   1706         RILRequest rr
   1707                 = RILRequest.obtain(RIL_REQUEST_BASEBAND_VERSION, response);
   1708 
   1709         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1710 
   1711         send(rr);
   1712     }
   1713 
   1714     @Override
   1715     public void
   1716     queryFacilityLock(String facility, String password, int serviceClass,
   1717                             Message response) {
   1718         queryFacilityLockForApp(facility, password, serviceClass, null, response);
   1719     }
   1720 
   1721     @Override
   1722     public void
   1723     queryFacilityLockForApp(String facility, String password, int serviceClass, String appId,
   1724                             Message response) {
   1725         RILRequest rr = RILRequest.obtain(RIL_REQUEST_QUERY_FACILITY_LOCK, response);
   1726 
   1727         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1728                                                  + " [" + facility + " " + serviceClass
   1729                                                  + " " + appId + "]");
   1730 
   1731         // count strings
   1732         rr.mParcel.writeInt(4);
   1733 
   1734         rr.mParcel.writeString(facility);
   1735         rr.mParcel.writeString(password);
   1736 
   1737         rr.mParcel.writeString(Integer.toString(serviceClass));
   1738         rr.mParcel.writeString(appId);
   1739 
   1740         send(rr);
   1741     }
   1742 
   1743     @Override
   1744     public void
   1745     setFacilityLock (String facility, boolean lockState, String password,
   1746                         int serviceClass, Message response) {
   1747         setFacilityLockForApp(facility, lockState, password, serviceClass, null, response);
   1748     }
   1749 
   1750     @Override
   1751     public void
   1752     setFacilityLockForApp(String facility, boolean lockState, String password,
   1753                         int serviceClass, String appId, Message response) {
   1754         String lockString;
   1755          RILRequest rr
   1756                 = RILRequest.obtain(RIL_REQUEST_SET_FACILITY_LOCK, response);
   1757 
   1758         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1759                                                         + " [" + facility + " " + lockState
   1760                                                         + " " + serviceClass + " " + appId + "]");
   1761 
   1762         // count strings
   1763         rr.mParcel.writeInt(5);
   1764 
   1765         rr.mParcel.writeString(facility);
   1766         lockString = (lockState)?"1":"0";
   1767         rr.mParcel.writeString(lockString);
   1768         rr.mParcel.writeString(password);
   1769         rr.mParcel.writeString(Integer.toString(serviceClass));
   1770         rr.mParcel.writeString(appId);
   1771 
   1772         send(rr);
   1773 
   1774     }
   1775 
   1776     @Override
   1777     public void
   1778     sendUSSD (String ussdString, Message response) {
   1779         RILRequest rr
   1780                 = RILRequest.obtain(RIL_REQUEST_SEND_USSD, response);
   1781 
   1782         if (RILJ_LOGD) {
   1783             String logUssdString = "*******";
   1784             if (RILJ_LOGV) logUssdString = ussdString;
   1785             riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1786                                    + " " + logUssdString);
   1787         }
   1788 
   1789         rr.mParcel.writeString(ussdString);
   1790 
   1791         send(rr);
   1792     }
   1793 
   1794     // inherited javadoc suffices
   1795     @Override
   1796     public void cancelPendingUssd (Message response) {
   1797         RILRequest rr
   1798                 = RILRequest.obtain(RIL_REQUEST_CANCEL_USSD, response);
   1799 
   1800         if (RILJ_LOGD) riljLog(rr.serialString()
   1801                 + "> " + requestToString(rr.mRequest));
   1802 
   1803         send(rr);
   1804     }
   1805 
   1806 
   1807     @Override
   1808     public void resetRadio(Message result) {
   1809         RILRequest rr
   1810                 = RILRequest.obtain(RIL_REQUEST_RESET_RADIO, result);
   1811 
   1812         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1813 
   1814         send(rr);
   1815     }
   1816 
   1817     @Override
   1818     public void invokeOemRilRequestRaw(byte[] data, Message response) {
   1819         RILRequest rr
   1820                 = RILRequest.obtain(RIL_REQUEST_OEM_HOOK_RAW, response);
   1821 
   1822         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1823                + "[" + IccUtils.bytesToHexString(data) + "]");
   1824 
   1825         rr.mParcel.writeByteArray(data);
   1826 
   1827         send(rr);
   1828 
   1829     }
   1830 
   1831     @Override
   1832     public void invokeOemRilRequestStrings(String[] strings, Message response) {
   1833         RILRequest rr
   1834                 = RILRequest.obtain(RIL_REQUEST_OEM_HOOK_STRINGS, response);
   1835 
   1836         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1837 
   1838         rr.mParcel.writeStringArray(strings);
   1839 
   1840         send(rr);
   1841     }
   1842 
   1843      /**
   1844      * Assign a specified band for RF configuration.
   1845      *
   1846      * @param bandMode one of BM_*_BAND
   1847      * @param response is callback message
   1848      */
   1849     @Override
   1850     public void setBandMode (int bandMode, Message response) {
   1851         RILRequest rr
   1852                 = RILRequest.obtain(RIL_REQUEST_SET_BAND_MODE, response);
   1853 
   1854         rr.mParcel.writeInt(1);
   1855         rr.mParcel.writeInt(bandMode);
   1856 
   1857         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1858                  + " " + bandMode);
   1859 
   1860         send(rr);
   1861      }
   1862 
   1863     /**
   1864      * Query the list of band mode supported by RF.
   1865      *
   1866      * @param response is callback message
   1867      *        ((AsyncResult)response.obj).result  is an int[] with every
   1868      *        element representing one avialable BM_*_BAND
   1869      */
   1870     @Override
   1871     public void queryAvailableBandMode (Message response) {
   1872         RILRequest rr
   1873                 = RILRequest.obtain(RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE,
   1874                 response);
   1875 
   1876         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1877 
   1878         send(rr);
   1879     }
   1880 
   1881     /**
   1882      * {@inheritDoc}
   1883      */
   1884     @Override
   1885     public void sendTerminalResponse(String contents, Message response) {
   1886         RILRequest rr = RILRequest.obtain(
   1887                 RILConstants.RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE, response);
   1888 
   1889         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1890 
   1891         rr.mParcel.writeString(contents);
   1892         send(rr);
   1893     }
   1894 
   1895     /**
   1896      * {@inheritDoc}
   1897      */
   1898     @Override
   1899     public void sendEnvelope(String contents, Message response) {
   1900         RILRequest rr = RILRequest.obtain(
   1901                 RILConstants.RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND, response);
   1902 
   1903         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1904 
   1905         rr.mParcel.writeString(contents);
   1906         send(rr);
   1907     }
   1908 
   1909     /**
   1910      * {@inheritDoc}
   1911      */
   1912     @Override
   1913     public void sendEnvelopeWithStatus(String contents, Message response) {
   1914         RILRequest rr = RILRequest.obtain(
   1915                 RILConstants.RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS, response);
   1916 
   1917         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1918                 + '[' + contents + ']');
   1919 
   1920         rr.mParcel.writeString(contents);
   1921         send(rr);
   1922     }
   1923 
   1924     /**
   1925      * {@inheritDoc}
   1926      */
   1927     @Override
   1928     public void handleCallSetupRequestFromSim(
   1929             boolean accept, Message response) {
   1930 
   1931         RILRequest rr = RILRequest.obtain(
   1932             RILConstants.RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
   1933             response);
   1934 
   1935         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1936 
   1937         int[] param = new int[1];
   1938         param[0] = accept ? 1 : 0;
   1939         rr.mParcel.writeIntArray(param);
   1940         send(rr);
   1941     }
   1942 
   1943     /**
   1944      * {@inheritDoc}
   1945      */
   1946     @Override
   1947     public void setCurrentPreferredNetworkType() {
   1948         if (RILJ_LOGD) riljLog("setCurrentPreferredNetworkType: " + mSetPreferredNetworkType);
   1949         setPreferredNetworkType(mSetPreferredNetworkType, null);
   1950     }
   1951     private int mSetPreferredNetworkType;
   1952 
   1953     /**
   1954      * {@inheritDoc}
   1955      */
   1956     @Override
   1957     public void setPreferredNetworkType(int networkType , Message response) {
   1958         RILRequest rr = RILRequest.obtain(
   1959                 RILConstants.RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, response);
   1960 
   1961         rr.mParcel.writeInt(1);
   1962         rr.mParcel.writeInt(networkType);
   1963 
   1964         mSetPreferredNetworkType = networkType;
   1965         mPreferredNetworkType = networkType;
   1966 
   1967         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   1968                 + " : " + networkType);
   1969 
   1970         send(rr);
   1971     }
   1972 
   1973     /**
   1974      * {@inheritDoc}
   1975      */
   1976     @Override
   1977     public void getPreferredNetworkType(Message response) {
   1978         RILRequest rr = RILRequest.obtain(
   1979                 RILConstants.RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE, response);
   1980 
   1981         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1982 
   1983         send(rr);
   1984     }
   1985 
   1986     /**
   1987      * {@inheritDoc}
   1988      */
   1989     @Override
   1990     public void getNeighboringCids(Message response) {
   1991         RILRequest rr = RILRequest.obtain(
   1992                 RILConstants.RIL_REQUEST_GET_NEIGHBORING_CELL_IDS, response);
   1993 
   1994         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   1995 
   1996         send(rr);
   1997     }
   1998 
   1999     /**
   2000      * {@inheritDoc}
   2001      */
   2002     @Override
   2003     public void setLocationUpdates(boolean enable, Message response) {
   2004         RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_LOCATION_UPDATES, response);
   2005         rr.mParcel.writeInt(1);
   2006         rr.mParcel.writeInt(enable ? 1 : 0);
   2007 
   2008         if (RILJ_LOGD) riljLog(rr.serialString() + "> "
   2009                 + requestToString(rr.mRequest) + ": " + enable);
   2010 
   2011         send(rr);
   2012     }
   2013 
   2014     /**
   2015      * {@inheritDoc}
   2016      */
   2017     @Override
   2018     public void getSmscAddress(Message result) {
   2019         RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_SMSC_ADDRESS, result);
   2020 
   2021         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   2022 
   2023         send(rr);
   2024     }
   2025 
   2026     /**
   2027      * {@inheritDoc}
   2028      */
   2029     @Override
   2030     public void setSmscAddress(String address, Message result) {
   2031         RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_SMSC_ADDRESS, result);
   2032 
   2033         rr.mParcel.writeString(address);
   2034 
   2035         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   2036                 + " : " + address);
   2037 
   2038         send(rr);
   2039     }
   2040 
   2041     /**
   2042      * {@inheritDoc}
   2043      */
   2044     @Override
   2045     public void reportSmsMemoryStatus(boolean available, Message result) {
   2046         RILRequest rr = RILRequest.obtain(RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, result);
   2047         rr.mParcel.writeInt(1);
   2048         rr.mParcel.writeInt(available ? 1 : 0);
   2049 
   2050         if (RILJ_LOGD) riljLog(rr.serialString() + "> "
   2051                 + requestToString(rr.mRequest) + ": " + available);
   2052 
   2053         send(rr);
   2054     }
   2055 
   2056     /**
   2057      * {@inheritDoc}
   2058      */
   2059     @Override
   2060     public void reportStkServiceIsRunning(Message result) {
   2061         RILRequest rr = RILRequest.obtain(RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING, result);
   2062 
   2063         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   2064 
   2065         send(rr);
   2066     }
   2067 
   2068     /**
   2069      * {@inheritDoc}
   2070      */
   2071     @Override
   2072     public void getGsmBroadcastConfig(Message response) {
   2073         RILRequest rr = RILRequest.obtain(RIL_REQUEST_GSM_GET_BROADCAST_CONFIG, response);
   2074 
   2075         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   2076 
   2077         send(rr);
   2078     }
   2079 
   2080     /**
   2081      * {@inheritDoc}
   2082      */
   2083     @Override
   2084     public void setGsmBroadcastConfig(SmsBroadcastConfigInfo[] config, Message response) {
   2085         RILRequest rr = RILRequest.obtain(RIL_REQUEST_GSM_SET_BROADCAST_CONFIG, response);
   2086 
   2087         int numOfConfig = config.length;
   2088         rr.mParcel.writeInt(numOfConfig);
   2089 
   2090         for(int i = 0; i < numOfConfig; i++) {
   2091             rr.mParcel.writeInt(config[i].getFromServiceId());
   2092             rr.mParcel.writeInt(config[i].getToServiceId());
   2093             rr.mParcel.writeInt(config[i].getFromCodeScheme());
   2094             rr.mParcel.writeInt(config[i].getToCodeScheme());
   2095             rr.mParcel.writeInt(config[i].isSelected() ? 1 : 0);
   2096         }
   2097 
   2098         if (RILJ_LOGD) {
   2099             riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   2100                     + " with " + numOfConfig + " configs : ");
   2101             for (int i = 0; i < numOfConfig; i++) {
   2102                 riljLog(config[i].toString());
   2103             }
   2104         }
   2105 
   2106         send(rr);
   2107     }
   2108 
   2109     /**
   2110      * {@inheritDoc}
   2111      */
   2112     @Override
   2113     public void setGsmBroadcastActivation(boolean activate, Message response) {
   2114         RILRequest rr = RILRequest.obtain(RIL_REQUEST_GSM_BROADCAST_ACTIVATION, response);
   2115 
   2116         rr.mParcel.writeInt(1);
   2117         rr.mParcel.writeInt(activate ? 0 : 1);
   2118 
   2119         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   2120 
   2121         send(rr);
   2122     }
   2123 
   2124     //***** Private Methods
   2125 
   2126     private void sendScreenState(boolean on) {
   2127         RILRequest rr = RILRequest.obtain(RIL_REQUEST_SCREEN_STATE, null);
   2128         rr.mParcel.writeInt(1);
   2129         rr.mParcel.writeInt(on ? 1 : 0);
   2130 
   2131         if (RILJ_LOGD) riljLog(rr.serialString()
   2132                 + "> " + requestToString(rr.mRequest) + ": " + on);
   2133 
   2134         send(rr);
   2135     }
   2136 
   2137     @Override
   2138     protected void
   2139     onRadioAvailable() {
   2140         // In case screen state was lost (due to process crash),
   2141         // this ensures that the RIL knows the correct screen state.
   2142 
   2143         PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
   2144         sendScreenState(pm.isScreenOn());
   2145    }
   2146 
   2147     private RadioState getRadioStateFromInt(int stateInt) {
   2148         RadioState state;
   2149 
   2150         /* RIL_RadioState ril.h */
   2151         switch(stateInt) {
   2152             case 0: state = RadioState.RADIO_OFF; break;
   2153             case 1: state = RadioState.RADIO_UNAVAILABLE; break;
   2154             case 10: state = RadioState.RADIO_ON; break;
   2155 
   2156             default:
   2157                 throw new RuntimeException(
   2158                             "Unrecognized RIL_RadioState: " + stateInt);
   2159         }
   2160         return state;
   2161     }
   2162 
   2163     private void switchToRadioState(RadioState newState) {
   2164         setRadioState(newState);
   2165     }
   2166 
   2167     /**
   2168      * Holds a PARTIAL_WAKE_LOCK whenever
   2169      * a) There is outstanding RIL request sent to RIL deamon and no replied
   2170      * b) There is a request pending to be sent out.
   2171      *
   2172      * There is a WAKE_LOCK_TIMEOUT to release the lock, though it shouldn't
   2173      * happen often.
   2174      */
   2175 
   2176     private void
   2177     acquireWakeLock() {
   2178         synchronized (mWakeLock) {
   2179             mWakeLock.acquire();
   2180             mWakeLockCount++;
   2181 
   2182             mSender.removeMessages(EVENT_WAKE_LOCK_TIMEOUT);
   2183             Message msg = mSender.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT);
   2184             mSender.sendMessageDelayed(msg, mWakeLockTimeout);
   2185         }
   2186     }
   2187 
   2188     private void
   2189     decrementWakeLock() {
   2190         synchronized (mWakeLock) {
   2191             if (mWakeLockCount > 1) {
   2192                 mWakeLockCount--;
   2193             } else {
   2194                 mWakeLockCount = 0;
   2195                 mWakeLock.release();
   2196                 mSender.removeMessages(EVENT_WAKE_LOCK_TIMEOUT);
   2197             }
   2198         }
   2199     }
   2200 
   2201     // true if we had the wakelock
   2202     private boolean
   2203     clearWakeLock() {
   2204         synchronized (mWakeLock) {
   2205             if (mWakeLockCount == 0 && mWakeLock.isHeld() == false) return false;
   2206             Rlog.d(RILJ_LOG_TAG, "NOTE: mWakeLockCount is " + mWakeLockCount + "at time of clearing");
   2207             mWakeLockCount = 0;
   2208             mWakeLock.release();
   2209             mSender.removeMessages(EVENT_WAKE_LOCK_TIMEOUT);
   2210             return true;
   2211         }
   2212     }
   2213 
   2214     private void
   2215     send(RILRequest rr) {
   2216         Message msg;
   2217 
   2218         if (mSocket == null) {
   2219             rr.onError(RADIO_NOT_AVAILABLE, null);
   2220             rr.release();
   2221             return;
   2222         }
   2223 
   2224         msg = mSender.obtainMessage(EVENT_SEND, rr);
   2225 
   2226         acquireWakeLock();
   2227 
   2228         msg.sendToTarget();
   2229     }
   2230 
   2231     private void
   2232     processResponse (Parcel p) {
   2233         int type;
   2234 
   2235         type = p.readInt();
   2236 
   2237         if (type == RESPONSE_UNSOLICITED) {
   2238             processUnsolicited (p);
   2239         } else if (type == RESPONSE_SOLICITED) {
   2240             RILRequest rr = processSolicited (p);
   2241             if (rr != null) {
   2242                 rr.release();
   2243                 decrementWakeLock();
   2244             }
   2245         }
   2246     }
   2247 
   2248     /**
   2249      * Release each request in mRequestList then clear the list
   2250      * @param error is the RIL_Errno sent back
   2251      * @param loggable true means to print all requests in mRequestList
   2252      */
   2253     private void clearRequestList(int error, boolean loggable) {
   2254         RILRequest rr;
   2255         synchronized (mRequestList) {
   2256             int count = mRequestList.size();
   2257             if (RILJ_LOGD && loggable) {
   2258                 Rlog.d(RILJ_LOG_TAG, "clearRequestList " +
   2259                         " mWakeLockCount=" + mWakeLockCount +
   2260                         " mRequestList=" + count);
   2261             }
   2262 
   2263             for (int i = 0; i < count ; i++) {
   2264                 rr = mRequestList.valueAt(i);
   2265                 if (RILJ_LOGD && loggable) {
   2266                     Rlog.d(RILJ_LOG_TAG, i + ": [" + rr.mSerial + "] " +
   2267                             requestToString(rr.mRequest));
   2268                 }
   2269                 rr.onError(error, null);
   2270                 rr.release();
   2271                 decrementWakeLock();
   2272             }
   2273             mRequestList.clear();
   2274         }
   2275     }
   2276 
   2277     private RILRequest findAndRemoveRequestFromList(int serial) {
   2278         RILRequest rr = null;
   2279         synchronized (mRequestList) {
   2280             rr = mRequestList.get(serial);
   2281             if (rr != null) {
   2282                 mRequestList.remove(serial);
   2283             }
   2284         }
   2285 
   2286         return rr;
   2287     }
   2288 
   2289     private RILRequest
   2290     processSolicited (Parcel p) {
   2291         int serial, error;
   2292         boolean found = false;
   2293 
   2294         serial = p.readInt();
   2295         error = p.readInt();
   2296 
   2297         RILRequest rr;
   2298 
   2299         rr = findAndRemoveRequestFromList(serial);
   2300 
   2301         if (rr == null) {
   2302             Rlog.w(RILJ_LOG_TAG, "Unexpected solicited response! sn: "
   2303                             + serial + " error: " + error);
   2304             return null;
   2305         }
   2306 
   2307         Object ret = null;
   2308 
   2309         if (error == 0 || p.dataAvail() > 0) {
   2310             // either command succeeds or command fails but with data payload
   2311             try {switch (rr.mRequest) {
   2312             /*
   2313  cat libs/telephony/ril_commands.h \
   2314  | egrep "^ *{RIL_" \
   2315  | sed -re 's/\{([^,]+),[^,]+,([^}]+).+/case \1: ret = \2(p); break;/'
   2316              */
   2317             case RIL_REQUEST_GET_SIM_STATUS: ret =  responseIccCardStatus(p); break;
   2318             case RIL_REQUEST_ENTER_SIM_PIN: ret =  responseInts(p); break;
   2319             case RIL_REQUEST_ENTER_SIM_PUK: ret =  responseInts(p); break;
   2320             case RIL_REQUEST_ENTER_SIM_PIN2: ret =  responseInts(p); break;
   2321             case RIL_REQUEST_ENTER_SIM_PUK2: ret =  responseInts(p); break;
   2322             case RIL_REQUEST_CHANGE_SIM_PIN: ret =  responseInts(p); break;
   2323             case RIL_REQUEST_CHANGE_SIM_PIN2: ret =  responseInts(p); break;
   2324             case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: ret =  responseInts(p); break;
   2325             case RIL_REQUEST_GET_CURRENT_CALLS: ret =  responseCallList(p); break;
   2326             case RIL_REQUEST_DIAL: ret =  responseVoid(p); break;
   2327             case RIL_REQUEST_GET_IMSI: ret =  responseString(p); break;
   2328             case RIL_REQUEST_HANGUP: ret =  responseVoid(p); break;
   2329             case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: ret =  responseVoid(p); break;
   2330             case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: {
   2331                 if (mTestingEmergencyCall.getAndSet(false)) {
   2332                     if (mEmergencyCallbackModeRegistrant != null) {
   2333                         riljLog("testing emergency call, notify ECM Registrants");
   2334                         mEmergencyCallbackModeRegistrant.notifyRegistrant();
   2335                     }
   2336                 }
   2337                 ret =  responseVoid(p);
   2338                 break;
   2339             }
   2340             case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: ret =  responseVoid(p); break;
   2341             case RIL_REQUEST_CONFERENCE: ret =  responseVoid(p); break;
   2342             case RIL_REQUEST_UDUB: ret =  responseVoid(p); break;
   2343             case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: ret =  responseInts(p); break;
   2344             case RIL_REQUEST_SIGNAL_STRENGTH: ret =  responseSignalStrength(p); break;
   2345             case RIL_REQUEST_VOICE_REGISTRATION_STATE: ret =  responseStrings(p); break;
   2346             case RIL_REQUEST_DATA_REGISTRATION_STATE: ret =  responseStrings(p); break;
   2347             case RIL_REQUEST_OPERATOR: ret =  responseStrings(p); break;
   2348             case RIL_REQUEST_RADIO_POWER: ret =  responseVoid(p); break;
   2349             case RIL_REQUEST_DTMF: ret =  responseVoid(p); break;
   2350             case RIL_REQUEST_SEND_SMS: ret =  responseSMS(p); break;
   2351             case RIL_REQUEST_SEND_SMS_EXPECT_MORE: ret =  responseSMS(p); break;
   2352             case RIL_REQUEST_SETUP_DATA_CALL: ret =  responseSetupDataCall(p); break;
   2353             case RIL_REQUEST_SIM_IO: ret =  responseICC_IO(p); break;
   2354             case RIL_REQUEST_SEND_USSD: ret =  responseVoid(p); break;
   2355             case RIL_REQUEST_CANCEL_USSD: ret =  responseVoid(p); break;
   2356             case RIL_REQUEST_GET_CLIR: ret =  responseInts(p); break;
   2357             case RIL_REQUEST_SET_CLIR: ret =  responseVoid(p); break;
   2358             case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: ret =  responseCallForward(p); break;
   2359             case RIL_REQUEST_SET_CALL_FORWARD: ret =  responseVoid(p); break;
   2360             case RIL_REQUEST_QUERY_CALL_WAITING: ret =  responseInts(p); break;
   2361             case RIL_REQUEST_SET_CALL_WAITING: ret =  responseVoid(p); break;
   2362             case RIL_REQUEST_SMS_ACKNOWLEDGE: ret =  responseVoid(p); break;
   2363             case RIL_REQUEST_GET_IMEI: ret =  responseString(p); break;
   2364             case RIL_REQUEST_GET_IMEISV: ret =  responseString(p); break;
   2365             case RIL_REQUEST_ANSWER: ret =  responseVoid(p); break;
   2366             case RIL_REQUEST_DEACTIVATE_DATA_CALL: ret =  responseVoid(p); break;
   2367             case RIL_REQUEST_QUERY_FACILITY_LOCK: ret =  responseInts(p); break;
   2368             case RIL_REQUEST_SET_FACILITY_LOCK: ret =  responseInts(p); break;
   2369             case RIL_REQUEST_CHANGE_BARRING_PASSWORD: ret =  responseVoid(p); break;
   2370             case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: ret =  responseInts(p); break;
   2371             case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: ret =  responseVoid(p); break;
   2372             case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: ret =  responseVoid(p); break;
   2373             case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : ret =  responseOperatorInfos(p); break;
   2374             case RIL_REQUEST_DTMF_START: ret =  responseVoid(p); break;
   2375             case RIL_REQUEST_DTMF_STOP: ret =  responseVoid(p); break;
   2376             case RIL_REQUEST_BASEBAND_VERSION: ret =  responseString(p); break;
   2377             case RIL_REQUEST_SEPARATE_CONNECTION: ret =  responseVoid(p); break;
   2378             case RIL_REQUEST_SET_MUTE: ret =  responseVoid(p); break;
   2379             case RIL_REQUEST_GET_MUTE: ret =  responseInts(p); break;
   2380             case RIL_REQUEST_QUERY_CLIP: ret =  responseInts(p); break;
   2381             case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: ret =  responseInts(p); break;
   2382             case RIL_REQUEST_DATA_CALL_LIST: ret =  responseDataCallList(p); break;
   2383             case RIL_REQUEST_RESET_RADIO: ret =  responseVoid(p); break;
   2384             case RIL_REQUEST_OEM_HOOK_RAW: ret =  responseRaw(p); break;
   2385             case RIL_REQUEST_OEM_HOOK_STRINGS: ret =  responseStrings(p); break;
   2386             case RIL_REQUEST_SCREEN_STATE: ret =  responseVoid(p); break;
   2387             case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: ret =  responseVoid(p); break;
   2388             case RIL_REQUEST_WRITE_SMS_TO_SIM: ret =  responseInts(p); break;
   2389             case RIL_REQUEST_DELETE_SMS_ON_SIM: ret =  responseVoid(p); break;
   2390             case RIL_REQUEST_SET_BAND_MODE: ret =  responseVoid(p); break;
   2391             case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: ret =  responseInts(p); break;
   2392             case RIL_REQUEST_STK_GET_PROFILE: ret =  responseString(p); break;
   2393             case RIL_REQUEST_STK_SET_PROFILE: ret =  responseVoid(p); break;
   2394             case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: ret =  responseString(p); break;
   2395             case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: ret =  responseVoid(p); break;
   2396             case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: ret =  responseInts(p); break;
   2397             case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: ret =  responseVoid(p); break;
   2398             case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: ret =  responseVoid(p); break;
   2399             case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: ret =  responseGetPreferredNetworkType(p); break;
   2400             case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: ret = responseCellList(p); break;
   2401             case RIL_REQUEST_SET_LOCATION_UPDATES: ret =  responseVoid(p); break;
   2402             case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE: ret =  responseVoid(p); break;
   2403             case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE: ret =  responseVoid(p); break;
   2404             case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE: ret =  responseInts(p); break;
   2405             case RIL_REQUEST_SET_TTY_MODE: ret =  responseVoid(p); break;
   2406             case RIL_REQUEST_QUERY_TTY_MODE: ret =  responseInts(p); break;
   2407             case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE: ret =  responseVoid(p); break;
   2408             case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE: ret =  responseInts(p); break;
   2409             case RIL_REQUEST_CDMA_FLASH: ret =  responseVoid(p); break;
   2410             case RIL_REQUEST_CDMA_BURST_DTMF: ret =  responseVoid(p); break;
   2411             case RIL_REQUEST_CDMA_SEND_SMS: ret =  responseSMS(p); break;
   2412             case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE: ret =  responseVoid(p); break;
   2413             case RIL_REQUEST_GSM_GET_BROADCAST_CONFIG: ret =  responseGmsBroadcastConfig(p); break;
   2414             case RIL_REQUEST_GSM_SET_BROADCAST_CONFIG: ret =  responseVoid(p); break;
   2415             case RIL_REQUEST_GSM_BROADCAST_ACTIVATION: ret =  responseVoid(p); break;
   2416             case RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG: ret =  responseCdmaBroadcastConfig(p); break;
   2417             case RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG: ret =  responseVoid(p); break;
   2418             case RIL_REQUEST_CDMA_BROADCAST_ACTIVATION: ret =  responseVoid(p); break;
   2419             case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: ret =  responseVoid(p); break;
   2420             case RIL_REQUEST_CDMA_SUBSCRIPTION: ret =  responseStrings(p); break;
   2421             case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: ret =  responseInts(p); break;
   2422             case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: ret =  responseVoid(p); break;
   2423             case RIL_REQUEST_DEVICE_IDENTITY: ret =  responseStrings(p); break;
   2424             case RIL_REQUEST_GET_SMSC_ADDRESS: ret = responseString(p); break;
   2425             case RIL_REQUEST_SET_SMSC_ADDRESS: ret = responseVoid(p); break;
   2426             case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: ret = responseVoid(p); break;
   2427             case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: ret = responseVoid(p); break;
   2428             case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: ret = responseVoid(p); break;
   2429             case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: ret =  responseInts(p); break;
   2430             case RIL_REQUEST_ISIM_AUTHENTICATION: ret =  responseString(p); break;
   2431             case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: ret = responseVoid(p); break;
   2432             case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: ret = responseICC_IO(p); break;
   2433             case RIL_REQUEST_VOICE_RADIO_TECH: ret = responseInts(p); break;
   2434             case RIL_REQUEST_GET_CELL_INFO_LIST: ret = responseCellInfoList(p); break;
   2435             case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: ret = responseVoid(p); break;
   2436             case RIL_REQUEST_SET_INITIAL_ATTACH_APN: ret = responseVoid(p); break;
   2437             case RIL_REQUEST_IMS_REGISTRATION_STATE: ret = responseInts(p); break;
   2438             case RIL_REQUEST_IMS_SEND_SMS: ret =  responseSMS(p); break;
   2439             default:
   2440                 throw new RuntimeException("Unrecognized solicited response: " + rr.mRequest);
   2441             //break;
   2442             }} catch (Throwable tr) {
   2443                 // Exceptions here usually mean invalid RIL responses
   2444 
   2445                 Rlog.w(RILJ_LOG_TAG, rr.serialString() + "< "
   2446                         + requestToString(rr.mRequest)
   2447                         + " exception, possible invalid RIL response", tr);
   2448 
   2449                 if (rr.mResult != null) {
   2450                     AsyncResult.forMessage(rr.mResult, null, tr);
   2451                     rr.mResult.sendToTarget();
   2452                 }
   2453                 return rr;
   2454             }
   2455         }
   2456 
   2457         // Here and below fake RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, see b/7255789.
   2458         // This is needed otherwise we don't automatically transition to the main lock
   2459         // screen when the pin or puk is entered incorrectly.
   2460         switch (rr.mRequest) {
   2461             case RIL_REQUEST_ENTER_SIM_PUK:
   2462             case RIL_REQUEST_ENTER_SIM_PUK2:
   2463                 if (mIccStatusChangedRegistrants != null) {
   2464                     if (RILJ_LOGD) {
   2465                         riljLog("ON enter sim puk fakeSimStatusChanged: reg count="
   2466                                 + mIccStatusChangedRegistrants.size());
   2467                     }
   2468                     mIccStatusChangedRegistrants.notifyRegistrants();
   2469                 }
   2470                 break;
   2471         }
   2472 
   2473         if (error != 0) {
   2474             switch (rr.mRequest) {
   2475                 case RIL_REQUEST_ENTER_SIM_PIN:
   2476                 case RIL_REQUEST_ENTER_SIM_PIN2:
   2477                 case RIL_REQUEST_CHANGE_SIM_PIN:
   2478                 case RIL_REQUEST_CHANGE_SIM_PIN2:
   2479                 case RIL_REQUEST_SET_FACILITY_LOCK:
   2480                     if (mIccStatusChangedRegistrants != null) {
   2481                         if (RILJ_LOGD) {
   2482                             riljLog("ON some errors fakeSimStatusChanged: reg count="
   2483                                     + mIccStatusChangedRegistrants.size());
   2484                         }
   2485                         mIccStatusChangedRegistrants.notifyRegistrants();
   2486                     }
   2487                     break;
   2488             }
   2489 
   2490             rr.onError(error, ret);
   2491         } else {
   2492 
   2493             if (RILJ_LOGD) riljLog(rr.serialString() + "< " + requestToString(rr.mRequest)
   2494                     + " " + retToString(rr.mRequest, ret));
   2495 
   2496             if (rr.mResult != null) {
   2497                 AsyncResult.forMessage(rr.mResult, ret, null);
   2498                 rr.mResult.sendToTarget();
   2499             }
   2500         }
   2501         return rr;
   2502     }
   2503 
   2504     private String
   2505     retToString(int req, Object ret) {
   2506         if (ret == null) return "";
   2507         switch (req) {
   2508             // Don't log these return values, for privacy's sake.
   2509             case RIL_REQUEST_GET_IMSI:
   2510             case RIL_REQUEST_GET_IMEI:
   2511             case RIL_REQUEST_GET_IMEISV:
   2512                 if (!RILJ_LOGV) {
   2513                     // If not versbose logging just return and don't display IMSI and IMEI, IMEISV
   2514                     return "";
   2515                 }
   2516         }
   2517 
   2518         StringBuilder sb;
   2519         String s;
   2520         int length;
   2521         if (ret instanceof int[]){
   2522             int[] intArray = (int[]) ret;
   2523             length = intArray.length;
   2524             sb = new StringBuilder("{");
   2525             if (length > 0) {
   2526                 int i = 0;
   2527                 sb.append(intArray[i++]);
   2528                 while ( i < length) {
   2529                     sb.append(", ").append(intArray[i++]);
   2530                 }
   2531             }
   2532             sb.append("}");
   2533             s = sb.toString();
   2534         } else if (ret instanceof String[]) {
   2535             String[] strings = (String[]) ret;
   2536             length = strings.length;
   2537             sb = new StringBuilder("{");
   2538             if (length > 0) {
   2539                 int i = 0;
   2540                 sb.append(strings[i++]);
   2541                 while ( i < length) {
   2542                     sb.append(", ").append(strings[i++]);
   2543                 }
   2544             }
   2545             sb.append("}");
   2546             s = sb.toString();
   2547         }else if (req == RIL_REQUEST_GET_CURRENT_CALLS) {
   2548             ArrayList<DriverCall> calls = (ArrayList<DriverCall>) ret;
   2549             sb = new StringBuilder(" ");
   2550             for (DriverCall dc : calls) {
   2551                 sb.append("[").append(dc).append("] ");
   2552             }
   2553             s = sb.toString();
   2554         } else if (req == RIL_REQUEST_GET_NEIGHBORING_CELL_IDS) {
   2555             ArrayList<NeighboringCellInfo> cells;
   2556             cells = (ArrayList<NeighboringCellInfo>) ret;
   2557             sb = new StringBuilder(" ");
   2558             for (NeighboringCellInfo cell : cells) {
   2559                 sb.append(cell).append(" ");
   2560             }
   2561             s = sb.toString();
   2562         } else {
   2563             s = ret.toString();
   2564         }
   2565         return s;
   2566     }
   2567 
   2568     private void
   2569     processUnsolicited (Parcel p) {
   2570         int response;
   2571         Object ret;
   2572 
   2573         response = p.readInt();
   2574 
   2575         try {switch(response) {
   2576 /*
   2577  cat libs/telephony/ril_unsol_commands.h \
   2578  | egrep "^ *{RIL_" \
   2579  | sed -re 's/\{([^,]+),[^,]+,([^}]+).+/case \1: \2(rr, p); break;/'
   2580 */
   2581 
   2582             case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: ret =  responseVoid(p); break;
   2583             case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: ret =  responseVoid(p); break;
   2584             case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: ret =  responseVoid(p); break;
   2585             case RIL_UNSOL_RESPONSE_NEW_SMS: ret =  responseString(p); break;
   2586             case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: ret =  responseString(p); break;
   2587             case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: ret =  responseInts(p); break;
   2588             case RIL_UNSOL_ON_USSD: ret =  responseStrings(p); break;
   2589             case RIL_UNSOL_NITZ_TIME_RECEIVED: ret =  responseString(p); break;
   2590             case RIL_UNSOL_SIGNAL_STRENGTH: ret = responseSignalStrength(p); break;
   2591             case RIL_UNSOL_DATA_CALL_LIST_CHANGED: ret = responseDataCallList(p);break;
   2592             case RIL_UNSOL_SUPP_SVC_NOTIFICATION: ret = responseSuppServiceNotification(p); break;
   2593             case RIL_UNSOL_STK_SESSION_END: ret = responseVoid(p); break;
   2594             case RIL_UNSOL_STK_PROACTIVE_COMMAND: ret = responseString(p); break;
   2595             case RIL_UNSOL_STK_EVENT_NOTIFY: ret = responseString(p); break;
   2596             case RIL_UNSOL_STK_CALL_SETUP: ret = responseInts(p); break;
   2597             case RIL_UNSOL_SIM_SMS_STORAGE_FULL: ret =  responseVoid(p); break;
   2598             case RIL_UNSOL_SIM_REFRESH: ret =  responseSimRefresh(p); break;
   2599             case RIL_UNSOL_CALL_RING: ret =  responseCallRing(p); break;
   2600             case RIL_UNSOL_RESTRICTED_STATE_CHANGED: ret = responseInts(p); break;
   2601             case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED:  ret =  responseVoid(p); break;
   2602             case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS:  ret =  responseCdmaSms(p); break;
   2603             case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS:  ret =  responseRaw(p); break;
   2604             case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL:  ret =  responseVoid(p); break;
   2605             case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: ret = responseVoid(p); break;
   2606             case RIL_UNSOL_CDMA_CALL_WAITING: ret = responseCdmaCallWaiting(p); break;
   2607             case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: ret = responseInts(p); break;
   2608             case RIL_UNSOL_CDMA_INFO_REC: ret = responseCdmaInformationRecord(p); break;
   2609             case RIL_UNSOL_OEM_HOOK_RAW: ret = responseRaw(p); break;
   2610             case RIL_UNSOL_RINGBACK_TONE: ret = responseInts(p); break;
   2611             case RIL_UNSOL_RESEND_INCALL_MUTE: ret = responseVoid(p); break;
   2612             case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: ret = responseInts(p); break;
   2613             case RIL_UNSOl_CDMA_PRL_CHANGED: ret = responseInts(p); break;
   2614             case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: ret = responseVoid(p); break;
   2615             case RIL_UNSOL_RIL_CONNECTED: ret = responseInts(p); break;
   2616             case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: ret =  responseInts(p); break;
   2617             case RIL_UNSOL_CELL_INFO_LIST: ret = responseCellInfoList(p); break;
   2618             case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED: ret =  responseVoid(p); break;
   2619 
   2620             default:
   2621                 throw new RuntimeException("Unrecognized unsol response: " + response);
   2622             //break; (implied)
   2623         }} catch (Throwable tr) {
   2624             Rlog.e(RILJ_LOG_TAG, "Exception processing unsol response: " + response +
   2625                 "Exception:" + tr.toString());
   2626             return;
   2627         }
   2628 
   2629         switch(response) {
   2630             case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
   2631                 /* has bonus radio state int */
   2632                 RadioState newState = getRadioStateFromInt(p.readInt());
   2633                 if (RILJ_LOGD) unsljLogMore(response, newState.toString());
   2634 
   2635                 switchToRadioState(newState);
   2636             break;
   2637             case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
   2638                 if (RILJ_LOGD) unsljLog(response);
   2639 
   2640                 mImsNetworkStateChangedRegistrants
   2641                     .notifyRegistrants(new AsyncResult(null, null, null));
   2642             break;
   2643             case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:
   2644                 if (RILJ_LOGD) unsljLog(response);
   2645 
   2646                 mCallStateRegistrants
   2647                     .notifyRegistrants(new AsyncResult(null, null, null));
   2648             break;
   2649             case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
   2650                 if (RILJ_LOGD) unsljLog(response);
   2651 
   2652                 mVoiceNetworkStateRegistrants
   2653                     .notifyRegistrants(new AsyncResult(null, null, null));
   2654             break;
   2655             case RIL_UNSOL_RESPONSE_NEW_SMS: {
   2656                 if (RILJ_LOGD) unsljLog(response);
   2657 
   2658                 // FIXME this should move up a layer
   2659                 String a[] = new String[2];
   2660 
   2661                 a[1] = (String)ret;
   2662 
   2663                 SmsMessage sms;
   2664 
   2665                 sms = SmsMessage.newFromCMT(a);
   2666                 if (mGsmSmsRegistrant != null) {
   2667                     mGsmSmsRegistrant
   2668                         .notifyRegistrant(new AsyncResult(null, sms, null));
   2669                 }
   2670             break;
   2671             }
   2672             case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT:
   2673                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2674 
   2675                 if (mSmsStatusRegistrant != null) {
   2676                     mSmsStatusRegistrant.notifyRegistrant(
   2677                             new AsyncResult(null, ret, null));
   2678                 }
   2679             break;
   2680             case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM:
   2681                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2682 
   2683                 int[] smsIndex = (int[])ret;
   2684 
   2685                 if(smsIndex.length == 1) {
   2686                     if (mSmsOnSimRegistrant != null) {
   2687                         mSmsOnSimRegistrant.
   2688                                 notifyRegistrant(new AsyncResult(null, smsIndex, null));
   2689                     }
   2690                 } else {
   2691                     if (RILJ_LOGD) riljLog(" NEW_SMS_ON_SIM ERROR with wrong length "
   2692                             + smsIndex.length);
   2693                 }
   2694             break;
   2695             case RIL_UNSOL_ON_USSD:
   2696                 String[] resp = (String[])ret;
   2697 
   2698                 if (resp.length < 2) {
   2699                     resp = new String[2];
   2700                     resp[0] = ((String[])ret)[0];
   2701                     resp[1] = null;
   2702                 }
   2703                 if (RILJ_LOGD) unsljLogMore(response, resp[0]);
   2704                 if (mUSSDRegistrant != null) {
   2705                     mUSSDRegistrant.notifyRegistrant(
   2706                         new AsyncResult (null, resp, null));
   2707                 }
   2708             break;
   2709             case RIL_UNSOL_NITZ_TIME_RECEIVED:
   2710                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2711 
   2712                 // has bonus long containing milliseconds since boot that the NITZ
   2713                 // time was received
   2714                 long nitzReceiveTime = p.readLong();
   2715 
   2716                 Object[] result = new Object[2];
   2717 
   2718                 result[0] = ret;
   2719                 result[1] = Long.valueOf(nitzReceiveTime);
   2720 
   2721                 boolean ignoreNitz = SystemProperties.getBoolean(
   2722                         TelephonyProperties.PROPERTY_IGNORE_NITZ, false);
   2723 
   2724                 if (ignoreNitz) {
   2725                     if (RILJ_LOGD) riljLog("ignoring UNSOL_NITZ_TIME_RECEIVED");
   2726                 } else {
   2727                     if (mNITZTimeRegistrant != null) {
   2728 
   2729                         mNITZTimeRegistrant
   2730                             .notifyRegistrant(new AsyncResult (null, result, null));
   2731                     } else {
   2732                         // in case NITZ time registrant isnt registered yet
   2733                         mLastNITZTimeInfo = result;
   2734                     }
   2735                 }
   2736             break;
   2737 
   2738             case RIL_UNSOL_SIGNAL_STRENGTH:
   2739                 // Note this is set to "verbose" because it happens
   2740                 // frequently
   2741                 if (RILJ_LOGV) unsljLogvRet(response, ret);
   2742 
   2743                 if (mSignalStrengthRegistrant != null) {
   2744                     mSignalStrengthRegistrant.notifyRegistrant(
   2745                                         new AsyncResult (null, ret, null));
   2746                 }
   2747             break;
   2748             case RIL_UNSOL_DATA_CALL_LIST_CHANGED:
   2749                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2750 
   2751                 mDataNetworkStateRegistrants.notifyRegistrants(new AsyncResult(null, ret, null));
   2752             break;
   2753 
   2754             case RIL_UNSOL_SUPP_SVC_NOTIFICATION:
   2755                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2756 
   2757                 if (mSsnRegistrant != null) {
   2758                     mSsnRegistrant.notifyRegistrant(
   2759                                         new AsyncResult (null, ret, null));
   2760                 }
   2761                 break;
   2762 
   2763             case RIL_UNSOL_STK_SESSION_END:
   2764                 if (RILJ_LOGD) unsljLog(response);
   2765 
   2766                 if (mCatSessionEndRegistrant != null) {
   2767                     mCatSessionEndRegistrant.notifyRegistrant(
   2768                                         new AsyncResult (null, ret, null));
   2769                 }
   2770                 break;
   2771 
   2772             case RIL_UNSOL_STK_PROACTIVE_COMMAND:
   2773                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2774 
   2775                 if (mCatProCmdRegistrant != null) {
   2776                     mCatProCmdRegistrant.notifyRegistrant(
   2777                                         new AsyncResult (null, ret, null));
   2778                 }
   2779                 break;
   2780 
   2781             case RIL_UNSOL_STK_EVENT_NOTIFY:
   2782                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2783 
   2784                 if (mCatEventRegistrant != null) {
   2785                     mCatEventRegistrant.notifyRegistrant(
   2786                                         new AsyncResult (null, ret, null));
   2787                 }
   2788                 break;
   2789 
   2790             case RIL_UNSOL_STK_CALL_SETUP:
   2791                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2792 
   2793                 if (mCatCallSetUpRegistrant != null) {
   2794                     mCatCallSetUpRegistrant.notifyRegistrant(
   2795                                         new AsyncResult (null, ret, null));
   2796                 }
   2797                 break;
   2798 
   2799             case RIL_UNSOL_SIM_SMS_STORAGE_FULL:
   2800                 if (RILJ_LOGD) unsljLog(response);
   2801 
   2802                 if (mIccSmsFullRegistrant != null) {
   2803                     mIccSmsFullRegistrant.notifyRegistrant();
   2804                 }
   2805                 break;
   2806 
   2807             case RIL_UNSOL_SIM_REFRESH:
   2808                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2809 
   2810                 if (mIccRefreshRegistrants != null) {
   2811                     mIccRefreshRegistrants.notifyRegistrants(
   2812                             new AsyncResult (null, ret, null));
   2813                 }
   2814                 break;
   2815 
   2816             case RIL_UNSOL_CALL_RING:
   2817                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2818 
   2819                 if (mRingRegistrant != null) {
   2820                     mRingRegistrant.notifyRegistrant(
   2821                             new AsyncResult (null, ret, null));
   2822                 }
   2823                 break;
   2824 
   2825             case RIL_UNSOL_RESTRICTED_STATE_CHANGED:
   2826                 if (RILJ_LOGD) unsljLogvRet(response, ret);
   2827                 if (mRestrictedStateRegistrant != null) {
   2828                     mRestrictedStateRegistrant.notifyRegistrant(
   2829                                         new AsyncResult (null, ret, null));
   2830                 }
   2831                 break;
   2832 
   2833             case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED:
   2834                 if (RILJ_LOGD) unsljLog(response);
   2835 
   2836                 if (mIccStatusChangedRegistrants != null) {
   2837                     mIccStatusChangedRegistrants.notifyRegistrants();
   2838                 }
   2839                 break;
   2840 
   2841             case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS:
   2842                 if (RILJ_LOGD) unsljLog(response);
   2843 
   2844                 SmsMessage sms = (SmsMessage) ret;
   2845 
   2846                 if (mCdmaSmsRegistrant != null) {
   2847                     mCdmaSmsRegistrant
   2848                         .notifyRegistrant(new AsyncResult(null, sms, null));
   2849                 }
   2850                 break;
   2851 
   2852             case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS:
   2853                 if (RILJ_LOGD) unsljLog(response);
   2854 
   2855                 if (mGsmBroadcastSmsRegistrant != null) {
   2856                     mGsmBroadcastSmsRegistrant
   2857                         .notifyRegistrant(new AsyncResult(null, ret, null));
   2858                 }
   2859                 break;
   2860 
   2861             case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL:
   2862                 if (RILJ_LOGD) unsljLog(response);
   2863 
   2864                 if (mIccSmsFullRegistrant != null) {
   2865                     mIccSmsFullRegistrant.notifyRegistrant();
   2866                 }
   2867                 break;
   2868 
   2869             case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE:
   2870                 if (RILJ_LOGD) unsljLog(response);
   2871 
   2872                 if (mEmergencyCallbackModeRegistrant != null) {
   2873                     mEmergencyCallbackModeRegistrant.notifyRegistrant();
   2874                 }
   2875                 break;
   2876 
   2877             case RIL_UNSOL_CDMA_CALL_WAITING:
   2878                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2879 
   2880                 if (mCallWaitingInfoRegistrants != null) {
   2881                     mCallWaitingInfoRegistrants.notifyRegistrants(
   2882                                         new AsyncResult (null, ret, null));
   2883                 }
   2884                 break;
   2885 
   2886             case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS:
   2887                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2888 
   2889                 if (mOtaProvisionRegistrants != null) {
   2890                     mOtaProvisionRegistrants.notifyRegistrants(
   2891                                         new AsyncResult (null, ret, null));
   2892                 }
   2893                 break;
   2894 
   2895             case RIL_UNSOL_CDMA_INFO_REC:
   2896                 ArrayList<CdmaInformationRecords> listInfoRecs;
   2897 
   2898                 try {
   2899                     listInfoRecs = (ArrayList<CdmaInformationRecords>)ret;
   2900                 } catch (ClassCastException e) {
   2901                     Rlog.e(RILJ_LOG_TAG, "Unexpected exception casting to listInfoRecs", e);
   2902                     break;
   2903                 }
   2904 
   2905                 for (CdmaInformationRecords rec : listInfoRecs) {
   2906                     if (RILJ_LOGD) unsljLogRet(response, rec);
   2907                     notifyRegistrantsCdmaInfoRec(rec);
   2908                 }
   2909                 break;
   2910 
   2911             case RIL_UNSOL_OEM_HOOK_RAW:
   2912                 if (RILJ_LOGD) unsljLogvRet(response, IccUtils.bytesToHexString((byte[])ret));
   2913                 if (mUnsolOemHookRawRegistrant != null) {
   2914                     mUnsolOemHookRawRegistrant.notifyRegistrant(new AsyncResult(null, ret, null));
   2915                 }
   2916                 break;
   2917 
   2918             case RIL_UNSOL_RINGBACK_TONE:
   2919                 if (RILJ_LOGD) unsljLogvRet(response, ret);
   2920                 if (mRingbackToneRegistrants != null) {
   2921                     boolean playtone = (((int[])ret)[0] == 1);
   2922                     mRingbackToneRegistrants.notifyRegistrants(
   2923                                         new AsyncResult (null, playtone, null));
   2924                 }
   2925                 break;
   2926 
   2927             case RIL_UNSOL_RESEND_INCALL_MUTE:
   2928                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2929 
   2930                 if (mResendIncallMuteRegistrants != null) {
   2931                     mResendIncallMuteRegistrants.notifyRegistrants(
   2932                                         new AsyncResult (null, ret, null));
   2933                 }
   2934                 break;
   2935 
   2936             case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED:
   2937                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2938 
   2939                 if (mVoiceRadioTechChangedRegistrants != null) {
   2940                     mVoiceRadioTechChangedRegistrants.notifyRegistrants(
   2941                             new AsyncResult(null, ret, null));
   2942                 }
   2943                 break;
   2944 
   2945             case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED:
   2946                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2947 
   2948                 if (mCdmaSubscriptionChangedRegistrants != null) {
   2949                     mCdmaSubscriptionChangedRegistrants.notifyRegistrants(
   2950                                         new AsyncResult (null, ret, null));
   2951                 }
   2952                 break;
   2953 
   2954             case RIL_UNSOl_CDMA_PRL_CHANGED:
   2955                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2956 
   2957                 if (mCdmaPrlChangedRegistrants != null) {
   2958                     mCdmaPrlChangedRegistrants.notifyRegistrants(
   2959                                         new AsyncResult (null, ret, null));
   2960                 }
   2961                 break;
   2962 
   2963             case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE:
   2964                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2965 
   2966                 if (mExitEmergencyCallbackModeRegistrants != null) {
   2967                     mExitEmergencyCallbackModeRegistrants.notifyRegistrants(
   2968                                         new AsyncResult (null, null, null));
   2969                 }
   2970                 break;
   2971 
   2972             case RIL_UNSOL_RIL_CONNECTED: {
   2973                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2974 
   2975                 // Initial conditions
   2976                 setRadioPower(false, null);
   2977                 setPreferredNetworkType(mPreferredNetworkType, null);
   2978                 setCdmaSubscriptionSource(mCdmaSubscription, null);
   2979                 setCellInfoListRate(Integer.MAX_VALUE, null);
   2980                 notifyRegistrantsRilConnectionChanged(((int[])ret)[0]);
   2981                 break;
   2982             }
   2983             case RIL_UNSOL_CELL_INFO_LIST: {
   2984                 if (RILJ_LOGD) unsljLogRet(response, ret);
   2985 
   2986                 if (mRilCellInfoListRegistrants != null) {
   2987                     mRilCellInfoListRegistrants.notifyRegistrants(
   2988                                         new AsyncResult (null, ret, null));
   2989                 }
   2990                 break;
   2991             }
   2992         }
   2993     }
   2994 
   2995     /**
   2996      * Notifiy all registrants that the ril has connected or disconnected.
   2997      *
   2998      * @param rilVer is the version of the ril or -1 if disconnected.
   2999      */
   3000     private void notifyRegistrantsRilConnectionChanged(int rilVer) {
   3001         mRilVersion = rilVer;
   3002         if (mRilConnectedRegistrants != null) {
   3003             mRilConnectedRegistrants.notifyRegistrants(
   3004                                 new AsyncResult (null, new Integer(rilVer), null));
   3005         }
   3006     }
   3007 
   3008     private Object
   3009     responseInts(Parcel p) {
   3010         int numInts;
   3011         int response[];
   3012 
   3013         numInts = p.readInt();
   3014 
   3015         response = new int[numInts];
   3016 
   3017         for (int i = 0 ; i < numInts ; i++) {
   3018             response[i] = p.readInt();
   3019         }
   3020 
   3021         return response;
   3022     }
   3023 
   3024 
   3025     private Object
   3026     responseVoid(Parcel p) {
   3027         return null;
   3028     }
   3029 
   3030     private Object
   3031     responseCallForward(Parcel p) {
   3032         int numInfos;
   3033         CallForwardInfo infos[];
   3034 
   3035         numInfos = p.readInt();
   3036 
   3037         infos = new CallForwardInfo[numInfos];
   3038 
   3039         for (int i = 0 ; i < numInfos ; i++) {
   3040             infos[i] = new CallForwardInfo();
   3041 
   3042             infos[i].status = p.readInt();
   3043             infos[i].reason = p.readInt();
   3044             infos[i].serviceClass = p.readInt();
   3045             infos[i].toa = p.readInt();
   3046             infos[i].number = p.readString();
   3047             infos[i].timeSeconds = p.readInt();
   3048         }
   3049 
   3050         return infos;
   3051     }
   3052 
   3053     private Object
   3054     responseSuppServiceNotification(Parcel p) {
   3055         SuppServiceNotification notification = new SuppServiceNotification();
   3056 
   3057         notification.notificationType = p.readInt();
   3058         notification.code = p.readInt();
   3059         notification.index = p.readInt();
   3060         notification.type = p.readInt();
   3061         notification.number = p.readString();
   3062 
   3063         return notification;
   3064     }
   3065 
   3066     private Object
   3067     responseCdmaSms(Parcel p) {
   3068         SmsMessage sms;
   3069         sms = SmsMessage.newFromParcel(p);
   3070 
   3071         return sms;
   3072     }
   3073 
   3074     private Object
   3075     responseString(Parcel p) {
   3076         String response;
   3077 
   3078         response = p.readString();
   3079 
   3080         return response;
   3081     }
   3082 
   3083     private Object
   3084     responseStrings(Parcel p) {
   3085         int num;
   3086         String response[];
   3087 
   3088         response = p.readStringArray();
   3089 
   3090         return response;
   3091     }
   3092 
   3093     private Object
   3094     responseRaw(Parcel p) {
   3095         int num;
   3096         byte response[];
   3097 
   3098         response = p.createByteArray();
   3099 
   3100         return response;
   3101     }
   3102 
   3103     private Object
   3104     responseSMS(Parcel p) {
   3105         int messageRef, errorCode;
   3106         String ackPDU;
   3107 
   3108         messageRef = p.readInt();
   3109         ackPDU = p.readString();
   3110         errorCode = p.readInt();
   3111 
   3112         SmsResponse response = new SmsResponse(messageRef, ackPDU, errorCode);
   3113 
   3114         return response;
   3115     }
   3116 
   3117 
   3118     private Object
   3119     responseICC_IO(Parcel p) {
   3120         int sw1, sw2;
   3121         Message ret;
   3122 
   3123         sw1 = p.readInt();
   3124         sw2 = p.readInt();
   3125 
   3126         String s = p.readString();
   3127 
   3128         if (RILJ_LOGV) riljLog("< iccIO: "
   3129                 + " 0x" + Integer.toHexString(sw1)
   3130                 + " 0x" + Integer.toHexString(sw2) + " "
   3131                 + s);
   3132 
   3133         return new IccIoResult(sw1, sw2, s);
   3134     }
   3135 
   3136     private Object
   3137     responseIccCardStatus(Parcel p) {
   3138         IccCardApplicationStatus appStatus;
   3139 
   3140         IccCardStatus cardStatus = new IccCardStatus();
   3141         cardStatus.setCardState(p.readInt());
   3142         cardStatus.setUniversalPinState(p.readInt());
   3143         cardStatus.mGsmUmtsSubscriptionAppIndex = p.readInt();
   3144         cardStatus.mCdmaSubscriptionAppIndex = p.readInt();
   3145         cardStatus.mImsSubscriptionAppIndex = p.readInt();
   3146         int numApplications = p.readInt();
   3147 
   3148         // limit to maximum allowed applications
   3149         if (numApplications > IccCardStatus.CARD_MAX_APPS) {
   3150             numApplications = IccCardStatus.CARD_MAX_APPS;
   3151         }
   3152         cardStatus.mApplications = new IccCardApplicationStatus[numApplications];
   3153         for (int i = 0 ; i < numApplications ; i++) {
   3154             appStatus = new IccCardApplicationStatus();
   3155             appStatus.app_type       = appStatus.AppTypeFromRILInt(p.readInt());
   3156             appStatus.app_state      = appStatus.AppStateFromRILInt(p.readInt());
   3157             appStatus.perso_substate = appStatus.PersoSubstateFromRILInt(p.readInt());
   3158             appStatus.aid            = p.readString();
   3159             appStatus.app_label      = p.readString();
   3160             appStatus.pin1_replaced  = p.readInt();
   3161             appStatus.pin1           = appStatus.PinStateFromRILInt(p.readInt());
   3162             appStatus.pin2           = appStatus.PinStateFromRILInt(p.readInt());
   3163             cardStatus.mApplications[i] = appStatus;
   3164         }
   3165         return cardStatus;
   3166     }
   3167 
   3168     private Object
   3169     responseSimRefresh(Parcel p) {
   3170         IccRefreshResponse response = new IccRefreshResponse();
   3171 
   3172         response.refreshResult = p.readInt();
   3173         response.efId   = p.readInt();
   3174         response.aid = p.readString();
   3175         return response;
   3176     }
   3177 
   3178     private Object
   3179     responseCallList(Parcel p) {
   3180         int num;
   3181         int voiceSettings;
   3182         ArrayList<DriverCall> response;
   3183         DriverCall dc;
   3184 
   3185         num = p.readInt();
   3186         response = new ArrayList<DriverCall>(num);
   3187 
   3188         if (RILJ_LOGV) {
   3189             riljLog("responseCallList: num=" + num +
   3190                     " mEmergencyCallbackModeRegistrant=" + mEmergencyCallbackModeRegistrant +
   3191                     " mTestingEmergencyCall=" + mTestingEmergencyCall.get());
   3192         }
   3193         for (int i = 0 ; i < num ; i++) {
   3194             dc = new DriverCall();
   3195 
   3196             dc.state = DriverCall.stateFromCLCC(p.readInt());
   3197             dc.index = p.readInt();
   3198             dc.TOA = p.readInt();
   3199             dc.isMpty = (0 != p.readInt());
   3200             dc.isMT = (0 != p.readInt());
   3201             dc.als = p.readInt();
   3202             voiceSettings = p.readInt();
   3203             dc.isVoice = (0 == voiceSettings) ? false : true;
   3204             dc.isVoicePrivacy = (0 != p.readInt());
   3205             dc.number = p.readString();
   3206             int np = p.readInt();
   3207             dc.numberPresentation = DriverCall.presentationFromCLIP(np);
   3208             dc.name = p.readString();
   3209             dc.namePresentation = p.readInt();
   3210             int uusInfoPresent = p.readInt();
   3211             if (uusInfoPresent == 1) {
   3212                 dc.uusInfo = new UUSInfo();
   3213                 dc.uusInfo.setType(p.readInt());
   3214                 dc.uusInfo.setDcs(p.readInt());
   3215                 byte[] userData = p.createByteArray();
   3216                 dc.uusInfo.setUserData(userData);
   3217                 riljLogv(String.format("Incoming UUS : type=%d, dcs=%d, length=%d",
   3218                                 dc.uusInfo.getType(), dc.uusInfo.getDcs(),
   3219                                 dc.uusInfo.getUserData().length));
   3220                 riljLogv("Incoming UUS : data (string)="
   3221                         + new String(dc.uusInfo.getUserData()));
   3222                 riljLogv("Incoming UUS : data (hex): "
   3223                         + IccUtils.bytesToHexString(dc.uusInfo.getUserData()));
   3224             } else {
   3225                 riljLogv("Incoming UUS : NOT present!");
   3226             }
   3227 
   3228             // Make sure there's a leading + on addresses with a TOA of 145
   3229             dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA);
   3230 
   3231             response.add(dc);
   3232 
   3233             if (dc.isVoicePrivacy) {
   3234                 mVoicePrivacyOnRegistrants.notifyRegistrants();
   3235                 riljLog("InCall VoicePrivacy is enabled");
   3236             } else {
   3237                 mVoicePrivacyOffRegistrants.notifyRegistrants();
   3238                 riljLog("InCall VoicePrivacy is disabled");
   3239             }
   3240         }
   3241 
   3242         Collections.sort(response);
   3243 
   3244         if ((num == 0) && mTestingEmergencyCall.getAndSet(false)) {
   3245             if (mEmergencyCallbackModeRegistrant != null) {
   3246                 riljLog("responseCallList: call ended, testing emergency call," +
   3247                             " notify ECM Registrants");
   3248                 mEmergencyCallbackModeRegistrant.notifyRegistrant();
   3249             }
   3250         }
   3251 
   3252         return response;
   3253     }
   3254 
   3255     private DataCallResponse getDataCallResponse(Parcel p, int version) {
   3256         DataCallResponse dataCall = new DataCallResponse();
   3257 
   3258         dataCall.version = version;
   3259         if (version < 5) {
   3260             dataCall.cid = p.readInt();
   3261             dataCall.active = p.readInt();
   3262             dataCall.type = p.readString();
   3263             String addresses = p.readString();
   3264             if (!TextUtils.isEmpty(addresses)) {
   3265                 dataCall.addresses = addresses.split(" ");
   3266             }
   3267         } else {
   3268             dataCall.status = p.readInt();
   3269             dataCall.suggestedRetryTime = p.readInt();
   3270             dataCall.cid = p.readInt();
   3271             dataCall.active = p.readInt();
   3272             dataCall.type = p.readString();
   3273             dataCall.ifname = p.readString();
   3274             if ((dataCall.status == DcFailCause.NONE.getErrorCode()) &&
   3275                     TextUtils.isEmpty(dataCall.ifname)) {
   3276               throw new RuntimeException("getDataCallResponse, no ifname");
   3277             }
   3278             String addresses = p.readString();
   3279             if (!TextUtils.isEmpty(addresses)) {
   3280                 dataCall.addresses = addresses.split(" ");
   3281             }
   3282             String dnses = p.readString();
   3283             if (!TextUtils.isEmpty(dnses)) {
   3284                 dataCall.dnses = dnses.split(" ");
   3285             }
   3286             String gateways = p.readString();
   3287             if (!TextUtils.isEmpty(gateways)) {
   3288                 dataCall.gateways = gateways.split(" ");
   3289             }
   3290         }
   3291         return dataCall;
   3292     }
   3293 
   3294     private Object
   3295     responseDataCallList(Parcel p) {
   3296         ArrayList<DataCallResponse> response;
   3297 
   3298         int ver = p.readInt();
   3299         int num = p.readInt();
   3300         riljLog("responseDataCallList ver=" + ver + " num=" + num);
   3301 
   3302         response = new ArrayList<DataCallResponse>(num);
   3303         for (int i = 0; i < num; i++) {
   3304             response.add(getDataCallResponse(p, ver));
   3305         }
   3306 
   3307         return response;
   3308     }
   3309 
   3310     private Object
   3311     responseSetupDataCall(Parcel p) {
   3312         int ver = p.readInt();
   3313         int num = p.readInt();
   3314         if (RILJ_LOGV) riljLog("responseSetupDataCall ver=" + ver + " num=" + num);
   3315 
   3316         DataCallResponse dataCall;
   3317 
   3318         if (ver < 5) {
   3319             dataCall = new DataCallResponse();
   3320             dataCall.version = ver;
   3321             dataCall.cid = Integer.parseInt(p.readString());
   3322             dataCall.ifname = p.readString();
   3323             if (TextUtils.isEmpty(dataCall.ifname)) {
   3324                 throw new RuntimeException(
   3325                         "RIL_REQUEST_SETUP_DATA_CALL response, no ifname");
   3326             }
   3327             String addresses = p.readString();
   3328             if (!TextUtils.isEmpty(addresses)) {
   3329               dataCall.addresses = addresses.split(" ");
   3330             }
   3331             if (num >= 4) {
   3332                 String dnses = p.readString();
   3333                 if (RILJ_LOGD) riljLog("responseSetupDataCall got dnses=" + dnses);
   3334                 if (!TextUtils.isEmpty(dnses)) {
   3335                     dataCall.dnses = dnses.split(" ");
   3336                 }
   3337             }
   3338             if (num >= 5) {
   3339                 String gateways = p.readString();
   3340                 if (RILJ_LOGD) riljLog("responseSetupDataCall got gateways=" + gateways);
   3341                 if (!TextUtils.isEmpty(gateways)) {
   3342                     dataCall.gateways = gateways.split(" ");
   3343                 }
   3344             }
   3345         } else {
   3346             if (num != 1) {
   3347                 throw new RuntimeException(
   3348                         "RIL_REQUEST_SETUP_DATA_CALL response expecting 1 RIL_Data_Call_response_v5"
   3349                         + " got " + num);
   3350             }
   3351             dataCall = getDataCallResponse(p, ver);
   3352         }
   3353 
   3354         return dataCall;
   3355     }
   3356 
   3357     private Object
   3358     responseOperatorInfos(Parcel p) {
   3359         String strings[] = (String [])responseStrings(p);
   3360         ArrayList<OperatorInfo> ret;
   3361 
   3362         if (strings.length % 4 != 0) {
   3363             throw new RuntimeException(
   3364                 "RIL_REQUEST_QUERY_AVAILABLE_NETWORKS: invalid response. Got "
   3365                 + strings.length + " strings, expected multible of 4");
   3366         }
   3367 
   3368         ret = new ArrayList<OperatorInfo>(strings.length / 4);
   3369 
   3370         for (int i = 0 ; i < strings.length ; i += 4) {
   3371             ret.add (
   3372                 new OperatorInfo(
   3373                     strings[i+0],
   3374                     strings[i+1],
   3375                     strings[i+2],
   3376                     strings[i+3]));
   3377         }
   3378 
   3379         return ret;
   3380     }
   3381 
   3382     private Object
   3383     responseCellList(Parcel p) {
   3384        int num, rssi;
   3385        String location;
   3386        ArrayList<NeighboringCellInfo> response;
   3387        NeighboringCellInfo cell;
   3388 
   3389        num = p.readInt();
   3390        response = new ArrayList<NeighboringCellInfo>();
   3391 
   3392        // Determine the radio access type
   3393        String radioString = SystemProperties.get(
   3394                TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE, "unknown");
   3395        int radioType;
   3396        if (radioString.equals("GPRS")) {
   3397            radioType = NETWORK_TYPE_GPRS;
   3398        } else if (radioString.equals("EDGE")) {
   3399            radioType = NETWORK_TYPE_EDGE;
   3400        } else if (radioString.equals("UMTS")) {
   3401            radioType = NETWORK_TYPE_UMTS;
   3402        } else if (radioString.equals("HSDPA")) {
   3403            radioType = NETWORK_TYPE_HSDPA;
   3404        } else if (radioString.equals("HSUPA")) {
   3405            radioType = NETWORK_TYPE_HSUPA;
   3406        } else if (radioString.equals("HSPA")) {
   3407            radioType = NETWORK_TYPE_HSPA;
   3408        } else {
   3409            radioType = NETWORK_TYPE_UNKNOWN;
   3410        }
   3411 
   3412        // Interpret the location based on radio access type
   3413        if (radioType != NETWORK_TYPE_UNKNOWN) {
   3414            for (int i = 0 ; i < num ; i++) {
   3415                rssi = p.readInt();
   3416                location = p.readString();
   3417                cell = new NeighboringCellInfo(rssi, location, radioType);
   3418                response.add(cell);
   3419            }
   3420        }
   3421        return response;
   3422     }
   3423 
   3424     private Object responseGetPreferredNetworkType(Parcel p) {
   3425        int [] response = (int[]) responseInts(p);
   3426 
   3427        if (response.length >= 1) {
   3428            // Since this is the response for getPreferredNetworkType
   3429            // we'll assume that it should be the value we want the
   3430            // vendor ril to take if we reestablish a connection to it.
   3431            mPreferredNetworkType = response[0];
   3432        }
   3433        return response;
   3434     }
   3435 
   3436     private Object responseGmsBroadcastConfig(Parcel p) {
   3437         int num;
   3438         ArrayList<SmsBroadcastConfigInfo> response;
   3439         SmsBroadcastConfigInfo info;
   3440 
   3441         num = p.readInt();
   3442         response = new ArrayList<SmsBroadcastConfigInfo>(num);
   3443 
   3444         for (int i = 0; i < num; i++) {
   3445             int fromId = p.readInt();
   3446             int toId = p.readInt();
   3447             int fromScheme = p.readInt();
   3448             int toScheme = p.readInt();
   3449             boolean selected = (p.readInt() == 1);
   3450 
   3451             info = new SmsBroadcastConfigInfo(fromId, toId, fromScheme,
   3452                     toScheme, selected);
   3453             response.add(info);
   3454         }
   3455         return response;
   3456     }
   3457 
   3458     private Object
   3459     responseCdmaBroadcastConfig(Parcel p) {
   3460         int numServiceCategories;
   3461         int response[];
   3462 
   3463         numServiceCategories = p.readInt();
   3464 
   3465         if (numServiceCategories == 0) {
   3466             // TODO: The logic of providing default values should
   3467             // not be done by this transport layer. And needs to
   3468             // be done by the vendor ril or application logic.
   3469             int numInts;
   3470             numInts = CDMA_BROADCAST_SMS_NO_OF_SERVICE_CATEGORIES * CDMA_BSI_NO_OF_INTS_STRUCT + 1;
   3471             response = new int[numInts];
   3472 
   3473             // Faking a default record for all possible records.
   3474             response[0] = CDMA_BROADCAST_SMS_NO_OF_SERVICE_CATEGORIES;
   3475 
   3476             // Loop over CDMA_BROADCAST_SMS_NO_OF_SERVICE_CATEGORIES set 'english' as
   3477             // default language and selection status to false for all.
   3478             for (int i = 1; i < numInts; i += CDMA_BSI_NO_OF_INTS_STRUCT ) {
   3479                 response[i + 0] = i / CDMA_BSI_NO_OF_INTS_STRUCT;
   3480                 response[i + 1] = 1;
   3481                 response[i + 2] = 0;
   3482             }
   3483         } else {
   3484             int numInts;
   3485             numInts = (numServiceCategories * CDMA_BSI_NO_OF_INTS_STRUCT) + 1;
   3486             response = new int[numInts];
   3487 
   3488             response[0] = numServiceCategories;
   3489             for (int i = 1 ; i < numInts; i++) {
   3490                  response[i] = p.readInt();
   3491              }
   3492         }
   3493 
   3494         return response;
   3495     }
   3496 
   3497     private Object
   3498     responseSignalStrength(Parcel p) {
   3499         // Assume this is gsm, but doesn't matter as ServiceStateTracker
   3500         // sets the proper value.
   3501         SignalStrength signalStrength = SignalStrength.makeSignalStrengthFromRilParcel(p);
   3502         return signalStrength;
   3503     }
   3504 
   3505     private ArrayList<CdmaInformationRecords>
   3506     responseCdmaInformationRecord(Parcel p) {
   3507         int numberOfInfoRecs;
   3508         ArrayList<CdmaInformationRecords> response;
   3509 
   3510         /**
   3511          * Loop through all of the information records unmarshalling them
   3512          * and converting them to Java Objects.
   3513          */
   3514         numberOfInfoRecs = p.readInt();
   3515         response = new ArrayList<CdmaInformationRecords>(numberOfInfoRecs);
   3516 
   3517         for (int i = 0; i < numberOfInfoRecs; i++) {
   3518             CdmaInformationRecords InfoRec = new CdmaInformationRecords(p);
   3519             response.add(InfoRec);
   3520         }
   3521 
   3522         return response;
   3523     }
   3524 
   3525     private Object
   3526     responseCdmaCallWaiting(Parcel p) {
   3527         CdmaCallWaitingNotification notification = new CdmaCallWaitingNotification();
   3528 
   3529         notification.number = p.readString();
   3530         notification.numberPresentation =
   3531                 CdmaCallWaitingNotification.presentationFromCLIP(p.readInt());
   3532         notification.name = p.readString();
   3533         notification.namePresentation = notification.numberPresentation;
   3534         notification.isPresent = p.readInt();
   3535         notification.signalType = p.readInt();
   3536         notification.alertPitch = p.readInt();
   3537         notification.signal = p.readInt();
   3538         notification.numberType = p.readInt();
   3539         notification.numberPlan = p.readInt();
   3540 
   3541         return notification;
   3542     }
   3543 
   3544     private Object
   3545     responseCallRing(Parcel p){
   3546         char response[] = new char[4];
   3547 
   3548         response[0] = (char) p.readInt();    // isPresent
   3549         response[1] = (char) p.readInt();    // signalType
   3550         response[2] = (char) p.readInt();    // alertPitch
   3551         response[3] = (char) p.readInt();    // signal
   3552 
   3553         return response;
   3554     }
   3555 
   3556     private void
   3557     notifyRegistrantsCdmaInfoRec(CdmaInformationRecords infoRec) {
   3558         int response = RIL_UNSOL_CDMA_INFO_REC;
   3559         if (infoRec.record instanceof CdmaInformationRecords.CdmaDisplayInfoRec) {
   3560             if (mDisplayInfoRegistrants != null) {
   3561                 if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
   3562                 mDisplayInfoRegistrants.notifyRegistrants(
   3563                         new AsyncResult (null, infoRec.record, null));
   3564             }
   3565         } else if (infoRec.record instanceof CdmaInformationRecords.CdmaSignalInfoRec) {
   3566             if (mSignalInfoRegistrants != null) {
   3567                 if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
   3568                 mSignalInfoRegistrants.notifyRegistrants(
   3569                         new AsyncResult (null, infoRec.record, null));
   3570             }
   3571         } else if (infoRec.record instanceof CdmaInformationRecords.CdmaNumberInfoRec) {
   3572             if (mNumberInfoRegistrants != null) {
   3573                 if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
   3574                 mNumberInfoRegistrants.notifyRegistrants(
   3575                         new AsyncResult (null, infoRec.record, null));
   3576             }
   3577         } else if (infoRec.record instanceof CdmaInformationRecords.CdmaRedirectingNumberInfoRec) {
   3578             if (mRedirNumInfoRegistrants != null) {
   3579                 if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
   3580                 mRedirNumInfoRegistrants.notifyRegistrants(
   3581                         new AsyncResult (null, infoRec.record, null));
   3582             }
   3583         } else if (infoRec.record instanceof CdmaInformationRecords.CdmaLineControlInfoRec) {
   3584             if (mLineControlInfoRegistrants != null) {
   3585                 if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
   3586                 mLineControlInfoRegistrants.notifyRegistrants(
   3587                         new AsyncResult (null, infoRec.record, null));
   3588             }
   3589         } else if (infoRec.record instanceof CdmaInformationRecords.CdmaT53ClirInfoRec) {
   3590             if (mT53ClirInfoRegistrants != null) {
   3591                 if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
   3592                 mT53ClirInfoRegistrants.notifyRegistrants(
   3593                         new AsyncResult (null, infoRec.record, null));
   3594             }
   3595         } else if (infoRec.record instanceof CdmaInformationRecords.CdmaT53AudioControlInfoRec) {
   3596             if (mT53AudCntrlInfoRegistrants != null) {
   3597                if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
   3598                mT53AudCntrlInfoRegistrants.notifyRegistrants(
   3599                        new AsyncResult (null, infoRec.record, null));
   3600             }
   3601         }
   3602     }
   3603 
   3604     private ArrayList<CellInfo> responseCellInfoList(Parcel p) {
   3605         int numberOfInfoRecs;
   3606         ArrayList<CellInfo> response;
   3607 
   3608         /**
   3609          * Loop through all of the information records unmarshalling them
   3610          * and converting them to Java Objects.
   3611          */
   3612         numberOfInfoRecs = p.readInt();
   3613         response = new ArrayList<CellInfo>(numberOfInfoRecs);
   3614 
   3615         for (int i = 0; i < numberOfInfoRecs; i++) {
   3616             CellInfo InfoRec = CellInfo.CREATOR.createFromParcel(p);
   3617             response.add(InfoRec);
   3618         }
   3619 
   3620         return response;
   3621     }
   3622 
   3623     static String
   3624     requestToString(int request) {
   3625 /*
   3626  cat libs/telephony/ril_commands.h \
   3627  | egrep "^ *{RIL_" \
   3628  | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/'
   3629 */
   3630         switch(request) {
   3631             case RIL_REQUEST_GET_SIM_STATUS: return "GET_SIM_STATUS";
   3632             case RIL_REQUEST_ENTER_SIM_PIN: return "ENTER_SIM_PIN";
   3633             case RIL_REQUEST_ENTER_SIM_PUK: return "ENTER_SIM_PUK";
   3634             case RIL_REQUEST_ENTER_SIM_PIN2: return "ENTER_SIM_PIN2";
   3635             case RIL_REQUEST_ENTER_SIM_PUK2: return "ENTER_SIM_PUK2";
   3636             case RIL_REQUEST_CHANGE_SIM_PIN: return "CHANGE_SIM_PIN";
   3637             case RIL_REQUEST_CHANGE_SIM_PIN2: return "CHANGE_SIM_PIN2";
   3638             case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION: return "ENTER_NETWORK_DEPERSONALIZATION";
   3639             case RIL_REQUEST_GET_CURRENT_CALLS: return "GET_CURRENT_CALLS";
   3640             case RIL_REQUEST_DIAL: return "DIAL";
   3641             case RIL_REQUEST_GET_IMSI: return "GET_IMSI";
   3642             case RIL_REQUEST_HANGUP: return "HANGUP";
   3643             case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "HANGUP_WAITING_OR_BACKGROUND";
   3644             case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "HANGUP_FOREGROUND_RESUME_BACKGROUND";
   3645             case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: return "REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
   3646             case RIL_REQUEST_CONFERENCE: return "CONFERENCE";
   3647             case RIL_REQUEST_UDUB: return "UDUB";
   3648             case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: return "LAST_CALL_FAIL_CAUSE";
   3649             case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH";
   3650             case RIL_REQUEST_VOICE_REGISTRATION_STATE: return "VOICE_REGISTRATION_STATE";
   3651             case RIL_REQUEST_DATA_REGISTRATION_STATE: return "DATA_REGISTRATION_STATE";
   3652             case RIL_REQUEST_OPERATOR: return "OPERATOR";
   3653             case RIL_REQUEST_RADIO_POWER: return "RADIO_POWER";
   3654             case RIL_REQUEST_DTMF: return "DTMF";
   3655             case RIL_REQUEST_SEND_SMS: return "SEND_SMS";
   3656             case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "SEND_SMS_EXPECT_MORE";
   3657             case RIL_REQUEST_SETUP_DATA_CALL: return "SETUP_DATA_CALL";
   3658             case RIL_REQUEST_SIM_IO: return "SIM_IO";
   3659             case RIL_REQUEST_SEND_USSD: return "SEND_USSD";
   3660             case RIL_REQUEST_CANCEL_USSD: return "CANCEL_USSD";
   3661             case RIL_REQUEST_GET_CLIR: return "GET_CLIR";
   3662             case RIL_REQUEST_SET_CLIR: return "SET_CLIR";
   3663             case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: return "QUERY_CALL_FORWARD_STATUS";
   3664             case RIL_REQUEST_SET_CALL_FORWARD: return "SET_CALL_FORWARD";
   3665             case RIL_REQUEST_QUERY_CALL_WAITING: return "QUERY_CALL_WAITING";
   3666             case RIL_REQUEST_SET_CALL_WAITING: return "SET_CALL_WAITING";
   3667             case RIL_REQUEST_SMS_ACKNOWLEDGE: return "SMS_ACKNOWLEDGE";
   3668             case RIL_REQUEST_GET_IMEI: return "GET_IMEI";
   3669             case RIL_REQUEST_GET_IMEISV: return "GET_IMEISV";
   3670             case RIL_REQUEST_ANSWER: return "ANSWER";
   3671             case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "DEACTIVATE_DATA_CALL";
   3672             case RIL_REQUEST_QUERY_FACILITY_LOCK: return "QUERY_FACILITY_LOCK";
   3673             case RIL_REQUEST_SET_FACILITY_LOCK: return "SET_FACILITY_LOCK";
   3674             case RIL_REQUEST_CHANGE_BARRING_PASSWORD: return "CHANGE_BARRING_PASSWORD";
   3675             case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: return "QUERY_NETWORK_SELECTION_MODE";
   3676             case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: return "SET_NETWORK_SELECTION_AUTOMATIC";
   3677             case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: return "SET_NETWORK_SELECTION_MANUAL";
   3678             case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : return "QUERY_AVAILABLE_NETWORKS ";
   3679             case RIL_REQUEST_DTMF_START: return "DTMF_START";
   3680             case RIL_REQUEST_DTMF_STOP: return "DTMF_STOP";
   3681             case RIL_REQUEST_BASEBAND_VERSION: return "BASEBAND_VERSION";
   3682             case RIL_REQUEST_SEPARATE_CONNECTION: return "SEPARATE_CONNECTION";
   3683             case RIL_REQUEST_SET_MUTE: return "SET_MUTE";
   3684             case RIL_REQUEST_GET_MUTE: return "GET_MUTE";
   3685             case RIL_REQUEST_QUERY_CLIP: return "QUERY_CLIP";
   3686             case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: return "LAST_DATA_CALL_FAIL_CAUSE";
   3687             case RIL_REQUEST_DATA_CALL_LIST: return "DATA_CALL_LIST";
   3688             case RIL_REQUEST_RESET_RADIO: return "RESET_RADIO";
   3689             case RIL_REQUEST_OEM_HOOK_RAW: return "OEM_HOOK_RAW";
   3690             case RIL_REQUEST_OEM_HOOK_STRINGS: return "OEM_HOOK_STRINGS";
   3691             case RIL_REQUEST_SCREEN_STATE: return "SCREEN_STATE";
   3692             case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: return "SET_SUPP_SVC_NOTIFICATION";
   3693             case RIL_REQUEST_WRITE_SMS_TO_SIM: return "WRITE_SMS_TO_SIM";
   3694             case RIL_REQUEST_DELETE_SMS_ON_SIM: return "DELETE_SMS_ON_SIM";
   3695             case RIL_REQUEST_SET_BAND_MODE: return "SET_BAND_MODE";
   3696             case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: return "QUERY_AVAILABLE_BAND_MODE";
   3697             case RIL_REQUEST_STK_GET_PROFILE: return "REQUEST_STK_GET_PROFILE";
   3698             case RIL_REQUEST_STK_SET_PROFILE: return "REQUEST_STK_SET_PROFILE";
   3699             case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: return "REQUEST_STK_SEND_ENVELOPE_COMMAND";
   3700             case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: return "REQUEST_STK_SEND_TERMINAL_RESPONSE";
   3701             case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: return "REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
   3702             case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "REQUEST_EXPLICIT_CALL_TRANSFER";
   3703             case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: return "REQUEST_SET_PREFERRED_NETWORK_TYPE";
   3704             case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: return "REQUEST_GET_PREFERRED_NETWORK_TYPE";
   3705             case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: return "REQUEST_GET_NEIGHBORING_CELL_IDS";
   3706             case RIL_REQUEST_SET_LOCATION_UPDATES: return "REQUEST_SET_LOCATION_UPDATES";
   3707             case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE: return "RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE";
   3708             case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE: return "RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE";
   3709             case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE: return "RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE";
   3710             case RIL_REQUEST_SET_TTY_MODE: return "RIL_REQUEST_SET_TTY_MODE";
   3711             case RIL_REQUEST_QUERY_TTY_MODE: return "RIL_REQUEST_QUERY_TTY_MODE";
   3712             case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE: return "RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
   3713             case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE: return "RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
   3714             case RIL_REQUEST_CDMA_FLASH: return "RIL_REQUEST_CDMA_FLASH";
   3715             case RIL_REQUEST_CDMA_BURST_DTMF: return "RIL_REQUEST_CDMA_BURST_DTMF";
   3716             case RIL_REQUEST_CDMA_SEND_SMS: return "RIL_REQUEST_CDMA_SEND_SMS";
   3717             case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE: return "RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE";
   3718             case RIL_REQUEST_GSM_GET_BROADCAST_CONFIG: return "RIL_REQUEST_GSM_GET_BROADCAST_CONFIG";
   3719             case RIL_REQUEST_GSM_SET_BROADCAST_CONFIG: return "RIL_REQUEST_GSM_SET_BROADCAST_CONFIG";
   3720             case RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG: return "RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG";
   3721             case RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG: return "RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG";
   3722             case RIL_REQUEST_GSM_BROADCAST_ACTIVATION: return "RIL_REQUEST_GSM_BROADCAST_ACTIVATION";
   3723             case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: return "RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY";
   3724             case RIL_REQUEST_CDMA_BROADCAST_ACTIVATION: return "RIL_REQUEST_CDMA_BROADCAST_ACTIVATION";
   3725             case RIL_REQUEST_CDMA_SUBSCRIPTION: return "RIL_REQUEST_CDMA_SUBSCRIPTION";
   3726             case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: return "RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM";
   3727             case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: return "RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM";
   3728             case RIL_REQUEST_DEVICE_IDENTITY: return "RIL_REQUEST_DEVICE_IDENTITY";
   3729             case RIL_REQUEST_GET_SMSC_ADDRESS: return "RIL_REQUEST_GET_SMSC_ADDRESS";
   3730             case RIL_REQUEST_SET_SMSC_ADDRESS: return "RIL_REQUEST_SET_SMSC_ADDRESS";
   3731             case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: return "REQUEST_EXIT_EMERGENCY_CALLBACK_MODE";
   3732             case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: return "RIL_REQUEST_REPORT_SMS_MEMORY_STATUS";
   3733             case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: return "RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING";
   3734             case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: return "RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE";
   3735             case RIL_REQUEST_ISIM_AUTHENTICATION: return "RIL_REQUEST_ISIM_AUTHENTICATION";
   3736             case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: return "RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU";
   3737             case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: return "RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS";
   3738             case RIL_REQUEST_VOICE_RADIO_TECH: return "RIL_REQUEST_VOICE_RADIO_TECH";
   3739             case RIL_REQUEST_GET_CELL_INFO_LIST: return "RIL_REQUEST_GET_CELL_INFO_LIST";
   3740             case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE: return "RIL_REQUEST_SET_CELL_INFO_LIST_RATE";
   3741             case RIL_REQUEST_SET_INITIAL_ATTACH_APN: return "RIL_REQUEST_SET_INITIAL_ATTACH_APN";
   3742             case RIL_REQUEST_IMS_REGISTRATION_STATE: return "RIL_REQUEST_IMS_REGISTRATION_STATE";
   3743             case RIL_REQUEST_IMS_SEND_SMS: return "RIL_REQUEST_IMS_SEND_SMS";
   3744             default: return "<unknown request>";
   3745         }
   3746     }
   3747 
   3748     static String
   3749     responseToString(int request)
   3750     {
   3751 /*
   3752  cat libs/telephony/ril_unsol_commands.h \
   3753  | egrep "^ *{RIL_" \
   3754  | sed -re 's/\{RIL_([^,]+),[^,]+,([^}]+).+/case RIL_\1: return "\1";/'
   3755 */
   3756         switch(request) {
   3757             case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED: return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
   3758             case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
   3759             case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: return "UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED";
   3760             case RIL_UNSOL_RESPONSE_NEW_SMS: return "UNSOL_RESPONSE_NEW_SMS";
   3761             case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT: return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
   3762             case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM: return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
   3763             case RIL_UNSOL_ON_USSD: return "UNSOL_ON_USSD";
   3764             case RIL_UNSOL_ON_USSD_REQUEST: return "UNSOL_ON_USSD_REQUEST";
   3765             case RIL_UNSOL_NITZ_TIME_RECEIVED: return "UNSOL_NITZ_TIME_RECEIVED";
   3766             case RIL_UNSOL_SIGNAL_STRENGTH: return "UNSOL_SIGNAL_STRENGTH";
   3767             case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED";
   3768             case RIL_UNSOL_SUPP_SVC_NOTIFICATION: return "UNSOL_SUPP_SVC_NOTIFICATION";
   3769             case RIL_UNSOL_STK_SESSION_END: return "UNSOL_STK_SESSION_END";
   3770             case RIL_UNSOL_STK_PROACTIVE_COMMAND: return "UNSOL_STK_PROACTIVE_COMMAND";
   3771             case RIL_UNSOL_STK_EVENT_NOTIFY: return "UNSOL_STK_EVENT_NOTIFY";
   3772             case RIL_UNSOL_STK_CALL_SETUP: return "UNSOL_STK_CALL_SETUP";
   3773             case RIL_UNSOL_SIM_SMS_STORAGE_FULL: return "UNSOL_SIM_SMS_STORAGE_FULL";
   3774             case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH";
   3775             case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING";
   3776             case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
   3777             case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_RESPONSE_CDMA_NEW_SMS";
   3778             case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_RESPONSE_NEW_BROADCAST_SMS";
   3779             case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
   3780             case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
   3781             case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
   3782             case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING";
   3783             case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS";
   3784             case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC";
   3785             case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW";
   3786             case RIL_UNSOL_RINGBACK_TONE: return "UNSOL_RINGBACK_TONE";
   3787             case RIL_UNSOL_RESEND_INCALL_MUTE: return "UNSOL_RESEND_INCALL_MUTE";
   3788             case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED: return "CDMA_SUBSCRIPTION_SOURCE_CHANGED";
   3789             case RIL_UNSOl_CDMA_PRL_CHANGED: return "UNSOL_CDMA_PRL_CHANGED";
   3790             case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE: return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE";
   3791             case RIL_UNSOL_RIL_CONNECTED: return "UNSOL_RIL_CONNECTED";
   3792             case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED: return "UNSOL_VOICE_RADIO_TECH_CHANGED";
   3793             case RIL_UNSOL_CELL_INFO_LIST: return "UNSOL_CELL_INFO_LIST";
   3794             case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
   3795                 return "UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED";
   3796             default: return "<unknown response>";
   3797         }
   3798     }
   3799 
   3800     private void riljLog(String msg) {
   3801         Rlog.d(RILJ_LOG_TAG, msg);
   3802     }
   3803 
   3804     private void riljLogv(String msg) {
   3805         Rlog.v(RILJ_LOG_TAG, msg);
   3806     }
   3807 
   3808     private void unsljLog(int response) {
   3809         riljLog("[UNSL]< " + responseToString(response));
   3810     }
   3811 
   3812     private void unsljLogMore(int response, String more) {
   3813         riljLog("[UNSL]< " + responseToString(response) + " " + more);
   3814     }
   3815 
   3816     private void unsljLogRet(int response, Object ret) {
   3817         riljLog("[UNSL]< " + responseToString(response) + " " + retToString(response, ret));
   3818     }
   3819 
   3820     private void unsljLogvRet(int response, Object ret) {
   3821         riljLogv("[UNSL]< " + responseToString(response) + " " + retToString(response, ret));
   3822     }
   3823 
   3824 
   3825     // ***** Methods for CDMA support
   3826     @Override
   3827     public void
   3828     getDeviceIdentity(Message response) {
   3829         RILRequest rr = RILRequest.obtain(RIL_REQUEST_DEVICE_IDENTITY, response);
   3830 
   3831         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   3832 
   3833         send(rr);
   3834     }
   3835 
   3836     @Override
   3837     public void
   3838     getCDMASubscription(Message response) {
   3839         RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_SUBSCRIPTION, response);
   3840 
   3841         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   3842 
   3843         send(rr);
   3844     }
   3845 
   3846     @Override
   3847     public void setPhoneType(int phoneType) { // Called by CDMAPhone and GSMPhone constructor
   3848         if (RILJ_LOGD) riljLog("setPhoneType=" + phoneType + " old value=" + mPhoneType);
   3849         mPhoneType = phoneType;
   3850     }
   3851 
   3852     /**
   3853      * {@inheritDoc}
   3854      */
   3855     @Override
   3856     public void queryCdmaRoamingPreference(Message response) {
   3857         RILRequest rr = RILRequest.obtain(
   3858                 RILConstants.RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE, response);
   3859 
   3860         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   3861 
   3862         send(rr);
   3863     }
   3864 
   3865     /**
   3866      * {@inheritDoc}
   3867      */
   3868     @Override
   3869     public void setCdmaRoamingPreference(int cdmaRoamingType, Message response) {
   3870         RILRequest rr = RILRequest.obtain(
   3871                 RILConstants.RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, response);
   3872 
   3873         rr.mParcel.writeInt(1);
   3874         rr.mParcel.writeInt(cdmaRoamingType);
   3875 
   3876         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   3877                 + " : " + cdmaRoamingType);
   3878 
   3879         send(rr);
   3880     }
   3881 
   3882     /**
   3883      * {@inheritDoc}
   3884      */
   3885     @Override
   3886     public void setCdmaSubscriptionSource(int cdmaSubscription , Message response) {
   3887         RILRequest rr = RILRequest.obtain(
   3888                 RILConstants.RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, response);
   3889 
   3890         rr.mParcel.writeInt(1);
   3891         rr.mParcel.writeInt(cdmaSubscription);
   3892 
   3893         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   3894                 + " : " + cdmaSubscription);
   3895 
   3896         send(rr);
   3897     }
   3898 
   3899     /**
   3900      * {@inheritDoc}
   3901      */
   3902     @Override
   3903     public void getCdmaSubscriptionSource(Message response) {
   3904         RILRequest rr = RILRequest.obtain(
   3905                 RILConstants.RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE, response);
   3906 
   3907         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   3908 
   3909         send(rr);
   3910     }
   3911 
   3912     /**
   3913      * {@inheritDoc}
   3914      */
   3915     @Override
   3916     public void queryTTYMode(Message response) {
   3917         RILRequest rr = RILRequest.obtain(
   3918                 RILConstants.RIL_REQUEST_QUERY_TTY_MODE, response);
   3919 
   3920         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   3921 
   3922         send(rr);
   3923     }
   3924 
   3925     /**
   3926      * {@inheritDoc}
   3927      */
   3928     @Override
   3929     public void setTTYMode(int ttyMode, Message response) {
   3930         RILRequest rr = RILRequest.obtain(
   3931                 RILConstants.RIL_REQUEST_SET_TTY_MODE, response);
   3932 
   3933         rr.mParcel.writeInt(1);
   3934         rr.mParcel.writeInt(ttyMode);
   3935 
   3936         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   3937                 + " : " + ttyMode);
   3938 
   3939         send(rr);
   3940     }
   3941 
   3942     /**
   3943      * {@inheritDoc}
   3944      */
   3945     @Override
   3946     public void
   3947     sendCDMAFeatureCode(String FeatureCode, Message response) {
   3948         RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_FLASH, response);
   3949 
   3950         rr.mParcel.writeString(FeatureCode);
   3951 
   3952         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   3953                 + " : " + FeatureCode);
   3954 
   3955         send(rr);
   3956     }
   3957 
   3958     @Override
   3959     public void getCdmaBroadcastConfig(Message response) {
   3960         RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG, response);
   3961 
   3962         send(rr);
   3963     }
   3964 
   3965     @Override
   3966     public void setCdmaBroadcastConfig(CdmaSmsBroadcastConfigInfo[] configs, Message response) {
   3967         RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG, response);
   3968 
   3969         // Convert to 1 service category per config (the way RIL takes is)
   3970         ArrayList<CdmaSmsBroadcastConfigInfo> processedConfigs =
   3971             new ArrayList<CdmaSmsBroadcastConfigInfo>();
   3972         for (CdmaSmsBroadcastConfigInfo config : configs) {
   3973             for (int i = config.getFromServiceCategory(); i <= config.getToServiceCategory(); i++) {
   3974                 processedConfigs.add(new CdmaSmsBroadcastConfigInfo(i,
   3975                         i,
   3976                         config.getLanguage(),
   3977                         config.isSelected()));
   3978             }
   3979         }
   3980 
   3981         CdmaSmsBroadcastConfigInfo[] rilConfigs = processedConfigs.toArray(configs);
   3982         rr.mParcel.writeInt(rilConfigs.length);
   3983         for(int i = 0; i < rilConfigs.length; i++) {
   3984             rr.mParcel.writeInt(rilConfigs[i].getFromServiceCategory());
   3985             rr.mParcel.writeInt(rilConfigs[i].getLanguage());
   3986             rr.mParcel.writeInt(rilConfigs[i].isSelected() ? 1 : 0);
   3987         }
   3988 
   3989         if (RILJ_LOGD) {
   3990             riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   3991                     + " with " + rilConfigs.length + " configs : ");
   3992             for (int i = 0; i < rilConfigs.length; i++) {
   3993                 riljLog(rilConfigs[i].toString());
   3994             }
   3995         }
   3996 
   3997         send(rr);
   3998     }
   3999 
   4000     @Override
   4001     public void setCdmaBroadcastActivation(boolean activate, Message response) {
   4002         RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_BROADCAST_ACTIVATION, response);
   4003 
   4004         rr.mParcel.writeInt(1);
   4005         rr.mParcel.writeInt(activate ? 0 :1);
   4006 
   4007         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   4008 
   4009         send(rr);
   4010     }
   4011 
   4012     /**
   4013      * {@inheritDoc}
   4014      */
   4015     @Override
   4016     public void exitEmergencyCallbackMode(Message response) {
   4017         RILRequest rr = RILRequest.obtain(RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE, response);
   4018 
   4019         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   4020 
   4021         send(rr);
   4022     }
   4023 
   4024     @Override
   4025     public void requestIsimAuthentication(String nonce, Message response) {
   4026         RILRequest rr = RILRequest.obtain(RIL_REQUEST_ISIM_AUTHENTICATION, response);
   4027 
   4028         rr.mParcel.writeString(nonce);
   4029 
   4030         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   4031 
   4032         send(rr);
   4033     }
   4034 
   4035     /**
   4036      * {@inheritDoc}
   4037      */
   4038     @Override
   4039     public void getCellInfoList(Message result) {
   4040         RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_CELL_INFO_LIST, result);
   4041 
   4042         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   4043 
   4044         send(rr);
   4045     }
   4046 
   4047     /**
   4048      * {@inheritDoc}
   4049      */
   4050     @Override
   4051     public void setCellInfoListRate(int rateInMillis, Message response) {
   4052         if (RILJ_LOGD) riljLog("setCellInfoListRate: " + rateInMillis);
   4053         RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, response);
   4054 
   4055         rr.mParcel.writeInt(1);
   4056         rr.mParcel.writeInt(rateInMillis);
   4057 
   4058         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
   4059 
   4060         send(rr);
   4061     }
   4062 
   4063     public void setInitialAttachApn(String apn, String protocol, int authType, String username,
   4064             String password, Message result) {
   4065         RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_INITIAL_ATTACH_APN, null);
   4066 
   4067         if (RILJ_LOGD) riljLog("Set RIL_REQUEST_SET_INITIAL_ATTACH_APN");
   4068 
   4069         rr.mParcel.writeString(apn);
   4070         rr.mParcel.writeString(protocol);
   4071         rr.mParcel.writeInt(authType);
   4072         rr.mParcel.writeString(username);
   4073         rr.mParcel.writeString(password);
   4074 
   4075         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
   4076                 + ", apn:" + apn + ", protocol:" + protocol + ", authType:" + authType
   4077                 + ", username:" + username + ", password:" + password);
   4078 
   4079         send(rr);
   4080     }
   4081 
   4082     /* (non-Javadoc)
   4083      * @see com.android.internal.telephony.BaseCommands#testingEmergencyCall()
   4084      */
   4085     @Override
   4086     public void testingEmergencyCall() {
   4087         if (RILJ_LOGD) riljLog("testingEmergencyCall");
   4088         mTestingEmergencyCall.set(true);
   4089     }
   4090 
   4091     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
   4092         pw.println("RIL: " + this);
   4093         pw.println(" mSocket=" + mSocket);
   4094         pw.println(" mSenderThread=" + mSenderThread);
   4095         pw.println(" mSender=" + mSender);
   4096         pw.println(" mReceiverThread=" + mReceiverThread);
   4097         pw.println(" mReceiver=" + mReceiver);
   4098         pw.println(" mWakeLock=" + mWakeLock);
   4099         pw.println(" mWakeLockTimeout=" + mWakeLockTimeout);
   4100         synchronized (mRequestList) {
   4101             synchronized (mWakeLock) {
   4102                 pw.println(" mWakeLockCount=" + mWakeLockCount);
   4103             }
   4104             int count = mRequestList.size();
   4105             pw.println(" mRequestList count=" + count);
   4106             for (int i = 0; i < count; i++) {
   4107                 RILRequest rr = mRequestList.valueAt(i);
   4108                 pw.println("  [" + rr.mSerial + "] " + requestToString(rr.mRequest));
   4109             }
   4110         }
   4111         pw.println(" mLastNITZTimeInfo=" + mLastNITZTimeInfo);
   4112         pw.println(" mTestingEmergencyCall=" + mTestingEmergencyCall.get());
   4113     }
   4114 }
   4115