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