10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
19c9c763417554f30c4fa51d3285a9a19893ecd399Amit Mahajanimport static com.android.internal.telephony.RILConstants.*;
20c9c763417554f30c4fa51d3285a9a19893ecd399Amit Mahajanimport static com.android.internal.util.Preconditions.checkNotNull;
21c9c763417554f30c4fa51d3285a9a19893ecd399Amit Mahajan
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context;
235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padaweimport android.hardware.radio.V1_0.Carrier;
245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padaweimport android.hardware.radio.V1_0.CarrierRestrictions;
255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padaweimport android.hardware.radio.V1_0.CdmaBroadcastSmsConfigInfo;
265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padaweimport android.hardware.radio.V1_0.CdmaSmsAck;
275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padaweimport android.hardware.radio.V1_0.CdmaSmsMessage;
285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padaweimport android.hardware.radio.V1_0.CdmaSmsWriteArgs;
2999607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yuimport android.hardware.radio.V1_0.CellInfoCdma;
3099607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yuimport android.hardware.radio.V1_0.CellInfoGsm;
3199607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yuimport android.hardware.radio.V1_0.CellInfoLte;
3299607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yuimport android.hardware.radio.V1_0.CellInfoType;
3399607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yuimport android.hardware.radio.V1_0.CellInfoWcdma;
348e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport android.hardware.radio.V1_0.DataProfileInfo;
35d60a877c59822d2157b8af86f2c3834b04011051Sanket Padaweimport android.hardware.radio.V1_0.Dial;
365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padaweimport android.hardware.radio.V1_0.GsmBroadcastSmsConfigInfo;
375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padaweimport android.hardware.radio.V1_0.GsmSmsMessage;
3899607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yuimport android.hardware.radio.V1_0.HardwareConfigModem;
39d60a877c59822d2157b8af86f2c3834b04011051Sanket Padaweimport android.hardware.radio.V1_0.IRadio;
405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padaweimport android.hardware.radio.V1_0.IccIo;
415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padaweimport android.hardware.radio.V1_0.ImsSmsMessage;
42c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbachimport android.hardware.radio.V1_0.IndicationFilter;
4399607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yuimport android.hardware.radio.V1_0.LceDataInfo;
448e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport android.hardware.radio.V1_0.MvnoType;
455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padaweimport android.hardware.radio.V1_0.NvWriteItem;
46d60a877c59822d2157b8af86f2c3834b04011051Sanket Padaweimport android.hardware.radio.V1_0.RadioError;
47d60a877c59822d2157b8af86f2c3834b04011051Sanket Padaweimport android.hardware.radio.V1_0.RadioIndicationType;
48d60a877c59822d2157b8af86f2c3834b04011051Sanket Padaweimport android.hardware.radio.V1_0.RadioResponseInfo;
49d60a877c59822d2157b8af86f2c3834b04011051Sanket Padaweimport android.hardware.radio.V1_0.RadioResponseType;
50e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran Cimport android.hardware.radio.V1_0.ResetNvType;
515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padaweimport android.hardware.radio.V1_0.SelectUiccSub;
525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padaweimport android.hardware.radio.V1_0.SimApdu;
535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padaweimport android.hardware.radio.V1_0.SmsWriteArgs;
54d60a877c59822d2157b8af86f2c3834b04011051Sanket Padaweimport android.hardware.radio.V1_0.UusInfo;
55c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbachimport android.hardware.radio.V1_2.AccessNetwork;
56ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qianimport android.hardware.radio.deprecated.V1_0.IOemHook;
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.ConnectivityManager;
58f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Haroldimport android.net.KeepalivePacketData;
59d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yuimport android.net.LinkProperties;
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult;
61504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasakaimport android.os.Build;
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler;
630012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajanimport android.os.HwBinder;
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Parcel;
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.PowerManager;
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.PowerManager.WakeLock;
680012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajanimport android.os.RemoteException;
6927eef341b171f925ef43dd088cc559280fd7d2b9Prerepa Viswanadhamimport android.os.SystemClock;
70f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yuimport android.os.SystemProperties;
711bb5864a6f2047b41da9ba6551ee4acfec4d7dd1Naveen Kallaimport android.os.WorkSource;
7240659286ac42ec77bbe7893830bd50c06f393ee8Meng Wangimport android.service.carrier.CarrierIdentifier;
7301e8b1e70fe5ee7d522fe8ba57630a55e633bcbbMalcolm Chenimport android.telephony.AccessNetworkConstants.AccessNetworkType;
747aa0254d5d8f08163b3702a2a1c9602366f568d8Jack Yuimport android.telephony.CellIdentity;
75a8af56d7ddc5b3e7781aaa792a44c2c18539ab2fNathan Haroldimport android.telephony.CellIdentityCdma;
765fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Savilleimport android.telephony.CellInfo;
77a8af56d7ddc5b3e7781aaa792a44c2c18539ab2fNathan Haroldimport android.telephony.CellSignalStrengthCdma;
781bb5864a6f2047b41da9ba6551ee4acfec4d7dd1Naveen Kallaimport android.telephony.ClientRequestStats;
799179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwarimport android.telephony.ImsiEncryptionInfo;
80f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yuimport android.telephony.ModemActivityInfo;
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.NeighboringCellInfo;
82c8c651f856047c6c761de788a14097600701cdabyinxuimport android.telephony.NetworkScanRequest;
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.PhoneNumberUtils;
843ad0c75dac907e8490b78d6fd8c0278d28b96f84Robert Greenwaltimport android.telephony.RadioAccessFamily;
85c8c651f856047c6c761de788a14097600701cdabyinxuimport android.telephony.RadioAccessSpecifier;
86fa4fd4721082689c4b276f67b845e7be249cb8daWink Savilleimport android.telephony.Rlog;
87d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yuimport android.telephony.ServiceState;
885b81adc82a53b3064f4baa3acfeabef31586588aUma Maheswari Ramalingamimport android.telephony.SignalStrength;
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.SmsManager;
90d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padaweimport android.telephony.TelephonyHistogram;
912d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chenimport android.telephony.TelephonyManager;
92c2d0cec6cc786470359383a5fa179586bdde3858Jack Yuimport android.telephony.data.DataProfile;
93d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yuimport android.telephony.data.DataService;
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.TextUtils;
95c8c651f856047c6c761de788a14097600701cdabyinxuimport android.util.Log;
967cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwaltimport android.util.SparseArray;
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
98c066b40160496c1265e21a3b624e267e47807137Pengquan Mengimport com.android.internal.annotations.VisibleForTesting;
99e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Nakaimport com.android.internal.telephony.cat.ComprehensionTlv;
100e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Nakaimport com.android.internal.telephony.cat.ComprehensionTlvTag;
101f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yuimport com.android.internal.telephony.cdma.CdmaInformationRecords;
102f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yuimport com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo;
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
104f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yuimport com.android.internal.telephony.metrics.TelephonyMetrics;
1059460a22f3c1ae70dde80e34557d7011be113b39aTamas Berghammerimport com.android.internal.telephony.nano.TelephonyProto.SmsSession;
106d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccUtils;
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.ByteArrayInputStream;
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.DataInputStream;
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor;
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.IOException;
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter;
113bf307ac11797b1a843e687a3f5e6170e20df244cJack Yuimport java.net.Inet4Address;
114f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Haroldimport java.net.Inet6Address;
1153f8bd3dd2c7bceeab44854231411e9517417b944Jack Yuimport java.net.InetAddress;
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList;
11727eef341b171f925ef43dd088cc559280fd7d2b9Prerepa Viswanadhamimport java.util.Arrays;
118d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padaweimport java.util.List;
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.concurrent.atomic.AtomicBoolean;
1200012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajanimport java.util.concurrent.atomic.AtomicLong;
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * RIL implementation of the CommandsInterface.
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
127c066b40160496c1265e21a3b624e267e47807137Pengquan Mengpublic class RIL extends BaseCommands implements CommandsInterface {
128fa4fd4721082689c4b276f67b845e7be249cb8daWink Saville    static final String RILJ_LOG_TAG = "RILJ";
12904ed5d01a9f80a41a09b8cb455d27614598caae4Olivier Gaillard    static final String RILJ_WAKELOCK_TAG = "*telephony-radio*";
130a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe    // Have a separate wakelock instance for Ack
131a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe    static final String RILJ_ACK_WAKELOCK_NAME = "RILJ_ACK_WL";
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final boolean RILJ_LOGD = true;
133cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    static final boolean RILJ_LOGV = false; // STOPSHIP if true
134d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe    static final int RIL_HISTOGRAM_BUCKET_COUNT = 5;
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Wake lock timeout should be longer than the longest timeout in
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the vendor ril.
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1403464cbb60f1bf1127fd9e10efb05925f6f911b37Sanket Padawe    private static final int DEFAULT_WAKE_LOCK_TIMEOUT_MS = 60000;
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
142a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe    // Wake lock default timeout associated with ack
1433464cbb60f1bf1127fd9e10efb05925f6f911b37Sanket Padawe    private static final int DEFAULT_ACK_WAKE_LOCK_TIMEOUT_MS = 200;
144a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe
14532c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold    private static final int DEFAULT_BLOCKING_MESSAGE_RESPONSE_TIMEOUT_MS = 2000;
14632c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold
147a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe    // Variables used to differentiate ack messages from request while calling clearWakeLock()
14832c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold    public static final int INVALID_WAKELOCK = -1;
14932c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold    public static final int FOR_WAKELOCK = 0;
15032c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold    public static final int FOR_ACK_WAKELOCK = 1;
1511b90799284785b26b0853ae367cac139ba37e18bNaveen Kalla    private final ClientWakelockTracker mClientWakelockTracker = new ClientWakelockTracker();
152a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Instance Variables
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
155a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe    final WakeLock mWakeLock;           // Wake lock associated with request/response
156a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe    final WakeLock mAckWakeLock;        // Wake lock associated with ack sent
157a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe    final int mWakeLockTimeout;         // Timeout associated with request/response
158a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe    final int mAckWakeLockTimeout;      // Timeout associated with ack sent
1597cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt    // The number of wakelock requests currently active.  Don't release the lock
1607cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt    // until dec'd to 0
1617cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt    int mWakeLockCount;
1627cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt
163a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe    // Variables used to identify releasing of WL on wakelock timeouts
164a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe    volatile int mWlSequenceNum = 0;
165a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe    volatile int mAckWlSequenceNum = 0;
166a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe
1677cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt    SparseArray<RILRequest> mRequestList = new SparseArray<RILRequest>();
168d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe    static SparseArray<TelephonyHistogram> mRilTimeHistograms = new
169d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe            SparseArray<TelephonyHistogram>();
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
171d39109502855e8d81e45e21161d8bf0cfacf42e0Sanket Padawe    Object[]     mLastNITZTimeInfo;
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // When we are testing emergency calls
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    AtomicBoolean mTestingEmergencyCall = new AtomicBoolean(false);
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    final Integer mPhoneId;
177a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
1788e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran    /* default work source which will blame phone process */
1798e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran    private WorkSource mRILDefaultWorkSource;
1805054dfa7fd9b0520d30a102ed5a2107af11590c8Pavel Zhamaitsiak
1818e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran    /* Worksource containing all applications causing wakelock to be held */
1828e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran    private WorkSource mActiveWakelockWorkSource;
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1843fe0578ea48570cd5d8c8dfd8b53b8984915330fJack Yu    /** Telephony metrics instance for logging metrics event */
185f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    private TelephonyMetrics mMetrics = TelephonyMetrics.getInstance();
1865054dfa7fd9b0520d30a102ed5a2107af11590c8Pavel Zhamaitsiak
1870d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan    boolean mIsMobileNetworkSupported;
1880d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan    RadioResponse mRadioResponse;
1890d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan    RadioIndication mRadioIndication;
1900d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan    volatile IRadio mRadioProxy = null;
191ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian    OemHookResponse mOemHookResponse;
192ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian    OemHookIndication mOemHookIndication;
193ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian    volatile IOemHook mOemHookProxy = null;
1940d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan    final AtomicLong mRadioProxyCookie = new AtomicLong(0);
1950d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan    final RadioProxyDeathRecipient mRadioProxyDeathRecipient;
1960d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan    final RilHandler mRilHandler;
1970d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan
1988e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran    //***** Events
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final int EVENT_WAKE_LOCK_TIMEOUT    = 2;
200a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe    static final int EVENT_ACK_WAKE_LOCK_TIMEOUT    = 4;
20132c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold    static final int EVENT_BLOCKING_RESPONSE_TIMEOUT = 5;
2020012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan    static final int EVENT_RADIO_PROXY_DEAD     = 6;
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Constants
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
206606cb716e62998ea9813deeb858c45dd4ac5470eAmit Mahajan    static final String[] HIDL_SERVICE_NAME = {"slot1", "slot2", "slot3"};
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2080d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan    static final int IRADIO_GET_SERVICE_DELAY_MILLIS = 4 * 1000;
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
210e2be13c62d7f340a6560c61e2e925d8608f1024cCassie    static final String EMPTY_ALPHA_LONG = "";
211e2be13c62d7f340a6560c61e2e925d8608f1024cCassie    static final String EMPTY_ALPHA_SHORT = "";
212e2be13c62d7f340a6560c61e2e925d8608f1024cCassie
213d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe    public static List<TelephonyHistogram> getTelephonyRILTimingHistograms() {
214d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe        List<TelephonyHistogram> list;
215d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe        synchronized (mRilTimeHistograms) {
216d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe            list = new ArrayList<>(mRilTimeHistograms.size());
217d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe            for (int i = 0; i < mRilTimeHistograms.size(); i++) {
218d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe                TelephonyHistogram entry = new TelephonyHistogram(mRilTimeHistograms.valueAt(i));
219d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe                list.add(entry);
220d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe            }
221d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe        }
222d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe        return list;
223d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe    }
224d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe
225c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    /** The handler used to handle the internal event of RIL. */
226c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @VisibleForTesting
227c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public class RilHandler extends Handler {
228c066b40160496c1265e21a3b624e267e47807137Pengquan Meng
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //***** Handler implementation
230c066b40160496c1265e21a3b624e267e47807137Pengquan Meng        @Override
231c066b40160496c1265e21a3b624e267e47807137Pengquan Meng        public void handleMessage(Message msg) {
232d71af3fb18a6bf51e6aa346849c968fad511d610Amit Mahajan            RILRequest rr;
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            switch (msg.what) {
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case EVENT_WAKE_LOCK_TIMEOUT:
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // Haven't heard back from the last request.  Assume we're
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // not getting a response and  release the wake lock.
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2397cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt                    // The timer of WAKE_LOCK_TIMEOUT is reset with each
2407cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt                    // new send request. So when WAKE_LOCK_TIMEOUT occurs
2417cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt                    // all requests in mRequestList already waited at
2423464cbb60f1bf1127fd9e10efb05925f6f911b37Sanket Padawe                    // least DEFAULT_WAKE_LOCK_TIMEOUT_MS but no response.
2437cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt                    //
2447cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt                    // Note: Keep mRequestList so that delayed response
2457cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt                    // can still be handled when response finally comes.
2467cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt
2477cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt                    synchronized (mRequestList) {
248a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe                        if (msg.arg1 == mWlSequenceNum && clearWakeLock(FOR_WAKELOCK)) {
2497cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt                            if (RILJ_LOGD) {
2507cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt                                int count = mRequestList.size();
2516613a961473a72c218ec505e384dad6b19049aa0Robert Greenwalt                                Rlog.d(RILJ_LOG_TAG, "WAKE_LOCK_TIMEOUT " +
2527cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt                                        " mRequestList=" + count);
2537cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt                                for (int i = 0; i < count; i++) {
2547cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt                                    rr = mRequestList.valueAt(i);
2556613a961473a72c218ec505e384dad6b19049aa0Robert Greenwalt                                    Rlog.d(RILJ_LOG_TAG, i + ": [" + rr.mSerial + "] "
2567cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt                                            + requestToString(rr.mRequest));
2577cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt                                }
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            }
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
262a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe
263a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe                case EVENT_ACK_WAKE_LOCK_TIMEOUT:
264a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe                    if (msg.arg1 == mAckWlSequenceNum && clearWakeLock(FOR_ACK_WAKELOCK)) {
26534dffd7066bcf421829e249f56288bc33735eaf4Sanket Padawe                        if (RILJ_LOGV) {
266a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe                            Rlog.d(RILJ_LOG_TAG, "ACK_WAKE_LOCK_TIMEOUT");
267a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe                        }
268a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe                    }
269a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe                    break;
27032c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold
27132c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                case EVENT_BLOCKING_RESPONSE_TIMEOUT:
27232c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                    int serial = msg.arg1;
27332c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                    rr = findAndRemoveRequestFromList(serial);
27432c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                    // If the request has already been processed, do nothing
27532c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                    if(rr == null) {
27632c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                        break;
27732c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                    }
27832c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold
27932c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                    //build a response if expected
28032c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                    if (rr.mResult != null) {
28132c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                        Object timeoutResponse = getResponseForTimedOutRILRequest(rr);
28232c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                        AsyncResult.forMessage( rr.mResult, timeoutResponse, null);
28332c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                        rr.mResult.sendToTarget();
2845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        mMetrics.writeOnRilTimeoutResponse(mPhoneId, rr.mSerial, rr.mRequest);
28532c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                    }
28632c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold
28732c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                    decrementWakeLock(rr);
28832c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                    rr.release();
28932c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                    break;
290d71af3fb18a6bf51e6aa346849c968fad511d610Amit Mahajan
291d71af3fb18a6bf51e6aa346849c968fad511d610Amit Mahajan                case EVENT_RADIO_PROXY_DEAD:
292d71af3fb18a6bf51e6aa346849c968fad511d610Amit Mahajan                    riljLog("handleMessage: EVENT_RADIO_PROXY_DEAD cookie = " + msg.obj +
293d71af3fb18a6bf51e6aa346849c968fad511d610Amit Mahajan                            " mRadioProxyCookie = " + mRadioProxyCookie.get());
294d71af3fb18a6bf51e6aa346849c968fad511d610Amit Mahajan                    if ((long) msg.obj == mRadioProxyCookie.get()) {
295d71af3fb18a6bf51e6aa346849c968fad511d610Amit Mahajan                        resetProxyAndRequestList();
296d71af3fb18a6bf51e6aa346849c968fad511d610Amit Mahajan                    }
297d71af3fb18a6bf51e6aa346849c968fad511d610Amit Mahajan                    break;
2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
30332c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold     * In order to prevent calls to Telephony from waiting indefinitely
30432c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold     * low-latency blocking calls will eventually time out. In the event of
30532c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold     * a timeout, this function generates a response that is returned to the
30632c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold     * higher layers to unblock the call. This is in lieu of a meaningful
30732c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold     * response.
30832c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold     * @param rr The RIL Request that has timed out.
30932c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold     * @return A default object, such as the one generated by a normal response
31032c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold     * that is returned to the higher layers.
31132c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold     **/
31232c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold    private static Object getResponseForTimedOutRILRequest(RILRequest rr) {
31332c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold        if (rr == null ) return null;
31432c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold
31532c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold        Object timeoutResponse = null;
31632c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold        switch(rr.mRequest) {
31732c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold            case RIL_REQUEST_GET_ACTIVITY_INFO:
31832c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                timeoutResponse = new ModemActivityInfo(
31932c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                        0, 0, 0, new int [ModemActivityInfo.TX_POWER_LEVELS], 0, 0);
32032c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold                break;
32132c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold        };
32232c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold        return timeoutResponse;
32332c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold    }
32432c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold
3250012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan    final class RadioProxyDeathRecipient implements HwBinder.DeathRecipient {
3260012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan        @Override
3270012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan        public void serviceDied(long cookie) {
3280012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan            // Deal with service going away
3290012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan            riljLog("serviceDied");
3305dab6d6e64ae95575dbaafbc1b618917ec3525d3Amit Mahajan            mRilHandler.sendMessage(mRilHandler.obtainMessage(EVENT_RADIO_PROXY_DEAD, cookie));
3310012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan        }
332a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
333a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
3340012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan    private void resetProxyAndRequestList() {
3350012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan        mRadioProxy = null;
336ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        mOemHookProxy = null;
33775a34bca6e996289e3ad200ab545aa154d2fba58Amit Mahajan
338c9c763417554f30c4fa51d3285a9a19893ecd399Amit Mahajan        // increment the cookie so that death notification can be ignored
339c9c763417554f30c4fa51d3285a9a19893ecd399Amit Mahajan        mRadioProxyCookie.incrementAndGet();
340c9c763417554f30c4fa51d3285a9a19893ecd399Amit Mahajan
34175a34bca6e996289e3ad200ab545aa154d2fba58Amit Mahajan        setRadioState(RadioState.RADIO_UNAVAILABLE);
34275a34bca6e996289e3ad200ab545aa154d2fba58Amit Mahajan
3430012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan        RILRequest.resetSerial();
3440012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan        // Clear request list on close
3450012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan        clearRequestList(RADIO_NOT_AVAILABLE, false);
346c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan
3475dab6d6e64ae95575dbaafbc1b618917ec3525d3Amit Mahajan        getRadioProxy(null);
348b8ed5811e5456b64838c198ba7ef7058920e3d4bsqian        getOemHookProxy(null);
3490012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan    }
350c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan
351c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    /** Returns a {@link IRadio} instance or null if the service is not available. */
352c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @VisibleForTesting
353c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public IRadio getRadioProxy(Message result) {
3540ef065b1f452063d6f5ad717d8d90f059ffcd6ecAmit Mahajan        if (!mIsMobileNetworkSupported) {
355b1438f640c98e884f47109e9c9fc4a52fb0aa4efAmit Mahajan            if (RILJ_LOGV) riljLog("getRadioProxy: Not calling getService(): wifi-only");
356447f1b35d518ab3049c22956b66fa76019e0bba2fionaxu            if (result != null) {
357447f1b35d518ab3049c22956b66fa76019e0bba2fionaxu                AsyncResult.forMessage(result, null,
358447f1b35d518ab3049c22956b66fa76019e0bba2fionaxu                        CommandException.fromRilErrno(RADIO_NOT_AVAILABLE));
359447f1b35d518ab3049c22956b66fa76019e0bba2fionaxu                result.sendToTarget();
360447f1b35d518ab3049c22956b66fa76019e0bba2fionaxu            }
3610ef065b1f452063d6f5ad717d8d90f059ffcd6ecAmit Mahajan            return null;
3620ef065b1f452063d6f5ad717d8d90f059ffcd6ecAmit Mahajan        }
3630ef065b1f452063d6f5ad717d8d90f059ffcd6ecAmit Mahajan
3640012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan        if (mRadioProxy != null) {
3650012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan            return mRadioProxy;
3660012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan        }
3670d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan
368c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan        try {
3695dab6d6e64ae95575dbaafbc1b618917ec3525d3Amit Mahajan            mRadioProxy = IRadio.getService(HIDL_SERVICE_NAME[mPhoneId == null ? 0 : mPhoneId],
3705dab6d6e64ae95575dbaafbc1b618917ec3525d3Amit Mahajan                    true);
3710012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan            if (mRadioProxy != null) {
3720012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan                mRadioProxy.linkToDeath(mRadioProxyDeathRecipient,
3730012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan                        mRadioProxyCookie.incrementAndGet());
3740012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan                mRadioProxy.setResponseFunctions(mRadioResponse, mRadioIndication);
375c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan            } else {
376f5865983b0be60ad2ab177ec37e57ffedfd20ac7Amit Mahajan                riljLoge("getRadioProxy: mRadioProxy == null");
377c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan            }
3780012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan        } catch (RemoteException | RuntimeException e) {
3790012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan            mRadioProxy = null;
3800d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan            riljLoge("RadioProxy getService/setResponseFunctions: " + e);
3810d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan        }
3825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
3830d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan        if (mRadioProxy == null) {
3845dab6d6e64ae95575dbaafbc1b618917ec3525d3Amit Mahajan            // getService() is a blocking call, so this should never happen
3855dab6d6e64ae95575dbaafbc1b618917ec3525d3Amit Mahajan            riljLoge("getRadioProxy: mRadioProxy == null");
3865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (result != null) {
3875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                AsyncResult.forMessage(result, null,
3885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        CommandException.fromRilErrno(RADIO_NOT_AVAILABLE));
3895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                result.sendToTarget();
3905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
391c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan        }
3920d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan
3930012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan        return mRadioProxy;
3940012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan    }
3950012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan
396ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian    /** Returns an {@link IOemHook} instance or null if the service is not available. */
397ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian    @VisibleForTesting
398ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian    public IOemHook getOemHookProxy(Message result) {
399ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        if (!mIsMobileNetworkSupported) {
400ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            if (RILJ_LOGV) riljLog("getOemHookProxy: Not calling getService(): wifi-only");
401ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            if (result != null) {
402ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                AsyncResult.forMessage(result, null,
403ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                        CommandException.fromRilErrno(RADIO_NOT_AVAILABLE));
404ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                result.sendToTarget();
405ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            }
406ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            return null;
407ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        }
408ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian
409ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        if (mOemHookProxy != null) {
410ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            return mOemHookProxy;
411ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        }
412ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian
413ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        try {
414ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            mOemHookProxy = IOemHook.getService(
415498ab681c876500f0a7ea5174d5f89f79f9d6a89Steven Moreland                    HIDL_SERVICE_NAME[mPhoneId == null ? 0 : mPhoneId], true);
416ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            if (mOemHookProxy != null) {
417ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                // not calling linkToDeath() as ril service runs in the same process and death
418ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                // notification for that should be sufficient
419ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                mOemHookProxy.setResponseFunctions(mOemHookResponse, mOemHookIndication);
420ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            } else {
421ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                riljLoge("getOemHookProxy: mOemHookProxy == null");
422ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            }
423ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        } catch (RemoteException | RuntimeException e) {
424ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            mOemHookProxy = null;
425ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            riljLoge("OemHookProxy getService/setResponseFunctions: " + e);
426ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        }
427ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian
428ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        if (mOemHookProxy == null) {
429ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            if (result != null) {
430ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                AsyncResult.forMessage(result, null,
431ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                        CommandException.fromRilErrno(RADIO_NOT_AVAILABLE));
432ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                result.sendToTarget();
433ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            }
434ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        }
435ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian
436ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        return mOemHookProxy;
437ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian    }
438ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian
4390012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan    //***** Constructors
4400012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan
4410012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan    public RIL(Context context, int preferredNetworkType, int cdmaSubscription) {
4420012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan        this(context, preferredNetworkType, cdmaSubscription, null);
443c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan    }
444c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan
445a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public RIL(Context context, int preferredNetworkType,
446a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            int cdmaSubscription, Integer instanceId) {
4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super(context);
4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (RILJ_LOGD) {
449d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            riljLog("RIL: init preferredNetworkType=" + preferredNetworkType
450d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe                    + " cdmaSubscription=" + cdmaSubscription + ")");
4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4527cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt
453a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mContext = context;
4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCdmaSubscription  = cdmaSubscription;
4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPreferredNetworkType = preferredNetworkType;
4560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPhoneType = RILConstants.NO_PHONE;
4575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        mPhoneId = instanceId;
4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4590ef065b1f452063d6f5ad717d8d90f059ffcd6ecAmit Mahajan        ConnectivityManager cm = (ConnectivityManager)context.getSystemService(
4600ef065b1f452063d6f5ad717d8d90f059ffcd6ecAmit Mahajan                Context.CONNECTIVITY_SERVICE);
4610ef065b1f452063d6f5ad717d8d90f059ffcd6ecAmit Mahajan        mIsMobileNetworkSupported = cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE);
4620ef065b1f452063d6f5ad717d8d90f059ffcd6ecAmit Mahajan
463c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan        mRadioResponse = new RadioResponse(this);
464c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan        mRadioIndication = new RadioIndication(this);
465ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        mOemHookResponse = new OemHookResponse(this);
466ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        mOemHookIndication = new OemHookIndication(this);
4670012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan        mRilHandler = new RilHandler();
4680012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan        mRadioProxyDeathRecipient = new RadioProxyDeathRecipient();
469c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan
4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
47104ed5d01a9f80a41a09b8cb455d27614598caae4Olivier Gaillard        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, RILJ_WAKELOCK_TAG);
4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWakeLock.setReferenceCounted(false);
473a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe        mAckWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, RILJ_ACK_WAKELOCK_NAME);
474a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe        mAckWakeLock.setReferenceCounted(false);
4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWakeLockTimeout = SystemProperties.getInt(TelephonyProperties.PROPERTY_WAKE_LOCK_TIMEOUT,
4763464cbb60f1bf1127fd9e10efb05925f6f911b37Sanket Padawe                DEFAULT_WAKE_LOCK_TIMEOUT_MS);
477a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe        mAckWakeLockTimeout = SystemProperties.getInt(
4783464cbb60f1bf1127fd9e10efb05925f6f911b37Sanket Padawe                TelephonyProperties.PROPERTY_WAKE_LOCK_TIMEOUT, DEFAULT_ACK_WAKE_LOCK_TIMEOUT_MS);
4797cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt        mWakeLockCount = 0;
4808e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran        mRILDefaultWorkSource = new WorkSource(context.getApplicationInfo().uid,
4818e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran                context.getPackageName());
4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
483a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        TelephonyDevController tdc = TelephonyDevController.getInstance();
484a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        tdc.registerRIL(this);
4850d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan
4860d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan        // set radio callback; needed to set RadioIndication callback (should be done after
4870d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan        // wakelock stuff is initialized above as callbacks are received on separate binder threads)
4880d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan        getRadioProxy(null);
489ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        getOemHookProxy(null);
4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
492c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @Override
493c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public void setOnNITZTime(Handler h, int what, Object obj) {
4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.setOnNITZTime(h, what, obj);
4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Send the last NITZ time if we have it
4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mLastNITZTimeInfo != null) {
4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mNITZTimeRegistrant
4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                .notifyRegistrant(
5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    new AsyncResult (null, mLastNITZTimeInfo, null));
5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
504c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan    private void addRequest(RILRequest rr) {
505c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan        acquireWakeLock(rr, FOR_WAKELOCK);
506c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan        synchronized (mRequestList) {
507d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            rr.mStartTimeMs = SystemClock.elapsedRealtime();
508c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan            mRequestList.append(rr.mSerial, rr);
509c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan        }
510c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan    }
511c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan
5125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    private RILRequest obtainRequest(int request, Message result, WorkSource workSource) {
5135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        RILRequest rr = RILRequest.obtain(request, result, workSource);
5145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        addRequest(rr);
5155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        return rr;
5165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
5175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
5185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    private void handleRadioProxyExceptionForRR(RILRequest rr, String caller, Exception e) {
5190d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan        riljLoge(caller + ": " + e);
5205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        resetProxyAndRequestList();
5215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
5225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
5235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    private String convertNullToEmptyString(String string) {
5245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        return string != null ? string : "";
5255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
5265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
527cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
528c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public void getIccCardStatus(Message result) {
5295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
5305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
5315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_GET_SIM_STATUS, result,
5325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
536c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan            try {
537c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan                radioProxy.getIccCardStatus(rr.mSerial);
5380012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan            } catch (RemoteException | RuntimeException e) {
5395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getIccCardStatus", e);
540c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan            }
541c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan        }
5420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
544c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @Override
5454e10a61602bd065cdf71d0335493ac3444d5055ayinxu    public void getIccSlotsStatus(Message result) {
5468b55cbe95ef5c0007cacf1727e239ab21da6cbafyinxu        if (result != null) {
5478b55cbe95ef5c0007cacf1727e239ab21da6cbafyinxu            AsyncResult.forMessage(result, null,
5488b55cbe95ef5c0007cacf1727e239ab21da6cbafyinxu                    CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
5498b55cbe95ef5c0007cacf1727e239ab21da6cbafyinxu            result.sendToTarget();
5504e10a61602bd065cdf71d0335493ac3444d5055ayinxu        }
5514e10a61602bd065cdf71d0335493ac3444d5055ayinxu    }
5524e10a61602bd065cdf71d0335493ac3444d5055ayinxu
5534e10a61602bd065cdf71d0335493ac3444d5055ayinxu    @Override
5544e10a61602bd065cdf71d0335493ac3444d5055ayinxu    public void setLogicalToPhysicalSlotMapping(int[] physicalSlots, Message result) {
5558b55cbe95ef5c0007cacf1727e239ab21da6cbafyinxu        if (result != null) {
5568b55cbe95ef5c0007cacf1727e239ab21da6cbafyinxu            AsyncResult.forMessage(result, null,
5578b55cbe95ef5c0007cacf1727e239ab21da6cbafyinxu                    CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
5588b55cbe95ef5c0007cacf1727e239ab21da6cbafyinxu            result.sendToTarget();
5594e10a61602bd065cdf71d0335493ac3444d5055ayinxu        }
5604e10a61602bd065cdf71d0335493ac3444d5055ayinxu    }
5614e10a61602bd065cdf71d0335493ac3444d5055ayinxu
5624e10a61602bd065cdf71d0335493ac3444d5055ayinxu    @Override
563c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public void supplyIccPin(String pin, Message result) {
5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        supplyIccPinForApp(pin, null, result);
5650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
567c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @Override
568c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public void supplyIccPinForApp(String pin, String aid, Message result) {
5695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
5705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
5715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_ENTER_SIM_PIN, result,
5725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
5730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
575231379c494dc7274ff97037c593c7e7b88d320d6Sooraj Sasindran                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
576231379c494dc7274ff97037c593c7e7b88d320d6Sooraj Sasindran                        + " aid = " + aid);
5775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
5780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
579d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            try {
580d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe                radioProxy.supplyIccPinForApp(rr.mSerial,
5815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(pin),
5825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(aid));
5830012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan            } catch (RemoteException | RuntimeException e) {
5845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "supplyIccPinForApp", e);
585d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            }
586d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe        }
5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
5905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void supplyIccPuk(String puk, String newPin, Message result) {
5910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        supplyIccPukForApp(puk, newPin, null, result);
5920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
5955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void supplyIccPukForApp(String puk, String newPin, String aid, Message result) {
5965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
5975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
5985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_ENTER_SIM_PUK, result,
5995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
602231379c494dc7274ff97037c593c7e7b88d320d6Sooraj Sasindran                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
603231379c494dc7274ff97037c593c7e7b88d320d6Sooraj Sasindran                        + " aid = " + aid);
6045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
6050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
606d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            try {
607d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe                radioProxy.supplyIccPukForApp(rr.mSerial,
6085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(puk),
6095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(newPin),
6105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(aid));
6110012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan            } catch (RemoteException | RuntimeException e) {
6125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "supplyIccPukForApp", e);
613d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            }
614d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe        }
6150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
617c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @Override
618c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public void supplyIccPin2(String pin, Message result) {
6190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        supplyIccPin2ForApp(pin, null, result);
6200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
622c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @Override
623c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public void supplyIccPin2ForApp(String pin, String aid, Message result) {
6245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
6255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
6265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_ENTER_SIM_PIN2, result,
6275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
6280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
630231379c494dc7274ff97037c593c7e7b88d320d6Sooraj Sasindran                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
631231379c494dc7274ff97037c593c7e7b88d320d6Sooraj Sasindran                        + " aid = " + aid);
6325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
6330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
634d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            try {
635d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe                radioProxy.supplyIccPin2ForApp(rr.mSerial,
6365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(pin),
6375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(aid));
6380012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan            } catch (RemoteException | RuntimeException e) {
6395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "supplyIccPin2ForApp", e);
640d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            }
641d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe        }
6420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
644c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @Override
645c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public void supplyIccPuk2(String puk2, String newPin2, Message result) {
6460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        supplyIccPuk2ForApp(puk2, newPin2, null, result);
6470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
649c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @Override
650c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public void supplyIccPuk2ForApp(String puk, String newPin2, String aid, Message result) {
6515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
6525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
6535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_ENTER_SIM_PUK2, result,
6545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
6550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
657231379c494dc7274ff97037c593c7e7b88d320d6Sooraj Sasindran                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
658231379c494dc7274ff97037c593c7e7b88d320d6Sooraj Sasindran                        + " aid = " + aid);
6595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
6600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
661d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            try {
662d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe                radioProxy.supplyIccPuk2ForApp(rr.mSerial,
6635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(puk),
6645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(newPin2),
6655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(aid));
6660012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan            } catch (RemoteException | RuntimeException e) {
6675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "supplyIccPuk2ForApp", e);
668d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            }
669d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe        }
6700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
672c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @Override
673c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public void changeIccPin(String oldPin, String newPin, Message result) {
6740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        changeIccPinForApp(oldPin, newPin, null, result);
6750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
677c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @Override
678c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public void changeIccPinForApp(String oldPin, String newPin, String aid, Message result) {
6795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
6805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
6815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CHANGE_SIM_PIN, result,
6825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
6830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
6855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " oldPin = "
6865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + oldPin + " newPin = " + newPin + " aid = " + aid);
6875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
6880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
689d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            try {
690d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe                radioProxy.changeIccPinForApp(rr.mSerial,
6915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(oldPin),
6925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(newPin),
6935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(aid));
6940012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan            } catch (RemoteException | RuntimeException e) {
6955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "changeIccPinForApp", e);
696d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            }
697d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe        }
6980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
700c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @Override
701c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public void changeIccPin2(String oldPin2, String newPin2, Message result) {
7020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        changeIccPin2ForApp(oldPin2, newPin2, null, result);
7030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
705c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @Override
706c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public void changeIccPin2ForApp(String oldPin2, String newPin2, String aid, Message result) {
7075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
7085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
7095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CHANGE_SIM_PIN2, result,
7105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
7110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
7135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " oldPin = "
7145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + oldPin2 + " newPin = " + newPin2 + " aid = " + aid);
7155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
7160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
717d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            try {
718d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe                radioProxy.changeIccPin2ForApp(rr.mSerial,
7195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(oldPin2),
7205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(newPin2),
7215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(aid));
7220012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan            } catch (RemoteException | RuntimeException e) {
7235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "changeIccPin2ForApp", e);
724d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            }
725d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe        }
726d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe    }
7270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
728d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe    @Override
729d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe    public void supplyNetworkDepersonalization(String netpin, Message result) {
7305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
7315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
7325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, result,
7335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
734d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe
7355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
7365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " netpin = "
7375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + netpin);
7385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
739d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe
740d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            try {
741d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe                radioProxy.supplyNetworkDepersonalization(rr.mSerial,
7425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(netpin));
7430012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan            } catch (RemoteException | RuntimeException e) {
7445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "supplyNetworkDepersonalization", e);
745d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            }
746d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe        }
7470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
749cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
750d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe    public void getCurrentCalls(Message result) {
7515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
7525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
7535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_GET_CURRENT_CALLS, result,
7545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
7550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
7575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
7585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
7590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
760d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            try {
761d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe                radioProxy.getCurrentCalls(rr.mSerial);
7620012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan            } catch (RemoteException | RuntimeException e) {
7635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getCurrentCalls", e);
764d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            }
765d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe        }
766d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe    }
7670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
768d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe    @Override
769d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe    public void dial(String address, int clirMode, Message result) {
770d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe        dial(address, clirMode, null, result);
7710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
773cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
774d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe    public void dial(String address, int clirMode, UUSInfo uusInfo, Message result) {
7755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
7765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
7775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_DIAL, result,
7785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
7790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            Dial dialInfo = new Dial();
7815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            dialInfo.address = convertNullToEmptyString(address);
7825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            dialInfo.clir = clirMode;
7835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (uusInfo != null) {
7845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                UusInfo info = new UusInfo();
7855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                info.uusType = uusInfo.getType();
7865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                info.uusDcs = uusInfo.getDcs();
7875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                info.uusData = new String(uusInfo.getUserData());
7885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                dialInfo.uusInfo.add(info);
7895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
7900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
7925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                // Do not log function arg for privacy
7935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
7945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
7950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
796d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            try {
797d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe                radioProxy.dial(rr.mSerial, dialInfo);
7980012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan            } catch (RemoteException | RuntimeException e) {
7995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "dial", e);
800d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            }
801d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe        }
8020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
8055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getIMSI(Message result) {
8065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        getIMSIForApp(null, result);
8075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
8080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
8105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getIMSIForApp(String aid, Message result) {
8115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
8125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
8135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_GET_IMSI, result,
8145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
8155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
8165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
8175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString()
8185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + ">  " + requestToString(rr.mRequest) + " aid = " + aid);
8195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
8205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
8215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getImsiForApp(rr.mSerial, convertNullToEmptyString(aid));
8225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
8235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getIMSIForApp", e);
8245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
825d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe        }
8265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
827d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe
8285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
8295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void hangupConnection(int gsmIndex, Message result) {
8305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
8315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
8325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_HANGUP, result,
8335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
8340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
8365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " gsmIndex = "
8375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + gsmIndex);
8385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
8390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
8415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.hangup(rr.mSerial, gsmIndex);
8425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
8435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "hangupConnection", e);
8445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
845d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe        }
8460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
848cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void hangupWaitingOrBackground(Message result) {
8505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
8515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
8525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND, result,
8535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
8540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
856d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe
8575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
8585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.hangupWaitingOrBackground(rr.mSerial);
8595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
8605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "hangupWaitingOrBackground", e);
8615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
8625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
8630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
865cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void hangupForegroundResumeBackground(Message result) {
8675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
8685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
8695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND, result,
8705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
8715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
8725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
8735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
8745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
8755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.hangupForegroundResumeBackground(rr.mSerial);
8765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
8775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "hangupForegroundResumeBackground", e);
8785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
8795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
8800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
882cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void switchWaitingOrHoldingAndActive(Message result) {
8845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
8855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
8865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE, result,
8875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
8880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
8900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
8925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.switchWaitingOrHoldingAndActive(rr.mSerial);
8935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
8945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "switchWaitingOrHoldingAndActive", e);
8955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
8965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
8970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
899cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
9005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void conference(Message result) {
9015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
9025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
9035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CONFERENCE, result,
9045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
9055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
9065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
9075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
9085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
9095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.conference(rr.mSerial);
9105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
9115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "conference", e);
9125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
9135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
9140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
916cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
9175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void rejectCall(Message result) {
9185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
9195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
9205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_UDUB, result,
9215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
9220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
9240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
9265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.rejectCall(rr.mSerial);
9275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
9285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "rejectCall", e);
9295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
9305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
9310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
933cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
9345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getLastCallFailCause(Message result) {
9355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
9365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
9375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_LAST_CALL_FAIL_CAUSE, result,
9385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
9390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
9410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
9435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getLastCallFailCause(rr.mSerial);
9445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
9455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getLastCallFailCause", e);
9465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
9475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
9480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
950cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
951a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan    public void getSignalStrength(Message result) {
952a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        IRadio radioProxy = getRadioProxy(result);
953a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        if (radioProxy != null) {
954a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            RILRequest rr = obtainRequest(RIL_REQUEST_SIGNAL_STRENGTH, result,
955a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                    mRILDefaultWorkSource);
9560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
957a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
9580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
959a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            try {
960a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                radioProxy.getSignalStrength(rr.mSerial);
961a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            } catch (RemoteException | RuntimeException e) {
962a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                handleRadioProxyExceptionForRR(rr, "getSignalStrength", e);
963a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            }
964a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        }
9650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
967cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
9685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getVoiceRegistrationState(Message result) {
9695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
9705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
9715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_VOICE_REGISTRATION_STATE, result,
9725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
9730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
9750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
9775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getVoiceRegistrationState(rr.mSerial);
9785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
9795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getVoiceRegistrationState", e);
9805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
9815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
9820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
984cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
9855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getDataRegistrationState(Message result) {
9865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
9875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
9885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_DATA_REGISTRATION_STATE, result,
9895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
9900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
9920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
9945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getDataRegistrationState(rr.mSerial);
9955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
9965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getDataRegistrationState", e);
9975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
9985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
9990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1001cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
10025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getOperator(Message result) {
10035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
10045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
10055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_OPERATOR, result,
10065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
10070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
10095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
10105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
10115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getOperator(rr.mSerial);
10125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
10135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getOperator", e);
10145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
10155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
10160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1018cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
10195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setRadioPower(boolean on, Message result) {
10205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
10215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
10225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_RADIO_POWER, result,
10235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
10240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
10265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
10275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " on = " + on);
10285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
10290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
10315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setRadioPower(rr.mSerial, on);
10325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
10335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setRadioPower", e);
10345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
10355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
10360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1038cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
10395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void sendDtmf(char c, Message result) {
10405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
10415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
10425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_DTMF, result,
10435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
10440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
10465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                // Do not log function arg for privacy
10475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
10485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
10490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
10515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.sendDtmf(rr.mSerial, c + "");
10525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
10535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "sendDtmf", e);
10545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
10555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
10560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    private GsmSmsMessage constructGsmSendSmsRilRequest(String smscPdu, String pdu) {
10595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        GsmSmsMessage msg = new GsmSmsMessage();
10605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        msg.smscPdu = smscPdu == null ? "" : smscPdu;
10615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        msg.pdu = pdu == null ? "" : pdu;
10625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        return msg;
10630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1065cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
10665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void sendSMS(String smscPdu, String pdu, Message result) {
10675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
10685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
10695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SEND_SMS, result,
10705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
10710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            // Do not log function args for privacy
10735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
10740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            GsmSmsMessage msg = constructGsmSendSmsRilRequest(smscPdu, pdu);
10760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
10785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.sendSms(rr.mSerial, msg);
10795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mMetrics.writeRilSendSms(mPhoneId, rr.mSerial, SmsSession.Event.Tech.SMS_GSM,
10805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        SmsSession.Event.Format.SMS_FORMAT_3GPP);
10815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
10825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "sendSMS", e);
10835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
10845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
10850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1087cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
10885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void sendSMSExpectMore(String smscPdu, String pdu, Message result) {
10895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
10905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
10915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SEND_SMS_EXPECT_MORE, result,
10925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
10930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            // Do not log function arg for privacy
10955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
10960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            GsmSmsMessage msg = constructGsmSendSmsRilRequest(smscPdu, pdu);
10985054dfa7fd9b0520d30a102ed5a2107af11590c8Pavel Zhamaitsiak
10995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
11005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.sendSMSExpectMore(rr.mSerial, msg);
11015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mMetrics.writeRilSendSms(mPhoneId, rr.mSerial, SmsSession.Event.Tech.SMS_GSM,
11025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        SmsSession.Event.Format.SMS_FORMAT_3GPP);
11035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
11045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "sendSMSExpectMore", e);
11055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
11065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
11070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11098e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    /**
11108e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu     * Convert MVNO type string into MvnoType defined in types.hal.
11118e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu     * @param mvnoType MVNO type
11128e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu     * @return MVNO type in integer
11138e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu     */
11148e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    private static int convertToHalMvnoType(String mvnoType) {
11158e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        switch (mvnoType) {
11168e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu            case "imsi" : return MvnoType.IMSI;
11178e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu            case "gid" : return MvnoType.GID;
11188e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu            case "spn" : return MvnoType.SPN;
11198e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu            default: return MvnoType.NONE;
11208e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        }
11218e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    }
11228e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu
11238e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    /**
11248e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu     * Convert to DataProfileInfo defined in types.hal
11258e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu     * @param dp Data profile
11268e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu     * @return A converted data profile
11278e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu     */
11288e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    private static DataProfileInfo convertToHalDataProfile(DataProfile dp) {
11298e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        DataProfileInfo dpi = new DataProfileInfo();
11308e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu
1131c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.profileId = dp.getProfileId();
1132c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.apn = dp.getApn();
1133c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.protocol = dp.getProtocol();
1134c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.roamingProtocol = dp.getRoamingProtocol();
1135c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.authType = dp.getAuthType();
1136c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.user = dp.getUserName();
1137c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.password = dp.getPassword();
1138c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.type = dp.getType();
1139c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.maxConnsTime = dp.getMaxConnsTime();
1140c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.maxConns = dp.getMaxConns();
1141c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.waitTime = dp.getWaitTime();
1142c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.enabled = dp.isEnabled();
1143c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.supportedApnTypesBitmap = dp.getSupportedApnTypesBitmap();
1144c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.bearerBitmap = dp.getBearerBitmap();
1145c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.mtu = dp.getMtu();
1146c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.mvnoType = convertToHalMvnoType(dp.getMvnoType());
1147c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu        dpi.mvnoMatchData = dp.getMvnoMatchData();
11488e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu
11498e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        return dpi;
11508e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    }
11518e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu
11528e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    /**
1153e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C     * Convert NV reset type into ResetNvType defined in types.hal.
1154e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C     * @param resetType NV reset type.
1155e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C     * @return Converted reset type in integer or -1 if param is invalid.
1156e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C     */
1157e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C    private static int convertToHalResetNvType(int resetType) {
1158e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C        /**
1159e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C         * resetType values
1160e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C         * 1 - reload all NV items
1161e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C         * 2 - erase NV reset (SCRTN)
1162e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C         * 3 - factory reset (RTN)
1163e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C         */
1164e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C        switch (resetType) {
1165e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C            case 1: return ResetNvType.RELOAD;
1166e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C            case 2: return ResetNvType.ERASE;
1167e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C            case 3: return ResetNvType.FACTORY_RESET;
1168e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C        }
1169e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C        return -1;
1170e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C    }
1171e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C
1172cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1173d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu    public void setupDataCall(int accessNetworkType, DataProfile dataProfile, boolean isRoaming,
1174d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                              boolean allowRoaming, int reason, LinkProperties linkProperties,
1175d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                              Message result) {
11768e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu
1177a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        IRadio radioProxy = getRadioProxy(result);
11784b2c78c078d59466d18a4f7f926bb3bc0eccff9dJack Yu
1179a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        if (radioProxy != null) {
11808e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu
1181a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            RILRequest rr = obtainRequest(RIL_REQUEST_SETUP_DATA_CALL, result,
1182a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                    mRILDefaultWorkSource);
1183a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan
11848e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu            // Convert to HAL data profile
11858e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu            DataProfileInfo dpi = convertToHalDataProfile(dataProfile);
11868e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu
1187d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu            android.hardware.radio.V1_2.IRadio radioProxy12 =
1188d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                    android.hardware.radio.V1_2.IRadio.castFrom(radioProxy);
1189a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            try {
1190d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                if (radioProxy12 == null) {
1191d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                    // IRadio V1.0
11927465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu
11937465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu                    // Getting data RAT here is just a workaround to support the older 1.0 vendor
11947465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu                    // RIL. The new data service interface passes access network type instead of
11957465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu                    // RAT for setup data request. It is impossible to convert access network
11967465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu                    // type back to RAT here, so we directly get the data RAT from phone.
11977465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu                    int dataRat = ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN;
11987465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu                    Phone phone = PhoneFactory.getPhone(mPhoneId);
11997465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu                    if (phone != null) {
12007465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu                        ServiceState ss = phone.getServiceState();
12017465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu                        if (ss != null) {
12027465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu                            dataRat = ss.getRilDataRadioTechnology();
12037465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu                        }
12047465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu                    }
1205d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                    if (RILJ_LOGD) {
1206d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                        riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
12077465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu                                + ",dataRat=" + dataRat + ",isRoaming=" + isRoaming
1208d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                                + ",allowRoaming=" + allowRoaming + "," + dataProfile);
1209d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                    }
12107465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu
12117465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu                    radioProxy.setupDataCall(rr.mSerial, dataRat, dpi,
12127465b0a9baaa9e27088324cda4f005aab40fa71dJack Yu                            dataProfile.isModemCognitive(), allowRoaming, isRoaming);
1213d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                } else {
1214d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                    // IRadio V1.2
1215014495e4376ec853899a43b8dca4a8c874aba1d5Sandeep Gutta                    ArrayList<String> addresses = new ArrayList<>();
1216014495e4376ec853899a43b8dca4a8c874aba1d5Sandeep Gutta                    ArrayList<String> dnses = new ArrayList<>();
1217d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                    if (linkProperties != null) {
1218d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                        for (InetAddress address : linkProperties.getAddresses()) {
1219d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                            addresses.add(address.getHostAddress());
1220d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                        }
1221d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                        for (InetAddress dns : linkProperties.getDnsServers()) {
1222d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                            dnses.add(dns.getHostAddress());
1223d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                        }
1224d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                    }
1225d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu
1226d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                    if (RILJ_LOGD) {
1227d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                        riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
1228d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                                + ",accessNetworkType=" + accessNetworkType + ",isRoaming="
1229d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                                + isRoaming + ",allowRoaming=" + allowRoaming + "," + dataProfile
1230d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                                + ",addresses=" + addresses + ",dnses=" + dnses);
1231d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                    }
1232d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu
1233d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                    radioProxy12.setupDataCall_1_2(rr.mSerial, accessNetworkType, dpi,
1234d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                            dataProfile.isModemCognitive(), allowRoaming, isRoaming, reason,
1235d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                            addresses, dnses);
1236d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                }
1237a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            } catch (RemoteException | RuntimeException e) {
1238a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                handleRadioProxyExceptionForRR(rr, "setupDataCall", e);
1239a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            }
12408e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        }
12410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1243cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
12445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void iccIO(int command, int fileId, String path, int p1, int p2, int p3,
12455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                      String data, String pin2, Message result) {
12465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        iccIOForApp(command, fileId, path, p1, p2, p3, data, pin2, null, result);
12470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1249cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
12505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void iccIOForApp(int command, int fileId, String path, int p1, int p2, int p3,
12515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                 String data, String pin2, String aid, Message result) {
12525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
12535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
12545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SIM_IO, result,
12555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
12560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
1258504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                if (Build.IS_DEBUGGABLE) {
1259504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                    riljLog(rr.serialString() + "> iccIO: "
1260504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                            + requestToString(rr.mRequest) + " command = 0x"
1261504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                            + Integer.toHexString(command) + " fileId = 0x"
1262504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                            + Integer.toHexString(fileId) + " path = " + path + " p1 = "
1263504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                            + p1 + " p2 = " + p2 + " p3 = " + " data = " + data
1264504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                            + " aid = " + aid);
1265504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                } else {
1266504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                    riljLog(rr.serialString() + "> iccIO: " + requestToString(rr.mRequest));
1267504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                }
12685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
12690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            IccIo iccIo = new IccIo();
12715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            iccIo.command = command;
12725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            iccIo.fileId = fileId;
12735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            iccIo.path = convertNullToEmptyString(path);
12745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            iccIo.p1 = p1;
12755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            iccIo.p2 = p2;
12765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            iccIo.p3 = p3;
12775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            iccIo.data = convertNullToEmptyString(data);
12785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            iccIo.pin2 = convertNullToEmptyString(pin2);
12795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            iccIo.aid = convertNullToEmptyString(aid);
12800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
12825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.iccIOForApp(rr.mSerial, iccIo);
12835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
12845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "iccIOForApp", e);
12855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
12865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
12870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1289cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
12905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void sendUSSD(String ussd, Message result) {
12915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
12925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
12935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SEND_USSD, result,
12945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
12950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
12975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                String logUssd = "*******";
12985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                if (RILJ_LOGV) logUssd = ussd;
12995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
13005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " ussd = " + logUssd);
13015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
13020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
13045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.sendUssd(rr.mSerial, convertNullToEmptyString(ussd));
13055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
13065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "sendUSSD", e);
13075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
13085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
13090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1311cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void cancelPendingUssd(Message result) {
13135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
13145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
13155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CANCEL_USSD, result,
13165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
13170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
13195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString()
13205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + "> " + requestToString(rr.mRequest));
13215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
13220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
13245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.cancelPendingUssd(rr.mSerial);
13255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
13265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "cancelPendingUssd", e);
13275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
13285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
13290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1331cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getCLIR(Message result) {
13335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
13345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
13355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_GET_CLIR, result,
13365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
13370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
13390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
13415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getClir(rr.mSerial);
13425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
13435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getCLIR", e);
13445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
13455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
13460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1348cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setCLIR(int clirMode, Message result) {
13505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
13515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
13525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_CLIR, result, mRILDefaultWorkSource);
13530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
13555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
13565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " clirMode = " + clirMode);
13575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
13580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
13605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setClir(rr.mSerial, clirMode);
13615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
13625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setCLIR", e);
13635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
13645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
13650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1367cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void queryCallForwardStatus(int cfReason, int serviceClass,
13695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                           String number, Message result) {
13705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
13715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
13725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_QUERY_CALL_FORWARD_STATUS, result,
13735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
13740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
13765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
13775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " cfreason = " + cfReason + " serviceClass = " + serviceClass);
13785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
13790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            android.hardware.radio.V1_0.CallForwardInfo cfInfo =
13815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    new android.hardware.radio.V1_0.CallForwardInfo();
13825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            cfInfo.reason = cfReason;
13835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            cfInfo.serviceClass = serviceClass;
13845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            cfInfo.toa = PhoneNumberUtils.toaFromString(number);
13855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            cfInfo.number = convertNullToEmptyString(number);
13865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            cfInfo.timeSeconds = 0;
13875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
13885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
13895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getCallForwardStatus(rr.mSerial, cfInfo);
13905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
13915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "queryCallForwardStatus", e);
13925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
13935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
13940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1396cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setCallForward(int action, int cfReason, int serviceClass,
13985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                   String number, int timeSeconds, Message result) {
13995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
14005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
14015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_CALL_FORWARD, result,
14025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
14030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
14055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
14065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " action = " + action + " cfReason = " + cfReason + " serviceClass = "
14075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + serviceClass + " timeSeconds = " + timeSeconds);
14085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
14090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            android.hardware.radio.V1_0.CallForwardInfo cfInfo =
14115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    new android.hardware.radio.V1_0.CallForwardInfo();
14125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            cfInfo.status = action;
14135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            cfInfo.reason = cfReason;
14145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            cfInfo.serviceClass = serviceClass;
14155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            cfInfo.toa = PhoneNumberUtils.toaFromString(number);
1416a5b70e4dc179942acc958d650bab1017be443e14Sooraj Sasindran            cfInfo.number = convertNullToEmptyString(number);
14178489fba4bf4086d89973231cd627ce5898f34b5cSanket Padawe            cfInfo.timeSeconds = timeSeconds;
14185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
14195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
14205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setCallForward(rr.mSerial, cfInfo);
14215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
14225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setCallForward", e);
14235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
14245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
14255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
14260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1428cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
14295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void queryCallWaiting(int serviceClass, Message result) {
14305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
14315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
14325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_QUERY_CALL_WAITING, result,
14335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
1434a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
14355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
14365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
14375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " serviceClass = " + serviceClass);
14385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
1439a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
14405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
14415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getCallWaiting(rr.mSerial, serviceClass);
14425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
14435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "queryCallWaiting", e);
14445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
14455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
1446a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
1447a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
1448a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
14495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setCallWaiting(boolean enable, int serviceClass, Message result) {
14505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
14515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
14525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_CALL_WAITING, result,
14535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
14540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
14565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
14575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " enable = " + enable + " serviceClass = " + serviceClass);
14585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
14590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
14615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setCallWaiting(rr.mSerial, enable, serviceClass);
14625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
14635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setCallWaiting", e);
14645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
14655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
14660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1468cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
14695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void acknowledgeLastIncomingGsmSms(boolean success, int cause, Message result) {
14705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
14715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
14725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SMS_ACKNOWLEDGE, result,
14735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
14740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
14765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
14775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " success = " + success + " cause = " + cause);
14785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
14790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
14815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.acknowledgeLastIncomingGsmSms(rr.mSerial, success, cause);
14825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
14835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "acknowledgeLastIncomingGsmSms", e);
14845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
14855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
14860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1488cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
14895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void acceptCall(Message result) {
14905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
14915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
14925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_ANSWER, result,
14935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
14940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
14965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
14975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
14980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
15005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.acceptCall(rr.mSerial);
15015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mMetrics.writeRilAnswer(mPhoneId, rr.mSerial);
15025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
15035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "acceptCall", e);
15045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
15055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
15060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1508cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
15095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void deactivateDataCall(int cid, int reason, Message result) {
15105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
15115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
15125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_DEACTIVATE_DATA_CALL, result,
15135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
15140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
15165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> "
15175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + requestToString(rr.mRequest) + " cid = " + cid + " reason = " + reason);
15185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
15190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1520d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu            android.hardware.radio.V1_2.IRadio radioProxy12 =
1521d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                    android.hardware.radio.V1_2.IRadio.castFrom(radioProxy);
1522d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu
15235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
1524d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                if (radioProxy12 == null) {
1525d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                    radioProxy.deactivateDataCall(rr.mSerial, cid,
1526d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                            (reason == DataService.REQUEST_REASON_SHUTDOWN));
1527d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                } else {
1528d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                    radioProxy12.deactivateDataCall_1_2(rr.mSerial, cid, reason);
1529d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                }
1530d5a7979d5c82f1fd568d80267216402bc9d8d0baJack Yu                mMetrics.writeRilDeactivateDataCall(mPhoneId, rr.mSerial, cid, reason);
15315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
15325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "deactivateDataCall", e);
15335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
15345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
15350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
15385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void queryFacilityLock(String facility, String password, int serviceClass,
15395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                  Message result) {
15405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        queryFacilityLockForApp(facility, password, serviceClass, null, result);
15411260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
15421260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
15435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
15445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void queryFacilityLockForApp(String facility, String password, int serviceClass,
15455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                        String appId, Message result) {
15465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
15475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
15485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_QUERY_FACILITY_LOCK, result,
15495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
15500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
15525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
15535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " facility = " + facility + " serviceClass = " + serviceClass
15545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " appId = " + appId);
15555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
15565054dfa7fd9b0520d30a102ed5a2107af11590c8Pavel Zhamaitsiak
15575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
15585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getFacilityLockForApp(rr.mSerial,
15595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(facility),
15605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(password),
15615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        serviceClass,
15625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(appId));
15635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
15645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getFacilityLockForApp", e);
15655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
15665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
15670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15696ad88a8a2caf739e78c8d5f7f50fc7fa84a07ca7Chaitanya Saggurthi    @Override
15705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setFacilityLock(String facility, boolean lockState, String password,
15715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                int serviceClass, Message result) {
15725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        setFacilityLockForApp(facility, lockState, password, serviceClass, null, result);
15736ad88a8a2caf739e78c8d5f7f50fc7fa84a07ca7Chaitanya Saggurthi    }
15746ad88a8a2caf739e78c8d5f7f50fc7fa84a07ca7Chaitanya Saggurthi
15755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
15765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setFacilityLockForApp(String facility, boolean lockState, String password,
15775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                      int serviceClass, String appId, Message result) {
15785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
15795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
15805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_FACILITY_LOCK, result,
15815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
15820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
15845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
15855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " facility = " + facility + " lockstate = " + lockState
15865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " serviceClass = " + serviceClass + " appId = " + appId);
15870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
15880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
15905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setFacilityLockForApp(rr.mSerial,
15915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(facility),
15925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        lockState,
15935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(password),
15945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        serviceClass,
15955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(appId));
15965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
15975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setFacilityLockForApp", e);
15980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
15990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
16001260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
16011260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
16025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
16035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void changeBarringPassword(String facility, String oldPwd, String newPwd,
16045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                      Message result) {
16055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
16065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
16075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CHANGE_BARRING_PASSWORD, result,
16085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
16091260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
16105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            // Do not log all function args for privacy
16115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
16125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
16135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + "facility = " + facility);
16145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
16155054dfa7fd9b0520d30a102ed5a2107af11590c8Pavel Zhamaitsiak
16165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
16175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setBarringPassword(rr.mSerial,
16185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(facility),
16195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(oldPwd),
16205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(newPwd));
16215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
16225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "changeBarringPassword", e);
16235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
16245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
16251260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
16261260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
16275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
16285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getNetworkSelectionMode(Message result) {
16295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
16305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
16315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE, result,
16325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
16331260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
16345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
16355054dfa7fd9b0520d30a102ed5a2107af11590c8Pavel Zhamaitsiak
16365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
16375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getNetworkSelectionMode(rr.mSerial);
16385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
16395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getNetworkSelectionMode", e);
16405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
16415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
16421260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
16431260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
16445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
16455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setNetworkSelectionModeAutomatic(Message result) {
16465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
16475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
16485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC, result,
16495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
16500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
16525054dfa7fd9b0520d30a102ed5a2107af11590c8Pavel Zhamaitsiak
16535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
16545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setNetworkSelectionModeAutomatic(rr.mSerial);
16555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
16565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setNetworkSelectionModeAutomatic", e);
16575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
16585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
16590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1661cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setNetworkSelectionModeManual(String operatorNumeric, Message result) {
16635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
16645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
16655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL, result,
16665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
16670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
16695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
16705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " operatorNumeric = " + operatorNumeric);
16715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
16720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
16745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setNetworkSelectionModeManual(rr.mSerial,
16755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(operatorNumeric));
16765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
16775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setNetworkSelectionModeManual", e);
16785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
16795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
16800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1682cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getAvailableNetworks(Message result) {
16845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
16855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
16865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_QUERY_AVAILABLE_NETWORKS, result,
16875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
16880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
16900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
16925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getAvailableNetworks(rr.mSerial);
16935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
16945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getAvailableNetworks", e);
16955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
16965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
16970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1699ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran    private android.hardware.radio.V1_1.RadioAccessSpecifier convertRadioAccessSpecifierToRadioHAL(
1700ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran            RadioAccessSpecifier ras) {
1701ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran        android.hardware.radio.V1_1.RadioAccessSpecifier rasInHalFormat =
1702ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                new android.hardware.radio.V1_1.RadioAccessSpecifier();
1703a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu        rasInHalFormat.radioAccessNetwork = ras.getRadioAccessNetwork();
1704ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran        List<Integer> bands = null;
1705a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu        switch (ras.getRadioAccessNetwork()) {
170601e8b1e70fe5ee7d522fe8ba57630a55e633bcbbMalcolm Chen            case AccessNetworkType.GERAN:
1707ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                bands = rasInHalFormat.geranBands;
1708ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                break;
170901e8b1e70fe5ee7d522fe8ba57630a55e633bcbbMalcolm Chen            case AccessNetworkType.UTRAN:
1710ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                bands = rasInHalFormat.utranBands;
1711ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                break;
171201e8b1e70fe5ee7d522fe8ba57630a55e633bcbbMalcolm Chen            case AccessNetworkType.EUTRAN:
1713ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                bands = rasInHalFormat.eutranBands;
1714ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                break;
1715ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran            default:
1716a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu                Log.wtf(RILJ_LOG_TAG, "radioAccessNetwork " + ras.getRadioAccessNetwork()
1717ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                        + " not supported!");
1718ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                return null;
1719ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran        }
1720ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran
1721a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu        if (ras.getBands() != null) {
1722a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu            for (int band : ras.getBands()) {
1723ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                bands.add(band);
1724ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran            }
1725ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran        }
1726a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu        if (ras.getChannels() != null) {
1727a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu            for (int channel : ras.getChannels()) {
1728ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                rasInHalFormat.channels.add(channel);
1729ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran            }
1730ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran        }
1731ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran
1732ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran        return rasInHalFormat;
1733ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran    }
1734ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran
1735cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
173684de7198887db7ba56c5cfd1d653033e7b4631a9yinxu    public void startNetworkScan(NetworkScanRequest nsr, Message result) {
1737c8c651f856047c6c761de788a14097600701cdabyinxu        IRadio radioProxy = getRadioProxy(result);
1738c8c651f856047c6c761de788a14097600701cdabyinxu        if (radioProxy != null) {
1739ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran            android.hardware.radio.V1_2.IRadio radioProxy12 =
1740ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                    android.hardware.radio.V1_2.IRadio.castFrom(radioProxy);
1741ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran            if (radioProxy12 != null) {
1742ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                android.hardware.radio.V1_2.NetworkScanRequest request =
1743ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                        new android.hardware.radio.V1_2.NetworkScanRequest();
1744a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu                request.type = nsr.getScanType();
1745a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu                request.interval = nsr.getSearchPeriodicity();
1746a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu                request.maxSearchTime = nsr.getMaxSearchTime();
1747a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu                request.incrementalResultsPeriodicity = nsr.getIncrementalResultsPeriodicity();
1748a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu                request.incrementalResults = nsr.getIncrementalResults();
1749ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran
1750a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu                for (RadioAccessSpecifier ras : nsr.getSpecifiers()) {
1751ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran
1752ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                    android.hardware.radio.V1_1.RadioAccessSpecifier rasInHalFormat =
1753ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                            convertRadioAccessSpecifierToRadioHAL(ras);
1754ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                    if (rasInHalFormat == null) {
1755ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                        return;
1756c8c651f856047c6c761de788a14097600701cdabyinxu                    }
1757ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran
1758ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                    request.specifiers.add(rasInHalFormat);
1759c8c651f856047c6c761de788a14097600701cdabyinxu                }
1760c8c651f856047c6c761de788a14097600701cdabyinxu
1761a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu                request.mccMncs.addAll(nsr.getPlmns());
1762c8c651f856047c6c761de788a14097600701cdabyinxu                RILRequest rr = obtainRequest(RIL_REQUEST_START_NETWORK_SCAN, result,
1763c8c651f856047c6c761de788a14097600701cdabyinxu                        mRILDefaultWorkSource);
1764c8c651f856047c6c761de788a14097600701cdabyinxu
1765c8c651f856047c6c761de788a14097600701cdabyinxu                if (RILJ_LOGD) {
1766c8c651f856047c6c761de788a14097600701cdabyinxu                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
1767c8c651f856047c6c761de788a14097600701cdabyinxu                }
1768c8c651f856047c6c761de788a14097600701cdabyinxu
1769c8c651f856047c6c761de788a14097600701cdabyinxu                try {
1770ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                    radioProxy12.startNetworkScan_1_2(rr.mSerial, request);
1771c8c651f856047c6c761de788a14097600701cdabyinxu                } catch (RemoteException | RuntimeException e) {
1772c8c651f856047c6c761de788a14097600701cdabyinxu                    handleRadioProxyExceptionForRR(rr, "startNetworkScan", e);
1773c8c651f856047c6c761de788a14097600701cdabyinxu                }
1774ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran            } else {
1775ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                android.hardware.radio.V1_1.IRadio radioProxy11 =
1776ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                        android.hardware.radio.V1_1.IRadio.castFrom(radioProxy);
1777ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                if (radioProxy11 == null) {
1778ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                    if (result != null) {
1779ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                        AsyncResult.forMessage(result, null,
1780ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                                CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
1781ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                        result.sendToTarget();
1782ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                    }
1783ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                } else {
1784ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                    android.hardware.radio.V1_1.NetworkScanRequest request =
1785ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                            new android.hardware.radio.V1_1.NetworkScanRequest();
1786a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu                    request.type = nsr.getScanType();
1787a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu                    request.interval = nsr.getSearchPeriodicity();
1788a4fd7bbd4141a66ff1465c2e4f65aca2c65ec728yinxu                    for (RadioAccessSpecifier ras : nsr.getSpecifiers()) {
1789ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                        android.hardware.radio.V1_1.RadioAccessSpecifier rasInHalFormat =
1790ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                                convertRadioAccessSpecifierToRadioHAL(ras);
1791ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                        if (rasInHalFormat == null) {
1792ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                            return;
1793ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                        }
1794ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran
1795ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                        request.specifiers.add(rasInHalFormat);
1796ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                    }
1797ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran
1798ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                    RILRequest rr = obtainRequest(RIL_REQUEST_START_NETWORK_SCAN, result,
1799ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                            mRILDefaultWorkSource);
1800ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran
1801ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                    if (RILJ_LOGD) {
1802ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                        riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
1803ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                    }
1804ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran
1805ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                    try {
1806ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                        radioProxy11.startNetworkScan(rr.mSerial, request);
1807ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                    } catch (RemoteException | RuntimeException e) {
1808ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                        handleRadioProxyExceptionForRR(rr, "startNetworkScan", e);
1809ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                    }
1810ffac118f2399d342c4ca4ddb5167667e52db5adfSooraj Sasindran                }
1811c8c651f856047c6c761de788a14097600701cdabyinxu            }
1812c8c651f856047c6c761de788a14097600701cdabyinxu        }
1813c8c651f856047c6c761de788a14097600701cdabyinxu    }
1814c8c651f856047c6c761de788a14097600701cdabyinxu
1815c8c651f856047c6c761de788a14097600701cdabyinxu    @Override
1816c8c651f856047c6c761de788a14097600701cdabyinxu    public void stopNetworkScan(Message result) {
1817c8c651f856047c6c761de788a14097600701cdabyinxu        IRadio radioProxy = getRadioProxy(result);
1818c8c651f856047c6c761de788a14097600701cdabyinxu        if (radioProxy != null) {
1819c8c651f856047c6c761de788a14097600701cdabyinxu            android.hardware.radio.V1_1.IRadio radioProxy11 =
1820c8c651f856047c6c761de788a14097600701cdabyinxu                    android.hardware.radio.V1_1.IRadio.castFrom(radioProxy);
1821c8c651f856047c6c761de788a14097600701cdabyinxu            if (radioProxy11 == null) {
1822c8c651f856047c6c761de788a14097600701cdabyinxu                if (result != null) {
1823c8c651f856047c6c761de788a14097600701cdabyinxu                    AsyncResult.forMessage(result, null,
1824c8c651f856047c6c761de788a14097600701cdabyinxu                            CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
1825c8c651f856047c6c761de788a14097600701cdabyinxu                    result.sendToTarget();
1826c8c651f856047c6c761de788a14097600701cdabyinxu                }
1827c8c651f856047c6c761de788a14097600701cdabyinxu            } else {
1828c8c651f856047c6c761de788a14097600701cdabyinxu                RILRequest rr = obtainRequest(RIL_REQUEST_STOP_NETWORK_SCAN, result,
1829c8c651f856047c6c761de788a14097600701cdabyinxu                        mRILDefaultWorkSource);
1830c8c651f856047c6c761de788a14097600701cdabyinxu
1831c8c651f856047c6c761de788a14097600701cdabyinxu                if (RILJ_LOGD) {
1832c8c651f856047c6c761de788a14097600701cdabyinxu                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
1833c8c651f856047c6c761de788a14097600701cdabyinxu                }
1834c8c651f856047c6c761de788a14097600701cdabyinxu
1835c8c651f856047c6c761de788a14097600701cdabyinxu                try {
1836c8c651f856047c6c761de788a14097600701cdabyinxu                    radioProxy11.stopNetworkScan(rr.mSerial);
1837c8c651f856047c6c761de788a14097600701cdabyinxu                } catch (RemoteException | RuntimeException e) {
1838c8c651f856047c6c761de788a14097600701cdabyinxu                    handleRadioProxyExceptionForRR(rr, "stopNetworkScan", e);
1839c8c651f856047c6c761de788a14097600701cdabyinxu                }
1840c8c651f856047c6c761de788a14097600701cdabyinxu            }
1841c8c651f856047c6c761de788a14097600701cdabyinxu        }
1842c8c651f856047c6c761de788a14097600701cdabyinxu    }
1843c8c651f856047c6c761de788a14097600701cdabyinxu
1844c8c651f856047c6c761de788a14097600701cdabyinxu    @Override
18455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void startDtmf(char c, Message result) {
18465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
18475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
18485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_DTMF_START, result,
18495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
18500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            // Do not log function arg for privacy
18525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
18530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
18555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.startDtmf(rr.mSerial, c + "");
18565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
18575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "startDtmf", e);
18585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
18595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
18600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
18610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1862cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
18635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void stopDtmf(Message result) {
18645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
18655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
18665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_DTMF_STOP, result,
18675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
18680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
18700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
18725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.stopDtmf(rr.mSerial);
18735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
18745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "stopDtmf", e);
18755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
18765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
18775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
18780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
18805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void separateConnection(int gsmIndex, Message result) {
18815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
18825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
18835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SEPARATE_CONNECTION, result,
18845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
18850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
18875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
18885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " gsmIndex = " + gsmIndex);
18895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
18900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
18925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.separateConnection(rr.mSerial, gsmIndex);
18935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
18945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "separateConnection", e);
18955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
18960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
18970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
18980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1899cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
19005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getBasebandVersion(Message result) {
19015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
19025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
19035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_BASEBAND_VERSION, result,
19045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
19050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
19065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
19070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
19085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
19095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getBasebandVersion(rr.mSerial);
19105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
19115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getBasebandVersion", e);
19125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
19135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
19145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
19150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
19165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
19175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setMute(boolean enableMute, Message result) {
19185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
19195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
19205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_MUTE, result,
19215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
19220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
19235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
19245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
19255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " enableMute = " + enableMute);
19265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
19275054dfa7fd9b0520d30a102ed5a2107af11590c8Pavel Zhamaitsiak
19285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
19295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setMute(rr.mSerial, enableMute);
19305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
19315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setMute", e);
19325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
19335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
19340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
19350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1936cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
19375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getMute(Message result) {
19385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
19395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
19405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_GET_MUTE, result,
19415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
19420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
19435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
19445054dfa7fd9b0520d30a102ed5a2107af11590c8Pavel Zhamaitsiak
19455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
19465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getMute(rr.mSerial);
19475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
19485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getMute", e);
19495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
19505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
19510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
19520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1953cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
19545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void queryCLIP(Message result) {
19555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
19565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
19575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_QUERY_CLIP, result,
19585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
19590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
19605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
19610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
19625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
19635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getClip(rr.mSerial);
19645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
19655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "queryCLIP", e);
19665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
19670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
19680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
19690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
19705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    /**
19715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * @deprecated
19725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     */
1973cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
19745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Deprecated
19755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getPDPContextList(Message result) {
19765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        getDataCallList(result);
197703586878fb3d870373f2fdf65afb81cc5ae97067Naveen Kalla    }
197803586878fb3d870373f2fdf65afb81cc5ae97067Naveen Kalla
197903586878fb3d870373f2fdf65afb81cc5ae97067Naveen Kalla    @Override
19805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getDataCallList(Message result) {
1981a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        IRadio radioProxy = getRadioProxy(result);
1982a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        if (radioProxy != null) {
1983a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            RILRequest rr = obtainRequest(RIL_REQUEST_DATA_CALL_LIST, result,
1984a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                    mRILDefaultWorkSource);
19850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1986a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
19870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1988a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            try {
1989a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                radioProxy.getDataCallList(rr.mSerial);
1990a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            } catch (RemoteException | RuntimeException e) {
1991a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                handleRadioProxyExceptionForRR(rr, "getDataCallList", e);
1992a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            }
1993a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        }
19940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
19950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1996cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1997ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian    public void invokeOemRilRequestRaw(byte[] data, Message response) {
1998ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        IOemHook oemHookProxy = getOemHookProxy(response);
1999ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        if (oemHookProxy != null) {
2000ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            RILRequest rr = obtainRequest(RIL_REQUEST_OEM_HOOK_RAW, response,
2001ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                    mRILDefaultWorkSource);
2002ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian
2003ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            if (RILJ_LOGD) {
2004ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
2005ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                        + "[" + IccUtils.bytesToHexString(data) + "]");
2006ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            }
2007ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian
2008ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            try {
2009ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                oemHookProxy.sendRequestRaw(rr.mSerial, primitiveArrayToArrayList(data));
2010ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            } catch (RemoteException | RuntimeException e) {
2011ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                handleRadioProxyExceptionForRR(rr, "invokeOemRilRequestRaw", e);
2012ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            }
2013b8ed5811e5456b64838c198ba7ef7058920e3d4bsqian        } else {
2014b8ed5811e5456b64838c198ba7ef7058920e3d4bsqian            // OEM Hook service is disabled for P and later devices.
2015b8ed5811e5456b64838c198ba7ef7058920e3d4bsqian            // Deprecated OEM Hook APIs will perform dummy before being removed.
2016b8ed5811e5456b64838c198ba7ef7058920e3d4bsqian            if (RILJ_LOGD) riljLog("Radio Oem Hook Service is disabled for P and later devices. ");
2017ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        }
2018ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian    }
2019ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian
2020ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian    @Override
2021ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian    public void invokeOemRilRequestStrings(String[] strings, Message result) {
2022ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        IOemHook oemHookProxy = getOemHookProxy(result);
2023ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        if (oemHookProxy != null) {
2024ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            RILRequest rr = obtainRequest(RIL_REQUEST_OEM_HOOK_STRINGS, result,
2025ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                    mRILDefaultWorkSource);
2026ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian
2027ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            String logStr = "";
2028ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            for (int i = 0; i < strings.length; i++) {
2029ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                logStr = logStr + strings[i] + " ";
2030ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            }
2031ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            if (RILJ_LOGD) {
2032ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " strings = "
2033ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                        + logStr);
2034ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            }
2035ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian
2036ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            try {
2037ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                oemHookProxy.sendRequestStrings(rr.mSerial,
2038ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                        new ArrayList<String>(Arrays.asList(strings)));
2039ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            } catch (RemoteException | RuntimeException e) {
2040ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                handleRadioProxyExceptionForRR(rr, "invokeOemRilRequestStrings", e);
2041ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            }
2042b8ed5811e5456b64838c198ba7ef7058920e3d4bsqian        } else {
2043b8ed5811e5456b64838c198ba7ef7058920e3d4bsqian            // OEM Hook service is disabled for P and later devices.
2044b8ed5811e5456b64838c198ba7ef7058920e3d4bsqian            // Deprecated OEM Hook APIs will perform dummy before being removed.
2045b8ed5811e5456b64838c198ba7ef7058920e3d4bsqian            if (RILJ_LOGD) riljLog("Radio Oem Hook Service is disabled for P and later devices. ");
2046ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian        }
2047ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian    }
2048ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian
2049ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian    @Override
20505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setSuppServiceNotifications(boolean enable, Message result) {
20515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
20525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
20535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION, result,
20545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
20550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
20565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
20575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " enable = "
20585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + enable);
20595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
20600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
20615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
20625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setSuppServiceNotifications(rr.mSerial, enable);
20635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
20645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setSuppServiceNotifications", e);
20655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
20665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
20670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
20680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2069cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
20705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void writeSmsToSim(int status, String smsc, String pdu, Message result) {
20715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        status = translateStatus(status);
20725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
20735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
20745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_WRITE_SMS_TO_SIM, result,
20755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
20760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
20775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGV) {
20785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> "
20795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + requestToString(rr.mRequest)
20805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " " + status);
20815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
20820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
20835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            SmsWriteArgs args = new SmsWriteArgs();
20845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            args.status = status;
20855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            args.smsc = convertNullToEmptyString(smsc);
20865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            args.pdu = convertNullToEmptyString(pdu);
20870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
20885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
20895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.writeSmsToSim(rr.mSerial, args);
20905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
20915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "writeSmsToSim", e);
20925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
20935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
20940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
20950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2096cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
20975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void deleteSmsOnSim(int index, Message result) {
20985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
20995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
21005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_DELETE_SMS_ON_SIM, result,
21015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
21020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
21035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGV) {
21045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> "
21055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + requestToString(rr.mRequest) + " index = " + index);
21065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
21070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
21085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
21095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.deleteSmsOnSim(rr.mSerial, index);
21105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
21115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "deleteSmsOnSim", e);
21125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
21135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
21140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
21150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2116cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
21175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setBandMode(int bandMode, Message result) {
21185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
21195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
21205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_BAND_MODE, result,
21215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
21220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
21235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
21245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
21255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " bandMode = " + bandMode);
21265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
21270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
21285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
21295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setBandMode(rr.mSerial, bandMode);
21305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
21315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setBandMode", e);
21325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
21335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
21340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
21350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2136cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
21375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void queryAvailableBandMode(Message result) {
21385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
21395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
21405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE, result,
21415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
21420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
21435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
21440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
21455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
21465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getAvailableBandModes(rr.mSerial);
21475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
21485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "queryAvailableBandMode", e);
21495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
21505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
21510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
21520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2153cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
21545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void sendEnvelope(String contents, Message result) {
21555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
21565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
21575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND, result,
21585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
21590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
21605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
21615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " contents = "
21625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + contents);
21635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
21640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
21655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
21665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.sendEnvelope(rr.mSerial, convertNullToEmptyString(contents));
21675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
21685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "sendEnvelope", e);
21695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
21705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
21710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
21720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2173cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
21745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void sendTerminalResponse(String contents, Message result) {
21755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
21765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
21775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE, result,
21785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
21790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
21805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
21815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " contents = "
2182e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka                        + (Build.IS_DEBUGGABLE ? contents : censoredTerminalResponse(contents)));
21835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
21840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
21855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
21865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.sendTerminalResponseToSim(rr.mSerial,
21875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(contents));
21885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
21895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "sendTerminalResponse", e);
21905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
21915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
21920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
21930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2194e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka    private String censoredTerminalResponse(String terminalResponse) {
2195e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka        try {
2196e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka            byte[] bytes = IccUtils.hexStringToBytes(terminalResponse);
2197e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka            if (bytes != null) {
2198e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka                List<ComprehensionTlv> ctlvs = ComprehensionTlv.decodeMany(bytes, 0);
2199e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka                int from = 0;
2200e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka                for (ComprehensionTlv ctlv : ctlvs) {
2201e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka                    // Find text strings which might be personal information input by user,
2202e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka                    // then replace it with "********".
2203e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka                    if (ComprehensionTlvTag.TEXT_STRING.value() == ctlv.getTag()) {
2204e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka                        byte[] target = Arrays.copyOfRange(ctlv.getRawValue(), from,
2205e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka                                ctlv.getValueIndex() + ctlv.getLength());
2206e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka                        terminalResponse = terminalResponse.toLowerCase().replace(
2207e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka                                IccUtils.bytesToHexString(target), "********");
2208e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka                    }
2209e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka                    // The text string tag and the length field should also be hidden.
2210e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka                    from = ctlv.getValueIndex() + ctlv.getLength();
2211e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka                }
2212e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka            }
2213e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka        } catch (Exception e) {
2214e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka            Rlog.e(RILJ_LOG_TAG, "Could not censor the terminal response: " + e);
2215e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka            terminalResponse = null;
2216e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka        }
2217e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka
2218e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka        return terminalResponse;
2219e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka    }
2220e411085af17b045bfb3b4c2dcbccd7ba4ad2fb73Yoshiaki Naka
2221cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
22225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void sendEnvelopeWithStatus(String contents, Message result) {
22235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
22245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
22255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS, result,
22265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
22270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
22285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
22295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " contents = "
22305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + contents);
22315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
22320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
22335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
22345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.sendEnvelopeWithStatus(rr.mSerial, convertNullToEmptyString(contents));
22355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
22365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "sendEnvelopeWithStatus", e);
22375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
22385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
22390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
22400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2241cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
22425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void explicitCallTransfer(Message result) {
22435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
22445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
22455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_EXPLICIT_CALL_TRANSFER, result,
22465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
22470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
22485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
22490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
22505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
22515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.explicitCallTransfer(rr.mSerial);
22525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
22535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "explicitCallTransfer", e);
22545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
22555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
22560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
22570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2258cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
22595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setPreferredNetworkType(int networkType , Message result) {
22605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
22615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
22625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, result,
22635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
22640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
22655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
22665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
22675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " networkType = " + networkType);
22685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
22695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            mPreferredNetworkType = networkType;
22705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            mMetrics.writeSetPreferredNetworkType(mPhoneId, networkType);
22710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
22725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
22735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setPreferredNetworkType(rr.mSerial, networkType);
22745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
22755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setPreferredNetworkType", e);
22765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
22775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
22780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
22790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2280cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
22815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getPreferredNetworkType(Message result) {
22825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
22835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
22845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE, result,
22855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
22860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
22875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
22880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
22895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
22905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getPreferredNetworkType(rr.mSerial);
22915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
22925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getPreferredNetworkType", e);
22935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
22945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
22950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
22960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2297cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
22985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getNeighboringCids(Message result, WorkSource workSource) {
22995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        workSource = getDeafultWorkSourceIfInvalid(workSource);
23005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
23015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
23025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_GET_NEIGHBORING_CELL_IDS, result,
23035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    workSource);
23040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
23055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
23060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
23075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
23085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getNeighboringCids(rr.mSerial);
23095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
23105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getNeighboringCids", e);
23115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
23125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
23130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
23140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
23150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
23165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setLocationUpdates(boolean enable, Message result) {
23175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
23185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
23195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_LOCATION_UPDATES, result,
23205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
23215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
23225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
23235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> "
23245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + requestToString(rr.mRequest) + " enable = " + enable);
23255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
23265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
23275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
23285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setLocationUpdates(rr.mSerial, enable);
23295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
23305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setLocationUpdates", e);
23315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
23325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
23330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
23340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
23350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
23365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setCdmaSubscriptionSource(int cdmaSubscription , Message result) {
23375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
23385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
23395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE, result,
23405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
23410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
23425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
23435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
23445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " cdmaSubscription = " + cdmaSubscription);
23455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
23460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
23475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
23485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setCdmaSubscriptionSource(rr.mSerial, cdmaSubscription);
23495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
23505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setCdmaSubscriptionSource", e);
23515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
23525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
23535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
23540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
23555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
23565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void queryCdmaRoamingPreference(Message result) {
23575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
23585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
23595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE, result,
23605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
23610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
23625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
23630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
23645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
23655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getCdmaRoamingPreference(rr.mSerial);
23665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
23675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "queryCdmaRoamingPreference", e);
23685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
23695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
23700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
23710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
23720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
23735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setCdmaRoamingPreference(int cdmaRoamingType, Message result) {
23745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
23755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
23765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE, result,
23775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
23785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
23795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
23805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
23815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " cdmaRoamingType = " + cdmaRoamingType);
23825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
23835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
23845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
23855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setCdmaRoamingPreference(rr.mSerial, cdmaRoamingType);
23865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
23875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setCdmaRoamingPreference", e);
23885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
23895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
23900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
23910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
23920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
23935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void queryTTYMode(Message result) {
23945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
23955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
23965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_QUERY_TTY_MODE, result,
23975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
23980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
23995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
24000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
24015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
24025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getTTYMode(rr.mSerial);
24035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
24045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "queryTTYMode", e);
24055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
24065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
24075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
24080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
24095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
24105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setTTYMode(int ttyMode, Message result) {
24115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
24125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
24135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_TTY_MODE, result,
24145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
24150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
24165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
24175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
24185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " ttyMode = " + ttyMode);
24195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
24200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
24215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
24225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setTTYMode(rr.mSerial, ttyMode);
24235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
24245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setTTYMode", e);
24255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
24265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
24270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
24280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2429cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
24305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setPreferredVoicePrivacy(boolean enable, Message result) {
24315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
24325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
24335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE, result,
24345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
24350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
24365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
24375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
24385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " enable = " + enable);
24395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
24400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
24415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
24425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setPreferredVoicePrivacy(rr.mSerial, enable);
24435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
24445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setPreferredVoicePrivacy", e);
24455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
24465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
24470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
24480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2449cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
24505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getPreferredVoicePrivacy(Message result) {
24515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
24525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
24535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE,
24545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    result, mRILDefaultWorkSource);
24550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
24565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
24570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
24585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
24595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getPreferredVoicePrivacy(rr.mSerial);
24605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
24615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getPreferredVoicePrivacy", e);
24625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
24635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
24640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
24650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2466cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
24675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void sendCDMAFeatureCode(String featureCode, Message result) {
24685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
24695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
24705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_FLASH, result,
24715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
24720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
24735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
24745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
24755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " featureCode = " + featureCode);
24765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
24770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
24785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
24795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.sendCDMAFeatureCode(rr.mSerial, convertNullToEmptyString(featureCode));
24805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
24815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "sendCDMAFeatureCode", e);
24825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
24835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
24840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
24850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2486cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
24875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void sendBurstDtmf(String dtmfString, int on, int off, Message result) {
24885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
24895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
24905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_BURST_DTMF, result,
24915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
24920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
24935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
24945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
24955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " dtmfString = " + dtmfString + " on = " + on + " off = " + off);
24965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
24970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
24985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
24995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.sendBurstDtmf(rr.mSerial, convertNullToEmptyString(dtmfString), on, off);
25005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
25015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "sendBurstDtmf", e);
25025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
25035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
25045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
25050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
25065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    private void constructCdmaSendSmsRilRequest(CdmaSmsMessage msg, byte[] pdu) {
25075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        int addrNbrOfDigits;
25085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        int subaddrNbrOfDigits;
25095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        int bearerDataLength;
25105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        ByteArrayInputStream bais = new ByteArrayInputStream(pdu);
25115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        DataInputStream dis = new DataInputStream(bais);
25125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
25135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        try {
25145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.teleserviceId = dis.readInt(); // teleServiceId
25155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.isServicePresent = (byte) dis.readInt() == 1 ? true : false; // servicePresent
25165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.serviceCategory = dis.readInt(); // serviceCategory
25175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.address.digitMode = dis.read();  // address digit mode
25185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.address.numberMode = dis.read(); // address number mode
25195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.address.numberType = dis.read(); // address number type
25205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.address.numberPlan = dis.read(); // address number plan
25215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            addrNbrOfDigits = (byte) dis.read();
25225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            for (int i = 0; i < addrNbrOfDigits; i++) {
25235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                msg.address.digits.add(dis.readByte()); // address_orig_bytes[i]
25245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
25255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.subAddress.subaddressType = dis.read(); //subaddressType
25265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.subAddress.odd = (byte) dis.read() == 1 ? true : false; //subaddr odd
25275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            subaddrNbrOfDigits = (byte) dis.read();
25285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            for (int i = 0; i < subaddrNbrOfDigits; i++) {
25295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                msg.subAddress.digits.add(dis.readByte()); //subaddr_orig_bytes[i]
25305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
25310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
25325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            bearerDataLength = dis.read();
25335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            for (int i = 0; i < bearerDataLength; i++) {
25345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                msg.bearerData.add(dis.readByte()); //bearerData[i]
25355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
25365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } catch (IOException ex) {
25375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
25385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog("sendSmsCdma: conversion from input stream to object failed: "
25395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + ex);
25405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
25415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
25420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
25430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2544cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
25455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void sendCdmaSms(byte[] pdu, Message result) {
25465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
25475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
25485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_SEND_SMS, result,
25495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
25500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
25515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            // Do not log function arg for privacy
25525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
25530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
25545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            CdmaSmsMessage msg = new CdmaSmsMessage();
25555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            constructCdmaSendSmsRilRequest(msg, pdu);
25560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
25575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
25585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.sendCdmaSms(rr.mSerial, msg);
25595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mMetrics.writeRilSendSms(mPhoneId, rr.mSerial, SmsSession.Event.Tech.SMS_CDMA,
25605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        SmsSession.Event.Format.SMS_FORMAT_3GPP2);
25615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
25625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "sendCdmaSms", e);
25635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
25645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
25650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
25660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2567cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
25685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void acknowledgeLastIncomingCdmaSms(boolean success, int cause, Message result) {
25695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
25705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
25715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE, result,
25725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
25730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
25745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
25755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
25765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " success = " + success + " cause = " + cause);
25775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
25780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
25795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            CdmaSmsAck msg = new CdmaSmsAck();
25805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.errorClass = success ? 0 : 1;
25815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.smsCauseCode = cause;
25820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
25835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
25845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.acknowledgeLastIncomingCdmaSms(rr.mSerial, msg);
25855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
25865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "acknowledgeLastIncomingCdmaSms", e);
25875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
25885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
25895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
25900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2591cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
25925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getGsmBroadcastConfig(Message result) {
25935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
25945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
25955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_GSM_GET_BROADCAST_CONFIG, result,
25965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
25970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
25985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
25990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
26005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
26015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getGsmBroadcastConfig(rr.mSerial);
26025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
26035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getGsmBroadcastConfig", e);
26045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
26055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
26060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
26070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2608cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
26095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setGsmBroadcastConfig(SmsBroadcastConfigInfo[] config, Message result) {
26105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
26115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
26125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_GSM_SET_BROADCAST_CONFIG, result,
26135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
26140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
26155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
26165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
26175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " with " + config.length + " configs : ");
26185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                for (int i = 0; i < config.length; i++) {
26195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    riljLog(config[i].toString());
26205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                }
26215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
26220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
26235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            ArrayList<GsmBroadcastSmsConfigInfo> configs = new ArrayList<>();
26240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
26255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            int numOfConfig = config.length;
26265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            GsmBroadcastSmsConfigInfo info;
26270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
26285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            for (int i = 0; i < numOfConfig; i++) {
26295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                info = new GsmBroadcastSmsConfigInfo();
26305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                info.fromServiceId = config[i].getFromServiceId();
26315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                info.toServiceId = config[i].getToServiceId();
26325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                info.fromCodeScheme = config[i].getFromCodeScheme();
26335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                info.toCodeScheme = config[i].getToCodeScheme();
26345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                info.selected = config[i].isSelected();
26355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                configs.add(info);
26365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
26370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
26385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
26395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setGsmBroadcastConfig(rr.mSerial, configs);
26405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
26415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setGsmBroadcastConfig", e);
26425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
26435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
26440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
26450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2646cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
26475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setGsmBroadcastActivation(boolean activate, Message result) {
26485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
26495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
26505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_GSM_BROADCAST_ACTIVATION, result,
26515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
26520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
26535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
26545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
26555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " activate = " + activate);
26565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
26570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
26585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
26595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setGsmBroadcastActivation(rr.mSerial, activate);
26605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
26615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setGsmBroadcastActivation", e);
26625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
26635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
26640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
26650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2666cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
26675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getCdmaBroadcastConfig(Message result) {
26685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
26695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
26705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG, result,
26715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
26720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
26735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
26740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
26755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
26765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getCdmaBroadcastConfig(rr.mSerial);
26775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
26785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getCdmaBroadcastConfig", e);
26795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
26805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
26810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
26820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
26830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
26845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setCdmaBroadcastConfig(CdmaSmsBroadcastConfigInfo[] configs, Message result) {
26855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
26865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
26875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG, result,
26885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
26890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
26905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            ArrayList<CdmaBroadcastSmsConfigInfo> halConfigs = new ArrayList<>();
26910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2692cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan            for (CdmaSmsBroadcastConfigInfo config: configs) {
2693cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan                for (int i = config.getFromServiceCategory();
2694cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan                        i <= config.getToServiceCategory();
2695cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan                        i++) {
2696cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan                    CdmaBroadcastSmsConfigInfo info = new CdmaBroadcastSmsConfigInfo();
2697cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan                    info.serviceCategory = i;
2698cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan                    info.language = config.getLanguage();
2699cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan                    info.selected = config.isSelected();
2700cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan                    halConfigs.add(info);
2701cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan                }
2702cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan            }
27030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2704cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan            if (RILJ_LOGD) {
2705cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
2706cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan                        + " with " + halConfigs.size() + " configs : ");
2707cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan                for (CdmaBroadcastSmsConfigInfo config : halConfigs) {
2708cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan                    riljLog(config.toString());
2709cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan                }
27105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
27119746fca2d7389f0fce6d5d031d87acd87b9de723Pavel Zhamaitsiak
27125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
27135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setCdmaBroadcastConfig(rr.mSerial, halConfigs);
27145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
27155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setCdmaBroadcastConfig", e);
27165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
27175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
27180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
27190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2720cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
27215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setCdmaBroadcastActivation(boolean activate, Message result) {
27225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
27235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
27245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_BROADCAST_ACTIVATION, result,
27255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
27260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
27275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
27285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
27295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " activate = " + activate);
27305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
27310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
27325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
27335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setCdmaBroadcastActivation(rr.mSerial, activate);
27345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
27355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setCdmaBroadcastActivation", e);
27365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
27375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
27380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
27390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2740cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
27415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getCDMASubscription(Message result) {
27425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
27435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
27445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_SUBSCRIPTION, result,
27455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
27460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
27475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
27480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
27495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
27505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getCDMASubscription(rr.mSerial);
27515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
27525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getCDMASubscription", e);
27535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
27545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
27550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
27560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2757cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
27585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void writeSmsToRuim(int status, String pdu, Message result) {
27595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        status = translateStatus(status);
27605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
27615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
27625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM, result,
27635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
27640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
27655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGV) {
27665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> "
27675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + requestToString(rr.mRequest)
27685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " status = " + status);
27695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
27700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
27715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            CdmaSmsWriteArgs args = new CdmaSmsWriteArgs();
27725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            args.status = status;
27735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            constructCdmaSendSmsRilRequest(args.message, pdu.getBytes());
27745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
27755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
27765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.writeSmsToRuim(rr.mSerial, args);
27775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
27785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "writeSmsToRuim", e);
27795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
27805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
27810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
27820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2783cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
27845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void deleteSmsOnRuim(int index, Message result) {
27855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
27865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
27875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM, result,
27885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
27890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
27905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGV) {
27915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> "
27925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + requestToString(rr.mRequest)
27935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " index = " + index);
27945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
27950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
27965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
27975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.deleteSmsOnRuim(rr.mSerial, index);
27985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
27995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "deleteSmsOnRuim", e);
28005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
28015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
28020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
28030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2804cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
28055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getDeviceIdentity(Message result) {
28065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
28075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
28085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_DEVICE_IDENTITY, result,
28095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
28100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
28115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
28120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
28135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
28145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getDeviceIdentity(rr.mSerial);
28155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
28165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getDeviceIdentity", e);
28175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
28185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
28190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
28200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2821cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
28225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void exitEmergencyCallbackMode(Message result) {
28235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
28245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
28255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE, result,
28265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
28270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
28285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
28290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
28305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
28315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.exitEmergencyCallbackMode(rr.mSerial);
28325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
28335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "exitEmergencyCallbackMode", e);
28345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
28355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
28360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
28370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2838cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
28395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getSmscAddress(Message result) {
28405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
28415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
28425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_GET_SMSC_ADDRESS, result,
28435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
28440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
28455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
28460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
28475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
28485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getSmscAddress(rr.mSerial);
28495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
28505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getSmscAddress", e);
28515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
28525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
28530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
28540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2855cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
28565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setSmscAddress(String address, Message result) {
28575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
28585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
28595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_SMSC_ADDRESS, result,
28605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
28610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
28625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
28635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
28645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " address = " + address);
28655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
28660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
28675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
28685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setSmscAddress(rr.mSerial, convertNullToEmptyString(address));
28695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
28705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setSmscAddress", e);
28715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
28725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
28730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
28740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2875cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
28765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void reportSmsMemoryStatus(boolean available, Message result) {
28775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
28785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
28795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_REPORT_SMS_MEMORY_STATUS, result,
28805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
28810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
28825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
28835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> "
28845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + requestToString(rr.mRequest) + " available = " + available);
28855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
28860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
28875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
28885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.reportSmsMemoryStatus(rr.mSerial, available);
28895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
28905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "reportSmsMemoryStatus", e);
28910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
28920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
28930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
28940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2895cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
28965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void reportStkServiceIsRunning(Message result) {
2897522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan        IRadio radioProxy = getRadioProxy(result);
2898522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan        if (radioProxy != null) {
2899522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan            RILRequest rr = obtainRequest(RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING, result,
2900522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan                    mRILDefaultWorkSource);
29010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2902522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
29030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2904522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan            try {
2905522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan                radioProxy.reportStkServiceIsRunning(rr.mSerial);
2906522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan            } catch (RemoteException | RuntimeException e) {
2907522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan                handleRadioProxyExceptionForRR(rr, "reportStkServiceIsRunning", e);
2908522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan            }
2909522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan        }
29100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
29110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
29125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
29135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getCdmaSubscriptionSource(Message result) {
29145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
29155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
29165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE, result,
29175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
29180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
29195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
29205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
29215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
29225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getCdmaSubscriptionSource(rr.mSerial);
29235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
29245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getCdmaSubscriptionSource", e);
292580795c239d6281db5fbf0f5a23494bfa3fb938f5Jeff Brown            }
292680795c239d6281db5fbf0f5a23494bfa3fb938f5Jeff Brown        }
292780795c239d6281db5fbf0f5a23494bfa3fb938f5Jeff Brown    }
292880795c239d6281db5fbf0f5a23494bfa3fb938f5Jeff Brown
29295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
29305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void acknowledgeIncomingGsmSmsWithPdu(boolean success, String ackPdu, Message result) {
29315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
29325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
29335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU, result,
29345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
29350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
29365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
29375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
29385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " success = " + success);
29395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
2940d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe
29415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
29425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.acknowledgeIncomingGsmSmsWithPdu(rr.mSerial, success,
29435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(ackPdu));
29445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
29455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "acknowledgeIncomingGsmSmsWithPdu", e);
2946d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            }
2947c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan        }
2948c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan    }
29490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
29505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
29515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getVoiceRadioTechnology(Message result) {
29525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
29535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
29545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_VOICE_RADIO_TECH, result,
29555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
2956c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan
29575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
2958c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan
29595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
29605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getVoiceRadioTechnology(rr.mSerial);
29615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
29625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getVoiceRadioTechnology", e);
2963c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan            }
2964d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe        }
29655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
2966c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan
29675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
29685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getCellInfoList(Message result, WorkSource workSource) {
29695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        workSource = getDeafultWorkSourceIfInvalid(workSource);
2970a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        IRadio radioProxy = getRadioProxy(result);
2971a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        if (radioProxy != null) {
2972a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            RILRequest rr = obtainRequest(RIL_REQUEST_GET_CELL_INFO_LIST, result,
2973a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                    workSource);
2974c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan
2975a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            if (RILJ_LOGD) {
2976a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
2977a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            }
2978d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe
2979a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            try {
2980a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                radioProxy.getCellInfoList(rr.mSerial);
2981a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            } catch (RemoteException | RuntimeException e) {
2982a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                handleRadioProxyExceptionForRR(rr, "getCellInfoList", e);
2983a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            }
2984a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        }
29850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
29860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
29875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
29885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setCellInfoListRate(int rateInMillis, Message result, WorkSource workSource) {
29895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        workSource = getDeafultWorkSourceIfInvalid(workSource);
29905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
29915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
29925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE, result,
29935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    workSource);
29945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
2995d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            if (RILJ_LOGD) {
29965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
29975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " rateInMillis = " + rateInMillis);
2998d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            }
29995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
30005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
30015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setCellInfoListRate(rr.mSerial, rateInMillis);
30025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
30035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setCellInfoListRate", e);
3004c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan            }
3005c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan        }
3006c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan    }
3007c3242d2257c479fed9288dad3103e7697d9c75c6Amit Mahajan
30085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    void setCellInfoListRate() {
30095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        setCellInfoListRate(Integer.MAX_VALUE, null, mRILDefaultWorkSource);
30105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
30115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
30125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
30138e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    public void setInitialAttachApn(DataProfile dataProfile, boolean isRoaming, Message result) {
30148e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu
30155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
3016d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe        if (radioProxy != null) {
30175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_INITIAL_ATTACH_APN, result,
30185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
30195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
30205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
30218e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + dataProfile);
30225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
30235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
3024d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            try {
30258e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                radioProxy.setInitialAttachApn(rr.mSerial, convertToHalDataProfile(dataProfile),
3026c2d0cec6cc786470359383a5fa179586bdde3858Jack Yu                        dataProfile.isModemCognitive(), isRoaming);
30270012abc0db410ba41a198fc5bbcaae77b60ace51Amit Mahajan            } catch (RemoteException | RuntimeException e) {
30285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setInitialAttachApn", e);
3029d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe            }
3030d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe        }
30318e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran    }
30328e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran
30335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
30345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getImsRegistrationState(Message result) {
30355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
30365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
30375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_IMS_REGISTRATION_STATE, result,
30385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
30390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
30405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
30415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
3042a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe            }
30430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
30445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
30455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getImsRegistrationState(rr.mSerial);
30465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
30475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getImsRegistrationState", e);
30485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
30495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
30505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
30518e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran
30525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
30535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void sendImsGsmSms(String smscPdu, String pdu, int retry, int messageRef,
30545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                   Message result) {
30555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
30565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
30575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_IMS_SEND_SMS, result,
30585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
30598e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran
30605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            // Do not log function args for privacy
30615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
306232c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold
30635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            ImsSmsMessage msg = new ImsSmsMessage();
30645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.tech = RILConstants.GSM_PHONE;
3065663bd9a35f7826c91357c32453fd94c54797ad8dyouhei yamahata            msg.retry = (byte) retry >= 1 ? true : false;
30665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.messageRef = messageRef;
306732c5d16886f6ae4f250e4597fe5e70583ea5d912Nathan Harold
30685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            GsmSmsMessage gsmMsg = constructGsmSendSmsRilRequest(smscPdu, pdu);
30695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.gsmMessage.add(gsmMsg);
30705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
30715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.sendImsSms(rr.mSerial, msg);
30725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mMetrics.writeRilSendSms(mPhoneId, rr.mSerial, SmsSession.Event.Tech.SMS_IMS,
30735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        SmsSession.Event.Format.SMS_FORMAT_3GPP);
30745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
30755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "sendImsGsmSms", e);
3076a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe            }
30770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
30780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
30790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
30805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
30815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void sendImsCdmaSms(byte[] pdu, int retry, int messageRef, Message result) {
30825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
30835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
30845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_IMS_SEND_SMS, result,
30855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
30868e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran
30875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            // Do not log function args for privacy
30885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
30895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
30905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            ImsSmsMessage msg = new ImsSmsMessage();
30915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.tech = RILConstants.CDMA_PHONE;
3092663bd9a35f7826c91357c32453fd94c54797ad8dyouhei yamahata            msg.retry = (byte) retry >= 1 ? true : false;
30935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.messageRef = messageRef;
30945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
30955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            CdmaSmsMessage cdmaMsg = new CdmaSmsMessage();
30965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            constructCdmaSendSmsRilRequest(cdmaMsg, pdu);
30975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            msg.cdmaMessage.add(cdmaMsg);
30985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
30995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
31005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.sendImsSms(rr.mSerial, msg);
31015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mMetrics.writeRilSendSms(mPhoneId, rr.mSerial, SmsSession.Event.Tech.SMS_IMS,
31023aa8c871462bbee9eb01a3c22afb5dcdd414eab2Sanket Padawe                        SmsSession.Event.Format.SMS_FORMAT_3GPP2);
31035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
31045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "sendImsCdmaSms", e);
31050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
31060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
31070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
31080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
31095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    private SimApdu createSimApdu(int channel, int cla, int instruction, int p1, int p2, int p3,
31105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                  String data) {
31115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        SimApdu msg = new SimApdu();
31125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        msg.sessionId = channel;
31135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        msg.cla = cla;
31145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        msg.instruction = instruction;
31155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        msg.p1 = p1;
31165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        msg.p2 = p2;
31175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        msg.p3 = p3;
31185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        msg.data = convertNullToEmptyString(data);
31195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        return msg;
31207cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt    }
31217cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt
31225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
31235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void iccTransmitApduBasicChannel(int cla, int instruction, int p1, int p2,
31245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                            int p3, String data, Message result) {
31255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
31265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
31275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC, result,
31285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
31290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
31305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
3131504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                if (Build.IS_DEBUGGABLE) {
3132504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
3133504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                            + " cla = " + cla + " instruction = " + instruction
3134504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                            + " p1 = " + p1 + " p2 = " + " p3 = " + p3 + " data = " + data);
3135504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                } else {
3136504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
3137504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                }
31385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
31390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
31405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            SimApdu msg = createSimApdu(0, cla, instruction, p1, p2, p3, data);
31415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
31425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.iccTransmitApduBasicChannel(rr.mSerial, msg);
31435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
31445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "iccTransmitApduBasicChannel", e);
31455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
31465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
31470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
31480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
31495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
3150c6676c9a97efb78950c8f71ca7330d0bb4b24efdAjay Nambi    public void iccOpenLogicalChannel(String aid, int p2, Message result) {
31515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
31525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
31535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SIM_OPEN_CHANNEL, result,
31545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
31550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
31565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
3157504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                if (Build.IS_DEBUGGABLE) {
3158504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " aid = " + aid
3159504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                            + " p2 = " + p2);
3160504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                } else {
3161504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
3162504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                }
3163060a6f0ba56dde532a9b9b28d4302df86a556691Sanket Padawe            }
3164060a6f0ba56dde532a9b9b28d4302df86a556691Sanket Padawe
31655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
3166c6676c9a97efb78950c8f71ca7330d0bb4b24efdAjay Nambi                radioProxy.iccOpenLogicalChannel(rr.mSerial, convertNullToEmptyString(aid), p2);
31675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
31685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "iccOpenLogicalChannel", e);
31697cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt            }
31700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
31710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
31720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
31735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
31745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void iccCloseLogicalChannel(int channel, Message result) {
31755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
31765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
31775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SIM_CLOSE_CHANNEL, result,
31785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
31795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
31805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
31815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " channel = "
31825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + channel);
31830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
31840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
31855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
31865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.iccCloseLogicalChannel(rr.mSerial, channel);
31875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
31885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "iccCloseLogicalChannel", e);
31890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
31900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
31910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
31920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
31935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
31945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void iccTransmitApduLogicalChannel(int channel, int cla, int instruction,
31955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                              int p1, int p2, int p3, String data,
31965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                              Message result) {
31975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (channel <= 0) {
31985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            throw new RuntimeException(
31995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    "Invalid channel in iccTransmitApduLogicalChannel: " + channel);
32000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
32010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
32025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
32035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
32045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL, result,
32055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
32060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
32075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
3208504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                if (Build.IS_DEBUGGABLE) {
3209504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " channel = "
3210504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                            + channel + " cla = " + cla + " instruction = " + instruction
3211504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                            + " p1 = " + p1 + " p2 = " + " p3 = " + p3 + " data = " + data);
3212504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                } else {
3213504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                    riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
3214504efb8bb7ecb120ee0ea38d60b0ad4dafd40cabMasatoshi Akasaka                }
32155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
3216d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe
32175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            SimApdu msg = createSimApdu(channel, cla, instruction, p1, p2, p3, data);
32185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
32195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
32205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.iccTransmitApduLogicalChannel(rr.mSerial, msg);
32215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
32225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "iccTransmitApduLogicalChannel", e);
3223d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe            }
3224d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe        }
3225d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe    }
3226d506d3daaa7f7ec94fdffcf31cb906b385534127Sanket Padawe
32275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
32285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void nvReadItem(int itemID, Message result) {
32295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
32305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
32315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_NV_READ_ITEM, result,
32325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
32330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
32345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
32355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
32365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " itemId = " + itemID);
32375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
32380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
32395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
32405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.nvReadItem(rr.mSerial, itemID);
32415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
32425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "nvReadItem", e);
32435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
32440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
32455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
32460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
32475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
32485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void nvWriteItem(int itemId, String itemValue, Message result) {
32495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
32505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
32515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_NV_WRITE_ITEM, result,
32528e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran                    mRILDefaultWorkSource);
32535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
3254a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe            if (RILJ_LOGD) {
32555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
32565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " itemId = " + itemId + " itemValue = " + itemValue);
3257a05275d90833d2ff26a2571e2cc0f2ea91fd2b43Sanket Padawe            }
3258060a6f0ba56dde532a9b9b28d4302df86a556691Sanket Padawe
32595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            NvWriteItem item = new NvWriteItem();
32605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            item.itemId = itemId;
32615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            item.value = convertNullToEmptyString(itemValue);
3262060a6f0ba56dde532a9b9b28d4302df86a556691Sanket Padawe
32635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
32645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.nvWriteItem(rr.mSerial, item);
32655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
32665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "nvWriteItem", e);
32675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
32685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
32695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
32700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
32715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
32725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void nvWriteCdmaPrl(byte[] preferredRoamingList, Message result) {
32735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
32745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
32755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_NV_WRITE_CDMA_PRL, result,
32765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
3277d60a877c59822d2157b8af86f2c3834b04011051Sanket Padawe
32785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
32795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
32805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " PreferredRoamingList = 0x"
32815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + IccUtils.bytesToHexString(preferredRoamingList));
32820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
32830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
32845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            ArrayList<Byte> arrList = new ArrayList<>();
32855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            for (int i = 0; i < preferredRoamingList.length; i++) {
32865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                arrList.add(preferredRoamingList[i]);
32875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
32880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
32895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
32905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.nvWriteCdmaPrl(rr.mSerial, arrList);
32915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
32925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "nvWriteCdmaPrl", e);
32930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
32940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
32955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
32960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
32975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
32985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void nvResetConfig(int resetType, Message result) {
32995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
33005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
33015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_NV_RESET_CONFIG, result,
33025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
330303586878fb3d870373f2fdf65afb81cc5ae97067Naveen Kalla
33045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
33055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
33065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " resetType = " + resetType);
3307f860a3f42f87c9c8572623aff33349168d689477Wink Saville            }
3308f860a3f42f87c9c8572623aff33349168d689477Wink Saville
33095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
3310e16769120c06f1ea7e4e22d85b39d7c33c925697Jayachandran C                radioProxy.nvResetConfig(rr.mSerial, convertToHalResetNvType(resetType));
33115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
33125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "nvResetConfig", e);
33137cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt            }
33140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
33155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
33165054dfa7fd9b0520d30a102ed5a2107af11590c8Pavel Zhamaitsiak
33175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
33185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setUiccSubscription(int slotId, int appIndex, int subId,
33195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                    int subStatus, Message result) {
33205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
33215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
33225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_UICC_SUBSCRIPTION, result,
33235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
33245054dfa7fd9b0520d30a102ed5a2107af11590c8Pavel Zhamaitsiak
33255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
33265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
33275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " slot = " + slotId + " appIndex = " + appIndex
33285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " subId = " + subId + " subStatus = " + subStatus);
33295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
33300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
33315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            SelectUiccSub info = new SelectUiccSub();
33325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            info.slot = slotId;
33335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            info.appIndex = appIndex;
33345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            info.subType = subId;
33355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            info.actStatus = subStatus;
33363ad0c75dac907e8490b78d6fd8c0278d28b96f84Robert Greenwalt
33375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
33385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setUiccSubscription(rr.mSerial, info);
33395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
33405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setUiccSubscription", e);
33415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
33423ad0c75dac907e8490b78d6fd8c0278d28b96f84Robert Greenwalt        }
33433ad0c75dac907e8490b78d6fd8c0278d28b96f84Robert Greenwalt    }
33443ad0c75dac907e8490b78d6fd8c0278d28b96f84Robert Greenwalt
33455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
33465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setDataAllowed(boolean allowed, Message result) {
33475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
33485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
33495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_ALLOW_DATA, result,
33505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
33510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
33525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
33535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
33545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " allowed = " + allowed);
33550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
33565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
33575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
33585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setDataAllowed(rr.mSerial, allowed);
33595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
33605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setDataAllowed", e);
3361a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
33620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
33630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
33640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
33655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
3366c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public void getHardwareConfig(Message result) {
3367a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        IRadio radioProxy = getRadioProxy(result);
3368a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        if (radioProxy != null) {
3369a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            RILRequest rr = obtainRequest(RIL_REQUEST_GET_HARDWARE_CONFIG, result,
3370a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                    mRILDefaultWorkSource);
3371e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan
3372a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            // Do not log function args for privacy
3373a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
3374e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan
3375a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            try {
3376a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                radioProxy.getHardwareConfig(rr.mSerial);
3377a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            } catch (RemoteException | RuntimeException e) {
3378a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                handleRadioProxyExceptionForRR(rr, "getHardwareConfig", e);
3379a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            }
3380a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        }
338121c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan    }
33821bb5864a6f2047b41da9ba6551ee4acfec4d7dd1Naveen Kalla
33835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
33845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void requestIccSimAuthentication(int authContext, String data, String aid,
33855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                            Message result) {
33865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
33875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
33885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SIM_AUTHENTICATION, result,
33895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
33900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
33915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            // Do not log function args for privacy
33925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
33935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
33945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
33955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.requestIccSimAuthentication(rr.mSerial,
33965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        authContext,
33975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(data),
33985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        convertNullToEmptyString(aid));
33995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
34005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "requestIccSimAuthentication", e);
34015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
34020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
34030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
34040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
34055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
34068e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu    public void setDataProfile(DataProfile[] dps, boolean isRoaming, Message result) {
34078e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu
34085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
34095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
34105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_DATA_PROFILE, result,
34115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
34120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
34135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
34145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
34158e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                        + " with data profiles : ");
34168e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                for (DataProfile profile : dps) {
34178e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                    riljLog(profile.toString());
34185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                }
34195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
34200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
34218e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu            ArrayList<DataProfileInfo> dpis = new ArrayList<>();
34228e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu            for (DataProfile dp : dps) {
34238e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                dpis.add(convertToHalDataProfile(dp));
34245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
34250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
34265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
34278e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                radioProxy.setDataProfile(rr.mSerial, dpis, isRoaming);
34285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
34295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setDataProfile", e);
34305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
343133cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu        }
34320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
34330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
34345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
34355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void requestShutdown(Message result) {
34365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
34375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
34385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SHUTDOWN, result,
34395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
34400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
34415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
34425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
34435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
34440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
34455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
34465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.requestShutdown(rr.mSerial);
34475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
34485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "requestShutdown", e);
34495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
34500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
34510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
34520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
34535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
34545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getRadioCapability(Message response) {
3455a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        IRadio radioProxy = getRadioProxy(response);
3456a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        if (radioProxy != null) {
3457a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            RILRequest rr = obtainRequest(RIL_REQUEST_GET_RADIO_CAPABILITY, response,
3458a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                    mRILDefaultWorkSource);
34590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3460a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            if (RILJ_LOGD) {
3461a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
3462a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            }
34630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3464a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            try {
3465a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                radioProxy.getRadioCapability(rr.mSerial);
3466a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            } catch (RemoteException | RuntimeException e) {
3467a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                handleRadioProxyExceptionForRR(rr, "getRadioCapability", e);
3468a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            }
3469a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        }
34700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
34710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
34725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
34735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setRadioCapability(RadioCapability rc, Message response) {
3474a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        IRadio radioProxy = getRadioProxy(response);
3475a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        if (radioProxy != null) {
3476a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            RILRequest rr = obtainRequest(RIL_REQUEST_SET_RADIO_CAPABILITY, response,
3477a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                    mRILDefaultWorkSource);
34780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3479a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            if (RILJ_LOGD) {
3480a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
3481a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                        + " RadioCapability = " + rc.toString());
3482a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            }
34830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3484a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            android.hardware.radio.V1_0.RadioCapability halRc =
3485a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                    new android.hardware.radio.V1_0.RadioCapability();
348671173a876ff48d65e013f0a92e920d90fa7a26c7Sanket Padawe
3487a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            halRc.session = rc.getSession();
3488a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            halRc.phase = rc.getPhase();
3489a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            halRc.raf = rc.getRadioAccessFamily();
3490a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            halRc.logicalModemUuid = convertNullToEmptyString(rc.getLogicalModemUuid());
3491a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            halRc.status = rc.getStatus();
3492a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan
3493a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            try {
3494a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                radioProxy.setRadioCapability(rr.mSerial, halRc);
3495a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            } catch (Exception e) {
3496a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                handleRadioProxyExceptionForRR(rr, "setRadioCapability", e);
3497a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            }
3498a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        }
34990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
35000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
35015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
35025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void startLceService(int reportIntervalMs, boolean pullMode, Message result) {
35035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
35047afdb3942adde7efd33b5af5556fead92243e49cNathan Harold        android.hardware.radio.V1_2.IRadio radioProxy12 =
35057afdb3942adde7efd33b5af5556fead92243e49cNathan Harold                android.hardware.radio.V1_2.IRadio.castFrom(radioProxy);
35067afdb3942adde7efd33b5af5556fead92243e49cNathan Harold        if (radioProxy12 != null) {
35077afdb3942adde7efd33b5af5556fead92243e49cNathan Harold            // We have a 1.2 or later radio, so the LCE 1.0 LCE service control path is unused.
35087afdb3942adde7efd33b5af5556fead92243e49cNathan Harold            // Instead the LCE functionality is always-on and provides unsolicited indications.
35097afdb3942adde7efd33b5af5556fead92243e49cNathan Harold            return;
35107afdb3942adde7efd33b5af5556fead92243e49cNathan Harold        }
35117afdb3942adde7efd33b5af5556fead92243e49cNathan Harold
35125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
35135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_START_LCE, result,
35145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
35150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
35165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
35175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
35185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " reportIntervalMs = " + reportIntervalMs + " pullMode = " + pullMode);
35195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
35200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
35215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
35225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.startLceService(rr.mSerial, reportIntervalMs, pullMode);
35235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
35245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "startLceService", e);
35255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
35265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
35270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
35280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
35295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
35305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void stopLceService(Message result) {
35315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
35327afdb3942adde7efd33b5af5556fead92243e49cNathan Harold        android.hardware.radio.V1_2.IRadio radioProxy12 =
35337afdb3942adde7efd33b5af5556fead92243e49cNathan Harold                android.hardware.radio.V1_2.IRadio.castFrom(radioProxy);
35347afdb3942adde7efd33b5af5556fead92243e49cNathan Harold        if (radioProxy12 != null) {
35357afdb3942adde7efd33b5af5556fead92243e49cNathan Harold            // We have a 1.2 or later radio, so the LCE 1.0 LCE service control is unused.
35367afdb3942adde7efd33b5af5556fead92243e49cNathan Harold            // Instead the LCE functionality is always-on and provides unsolicited indications.
35377afdb3942adde7efd33b5af5556fead92243e49cNathan Harold            return;
35387afdb3942adde7efd33b5af5556fead92243e49cNathan Harold        }
35397afdb3942adde7efd33b5af5556fead92243e49cNathan Harold
35405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
35415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_STOP_LCE, result,
35425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
35430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
35445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
35455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
35465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
35470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
35485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
35495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.stopLceService(rr.mSerial);
35505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
35515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "stopLceService", e);
35525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
35535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
35540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
35550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
35567afdb3942adde7efd33b5af5556fead92243e49cNathan Harold    /**
35577afdb3942adde7efd33b5af5556fead92243e49cNathan Harold     * This will only be called if the LCE service is started in PULL mode, which is
35587afdb3942adde7efd33b5af5556fead92243e49cNathan Harold     * only enabled when using Radio HAL versions 1.1 and earlier.
35597afdb3942adde7efd33b5af5556fead92243e49cNathan Harold     *
35607afdb3942adde7efd33b5af5556fead92243e49cNathan Harold     * It is still possible for vendors to override this behavior and use the 1.1 version
35617afdb3942adde7efd33b5af5556fead92243e49cNathan Harold     * of LCE; however, this is strongly discouraged and this functionality will be removed
35627afdb3942adde7efd33b5af5556fead92243e49cNathan Harold     * when HAL 1.x support is dropped.
35637afdb3942adde7efd33b5af5556fead92243e49cNathan Harold     *
35647afdb3942adde7efd33b5af5556fead92243e49cNathan Harold     * @deprecated HAL 1.2 and later use an always-on LCE that relies on indications.
35657afdb3942adde7efd33b5af5556fead92243e49cNathan Harold     */
35667afdb3942adde7efd33b5af5556fead92243e49cNathan Harold    @Deprecated
35675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
35685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void pullLceData(Message response) {
3569a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        IRadio radioProxy = getRadioProxy(response);
3570a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        if (radioProxy != null) {
3571a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            RILRequest rr = obtainRequest(RIL_REQUEST_PULL_LCEDATA, response,
3572a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                    mRILDefaultWorkSource);
3573a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan
3574a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            if (RILJ_LOGD) {
3575a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
3576a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            }
3577a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan
3578a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            try {
3579a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                radioProxy.pullLceData(rr.mSerial);
3580a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            } catch (RemoteException | RuntimeException e) {
3581a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                handleRadioProxyExceptionForRR(rr, "pullLceData", e);
3582a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            }
35835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
35840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
35850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
35865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
35875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getModemActivityInfo(Message result) {
35885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
35895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
35905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_GET_ACTIVITY_INFO, result,
35915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
3592cf916cfb2b4d8282def13e4553abff2ea73aca2bVinit Deshpande
35935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
35945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
35955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
3596cf916cfb2b4d8282def13e4553abff2ea73aca2bVinit Deshpande
35975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
35985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getModemActivityInfo(rr.mSerial);
3599cf916cfb2b4d8282def13e4553abff2ea73aca2bVinit Deshpande
3600d71af3fb18a6bf51e6aa346849c968fad511d610Amit Mahajan                Message msg = mRilHandler.obtainMessage(EVENT_BLOCKING_RESPONSE_TIMEOUT);
36015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                msg.obj = null;
36025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                msg.arg1 = rr.mSerial;
3603d71af3fb18a6bf51e6aa346849c968fad511d610Amit Mahajan                mRilHandler.sendMessageDelayed(msg, DEFAULT_BLOCKING_MESSAGE_RESPONSE_TIMEOUT_MS);
36045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
36055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getModemActivityInfo", e);
36065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
36075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
3608cf916cfb2b4d8282def13e4553abff2ea73aca2bVinit Deshpande
36090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
36100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
36110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
36125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
36135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setAllowedCarriers(List<CarrierIdentifier> carriers, Message result) {
36143953d6e1205524261e887cea2b283d05213e61c1Sanket Padawe        checkNotNull(carriers, "Allowed carriers list cannot be null.");
36155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
36165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
36175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_SET_ALLOWED_CARRIERS, result,
36185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
36190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
36205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
36215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                String logStr = "";
36225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                for (int i = 0; i < carriers.size(); i++) {
36235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    logStr = logStr + carriers.get(i) + " ";
36245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                }
3625e240e9e8f8ae0e9c0aebae3a860653c1dba08495Meng Wang                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " carriers = "
36265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + logStr);
36270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
36285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
36295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            boolean allAllowed;
36305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (carriers.size() == 0) {
36315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                allAllowed = true;
36325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } else {
36335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                allAllowed = false;
36340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
36355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            CarrierRestrictions carrierList = new CarrierRestrictions();
36365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
36375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            for (CarrierIdentifier ci : carriers) { /* allowed carriers */
36385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                Carrier c = new Carrier();
36399f18938b5f973c5f6bb4409bf8941e0801c565eaAmit Mahajan                c.mcc = convertNullToEmptyString(ci.getMcc());
36409f18938b5f973c5f6bb4409bf8941e0801c565eaAmit Mahajan                c.mnc = convertNullToEmptyString(ci.getMnc());
36415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                int matchType = CarrierIdentifier.MatchType.ALL;
36425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                String matchData = null;
36435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                if (!TextUtils.isEmpty(ci.getSpn())) {
36445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    matchType = CarrierIdentifier.MatchType.SPN;
36455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    matchData = ci.getSpn();
36465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                } else if (!TextUtils.isEmpty(ci.getImsi())) {
36475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    matchType = CarrierIdentifier.MatchType.IMSI_PREFIX;
36485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    matchData = ci.getImsi();
36495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                } else if (!TextUtils.isEmpty(ci.getGid1())) {
36505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    matchType = CarrierIdentifier.MatchType.GID1;
36515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    matchData = ci.getGid1();
36525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                } else if (!TextUtils.isEmpty(ci.getGid2())) {
36535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    matchType = CarrierIdentifier.MatchType.GID2;
36545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    matchData = ci.getGid2();
36558f19c6d717bf0e00aeb33552a570a0f60af0ce3bAmit Mahajan                }
36565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                c.matchType = matchType;
36579f18938b5f973c5f6bb4409bf8941e0801c565eaAmit Mahajan                c.matchData = convertNullToEmptyString(matchData);
36585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                carrierList.allowedCarriers.add(c);
3659a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
36600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
36619f18938b5f973c5f6bb4409bf8941e0801c565eaAmit Mahajan            /* TODO: add excluded carriers */
36620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
36635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
36645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.setAllowedCarriers(rr.mSerial, allAllowed, carrierList);
36655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
36665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "setAllowedCarriers", e);
36675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
36680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
36690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
36700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
36715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
36725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getAllowedCarriers(Message result) {
36735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
36745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
36755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_GET_ALLOWED_CARRIERS, result,
36765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mRILDefaultWorkSource);
36770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
36785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
36795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
3680a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
36815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
36825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
36835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.getAllowedCarriers(rr.mSerial);
36845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
36855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getAllowedCarriers", e);
36860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
36870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
36880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
36890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
36905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
3691baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu    public void sendDeviceState(int stateType, boolean state,
3692baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu                                Message result) {
3693baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu        IRadio radioProxy = getRadioProxy(result);
3694baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu        if (radioProxy != null) {
3695baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu            RILRequest rr = obtainRequest(RIL_REQUEST_SEND_DEVICE_STATE, result,
3696baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu                    mRILDefaultWorkSource);
3697baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu
3698baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu            if (RILJ_LOGD) {
3699baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " "
3700baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu                        + stateType + ":" + state);
3701baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu            }
3702baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu
3703baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu            try {
3704baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu                radioProxy.sendDeviceState(rr.mSerial, stateType, state);
3705baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu            } catch (RemoteException | RuntimeException e) {
3706baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu                handleRadioProxyExceptionForRR(rr, "sendDeviceState", e);
3707baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu            }
3708baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu        }
3709baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu    }
3710baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu
3711baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu    @Override
3712baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu    public void setUnsolResponseFilter(int filter, Message result) {
3713baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu        IRadio radioProxy = getRadioProxy(result);
3714baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu        if (radioProxy != null) {
3715baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu            RILRequest rr = obtainRequest(RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER, result,
3716baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu                    mRILDefaultWorkSource);
3717baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu
3718baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu            if (RILJ_LOGD) {
3719baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " " + filter);
3720baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu            }
3721baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu
3722c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            android.hardware.radio.V1_2.IRadio radioProxy12 =
3723c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                    android.hardware.radio.V1_2.IRadio.castFrom(radioProxy);
3724c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach
3725c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            if (radioProxy12 != null) {
3726c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                try {
3727c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                    radioProxy12.setIndicationFilter_1_2(rr.mSerial, filter);
3728c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                } catch (RemoteException | RuntimeException e) {
3729c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                    handleRadioProxyExceptionForRR(rr, "setIndicationFilter_1_2", e);
3730c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                }
3731c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            } else {
3732c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                try {
3733c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                    int filter10 = filter & IndicationFilter.ALL;
3734c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                    radioProxy.setIndicationFilter(rr.mSerial, filter10);
3735c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                } catch (RemoteException | RuntimeException e) {
3736c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                    handleRadioProxyExceptionForRR(rr, "setIndicationFilter", e);
3737c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                }
3738c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            }
3739c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach        }
3740c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach    }
3741c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach
3742c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach    @Override
3743c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach    public void setSignalStrengthReportingCriteria(int hysteresisMs, int hysteresisDb,
3744c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            int[] thresholdsDbm, int ran, Message result) {
3745c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach        IRadio radioProxy = getRadioProxy(result);
3746c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach        if (radioProxy != null) {
3747c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            android.hardware.radio.V1_2.IRadio radioProxy12 =
3748c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                    android.hardware.radio.V1_2.IRadio.castFrom(radioProxy);
3749c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            if (radioProxy12 == null) {
3750c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                riljLoge("setSignalStrengthReportingCriteria ignored. RadioProxy 1.2 is null!");
3751c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                return;
3752c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            }
3753c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach
3754c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            RILRequest rr = obtainRequest(RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA,
3755c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                    result, mRILDefaultWorkSource);
3756c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach
3757c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            if (RILJ_LOGD) {
3758c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
3759c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            }
3760c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach
3761baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu            try {
3762c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                radioProxy12.setSignalStrengthReportingCriteria(rr.mSerial, hysteresisMs,
3763c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                        hysteresisDb, primitiveArrayToArrayList(thresholdsDbm),
3764c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                        convertRanToHalRan(ran));
3765baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu            } catch (RemoteException | RuntimeException e) {
3766c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                handleRadioProxyExceptionForRR(rr, "setSignalStrengthReportingCriteria", e);
3767baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu            }
3768baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu        }
3769baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu    }
3770baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu
3771baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu    @Override
3772c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach    public void setLinkCapacityReportingCriteria(int hysteresisMs, int hysteresisDlKbps,
3773c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            int hysteresisUlKbps, int[] thresholdsDlKbps, int[] thresholdsUlKbps, int ran,
3774c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            Message result) {
3775c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach        IRadio radioProxy = getRadioProxy(result);
3776c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach        if (radioProxy != null) {
3777c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            android.hardware.radio.V1_2.IRadio radioProxy12 =
3778c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                    android.hardware.radio.V1_2.IRadio.castFrom(radioProxy);
3779c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            if (radioProxy12 == null) {
3780c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                riljLoge("setLinkCapacityReportingCriteria ignored. RadioProxy 1.2 is null!");
3781c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                return;
3782c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            }
3783c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach
3784c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            RILRequest rr = obtainRequest(RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA,
3785c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                    result, mRILDefaultWorkSource);
3786c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach
3787c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            if (RILJ_LOGD) {
3788c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
3789c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            }
3790c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach
3791c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            try {
3792c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                radioProxy12.setLinkCapacityReportingCriteria(rr.mSerial, hysteresisMs,
3793c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                        hysteresisDlKbps, hysteresisUlKbps,
3794c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                        primitiveArrayToArrayList(thresholdsDlKbps),
3795c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                        primitiveArrayToArrayList(thresholdsUlKbps), convertRanToHalRan(ran));
3796c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            } catch (RemoteException | RuntimeException e) {
3797c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                handleRadioProxyExceptionForRR(rr, "setLinkCapacityReportingCriteria", e);
3798c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            }
3799c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach        }
3800c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach    }
3801c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach
3802c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach    private static int convertRanToHalRan(int radioAccessNetwork) {
3803c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach        switch (radioAccessNetwork) {
3804c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            case AccessNetworkType.GERAN:
3805c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                return AccessNetwork.GERAN;
3806c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            case AccessNetworkType.UTRAN:
3807c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                return AccessNetwork.UTRAN;
3808c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            case AccessNetworkType.EUTRAN:
3809c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                return AccessNetwork.EUTRAN;
3810c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            case AccessNetworkType.CDMA2000:
3811c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                return AccessNetwork.CDMA2000;
3812c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            case AccessNetworkType.IWLAN:
3813c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                return AccessNetwork.IWLAN;
3814c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            case AccessNetworkType.UNKNOWN:
3815c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            default:
3816c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                return 0;
3817c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach        }
3818c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach    }
3819c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach
3820c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach    @Override
38212d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen    public void setSimCardPower(int state, Message result) {
382299607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yu        IRadio radioProxy = getRadioProxy(result);
382399607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yu        if (radioProxy != null) {
382499607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yu            RILRequest rr = obtainRequest(RIL_REQUEST_SET_SIM_CARD_POWER, result,
382599607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yu                    mRILDefaultWorkSource);
382699607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yu
382799607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yu            if (RILJ_LOGD) {
38282d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " " + state);
382999607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yu            }
38302d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen            android.hardware.radio.V1_1.IRadio radioProxy11 =
38312d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                    android.hardware.radio.V1_1.IRadio.castFrom(radioProxy);
38322d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen            if (radioProxy11 == null) {
38332d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                try {
38342d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                    switch (state) {
38352d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                        case TelephonyManager.CARD_POWER_DOWN: {
38362d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                            radioProxy.setSimCardPower(rr.mSerial, false);
38372d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                            break;
38382d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                        }
38392d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                        case TelephonyManager.CARD_POWER_UP: {
38402d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                            radioProxy.setSimCardPower(rr.mSerial, true);
38412d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                            break;
38422d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                        }
38432d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                        default: {
38442d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                            if (result != null) {
38452d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                                AsyncResult.forMessage(result, null,
38462d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                                        CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
38472d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                                result.sendToTarget();
38482d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                            }
38492d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                        }
38502d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                    }
38512d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                } catch (RemoteException | RuntimeException e) {
38522d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                    handleRadioProxyExceptionForRR(rr, "setSimCardPower", e);
38532d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                }
38542d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen            } else {
38552d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                try {
38562d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                    radioProxy11.setSimCardPower_1_1(rr.mSerial, state);
38572d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                } catch (RemoteException | RuntimeException e) {
38582d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                    handleRadioProxyExceptionForRR(rr, "setSimCardPower", e);
38592d4f7c72eb95807a2235068dde9c4c98cda2f626Grace Chen                }
386099607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yu            }
386199607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yu        }
386299607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yu    }
386399607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yu
386499607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yu    @Override
38659179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwar    public void setCarrierInfoForImsiEncryption(ImsiEncryptionInfo imsiEncryptionInfo,
38663dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                                                Message result) {
38679179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwar        checkNotNull(imsiEncryptionInfo, "ImsiEncryptionInfo cannot be null.");
38683dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar        IRadio radioProxy = getRadioProxy(result);
38693dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar        if (radioProxy != null) {
38703dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar            android.hardware.radio.V1_1.IRadio radioProxy11 =
38713dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                    android.hardware.radio.V1_1.IRadio.castFrom(radioProxy);
38723dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar            if (radioProxy11 == null) {
38733dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                if (result != null) {
38743dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                    AsyncResult.forMessage(result, null,
38753dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                            CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
38763dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                    result.sendToTarget();
38773dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                }
38783dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar            } else {
38793dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                RILRequest rr = obtainRequest(RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION, result,
38803dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                        mRILDefaultWorkSource);
38813dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
38823dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar
38833dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                try {
38849179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwar                    android.hardware.radio.V1_1.ImsiEncryptionInfo halImsiInfo =
38859179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwar                            new android.hardware.radio.V1_1.ImsiEncryptionInfo();
38869179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwar                    halImsiInfo.mnc = imsiEncryptionInfo.getMnc();
38879179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwar                    halImsiInfo.mcc = imsiEncryptionInfo.getMcc();
38889179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwar                    halImsiInfo.keyIdentifier = imsiEncryptionInfo.getKeyIdentifier();
38899179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwar                    if (imsiEncryptionInfo.getExpirationTime() != null) {
38909179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwar                        halImsiInfo.expirationTime =
38919179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwar                                imsiEncryptionInfo.getExpirationTime().getTime();
38929179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwar                    }
38939179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwar                    for (byte b : imsiEncryptionInfo.getPublicKey().getEncoded()) {
38949179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwar                        halImsiInfo.carrierKey.add(new Byte(b));
38959179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwar                    }
38969179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwar
38973dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                    radioProxy11.setCarrierInfoForImsiEncryption(
38989179967a8da4955d6d8c6e2bbc6293d4c451b942pkanwar                            rr.mSerial, halImsiInfo);
38993dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                } catch (RemoteException | RuntimeException e) {
39003dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                    handleRadioProxyExceptionForRR(rr, "setCarrierInfoForImsiEncryption", e);
39013dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                }
39023dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar            }
39033dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar        }
39043dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar    }
39053dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar
39063dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar    @Override
3907f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold    public void startNattKeepalive(
3908f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            int contextId, KeepalivePacketData packetData, int intervalMillis, Message result) {
3909f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        checkNotNull(packetData, "KeepaliveRequest cannot be null.");
3910f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        IRadio radioProxy = getRadioProxy(result);
3911f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        if (radioProxy == null) {
3912f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            riljLoge("Radio Proxy object is null!");
3913f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            return;
3914f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        }
3915f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold
3916f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        android.hardware.radio.V1_1.IRadio radioProxy11 =
3917f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                android.hardware.radio.V1_1.IRadio.castFrom(radioProxy);
3918f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        if (radioProxy11 == null) {
3919f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            if (result != null) {
3920f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                AsyncResult.forMessage(result, null,
3921f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                        CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
3922f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                result.sendToTarget();
3923f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            }
3924f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            return;
3925f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        }
3926f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold
3927f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        RILRequest rr = obtainRequest(
3928f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                RIL_REQUEST_START_KEEPALIVE, result, mRILDefaultWorkSource);
3929f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold
3930f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
3931f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold
3932f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        try {
3933f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            android.hardware.radio.V1_1.KeepaliveRequest req =
3934f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                    new android.hardware.radio.V1_1.KeepaliveRequest();
3935f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold
3936f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            req.cid = contextId;
3937f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold
3938f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            if (packetData.dstAddress instanceof Inet4Address) {
3939f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                req.type = android.hardware.radio.V1_1.KeepaliveType.NATT_IPV4;
3940f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            } else if (packetData.dstAddress instanceof Inet6Address) {
3941f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                req.type = android.hardware.radio.V1_1.KeepaliveType.NATT_IPV6;
3942f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            } else {
3943f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                AsyncResult.forMessage(result, null,
3944f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                        CommandException.fromRilErrno(INVALID_ARGUMENTS));
3945f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                result.sendToTarget();
3946f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                return;
3947f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            }
3948f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold
3949f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            appendPrimitiveArrayToArrayList(
3950f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                    packetData.srcAddress.getAddress(), req.sourceAddress);
3951f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            req.sourcePort = packetData.srcPort;
3952f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            appendPrimitiveArrayToArrayList(
3953f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                    packetData.dstAddress.getAddress(), req.destinationAddress);
3954f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            req.destinationPort = packetData.dstPort;
3955f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold
3956f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            radioProxy11.startKeepalive(rr.mSerial, req);
3957f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        } catch (RemoteException | RuntimeException e) {
3958f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            handleRadioProxyExceptionForRR(rr, "startNattKeepalive", e);
3959f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        }
3960f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold    }
3961f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold
3962f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold    @Override
3963f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold    public void stopNattKeepalive(int sessionHandle, Message result) {
3964f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        IRadio radioProxy = getRadioProxy(result);
3965f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        if (radioProxy == null) {
3966f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            Rlog.e(RIL.RILJ_LOG_TAG, "Radio Proxy object is null!");
3967f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            return;
3968f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        }
3969f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold
3970f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        android.hardware.radio.V1_1.IRadio radioProxy11 =
3971f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                android.hardware.radio.V1_1.IRadio.castFrom(radioProxy);
3972f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        if (radioProxy11 == null) {
3973f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            if (result != null) {
3974f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                AsyncResult.forMessage(result, null,
3975f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                        CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
3976f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                result.sendToTarget();
3977f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            }
3978f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            return;
3979f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        }
3980f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold
3981f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        RILRequest rr = obtainRequest(
3982f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                RIL_REQUEST_STOP_KEEPALIVE, result, mRILDefaultWorkSource);
3983f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold
3984f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
3985f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold
3986f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        try {
3987f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            radioProxy11.stopKeepalive(rr.mSerial, sessionHandle);
3988f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        } catch (RemoteException | RuntimeException e) {
3989f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            handleRadioProxyExceptionForRR(rr, "stopNattKeepalive", e);
3990f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        }
3991f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold    }
3992f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold
3993f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold    @Override
39945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getIMEI(Message result) {
3995522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan        throw new RuntimeException("getIMEI not expected to be called");
39960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
39970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
39985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
39995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getIMEISV(Message result) {
4000522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan        throw new RuntimeException("getIMEISV not expected to be called");
40010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
40020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
40035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    /**
40045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * @deprecated
40055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     */
40065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Deprecated
40075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
40085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getLastPdpFailCause(Message result) {
4009522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan        throw new RuntimeException("getLastPdpFailCause not expected to be called");
40100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
40110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
40125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    /**
40135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * The preferred new alternative to getLastPdpFailCause
40145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     */
40155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
40165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void getLastDataCallFailCause(Message result) {
4017522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan        throw new RuntimeException("getLastDataCallFailCause not expected to be called");
40185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
40195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
40205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    /**
40215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     *  Translates EF_SMS status bits to a status value compatible with
40225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     *  SMS AT commands.  See TS 27.005 3.1.
40235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     */
40245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    private int translateStatus(int status) {
40255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        switch(status & 0x7) {
40265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case SmsManager.STATUS_ON_ICC_READ:
40275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return 1;
40285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case SmsManager.STATUS_ON_ICC_UNREAD:
40295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return 0;
40305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case SmsManager.STATUS_ON_ICC_SENT:
40315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return 3;
40325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case SmsManager.STATUS_ON_ICC_UNSENT:
40335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return 2;
40340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
40355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
40365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        // Default to READ.
40375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        return 1;
40380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
40390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
40405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
40415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void resetRadio(Message result) {
4042522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan        throw new RuntimeException("resetRadio not expected to be called");
40435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
40445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
40455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    /**
40465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * {@inheritDoc}
40475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     */
40485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
40495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void handleCallSetupRequestFromSim(boolean accept, Message result) {
40505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(result);
40515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
40525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            RILRequest rr = obtainRequest(RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM,
40535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    result, mRILDefaultWorkSource);
40545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
40555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
40565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
40570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
40580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
40595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
40605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.handleStkCallSetupRequestFromSim(rr.mSerial, accept);
40615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
40625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                handleRadioProxyExceptionForRR(rr, "getAllowedCarriers", e);
40635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
40640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
40655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
40660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
40675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    //***** Private Methods
40685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
40695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    /**
40705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * This is a helper function to be called when a RadioIndication callback is called.
40715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * It takes care of acquiring wakelock and sending ack if needed.
40725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * @param indicationType RadioIndicationType received
40735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     */
40745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    void processIndication(int indicationType) {
40755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (indicationType == RadioIndicationType.UNSOLICITED_ACK_EXP) {
40765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            sendAck();
40775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) riljLog("Unsol response received; Sending ack to ril.cpp");
40785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else {
40795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            // ack is not expected to be sent back. Nothing is required to be done here.
40805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
40815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
40820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
40835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    void processRequestAck(int serial) {
40845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        RILRequest rr;
40855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        synchronized (mRequestList) {
40865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            rr = mRequestList.get(serial);
40875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
40885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (rr == null) {
40895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            Rlog.w(RIL.RILJ_LOG_TAG, "processRequestAck: Unexpected solicited ack response! "
40905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    + "serial: " + serial);
40915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else {
40925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            decrementWakeLock(rr);
40935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RIL.RILJ_LOGD) {
40945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + " Ack < " + RIL.requestToString(rr.mRequest));
40955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
40965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
40975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
40980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
40995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    /**
41005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * This is a helper function to be called when a RadioResponse callback is called.
41015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * It takes care of acks, wakelocks, and finds and returns RILRequest corresponding to the
41025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * response if one is found.
41035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * @param responseInfo RadioResponseInfo received in response callback
41045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * @return RILRequest corresponding to the response
41055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     */
4106c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @VisibleForTesting
4107c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public RILRequest processResponse(RadioResponseInfo responseInfo) {
41085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        int serial = responseInfo.serial;
41095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        int error = responseInfo.error;
41105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        int type = responseInfo.type;
41115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
4112a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        RILRequest rr = null;
4113a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan
4114a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        if (type == RadioResponseType.SOLICITED_ACK) {
4115a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            synchronized (mRequestList) {
4116a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                rr = mRequestList.get(serial);
4117a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            }
4118a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            if (rr == null) {
4119a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                Rlog.w(RILJ_LOG_TAG, "Unexpected solicited ack response! sn: " + serial);
4120a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            } else {
4121a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                decrementWakeLock(rr);
4122a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                if (RILJ_LOGD) {
4123a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                    riljLog(rr.serialString() + " Ack < " + requestToString(rr.mRequest));
4124a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                }
4125a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            }
4126a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            return rr;
4127a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        }
4128a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan
4129a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan        rr = findAndRemoveRequestFromList(serial);
41305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (rr == null) {
41315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            Rlog.e(RIL.RILJ_LOG_TAG, "processResponse: Unexpected response! serial: " + serial
41325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    + " error: " + error);
41335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            return null;
41340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
41350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
41365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        // Time logging for RIL command and storing it in TelephonyHistogram.
41375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        addToRilHistogram(rr);
41380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
41395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (type == RadioResponseType.SOLICITED_ACK_EXP) {
41405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            sendAck();
41415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RIL.RILJ_LOGD) {
41425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog("Response received for " + rr.serialString() + " "
41435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + RIL.requestToString(rr.mRequest) + " Sending ack to ril.cpp");
41440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
41455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else {
41465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            // ack sent for SOLICITED_ACK_EXP above; nothing to do for SOLICITED response
41475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
41485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
41495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        // Here and below fake RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, see b/7255789.
41505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        // This is needed otherwise we don't automatically transition to the main lock
41515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        // screen when the pin or puk is entered incorrectly.
41525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        switch (rr.mRequest) {
41535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_ENTER_SIM_PUK:
41545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_ENTER_SIM_PUK2:
41555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                if (mIccStatusChangedRegistrants != null) {
41565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    if (RILJ_LOGD) {
41575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        riljLog("ON enter sim puk fakeSimStatusChanged: reg count="
41585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                + mIccStatusChangedRegistrants.size());
41595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    }
41605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    mIccStatusChangedRegistrants.notifyRegistrants();
41615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                }
41625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                break;
41635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SHUTDOWN:
41645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                setRadioState(RadioState.RADIO_UNAVAILABLE);
41655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                break;
41665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
41675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
41685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (error != RadioError.NONE) {
41695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            switch (rr.mRequest) {
41705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                case RIL_REQUEST_ENTER_SIM_PIN:
41715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                case RIL_REQUEST_ENTER_SIM_PIN2:
41725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                case RIL_REQUEST_CHANGE_SIM_PIN:
41735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                case RIL_REQUEST_CHANGE_SIM_PIN2:
41745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                case RIL_REQUEST_SET_FACILITY_LOCK:
41755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    if (mIccStatusChangedRegistrants != null) {
41765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        if (RILJ_LOGD) {
41775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                            riljLog("ON some errors fakeSimStatusChanged: reg count="
41785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                    + mIccStatusChangedRegistrants.size());
41795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        }
41805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        mIccStatusChangedRegistrants.notifyRegistrants();
41815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    }
41825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    break;
41835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
41840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
41855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else {
41865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            switch (rr.mRequest) {
41875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND:
41885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                if (mTestingEmergencyCall.getAndSet(false)) {
41895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    if (mEmergencyCallbackModeRegistrant != null) {
41905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        riljLog("testing emergency call, notify ECM Registrants");
41915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        mEmergencyCallbackModeRegistrant.notifyRegistrant();
41925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    }
41935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                }
41940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
41955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
41965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        return rr;
41975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
41985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
41995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    /**
42005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * This is a helper function to be called at the end of all RadioResponse callbacks.
42015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * It takes care of sending error response, logging, decrementing wakelock if needed, and
42025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * releases the request from memory pool.
42035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * @param rr RILRequest for which response callback was called
42045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * @param responseInfo RadioResponseInfo received in the callback
42055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * @param ret object to be returned to request sender
42065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     */
4207c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @VisibleForTesting
4208c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public void processResponseDone(RILRequest rr, RadioResponseInfo responseInfo, Object ret) {
42095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (responseInfo.error == 0) {
42105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
42115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "< " + requestToString(rr.mRequest)
42125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " " + retToString(rr.mRequest, ret));
42130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
42145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else {
42155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD) {
42165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                riljLog(rr.serialString() + "< " + requestToString(rr.mRequest)
42175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + " error " + responseInfo.error);
42180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
42195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            rr.onError(responseInfo.error, ret);
42205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
42215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        mMetrics.writeOnRilSolicitedResponse(mPhoneId, rr.mSerial, responseInfo.error,
42225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                rr.mRequest, ret);
42235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (rr != null) {
42245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (responseInfo.type == RadioResponseType.SOLICITED) {
42255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                decrementWakeLock(rr);
42260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
42275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            rr.release();
42285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
42295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
42305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
42315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    /**
42325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * Function to send ack and acquire related wakelock
42335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     */
42345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    private void sendAck() {
42355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        // TODO: Remove rr and clean up acquireWakelock for response and ack
42365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        RILRequest rr = RILRequest.obtain(RIL_RESPONSE_ACKNOWLEDGEMENT, null,
42375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mRILDefaultWorkSource);
42385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        acquireWakeLock(rr, RIL.FOR_ACK_WAKELOCK);
42395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        IRadio radioProxy = getRadioProxy(null);
42405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (radioProxy != null) {
42415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            try {
42425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                radioProxy.responseAcknowledgement();
42435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            } catch (RemoteException | RuntimeException e) {
4244c9c763417554f30c4fa51d3285a9a19893ecd399Amit Mahajan                handleRadioProxyExceptionForRR(rr, "sendAck", e);
42450d9b3d744534df7ee3792fdd84454176536590e6Amit Mahajan                riljLoge("sendAck: " + e);
42465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
42475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else {
42485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            Rlog.e(RILJ_LOG_TAG, "Error trying to send ack, radioProxy = null");
42495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
42505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        rr.release();
42515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
42525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
42535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    private WorkSource getDeafultWorkSourceIfInvalid(WorkSource workSource) {
42545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (workSource == null) {
42555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            workSource = mRILDefaultWorkSource;
42565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
42575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
42585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        return workSource;
42595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
42605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
42615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
42625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    /**
42635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * Holds a PARTIAL_WAKE_LOCK whenever
42645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * a) There is outstanding RIL request sent to RIL deamon and no replied
42655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * b) There is a request pending to be sent out.
42665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     *
42675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * There is a WAKE_LOCK_TIMEOUT to release the lock, though it shouldn't
42685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * happen often.
42695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     */
42705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    private void acquireWakeLock(RILRequest rr, int wakeLockType) {
42715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        synchronized (rr) {
42725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (rr.mWakeLockType != INVALID_WAKELOCK) {
42735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                Rlog.d(RILJ_LOG_TAG, "Failed to aquire wakelock for " + rr.serialString());
42745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return;
42755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
42765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
42775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            switch(wakeLockType) {
42785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                case FOR_WAKELOCK:
42795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    synchronized (mWakeLock) {
42805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        mWakeLock.acquire();
42815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        mWakeLockCount++;
42825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        mWlSequenceNum++;
42835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
42849e0a2cd0de646f9455c0d6ab34632b89b418235cNarayan Kamath                        String clientId = rr.getWorkSourceClientId();
42855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        if (!mClientWakelockTracker.isClientActive(clientId)) {
42865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                            if (mActiveWakelockWorkSource != null) {
42875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                mActiveWakelockWorkSource.add(rr.mWorkSource);
42885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                            } else {
42895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                mActiveWakelockWorkSource = rr.mWorkSource;
42905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                            }
42915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                            mWakeLock.setWorkSource(mActiveWakelockWorkSource);
42925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        }
42935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
42945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        mClientWakelockTracker.startTracking(rr.mClientId,
42955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                rr.mRequest, rr.mSerial, mWakeLockCount);
42965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
4297d71af3fb18a6bf51e6aa346849c968fad511d610Amit Mahajan                        Message msg = mRilHandler.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT);
42985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        msg.arg1 = mWlSequenceNum;
4299d71af3fb18a6bf51e6aa346849c968fad511d610Amit Mahajan                        mRilHandler.sendMessageDelayed(msg, mWakeLockTimeout);
43005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    }
43015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    break;
43025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                case FOR_ACK_WAKELOCK:
43035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    synchronized (mAckWakeLock) {
43045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        mAckWakeLock.acquire();
43055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        mAckWlSequenceNum++;
43065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
4307d71af3fb18a6bf51e6aa346849c968fad511d610Amit Mahajan                        Message msg = mRilHandler.obtainMessage(EVENT_ACK_WAKE_LOCK_TIMEOUT);
43085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        msg.arg1 = mAckWlSequenceNum;
4309d71af3fb18a6bf51e6aa346849c968fad511d610Amit Mahajan                        mRilHandler.sendMessageDelayed(msg, mAckWakeLockTimeout);
43105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    }
43115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    break;
43125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                default: //WTF
43135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    Rlog.w(RILJ_LOG_TAG, "Acquiring Invalid Wakelock type " + wakeLockType);
43145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    return;
43155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
43165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            rr.mWakeLockType = wakeLockType;
43175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
43185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
43195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
4320c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    /** Returns the wake lock of the given type. */
4321c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @VisibleForTesting
4322c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public WakeLock getWakeLock(int wakeLockType) {
4323c066b40160496c1265e21a3b624e267e47807137Pengquan Meng        return wakeLockType == FOR_WAKELOCK ? mWakeLock : mAckWakeLock;
4324c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    }
4325c066b40160496c1265e21a3b624e267e47807137Pengquan Meng
4326c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    /** Returns the {@link RilHandler} instance. */
4327c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @VisibleForTesting
4328c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public RilHandler getRilHandler() {
4329c066b40160496c1265e21a3b624e267e47807137Pengquan Meng        return mRilHandler;
4330c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    }
4331c066b40160496c1265e21a3b624e267e47807137Pengquan Meng
4332c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    /** Returns the Ril request list. */
4333c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    @VisibleForTesting
4334c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    public SparseArray<RILRequest> getRilRequestList() {
4335c066b40160496c1265e21a3b624e267e47807137Pengquan Meng        return mRequestList;
4336c066b40160496c1265e21a3b624e267e47807137Pengquan Meng    }
4337c066b40160496c1265e21a3b624e267e47807137Pengquan Meng
43385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    private void decrementWakeLock(RILRequest rr) {
43395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        synchronized (rr) {
43405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            switch(rr.mWakeLockType) {
43415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                case FOR_WAKELOCK:
43425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    synchronized (mWakeLock) {
43435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        mClientWakelockTracker.stopTracking(rr.mClientId,
43445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                rr.mRequest, rr.mSerial,
43455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                (mWakeLockCount > 1) ? mWakeLockCount - 1 : 0);
43469e0a2cd0de646f9455c0d6ab34632b89b418235cNarayan Kamath                        String clientId = rr.getWorkSourceClientId();
43475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        if (!mClientWakelockTracker.isClientActive(clientId)
43485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                && (mActiveWakelockWorkSource != null)) {
43495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                            mActiveWakelockWorkSource.remove(rr.mWorkSource);
43505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                            if (mActiveWakelockWorkSource.size() == 0) {
43515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                                mActiveWakelockWorkSource = null;
43525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                            }
43535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                            mWakeLock.setWorkSource(mActiveWakelockWorkSource);
43545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        }
43555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
43565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        if (mWakeLockCount > 1) {
43575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                            mWakeLockCount--;
43585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        } else {
43595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                            mWakeLockCount = 0;
43605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                            mWakeLock.release();
43615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        }
43625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    }
43635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    break;
43645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                case FOR_ACK_WAKELOCK:
43655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    //We do not decrement the ACK wakelock
43665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    break;
43675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                case INVALID_WAKELOCK:
43685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    break;
43695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                default:
43705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    Rlog.w(RILJ_LOG_TAG, "Decrementing Invalid Wakelock type " + rr.mWakeLockType);
43715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
43725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            rr.mWakeLockType = INVALID_WAKELOCK;
43735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
43745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
43755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
43765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    private boolean clearWakeLock(int wakeLockType) {
43775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (wakeLockType == FOR_WAKELOCK) {
43785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            synchronized (mWakeLock) {
43795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                if (mWakeLockCount == 0 && !mWakeLock.isHeld()) return false;
43805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                Rlog.d(RILJ_LOG_TAG, "NOTE: mWakeLockCount is " + mWakeLockCount
43815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + "at time of clearing");
43825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mWakeLockCount = 0;
43835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mWakeLock.release();
43845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mClientWakelockTracker.stopTrackingAll();
43855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mActiveWakelockWorkSource = null;
43865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return true;
43875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
43885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else {
43895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            synchronized (mAckWakeLock) {
43905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                if (!mAckWakeLock.isHeld()) return false;
43915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mAckWakeLock.release();
43925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return true;
43935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
43945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
43955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
43965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
43975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    /**
43985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * Release each request in mRequestList then clear the list
43995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * @param error is the RIL_Errno sent back
44005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     * @param loggable true means to print all requests in mRequestList
44015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     */
44025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    private void clearRequestList(int error, boolean loggable) {
44035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        RILRequest rr;
44045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        synchronized (mRequestList) {
44055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            int count = mRequestList.size();
44065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (RILJ_LOGD && loggable) {
44075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                Rlog.d(RILJ_LOG_TAG, "clearRequestList " + " mWakeLockCount="
44085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        + mWakeLockCount + " mRequestList=" + count);
44095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
44105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
44115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            for (int i = 0; i < count; i++) {
44125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                rr = mRequestList.valueAt(i);
44135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                if (RILJ_LOGD && loggable) {
44145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    Rlog.d(RILJ_LOG_TAG, i + ": [" + rr.mSerial + "] "
44155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                            + requestToString(rr.mRequest));
44165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                }
44175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                rr.onError(error, null);
44185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                decrementWakeLock(rr);
44195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                rr.release();
44205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
44215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            mRequestList.clear();
44225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
44235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
44245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
44255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    private RILRequest findAndRemoveRequestFromList(int serial) {
44265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        RILRequest rr = null;
44275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        synchronized (mRequestList) {
44285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            rr = mRequestList.get(serial);
44295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (rr != null) {
44305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mRequestList.remove(serial);
44315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
44325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
44335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
44345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        return rr;
44355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
44365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
44375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    private void addToRilHistogram(RILRequest rr) {
44385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        long endTime = SystemClock.elapsedRealtime();
44395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        int totalTime = (int) (endTime - rr.mStartTimeMs);
44405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
44415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        synchronized (mRilTimeHistograms) {
44425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            TelephonyHistogram entry = mRilTimeHistograms.get(rr.mRequest);
44435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (entry == null) {
44445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                // We would have total #RIL_HISTOGRAM_BUCKET_COUNT range buckets for RIL commands
44455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                entry = new TelephonyHistogram(TelephonyHistogram.TELEPHONY_CATEGORY_RIL,
44465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        rr.mRequest, RIL_HISTOGRAM_BUCKET_COUNT);
44475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mRilTimeHistograms.put(rr.mRequest, entry);
44485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
44495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            entry.addTimeTaken(totalTime);
44505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
44515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
44525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
4453a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan    RadioCapability makeStaticRadioCapability() {
44545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        // default to UNKNOWN so we fail fast.
44555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        int raf = RadioAccessFamily.RAF_UNKNOWN;
44565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
44575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        String rafString = mContext.getResources().getString(
44585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                com.android.internal.R.string.config_radio_access_family);
44595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (!TextUtils.isEmpty(rafString)) {
44605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            raf = RadioAccessFamily.rafTypeFromString(rafString);
44615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
44625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        RadioCapability rc = new RadioCapability(mPhoneId.intValue(), 0, 0, raf,
44635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                "", RadioCapability.RC_STATUS_SUCCESS);
44645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (RILJ_LOGD) riljLog("Faking RIL_REQUEST_GET_RADIO_CAPABILITY response using " + raf);
44655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        return rc;
44665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
44675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
44685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    static String retToString(int req, Object ret) {
44695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (ret == null) return "";
44705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        switch (req) {
44715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            // Don't log these return values, for privacy's sake.
44725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_IMSI:
44735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_IMEI:
44745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_IMEISV:
44755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SIM_OPEN_CHANNEL:
44765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL:
44775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
44785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                if (!RILJ_LOGV) {
44795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    // If not versbose logging just return and don't display IMSI and IMEI, IMEISV
44805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    return "";
44815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                }
44825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
44835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe
44845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        StringBuilder sb;
44855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        String s;
44865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        int length;
44875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (ret instanceof int[]) {
44885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            int[] intArray = (int[]) ret;
44895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            length = intArray.length;
44905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            sb = new StringBuilder("{");
44915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (length > 0) {
44925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                int i = 0;
44935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                sb.append(intArray[i++]);
44945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                while (i < length) {
44955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    sb.append(", ").append(intArray[i++]);
44965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                }
44975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
44985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            sb.append("}");
44995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            s = sb.toString();
45005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else if (ret instanceof String[]) {
45015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            String[] strings = (String[]) ret;
45025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            length = strings.length;
45035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            sb = new StringBuilder("{");
45045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (length > 0) {
45055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                int i = 0;
45065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                sb.append(strings[i++]);
45075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                while (i < length) {
45085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    sb.append(", ").append(strings[i++]);
45095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                }
45105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
45115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            sb.append("}");
45125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            s = sb.toString();
45135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else if (req == RIL_REQUEST_GET_CURRENT_CALLS) {
45145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            ArrayList<DriverCall> calls = (ArrayList<DriverCall>) ret;
45155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            sb = new StringBuilder("{");
45165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            for (DriverCall dc : calls) {
45175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                sb.append("[").append(dc).append("] ");
45185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
45195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            sb.append("}");
45205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            s = sb.toString();
45215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else if (req == RIL_REQUEST_GET_NEIGHBORING_CELL_IDS) {
45225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            ArrayList<NeighboringCellInfo> cells = (ArrayList<NeighboringCellInfo>) ret;
45235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            sb = new StringBuilder("{");
45245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            for (NeighboringCellInfo cell : cells) {
45255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                sb.append("[").append(cell).append("] ");
45265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
45275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            sb.append("}");
45285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            s = sb.toString();
45295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else if (req == RIL_REQUEST_QUERY_CALL_FORWARD_STATUS) {
45305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            CallForwardInfo[] cinfo = (CallForwardInfo[]) ret;
45315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            length = cinfo.length;
45325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            sb = new StringBuilder("{");
45335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            for (int i = 0; i < length; i++) {
45345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                sb.append("[").append(cinfo[i]).append("] ");
45355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
45365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            sb.append("}");
45375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            s = sb.toString();
45385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else if (req == RIL_REQUEST_GET_HARDWARE_CONFIG) {
45395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            ArrayList<HardwareConfig> hwcfgs = (ArrayList<HardwareConfig>) ret;
45405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            sb = new StringBuilder(" ");
45415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            for (HardwareConfig hwcfg : hwcfgs) {
45425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                sb.append("[").append(hwcfg).append("] ");
45430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
45445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            s = sb.toString();
45455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else {
45465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            s = ret.toString();
45470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
45485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        return s;
45490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
45500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
45515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    void writeMetricsNewSms(int tech, int format) {
45525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        mMetrics.writeRilNewSms(mPhoneId, tech, format);
45535fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville    }
45545fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville
45555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    void writeMetricsCallRing(char[] response) {
45565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        mMetrics.writeRilCallRing(mPhoneId, response);
45572b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville    }
45582b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville
45595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    void writeMetricsSrvcc(int state) {
45605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        mMetrics.writeRilSrvcc(mPhoneId, state);
456165bee39d7e417fb898c3948696d5d8a38046c449fenglu    }
456265bee39d7e417fb898c3948696d5d8a38046c449fenglu
45635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    void writeMetricsModemRestartEvent(String reason) {
45645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        mMetrics.writeModemRestartEvent(mPhoneId, reason);
456565bee39d7e417fb898c3948696d5d8a38046c449fenglu    }
456665bee39d7e417fb898c3948696d5d8a38046c449fenglu
45675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    /**
45688e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu     * Notify all registrants that the ril has connected or disconnected.
4569a56f405d3006b1d8378b5f7757a5613b75fa8fb4Adrian Salido     *
4570a56f405d3006b1d8378b5f7757a5613b75fa8fb4Adrian Salido     * @param rilVer is the version of the ril or -1 if disconnected.
45715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe     */
4572a56f405d3006b1d8378b5f7757a5613b75fa8fb4Adrian Salido    void notifyRegistrantsRilConnectionChanged(int rilVer) {
4573a56f405d3006b1d8378b5f7757a5613b75fa8fb4Adrian Salido        mRilVersion = rilVer;
45745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (mRilConnectedRegistrants != null) {
45755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            mRilConnectedRegistrants.notifyRegistrants(
4576a56f405d3006b1d8378b5f7757a5613b75fa8fb4Adrian Salido                    new AsyncResult(null, new Integer(rilVer), null));
457727eef341b171f925ef43dd088cc559280fd7d2b9Prerepa Viswanadham        }
457827eef341b171f925ef43dd088cc559280fd7d2b9Prerepa Viswanadham    }
457927eef341b171f925ef43dd088cc559280fd7d2b9Prerepa Viswanadham
45805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    void
45815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    notifyRegistrantsCdmaInfoRec(CdmaInformationRecords infoRec) {
45825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        int response = RIL_UNSOL_CDMA_INFO_REC;
45835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (infoRec.record instanceof CdmaInformationRecords.CdmaDisplayInfoRec) {
45845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (mDisplayInfoRegistrants != null) {
45855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
45865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mDisplayInfoRegistrants.notifyRegistrants(
45875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        new AsyncResult(null, infoRec.record, null));
45885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
45895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else if (infoRec.record instanceof CdmaInformationRecords.CdmaSignalInfoRec) {
45905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (mSignalInfoRegistrants != null) {
45915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
45925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mSignalInfoRegistrants.notifyRegistrants(
45935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        new AsyncResult(null, infoRec.record, null));
45945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
45955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else if (infoRec.record instanceof CdmaInformationRecords.CdmaNumberInfoRec) {
45965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (mNumberInfoRegistrants != null) {
45975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
45985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mNumberInfoRegistrants.notifyRegistrants(
45995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        new AsyncResult(null, infoRec.record, null));
46005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
46015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else if (infoRec.record instanceof CdmaInformationRecords.CdmaRedirectingNumberInfoRec) {
46025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (mRedirNumInfoRegistrants != null) {
46035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
46045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mRedirNumInfoRegistrants.notifyRegistrants(
46055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        new AsyncResult(null, infoRec.record, null));
46065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
46075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else if (infoRec.record instanceof CdmaInformationRecords.CdmaLineControlInfoRec) {
46085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (mLineControlInfoRegistrants != null) {
46095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
46105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mLineControlInfoRegistrants.notifyRegistrants(
46115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        new AsyncResult(null, infoRec.record, null));
46125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
46135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else if (infoRec.record instanceof CdmaInformationRecords.CdmaT53ClirInfoRec) {
46145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (mT53ClirInfoRegistrants != null) {
46155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                if (RILJ_LOGD) unsljLogRet(response, infoRec.record);
46165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mT53ClirInfoRegistrants.notifyRegistrants(
46175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        new AsyncResult(null, infoRec.record, null));
46185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            }
46195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        } else if (infoRec.record instanceof CdmaInformationRecords.CdmaT53AudioControlInfoRec) {
46205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            if (mT53AudCntrlInfoRegistrants != null) {
46215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                if (RILJ_LOGD) {
46225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                    unsljLogRet(response, infoRec.record);
46235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                }
46245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                mT53AudCntrlInfoRegistrants.notifyRegistrants(
46255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                        new AsyncResult(null, infoRec.record, null));
4626a63f55cf17629426d976830429a7612387532195Rika Brooks            }
4627a63f55cf17629426d976830429a7612387532195Rika Brooks        }
46280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
46290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
46305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    static String requestToString(int request) {
46315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        switch(request) {
46325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_SIM_STATUS:
46335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "GET_SIM_STATUS";
46345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_ENTER_SIM_PIN:
46355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "ENTER_SIM_PIN";
46365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_ENTER_SIM_PUK:
46375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "ENTER_SIM_PUK";
46385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_ENTER_SIM_PIN2:
46395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "ENTER_SIM_PIN2";
46405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_ENTER_SIM_PUK2:
46415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "ENTER_SIM_PUK2";
46425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CHANGE_SIM_PIN:
46435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "CHANGE_SIM_PIN";
46445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CHANGE_SIM_PIN2:
46455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "CHANGE_SIM_PIN2";
46465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION:
46475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "ENTER_NETWORK_DEPERSONALIZATION";
46485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_CURRENT_CALLS:
46495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "GET_CURRENT_CALLS";
46505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_DIAL:
46515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "DIAL";
46525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_IMSI:
46535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "GET_IMSI";
46545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_HANGUP:
46555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "HANGUP";
46565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND:
46575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "HANGUP_WAITING_OR_BACKGROUND";
46585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND:
46595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "HANGUP_FOREGROUND_RESUME_BACKGROUND";
46605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE:
46615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE";
46625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CONFERENCE:
46635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "CONFERENCE";
46645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_UDUB:
46655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UDUB";
46665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_LAST_CALL_FAIL_CAUSE:
46675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "LAST_CALL_FAIL_CAUSE";
46685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SIGNAL_STRENGTH:
46695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SIGNAL_STRENGTH";
46705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_VOICE_REGISTRATION_STATE:
46715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "VOICE_REGISTRATION_STATE";
46725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_DATA_REGISTRATION_STATE:
46735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "DATA_REGISTRATION_STATE";
46745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_OPERATOR:
46755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "OPERATOR";
46765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_RADIO_POWER:
46775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RADIO_POWER";
46785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_DTMF:
46795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "DTMF";
46805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SEND_SMS:
46815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SEND_SMS";
46825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SEND_SMS_EXPECT_MORE:
46835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SEND_SMS_EXPECT_MORE";
46845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SETUP_DATA_CALL:
46855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SETUP_DATA_CALL";
46865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SIM_IO:
46875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SIM_IO";
46885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SEND_USSD:
46895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SEND_USSD";
46905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CANCEL_USSD:
46915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "CANCEL_USSD";
46925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_CLIR:
46935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "GET_CLIR";
46945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_CLIR:
46955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SET_CLIR";
46965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS:
46975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "QUERY_CALL_FORWARD_STATUS";
46985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_CALL_FORWARD:
46995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SET_CALL_FORWARD";
47005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_QUERY_CALL_WAITING:
47015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "QUERY_CALL_WAITING";
47025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_CALL_WAITING:
47035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SET_CALL_WAITING";
47045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SMS_ACKNOWLEDGE:
47055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SMS_ACKNOWLEDGE";
47065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_IMEI:
47075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "GET_IMEI";
47085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_IMEISV:
47095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "GET_IMEISV";
47105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_ANSWER:
47115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "ANSWER";
47125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_DEACTIVATE_DATA_CALL:
47135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "DEACTIVATE_DATA_CALL";
47145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_QUERY_FACILITY_LOCK:
47155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "QUERY_FACILITY_LOCK";
47165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_FACILITY_LOCK:
47175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SET_FACILITY_LOCK";
47185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CHANGE_BARRING_PASSWORD:
47195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "CHANGE_BARRING_PASSWORD";
47205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE:
47215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "QUERY_NETWORK_SELECTION_MODE";
47225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC:
47235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SET_NETWORK_SELECTION_AUTOMATIC";
47245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL:
47255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SET_NETWORK_SELECTION_MANUAL";
47265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS :
47275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "QUERY_AVAILABLE_NETWORKS ";
47285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_DTMF_START:
47295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "DTMF_START";
47305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_DTMF_STOP:
47315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "DTMF_STOP";
47325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_BASEBAND_VERSION:
47335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "BASEBAND_VERSION";
47345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SEPARATE_CONNECTION:
47355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SEPARATE_CONNECTION";
47365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_MUTE:
47375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SET_MUTE";
47385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_MUTE:
47395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "GET_MUTE";
47405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_QUERY_CLIP:
47415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "QUERY_CLIP";
47425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE:
47435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "LAST_DATA_CALL_FAIL_CAUSE";
47445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_DATA_CALL_LIST:
47455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "DATA_CALL_LIST";
47465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_RESET_RADIO:
47475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RESET_RADIO";
4748ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            case RIL_REQUEST_OEM_HOOK_RAW:
4749ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                return "OEM_HOOK_RAW";
4750ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            case RIL_REQUEST_OEM_HOOK_STRINGS:
4751ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                return "OEM_HOOK_STRINGS";
47525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SCREEN_STATE:
47535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SCREEN_STATE";
47545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION:
47555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SET_SUPP_SVC_NOTIFICATION";
47565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_WRITE_SMS_TO_SIM:
47575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "WRITE_SMS_TO_SIM";
47585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_DELETE_SMS_ON_SIM:
47595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "DELETE_SMS_ON_SIM";
47605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_BAND_MODE:
47615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "SET_BAND_MODE";
47625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE:
47635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "QUERY_AVAILABLE_BAND_MODE";
47645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_STK_GET_PROFILE:
47655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "REQUEST_STK_GET_PROFILE";
47665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_STK_SET_PROFILE:
47675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "REQUEST_STK_SET_PROFILE";
47685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND:
47695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "REQUEST_STK_SEND_ENVELOPE_COMMAND";
47705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE:
47715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "REQUEST_STK_SEND_TERMINAL_RESPONSE";
47725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM:
47735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM";
47745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: return "REQUEST_EXPLICIT_CALL_TRANSFER";
47755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE:
47765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "REQUEST_SET_PREFERRED_NETWORK_TYPE";
47775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE:
47785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "REQUEST_GET_PREFERRED_NETWORK_TYPE";
47795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS:
47805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "REQUEST_GET_NEIGHBORING_CELL_IDS";
47815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_LOCATION_UPDATES:
47825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "REQUEST_SET_LOCATION_UPDATES";
47835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE:
47845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE";
47855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE:
47865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE";
47875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE:
47885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE";
47895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_TTY_MODE:
47905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_SET_TTY_MODE";
47915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_QUERY_TTY_MODE:
47925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_QUERY_TTY_MODE";
47935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE:
47945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE";
47955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE:
47965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE";
47975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_FLASH:
47985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_FLASH";
47995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_BURST_DTMF:
48005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_BURST_DTMF";
48015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_SEND_SMS:
48025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_SEND_SMS";
48035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE:
48045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE";
48055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GSM_GET_BROADCAST_CONFIG:
48065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_GSM_GET_BROADCAST_CONFIG";
48075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GSM_SET_BROADCAST_CONFIG:
48085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_GSM_SET_BROADCAST_CONFIG";
48095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG:
48105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG";
48115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG:
48125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG";
48135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GSM_BROADCAST_ACTIVATION:
48145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_GSM_BROADCAST_ACTIVATION";
48155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY:
48165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY";
48175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_BROADCAST_ACTIVATION:
48185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_BROADCAST_ACTIVATION";
48195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_SUBSCRIPTION:
48205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_SUBSCRIPTION";
48215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM:
48225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM";
48235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM:
48245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM";
48255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_DEVICE_IDENTITY:
48265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_DEVICE_IDENTITY";
48275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_SMSC_ADDRESS:
48285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_GET_SMSC_ADDRESS";
48295fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_SMSC_ADDRESS:
48305fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_SET_SMSC_ADDRESS";
48315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE:
48325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "REQUEST_EXIT_EMERGENCY_CALLBACK_MODE";
48335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS:
48345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_REPORT_SMS_MEMORY_STATUS";
48355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING:
48365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING";
48375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE:
48385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE";
48395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_ISIM_AUTHENTICATION:
48405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_ISIM_AUTHENTICATION";
48415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU:
48425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU";
48435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS:
48445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS";
48455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_VOICE_RADIO_TECH:
48465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_VOICE_RADIO_TECH";
48475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_CELL_INFO_LIST:
48485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_GET_CELL_INFO_LIST";
48495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE:
48505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_SET_CELL_INFO_LIST_RATE";
48515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_INITIAL_ATTACH_APN:
48525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_SET_INITIAL_ATTACH_APN";
48535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_DATA_PROFILE:
48545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_SET_DATA_PROFILE";
48555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_IMS_REGISTRATION_STATE:
48565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_IMS_REGISTRATION_STATE";
48575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_IMS_SEND_SMS:
48585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_IMS_SEND_SMS";
48595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC:
48605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC";
48615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SIM_OPEN_CHANNEL:
48625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_SIM_OPEN_CHANNEL";
48635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SIM_CLOSE_CHANNEL:
48645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_SIM_CLOSE_CHANNEL";
48655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL:
48665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL";
48675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_NV_READ_ITEM:
48685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_NV_READ_ITEM";
48695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_NV_WRITE_ITEM:
48705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_NV_WRITE_ITEM";
48715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_NV_WRITE_CDMA_PRL:
48725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_NV_WRITE_CDMA_PRL";
48735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_NV_RESET_CONFIG:
48745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_NV_RESET_CONFIG";
48755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_UICC_SUBSCRIPTION:
48765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_SET_UICC_SUBSCRIPTION";
48775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_ALLOW_DATA:
48785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_ALLOW_DATA";
48795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_HARDWARE_CONFIG:
48805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "GET_HARDWARE_CONFIG";
48815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SIM_AUTHENTICATION:
48825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_SIM_AUTHENTICATION";
48835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SHUTDOWN:
48845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_SHUTDOWN";
48855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_RADIO_CAPABILITY:
48865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_SET_RADIO_CAPABILITY";
48875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_RADIO_CAPABILITY:
48885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_GET_RADIO_CAPABILITY";
48895fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_START_LCE:
48905fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_START_LCE";
48915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_STOP_LCE:
48925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_STOP_LCE";
48935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_PULL_LCEDATA:
48945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_PULL_LCEDATA";
48955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_ACTIVITY_INFO:
48965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_GET_ACTIVITY_INFO";
48975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_SET_ALLOWED_CARRIERS:
48985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_SET_ALLOWED_CARRIERS";
48995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_REQUEST_GET_ALLOWED_CARRIERS:
49005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_REQUEST_GET_ALLOWED_CARRIERS";
490199607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yu            case RIL_REQUEST_SET_SIM_CARD_POWER:
490299607db1bc0f46e73f39d5379c590b8bcb4bf947Jack Yu                return "RIL_REQUEST_SET_SIM_CARD_POWER";
4903baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu            case RIL_REQUEST_SEND_DEVICE_STATE:
4904baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu                return "RIL_REQUEST_SEND_DEVICE_STATE";
4905baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu            case RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER:
4906baecdb610b30a5d4b35345f8fc63fcbc2133c149Jack Yu                return "RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER";
49075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_RESPONSE_ACKNOWLEDGEMENT:
49085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_RESPONSE_ACKNOWLEDGEMENT";
49093dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar            case RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION:
49103dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                return "RIL_REQUEST_SET_CARRIER_INFO_IMSI_ENCRYPTION";
4911a88c366bfe12bd5b3bdd54bf9114ed625911fc3ayinxu            case RIL_REQUEST_START_NETWORK_SCAN:
4912a88c366bfe12bd5b3bdd54bf9114ed625911fc3ayinxu                return "RIL_REQUEST_START_NETWORK_SCAN";
4913a88c366bfe12bd5b3bdd54bf9114ed625911fc3ayinxu            case RIL_REQUEST_STOP_NETWORK_SCAN:
4914a88c366bfe12bd5b3bdd54bf9114ed625911fc3ayinxu                return "RIL_REQUEST_STOP_NETWORK_SCAN";
49154e10a61602bd065cdf71d0335493ac3444d5055ayinxu            case RIL_REQUEST_GET_SLOT_STATUS:
49164e10a61602bd065cdf71d0335493ac3444d5055ayinxu                return "RIL_REQUEST_GET_SLOT_STATUS";
49174e10a61602bd065cdf71d0335493ac3444d5055ayinxu            case RIL_REQUEST_SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING:
49184e10a61602bd065cdf71d0335493ac3444d5055ayinxu                return "RIL_REQUEST_SET_LOGICAL_TO_PHYSICAL_SLOT_MAPPING";
4919f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            case RIL_REQUEST_START_KEEPALIVE:
4920f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                return "RIL_REQUEST_START_KEEPALIVE";
4921f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            case RIL_REQUEST_STOP_KEEPALIVE:
4922f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                return "RIL_REQUEST_STOP_KEEPALIVE";
4923c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            case RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA:
4924c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                return "RIL_REQUEST_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA";
4925c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            case RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA:
4926c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach                return "RIL_REQUEST_SET_LINK_CAPACITY_REPORTING_CRITERIA";
49275fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            default: return "<unknown request>";
49285fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
49295fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville    }
49305fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville
49315fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    static String responseToString(int request) {
49325fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        switch(request) {
49335fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED:
49345fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_RESPONSE_RADIO_STATE_CHANGED";
49355fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:
49365fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_RESPONSE_CALL_STATE_CHANGED";
49375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED:
49385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_RESPONSE_NETWORK_STATE_CHANGED";
49395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_RESPONSE_NEW_SMS:
49405fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_RESPONSE_NEW_SMS";
49415fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT:
49425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT";
49435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM:
49445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_RESPONSE_NEW_SMS_ON_SIM";
49455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_ON_USSD:
49465fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_ON_USSD";
49475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_ON_USSD_REQUEST:
49485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_ON_USSD_REQUEST";
49495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_NITZ_TIME_RECEIVED:
49505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_NITZ_TIME_RECEIVED";
49515fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_SIGNAL_STRENGTH:
49525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_SIGNAL_STRENGTH";
49535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_DATA_CALL_LIST_CHANGED:
49545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_DATA_CALL_LIST_CHANGED";
49555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_SUPP_SVC_NOTIFICATION:
49565fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_SUPP_SVC_NOTIFICATION";
49575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_STK_SESSION_END:
49585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_STK_SESSION_END";
49595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_STK_PROACTIVE_COMMAND:
49605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_STK_PROACTIVE_COMMAND";
49615fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_STK_EVENT_NOTIFY:
49625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_STK_EVENT_NOTIFY";
49635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_STK_CALL_SETUP:
49645fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_STK_CALL_SETUP";
49655fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_SIM_SMS_STORAGE_FULL:
49665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_SIM_SMS_STORAGE_FULL";
49675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_SIM_REFRESH:
49685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_SIM_REFRESH";
49695fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_CALL_RING:
49705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_CALL_RING";
49715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED:
49725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
49735fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS:
49745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_RESPONSE_CDMA_NEW_SMS";
49755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS:
49765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_RESPONSE_NEW_BROADCAST_SMS";
49775fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL:
49785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
49795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_RESTRICTED_STATE_CHANGED:
49805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_RESTRICTED_STATE_CHANGED";
49815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE:
49825fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
49835fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_CDMA_CALL_WAITING:
49845fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_CDMA_CALL_WAITING";
49855fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS:
49865fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_CDMA_OTA_PROVISION_STATUS";
49875fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_CDMA_INFO_REC:
49885fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_CDMA_INFO_REC";
4989ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian            case RIL_UNSOL_OEM_HOOK_RAW:
4990ac009536df32d886e1bab79f07e61200ea6bdcf9Shuo Qian                return "UNSOL_OEM_HOOK_RAW";
49915fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_RINGBACK_TONE:
49925fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_RINGBACK_TONE";
49935fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_RESEND_INCALL_MUTE:
49945fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_RESEND_INCALL_MUTE";
49955fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED:
49965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "CDMA_SUBSCRIPTION_SOURCE_CHANGED";
49975fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOl_CDMA_PRL_CHANGED:
49985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_CDMA_PRL_CHANGED";
49995fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE:
50005fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_EXIT_EMERGENCY_CALLBACK_MODE";
50015fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_RIL_CONNECTED:
50025fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_RIL_CONNECTED";
50035fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_VOICE_RADIO_TECH_CHANGED:
50045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_VOICE_RADIO_TECH_CHANGED";
50055fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_CELL_INFO_LIST:
50065fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_CELL_INFO_LIST";
50075fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
50085fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED";
50095fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED:
50105fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED";
50115fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_SRVCC_STATE_NOTIFY:
50125fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_SRVCC_STATE_NOTIFY";
50135fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_HARDWARE_CONFIG_CHANGED:
50145fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_UNSOL_HARDWARE_CONFIG_CHANGED";
50155fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_RADIO_CAPABILITY:
50165fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "RIL_UNSOL_RADIO_CAPABILITY";
50175fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_ON_SS:
50185fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_ON_SS";
50195fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_STK_CC_ALPHA_NOTIFY:
50205fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_STK_CC_ALPHA_NOTIFY";
50215fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_LCEDATA_RECV:
50225fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_LCE_INFO_RECV";
50235fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_PCO_DATA:
50245fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_PCO_DATA";
50255fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            case RIL_UNSOL_MODEM_RESTART:
50265fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "UNSOL_MODEM_RESTART";
50273dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar            case RIL_UNSOL_CARRIER_INFO_IMSI_ENCRYPTION:
50283dd2f4b1d5d89bb2e785df8e6ede6bf25937b0bdpkanwar                return "RIL_UNSOL_CARRIER_INFO_IMSI_ENCRYPTION";
5029a88c366bfe12bd5b3bdd54bf9114ed625911fc3ayinxu            case RIL_UNSOL_NETWORK_SCAN_RESULT:
5030a88c366bfe12bd5b3bdd54bf9114ed625911fc3ayinxu                return "RIL_UNSOL_NETWORK_SCAN_RESULT";
50314e10a61602bd065cdf71d0335493ac3444d5055ayinxu            case RIL_UNSOL_ICC_SLOT_STATUS:
50324e10a61602bd065cdf71d0335493ac3444d5055ayinxu                return "RIL_UNSOL_ICC_SLOT_STATUS";
5033f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            case RIL_UNSOL_KEEPALIVE_STATUS:
5034f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold                return "RIL_UNSOL_KEEPALIVE_STATUS";
50359eac50b6b7da40f5f38277b7171b97c524f1f590Eric Schwarzenbach            case RIL_UNSOL_PHYSICAL_CHANNEL_CONFIG:
50369eac50b6b7da40f5f38277b7171b97c524f1f590Eric Schwarzenbach                return "RIL_UNSOL_PHYSICAL_CHANNEL_CONFIG";
50375fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            default:
50385fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                return "<unknown response>";
50395fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        }
504021c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan    }
504121c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
50425fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    void riljLog(String msg) {
50435fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        Rlog.d(RILJ_LOG_TAG, msg
50445fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                + (mPhoneId != null ? (" [SUB" + mPhoneId + "]") : ""));
50455fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
50465d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi
50475fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    void riljLoge(String msg) {
50485fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        Rlog.e(RILJ_LOG_TAG, msg
50495fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                + (mPhoneId != null ? (" [SUB" + mPhoneId + "]") : ""));
50505fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
50515d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi
50525fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    void riljLoge(String msg, Exception e) {
50535fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        Rlog.e(RILJ_LOG_TAG, msg
50545fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                + (mPhoneId != null ? (" [SUB" + mPhoneId + "]") : ""), e);
50555fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
50565d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi
50575fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    void riljLogv(String msg) {
50585fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        Rlog.v(RILJ_LOG_TAG, msg
50595fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                + (mPhoneId != null ? (" [SUB" + mPhoneId + "]") : ""));
50605fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
50615d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi
50625fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    void unsljLog(int response) {
50635fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        riljLog("[UNSL]< " + responseToString(response));
50645d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi    }
50655d5eea6ed231163c225144316b0d1913d48678a4Sungmin Choi
50665fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    void unsljLogMore(int response, String more) {
50675fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        riljLog("[UNSL]< " + responseToString(response) + " " + more);
50685fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
50699d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan
50705fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    void unsljLogRet(int response, Object ret) {
50715fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        riljLog("[UNSL]< " + responseToString(response) + " " + retToString(response, ret));
50725fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
50739d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan
50745fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    void unsljLogvRet(int response, Object ret) {
50755fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        riljLogv("[UNSL]< " + responseToString(response) + " " + retToString(response, ret));
50765fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    }
50779d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan
50785fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    @Override
50795fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe    public void setPhoneType(int phoneType) { // Called by GsmCdmaPhone
50805fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        if (RILJ_LOGD) riljLog("setPhoneType=" + phoneType + " old value=" + mPhoneType);
50815fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe        mPhoneType = phoneType;
50829d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan    }
50839d4ec7d45061f1da05f16cd244eb0a798e7f36bbAmit Mahajan
50840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* (non-Javadoc)
50850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @see com.android.internal.telephony.BaseCommands#testingEmergencyCall()
50860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
50870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
50880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void testingEmergencyCall() {
50890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (RILJ_LOGD) riljLog("testingEmergencyCall");
50900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mTestingEmergencyCall.set(true);
50910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
50920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
50930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
509405ef3b65972826780859b9acbd1fa9580d099832Alex Yakavenka        pw.println("RIL: " + this);
50950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mWakeLock=" + mWakeLock);
50960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mWakeLockTimeout=" + mWakeLockTimeout);
5097892e1fecf3c3736c4c04cf219d01034f71307065Robert Greenwalt        synchronized (mRequestList) {
50987cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt            synchronized (mWakeLock) {
50997cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt                pw.println(" mWakeLockCount=" + mWakeLockCount);
51007cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt            }
5101892e1fecf3c3736c4c04cf219d01034f71307065Robert Greenwalt            int count = mRequestList.size();
51020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pw.println(" mRequestList count=" + count);
51030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            for (int i = 0; i < count; i++) {
51047cabec78b4c9ad40f23d8f9fd756722d33b4a639Robert Greenwalt                RILRequest rr = mRequestList.valueAt(i);
51050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                pw.println("  [" + rr.mSerial + "] " + requestToString(rr.mRequest));
51060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
51070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5108d39109502855e8d81e45e21161d8bf0cfacf42e0Sanket Padawe        pw.println(" mLastNITZTimeInfo=" + Arrays.toString(mLastNITZTimeInfo));
51090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mTestingEmergencyCall=" + mTestingEmergencyCall.get());
5110ad44212e1cb9fc97679378036f6224c2c287cebfSanket Padawe        mClientWakelockTracker.dumpClientRequestTracker(pw);
51110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
511240d1d394302d83eb56f66cf08daecc612c97cd28Shishir Agrawal
51138e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran    public List<ClientRequestStats> getClientRequestStats() {
51148e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran        return mClientWakelockTracker.getClientRequestStats();
51158e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran    }
5116e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan
5117f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold    /** Append the data to the end of an ArrayList */
5118f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold    public static void appendPrimitiveArrayToArrayList(byte[] src, ArrayList<Byte> dst) {
5119f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        for (byte b : src) {
5120f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold            dst.add(b);
5121f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold        }
5122f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold    }
5123f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold
5124f5865983b0be60ad2ab177ec37e57ffedfd20ac7Amit Mahajan    public static ArrayList<Byte> primitiveArrayToArrayList(byte[] arr) {
5125f5865983b0be60ad2ab177ec37e57ffedfd20ac7Amit Mahajan        ArrayList<Byte> arrayList = new ArrayList<>(arr.length);
5126f5865983b0be60ad2ab177ec37e57ffedfd20ac7Amit Mahajan        for (byte b : arr) {
5127f5865983b0be60ad2ab177ec37e57ffedfd20ac7Amit Mahajan            arrayList.add(b);
5128f5865983b0be60ad2ab177ec37e57ffedfd20ac7Amit Mahajan        }
5129f5865983b0be60ad2ab177ec37e57ffedfd20ac7Amit Mahajan        return arrayList;
5130f5865983b0be60ad2ab177ec37e57ffedfd20ac7Amit Mahajan    }
5131f5865983b0be60ad2ab177ec37e57ffedfd20ac7Amit Mahajan
5132c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach    /** Convert a primitive int array to an ArrayList<Integer>. */
5133c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach    public static ArrayList<Integer> primitiveArrayToArrayList(int[] arr) {
5134c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach        ArrayList<Integer> arrayList = new ArrayList<>(arr.length);
5135c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach        for (int i : arr) {
5136c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach            arrayList.add(i);
5137c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach        }
5138c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach        return arrayList;
5139c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach    }
5140c7776a8f093a315d3baced16f57c5214116ed3d7Eric Schwarzenbach
5141f9d8835c31c9a0347e5d40f6b0f582bbf09b9e51Nathan Harold    /** Convert an ArrayList of Bytes to an exactly-sized primitive array */
5142e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan    public static byte[] arrayListToPrimitiveArray(ArrayList<Byte> bytes) {
5143e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan        byte[] ret = new byte[bytes.size()];
5144e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan        for (int i = 0; i < ret.length; i++) {
5145e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan            ret[i] = bytes.get(i);
5146e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan        }
5147e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan        return ret;
5148e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan    }
5149e7c29ee85e324289d247d6e28a8c1a216c3658c4Amit Mahajan
515021c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan    static ArrayList<HardwareConfig> convertHalHwConfigList(
515121c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            ArrayList<android.hardware.radio.V1_0.HardwareConfig> hwListRil,
515221c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            RIL ril) {
515321c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        int num;
515421c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        ArrayList<HardwareConfig> response;
515521c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        HardwareConfig hw;
515621c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
515721c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        num = hwListRil.size();
515821c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        response = new ArrayList<HardwareConfig>(num);
515921c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
516021c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        if (RILJ_LOGV) {
516121c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            ril.riljLog("convertHalHwConfigList: num=" + num);
516221c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        }
516321c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        for (android.hardware.radio.V1_0.HardwareConfig hwRil : hwListRil) {
516421c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            int type = hwRil.type;
516521c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            switch(type) {
516621c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                case HardwareConfig.DEV_HARDWARE_TYPE_MODEM: {
516721c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                    hw = new HardwareConfig(type);
516821c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                    HardwareConfigModem hwModem = hwRil.modem.get(0);
516921c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                    hw.assignModem(hwRil.uuid, hwRil.state, hwModem.rilModel, hwModem.rat,
517021c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                            hwModem.maxVoice, hwModem.maxData, hwModem.maxStandby);
517121c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                    break;
517221c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                }
517321c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                case HardwareConfig.DEV_HARDWARE_TYPE_SIM: {
517421c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                    hw = new HardwareConfig(type);
517521c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                    hw.assignSim(hwRil.uuid, hwRil.state, hwRil.sim.get(0).modemUuid);
517621c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                    break;
517721c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                }
517821c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                default: {
517921c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                    throw new RuntimeException(
518021c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                            "RIL_REQUEST_GET_HARDWARE_CONFIG invalid hardward type:" + type);
518121c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                }
518221c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            }
518321c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
518421c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            response.add(hw);
518521c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        }
518621c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
518721c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        return response;
518821c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan    }
518921c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
519021c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan    static RadioCapability convertHalRadioCapability(
519121c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            android.hardware.radio.V1_0.RadioCapability rcRil, RIL ril) {
519221c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        int session = rcRil.session;
519321c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        int phase = rcRil.phase;
519421c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        int rat = rcRil.raf;
519521c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        String logicModemUuid = rcRil.logicalModemUuid;
519621c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        int status = rcRil.status;
519721c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
519821c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        ril.riljLog("convertHalRadioCapability: session=" + session +
519921c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                ", phase=" + phase +
520021c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                ", rat=" + rat +
520121c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                ", logicModemUuid=" + logicModemUuid +
520221c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                ", status=" + status);
520321c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        RadioCapability rc = new RadioCapability(
52045fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe                ril.mPhoneId, session, phase, rat, logicModemUuid, status);
520521c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        return rc;
520621c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan    }
520721c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
52087afdb3942adde7efd33b5af5556fead92243e49cNathan Harold    static LinkCapacityEstimate convertHalLceData(LceDataInfo halData, RIL ril) {
52097afdb3942adde7efd33b5af5556fead92243e49cNathan Harold        final LinkCapacityEstimate lce = new LinkCapacityEstimate(
52107afdb3942adde7efd33b5af5556fead92243e49cNathan Harold                halData.lastHopCapacityKbps,
52117afdb3942adde7efd33b5af5556fead92243e49cNathan Harold                Byte.toUnsignedInt(halData.confidenceLevel),
52127afdb3942adde7efd33b5af5556fead92243e49cNathan Harold                halData.lceSuspended ? LinkCapacityEstimate.STATUS_SUSPENDED
52137afdb3942adde7efd33b5af5556fead92243e49cNathan Harold                        : LinkCapacityEstimate.STATUS_ACTIVE);
521421c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
52157afdb3942adde7efd33b5af5556fead92243e49cNathan Harold        ril.riljLog("LCE capacity information received:" + lce);
52167afdb3942adde7efd33b5af5556fead92243e49cNathan Harold        return lce;
52177afdb3942adde7efd33b5af5556fead92243e49cNathan Harold    }
521821c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
52197afdb3942adde7efd33b5af5556fead92243e49cNathan Harold    static LinkCapacityEstimate convertHalLceData(
52207afdb3942adde7efd33b5af5556fead92243e49cNathan Harold            android.hardware.radio.V1_2.LinkCapacityEstimate halData, RIL ril) {
52217afdb3942adde7efd33b5af5556fead92243e49cNathan Harold        final LinkCapacityEstimate lce = new LinkCapacityEstimate(
52227afdb3942adde7efd33b5af5556fead92243e49cNathan Harold                halData.downlinkCapacityKbps,
52237afdb3942adde7efd33b5af5556fead92243e49cNathan Harold                halData.uplinkCapacityKbps);
52247afdb3942adde7efd33b5af5556fead92243e49cNathan Harold        ril.riljLog("LCE capacity information received:" + lce);
52257afdb3942adde7efd33b5af5556fead92243e49cNathan Harold        return lce;
522621c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan    }
522721c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
5228e9c396cfd047b045c6df08a32ef546600f921bfaCassie    private static void writeToParcelForGsm(
5229e9c396cfd047b045c6df08a32ef546600f921bfaCassie            Parcel p, int lac, int cid, int arfcn, int bsic, String mcc, String mnc,
5230e9c396cfd047b045c6df08a32ef546600f921bfaCassie            String al, String as, int ss, int ber, int ta) {
52317aa0254d5d8f08163b3702a2a1c9602366f568d8Jack Yu        p.writeInt(CellIdentity.TYPE_GSM);
52327aa0254d5d8f08163b3702a2a1c9602366f568d8Jack Yu        p.writeString(mcc);
52337aa0254d5d8f08163b3702a2a1c9602366f568d8Jack Yu        p.writeString(mnc);
52346da36e04115847978aed09edb7a4f5f5906dc9f8Cassie        p.writeString(al);
52356da36e04115847978aed09edb7a4f5f5906dc9f8Cassie        p.writeString(as);
5236e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(lac);
5237e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(cid);
5238e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(arfcn);
5239e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(bsic);
5240e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(ss);
5241e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(ber);
5242e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(ta);
5243e9c396cfd047b045c6df08a32ef546600f921bfaCassie    }
5244e9c396cfd047b045c6df08a32ef546600f921bfaCassie
5245e9c396cfd047b045c6df08a32ef546600f921bfaCassie    private static void writeToParcelForCdma(
5246e9c396cfd047b045c6df08a32ef546600f921bfaCassie            Parcel p, int ni, int si, int bsi, int lon, int lat, String al, String as,
5247e9c396cfd047b045c6df08a32ef546600f921bfaCassie            int dbm, int ecio, int eDbm, int eEcio, int eSnr) {
5248a8af56d7ddc5b3e7781aaa792a44c2c18539ab2fNathan Harold        new CellIdentityCdma(ni, si, bsi, lon, lat, al, as).writeToParcel(p, 0);
5249a8af56d7ddc5b3e7781aaa792a44c2c18539ab2fNathan Harold        new CellSignalStrengthCdma(dbm, ecio, eDbm, eEcio, eSnr).writeToParcel(p, 0);
5250e9c396cfd047b045c6df08a32ef546600f921bfaCassie    }
5251e9c396cfd047b045c6df08a32ef546600f921bfaCassie
5252e9c396cfd047b045c6df08a32ef546600f921bfaCassie    private static void writeToParcelForLte(
525381b90daac5f0e09da0ea83327b8f31976194aadeEric Schwarzenbach            Parcel p, int ci, int pci, int tac, int earfcn, int bandwidth, String mcc, String mnc,
525481b90daac5f0e09da0ea83327b8f31976194aadeEric Schwarzenbach            String al, String as, int ss, int rsrp, int rsrq, int rssnr, int cqi, int ta) {
52557aa0254d5d8f08163b3702a2a1c9602366f568d8Jack Yu        p.writeInt(CellIdentity.TYPE_LTE);
52567aa0254d5d8f08163b3702a2a1c9602366f568d8Jack Yu        p.writeString(mcc);
52577aa0254d5d8f08163b3702a2a1c9602366f568d8Jack Yu        p.writeString(mnc);
52586da36e04115847978aed09edb7a4f5f5906dc9f8Cassie        p.writeString(al);
52596da36e04115847978aed09edb7a4f5f5906dc9f8Cassie        p.writeString(as);
5260e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(ci);
5261e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(pci);
5262e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(tac);
5263e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(earfcn);
526481b90daac5f0e09da0ea83327b8f31976194aadeEric Schwarzenbach        p.writeInt(bandwidth);
5265e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(ss);
5266e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(rsrp);
5267e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(rsrq);
5268e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(rssnr);
5269e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(cqi);
5270e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(ta);
5271e9c396cfd047b045c6df08a32ef546600f921bfaCassie    }
5272e9c396cfd047b045c6df08a32ef546600f921bfaCassie
5273e9c396cfd047b045c6df08a32ef546600f921bfaCassie    private static void writeToParcelForWcdma(
5274e9c396cfd047b045c6df08a32ef546600f921bfaCassie            Parcel p, int lac, int cid, int psc, int uarfcn, String mcc, String mnc,
5275e9c396cfd047b045c6df08a32ef546600f921bfaCassie            String al, String as, int ss, int ber) {
52767aa0254d5d8f08163b3702a2a1c9602366f568d8Jack Yu        p.writeInt(CellIdentity.TYPE_WCDMA);
52777aa0254d5d8f08163b3702a2a1c9602366f568d8Jack Yu        p.writeString(mcc);
52787aa0254d5d8f08163b3702a2a1c9602366f568d8Jack Yu        p.writeString(mnc);
52796da36e04115847978aed09edb7a4f5f5906dc9f8Cassie        p.writeString(al);
52806da36e04115847978aed09edb7a4f5f5906dc9f8Cassie        p.writeString(as);
5281e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(lac);
5282e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(cid);
5283e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(psc);
5284e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(uarfcn);
5285e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(ss);
5286e9c396cfd047b045c6df08a32ef546600f921bfaCassie        p.writeInt(ber);
5287e9c396cfd047b045c6df08a32ef546600f921bfaCassie    }
5288e9c396cfd047b045c6df08a32ef546600f921bfaCassie
5289e2be13c62d7f340a6560c61e2e925d8608f1024cCassie    /**
5290e2be13c62d7f340a6560c61e2e925d8608f1024cCassie     * Convert CellInfo defined in 1.0/types.hal to CellInfo type.
5291e2be13c62d7f340a6560c61e2e925d8608f1024cCassie     * @param records List of CellInfo defined in 1.0/types.hal
5292e2be13c62d7f340a6560c61e2e925d8608f1024cCassie     * @return List of converted CellInfo object
5293e2be13c62d7f340a6560c61e2e925d8608f1024cCassie     */
5294e9c396cfd047b045c6df08a32ef546600f921bfaCassie    @VisibleForTesting
5295e2be13c62d7f340a6560c61e2e925d8608f1024cCassie    public static ArrayList<CellInfo> convertHalCellInfoList(
529621c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            ArrayList<android.hardware.radio.V1_0.CellInfo> records) {
529721c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        ArrayList<CellInfo> response = new ArrayList<CellInfo>(records.size());
529821c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
529921c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        for (android.hardware.radio.V1_0.CellInfo record : records) {
530021c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            // first convert RIL CellInfo to Parcel
530121c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            Parcel p = Parcel.obtain();
530221c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            p.writeInt(record.cellInfoType);
530321c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            p.writeInt(record.registered ? 1 : 0);
530421c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            p.writeInt(record.timeStampType);
530521c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            p.writeLong(record.timeStamp);
530681b90daac5f0e09da0ea83327b8f31976194aadeEric Schwarzenbach            p.writeInt(CellInfo.CONNECTION_UNKNOWN);
530721c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            switch (record.cellInfoType) {
530821c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                case CellInfoType.GSM: {
530921c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                    CellInfoGsm cellInfoGsm = record.gsm.get(0);
5310e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    writeToParcelForGsm(
5311e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            p,
5312e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.cellIdentityGsm.lac,
5313e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.cellIdentityGsm.cid,
5314e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.cellIdentityGsm.arfcn,
5315e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            Byte.toUnsignedInt(cellInfoGsm.cellIdentityGsm.bsic),
5316e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.cellIdentityGsm.mcc,
5317e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.cellIdentityGsm.mnc,
5318e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            EMPTY_ALPHA_LONG,
5319e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            EMPTY_ALPHA_SHORT,
5320e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.signalStrengthGsm.signalStrength,
5321e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.signalStrengthGsm.bitErrorRate,
5322e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.signalStrengthGsm.timingAdvance);
532321c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                    break;
532421c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                }
532521c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
532621c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                case CellInfoType.CDMA: {
532721c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                    CellInfoCdma cellInfoCdma = record.cdma.get(0);
5328e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    writeToParcelForCdma(
5329e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            p,
5330e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.cellIdentityCdma.networkId,
5331e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.cellIdentityCdma.systemId,
5332e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.cellIdentityCdma.baseStationId,
5333e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.cellIdentityCdma.longitude,
5334e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.cellIdentityCdma.latitude,
5335e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            EMPTY_ALPHA_LONG,
5336e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            EMPTY_ALPHA_SHORT,
5337e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.signalStrengthCdma.dbm,
5338e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.signalStrengthCdma.ecio,
5339e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.signalStrengthEvdo.dbm,
5340e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.signalStrengthEvdo.ecio,
5341e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.signalStrengthEvdo.signalNoiseRatio);
534221c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                    break;
534321c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                }
534421c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
534521c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                case CellInfoType.LTE: {
534621c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                    CellInfoLte cellInfoLte = record.lte.get(0);
5347e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    writeToParcelForLte(
5348e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            p,
5349e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.cellIdentityLte.ci,
5350e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.cellIdentityLte.pci,
5351e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.cellIdentityLte.tac,
5352e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.cellIdentityLte.earfcn,
535381b90daac5f0e09da0ea83327b8f31976194aadeEric Schwarzenbach                            Integer.MAX_VALUE,
5354e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.cellIdentityLte.mcc,
5355e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.cellIdentityLte.mnc,
5356e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            EMPTY_ALPHA_LONG,
5357e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            EMPTY_ALPHA_SHORT,
5358e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.signalStrengthLte.signalStrength,
5359e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.signalStrengthLte.rsrp,
5360e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.signalStrengthLte.rsrq,
5361e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.signalStrengthLte.rssnr,
5362e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.signalStrengthLte.cqi,
5363e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.signalStrengthLte.timingAdvance);
536421c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                    break;
536521c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                }
536621c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
536721c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                case CellInfoType.WCDMA: {
536821c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                    CellInfoWcdma cellInfoWcdma = record.wcdma.get(0);
5369e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    writeToParcelForWcdma(
5370e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            p,
5371e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoWcdma.cellIdentityWcdma.lac,
5372e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoWcdma.cellIdentityWcdma.cid,
5373e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoWcdma.cellIdentityWcdma.psc,
5374e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoWcdma.cellIdentityWcdma.uarfcn,
5375e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoWcdma.cellIdentityWcdma.mcc,
5376e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoWcdma.cellIdentityWcdma.mnc,
5377e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            EMPTY_ALPHA_LONG,
5378e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            EMPTY_ALPHA_SHORT,
5379e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoWcdma.signalStrengthWcdma.signalStrength,
5380e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoWcdma.signalStrengthWcdma.bitErrorRate);
5381e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    break;
5382e9c396cfd047b045c6df08a32ef546600f921bfaCassie                }
5383e9c396cfd047b045c6df08a32ef546600f921bfaCassie
5384e9c396cfd047b045c6df08a32ef546600f921bfaCassie                default:
5385e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    throw new RuntimeException("unexpected cellinfotype: " + record.cellInfoType);
5386e9c396cfd047b045c6df08a32ef546600f921bfaCassie            }
5387e9c396cfd047b045c6df08a32ef546600f921bfaCassie
5388e9c396cfd047b045c6df08a32ef546600f921bfaCassie            p.setDataPosition(0);
5389e9c396cfd047b045c6df08a32ef546600f921bfaCassie            CellInfo InfoRec = CellInfo.CREATOR.createFromParcel(p);
5390e9c396cfd047b045c6df08a32ef546600f921bfaCassie            p.recycle();
5391e9c396cfd047b045c6df08a32ef546600f921bfaCassie            response.add(InfoRec);
5392e9c396cfd047b045c6df08a32ef546600f921bfaCassie        }
5393e9c396cfd047b045c6df08a32ef546600f921bfaCassie
5394e9c396cfd047b045c6df08a32ef546600f921bfaCassie        return response;
5395e9c396cfd047b045c6df08a32ef546600f921bfaCassie    }
5396e9c396cfd047b045c6df08a32ef546600f921bfaCassie
5397e9c396cfd047b045c6df08a32ef546600f921bfaCassie    /**
5398e9c396cfd047b045c6df08a32ef546600f921bfaCassie     * Convert CellInfo defined in 1.2/types.hal to CellInfo type.
5399e9c396cfd047b045c6df08a32ef546600f921bfaCassie     * @param records List of CellInfo defined in 1.2/types.hal
5400e9c396cfd047b045c6df08a32ef546600f921bfaCassie     * @return List of converted CellInfo object
5401e9c396cfd047b045c6df08a32ef546600f921bfaCassie     */
5402e9c396cfd047b045c6df08a32ef546600f921bfaCassie    @VisibleForTesting
5403e9c396cfd047b045c6df08a32ef546600f921bfaCassie    public static ArrayList<CellInfo> convertHalCellInfoList_1_2(
5404e9c396cfd047b045c6df08a32ef546600f921bfaCassie            ArrayList<android.hardware.radio.V1_2.CellInfo> records) {
5405e9c396cfd047b045c6df08a32ef546600f921bfaCassie        ArrayList<CellInfo> response = new ArrayList<CellInfo>(records.size());
5406e9c396cfd047b045c6df08a32ef546600f921bfaCassie
5407e9c396cfd047b045c6df08a32ef546600f921bfaCassie        for (android.hardware.radio.V1_2.CellInfo record : records) {
5408e9c396cfd047b045c6df08a32ef546600f921bfaCassie            // first convert RIL CellInfo to Parcel
5409e9c396cfd047b045c6df08a32ef546600f921bfaCassie            Parcel p = Parcel.obtain();
5410e9c396cfd047b045c6df08a32ef546600f921bfaCassie            p.writeInt(record.cellInfoType);
5411e9c396cfd047b045c6df08a32ef546600f921bfaCassie            p.writeInt(record.registered ? 1 : 0);
5412e9c396cfd047b045c6df08a32ef546600f921bfaCassie            p.writeInt(record.timeStampType);
5413e9c396cfd047b045c6df08a32ef546600f921bfaCassie            p.writeLong(record.timeStamp);
541481b90daac5f0e09da0ea83327b8f31976194aadeEric Schwarzenbach            p.writeInt(record.connectionStatus);
5415e9c396cfd047b045c6df08a32ef546600f921bfaCassie            switch (record.cellInfoType) {
5416e9c396cfd047b045c6df08a32ef546600f921bfaCassie                case CellInfoType.GSM: {
5417e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    android.hardware.radio.V1_2.CellInfoGsm cellInfoGsm = record.gsm.get(0);
5418e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    writeToParcelForGsm(
5419e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            p,
5420e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.cellIdentityGsm.base.lac,
5421e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.cellIdentityGsm.base.cid,
5422e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.cellIdentityGsm.base.arfcn,
5423e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            Byte.toUnsignedInt(cellInfoGsm.cellIdentityGsm.base.bsic),
5424e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.cellIdentityGsm.base.mcc,
5425e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.cellIdentityGsm.base.mnc,
5426e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.cellIdentityGsm.operatorNames.alphaLong,
5427e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.cellIdentityGsm.operatorNames.alphaShort,
5428e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.signalStrengthGsm.signalStrength,
5429e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.signalStrengthGsm.bitErrorRate,
5430e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoGsm.signalStrengthGsm.timingAdvance);
5431e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    break;
5432e9c396cfd047b045c6df08a32ef546600f921bfaCassie                }
5433e9c396cfd047b045c6df08a32ef546600f921bfaCassie
5434e9c396cfd047b045c6df08a32ef546600f921bfaCassie                case CellInfoType.CDMA: {
5435e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    android.hardware.radio.V1_2.CellInfoCdma cellInfoCdma = record.cdma.get(0);
5436e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    writeToParcelForCdma(
5437e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            p,
5438e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.cellIdentityCdma.base.networkId,
5439e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.cellIdentityCdma.base.systemId,
5440e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.cellIdentityCdma.base.baseStationId,
5441e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.cellIdentityCdma.base.longitude,
5442e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.cellIdentityCdma.base.latitude,
5443e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.cellIdentityCdma.operatorNames.alphaLong,
5444e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.cellIdentityCdma.operatorNames.alphaShort,
5445e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.signalStrengthCdma.dbm,
5446e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.signalStrengthCdma.ecio,
5447e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.signalStrengthEvdo.dbm,
5448e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.signalStrengthEvdo.ecio,
5449e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoCdma.signalStrengthEvdo.signalNoiseRatio);
5450e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    break;
5451e9c396cfd047b045c6df08a32ef546600f921bfaCassie                }
5452e9c396cfd047b045c6df08a32ef546600f921bfaCassie
5453e9c396cfd047b045c6df08a32ef546600f921bfaCassie                case CellInfoType.LTE: {
5454e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    android.hardware.radio.V1_2.CellInfoLte cellInfoLte = record.lte.get(0);
5455e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    writeToParcelForLte(
5456e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            p,
5457e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.cellIdentityLte.base.ci,
5458e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.cellIdentityLte.base.pci,
5459e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.cellIdentityLte.base.tac,
5460e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.cellIdentityLte.base.earfcn,
546181b90daac5f0e09da0ea83327b8f31976194aadeEric Schwarzenbach                            cellInfoLte.cellIdentityLte.bandwidth,
5462e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.cellIdentityLte.base.mcc,
5463e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.cellIdentityLte.base.mnc,
5464e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.cellIdentityLte.operatorNames.alphaLong,
5465e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.cellIdentityLte.operatorNames.alphaShort,
5466e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.signalStrengthLte.signalStrength,
5467e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.signalStrengthLte.rsrp,
5468e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.signalStrengthLte.rsrq,
5469e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.signalStrengthLte.rssnr,
5470e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.signalStrengthLte.cqi,
5471e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoLte.signalStrengthLte.timingAdvance);
5472e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    break;
5473e9c396cfd047b045c6df08a32ef546600f921bfaCassie                }
5474e9c396cfd047b045c6df08a32ef546600f921bfaCassie
5475e9c396cfd047b045c6df08a32ef546600f921bfaCassie                case CellInfoType.WCDMA: {
5476e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    android.hardware.radio.V1_2.CellInfoWcdma cellInfoWcdma = record.wcdma.get(0);
5477e9c396cfd047b045c6df08a32ef546600f921bfaCassie                    writeToParcelForWcdma(
5478e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            p,
5479e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoWcdma.cellIdentityWcdma.base.lac,
5480e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoWcdma.cellIdentityWcdma.base.cid,
5481e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoWcdma.cellIdentityWcdma.base.psc,
5482e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoWcdma.cellIdentityWcdma.base.uarfcn,
5483e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoWcdma.cellIdentityWcdma.base.mcc,
5484e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoWcdma.cellIdentityWcdma.base.mnc,
5485e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoWcdma.cellIdentityWcdma.operatorNames.alphaLong,
5486e9c396cfd047b045c6df08a32ef546600f921bfaCassie                            cellInfoWcdma.cellIdentityWcdma.operatorNames.alphaShort,
5487e6702220aa471f98579102516afa8aa268820856Wei Huang                            cellInfoWcdma.signalStrengthWcdma.base.signalStrength,
5488e6702220aa471f98579102516afa8aa268820856Wei Huang                            cellInfoWcdma.signalStrengthWcdma.base.bitErrorRate);
548921c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                    break;
549021c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan                }
5491522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan
5492522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan                default:
5493522fc0602d60895881b33243030dd40d5778e4a9Amit Mahajan                    throw new RuntimeException("unexpected cellinfotype: " + record.cellInfoType);
549421c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            }
549521c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
54965fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            p.setDataPosition(0);
549721c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            CellInfo InfoRec = CellInfo.CREATOR.createFromParcel(p);
54985fbc7580aaf80e31de81ed1dde4437451d822102Sanket Padawe            p.recycle();
549921c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan            response.add(InfoRec);
550021c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        }
550121c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan
550221c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan        return response;
550321c9e33b0a3e19ee70ddf0301469f4c58b57d14cAmit Mahajan    }
5504a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan
550520d8d294bf13299396436ec4c31cb524377c7502Nathan Harold    /** Convert HAL 1.0 Signal Strength to android SignalStrength */
550620d8d294bf13299396436ec4c31cb524377c7502Nathan Harold    @VisibleForTesting
550720d8d294bf13299396436ec4c31cb524377c7502Nathan Harold    public static SignalStrength convertHalSignalStrength(
5508a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan            android.hardware.radio.V1_0.SignalStrength signalStrength) {
550987162ecfbaa9b28580d905167ae5692dd355fea0Nathan Harold        int tdscdmaRscp_1_2 = 255; // 255 is the value for unknown/unreported ASU.
551087162ecfbaa9b28580d905167ae5692dd355fea0Nathan Harold        // The HAL 1.0 range is 25..120; the ASU/ HAL 1.2 range is 0..96;
551187162ecfbaa9b28580d905167ae5692dd355fea0Nathan Harold        // yes, this means the range in 1.0 cannot express -24dBm = 96
551287162ecfbaa9b28580d905167ae5692dd355fea0Nathan Harold        if (signalStrength.tdScdma.rscp >= 25 && signalStrength.tdScdma.rscp <= 120) {
551387162ecfbaa9b28580d905167ae5692dd355fea0Nathan Harold            // First we flip the sign to convert from the HALs -rscp to the actual RSCP value.
551487162ecfbaa9b28580d905167ae5692dd355fea0Nathan Harold            int rscpDbm = -signalStrength.tdScdma.rscp;
551587162ecfbaa9b28580d905167ae5692dd355fea0Nathan Harold            // Then to convert from RSCP to ASU, we apply the offset which aligns 0 ASU to -120dBm.
551687162ecfbaa9b28580d905167ae5692dd355fea0Nathan Harold            tdscdmaRscp_1_2 = rscpDbm + 120;
551787162ecfbaa9b28580d905167ae5692dd355fea0Nathan Harold        }
5518e6702220aa471f98579102516afa8aa268820856Wei Huang        return new SignalStrength(
5519e6702220aa471f98579102516afa8aa268820856Wei Huang                signalStrength.gw.signalStrength,
5520a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                signalStrength.gw.bitErrorRate,
5521a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                signalStrength.cdma.dbm,
5522a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                signalStrength.cdma.ecio,
5523a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                signalStrength.evdo.dbm,
5524a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                signalStrength.evdo.ecio,
5525a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                signalStrength.evdo.signalNoiseRatio,
5526a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                signalStrength.lte.signalStrength,
5527a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                signalStrength.lte.rsrp,
5528a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                signalStrength.lte.rsrq,
5529a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                signalStrength.lte.rssnr,
5530a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan                signalStrength.lte.cqi,
553187162ecfbaa9b28580d905167ae5692dd355fea0Nathan Harold                tdscdmaRscp_1_2);
5532a46dc426a10a9d3c95cca80a80d9c0759459cb4fAmit Mahajan    }
5533e6702220aa471f98579102516afa8aa268820856Wei Huang
553420d8d294bf13299396436ec4c31cb524377c7502Nathan Harold    /** Convert HAL 1.2 Signal Strength to android SignalStrength */
553520d8d294bf13299396436ec4c31cb524377c7502Nathan Harold    @VisibleForTesting
553620d8d294bf13299396436ec4c31cb524377c7502Nathan Harold    public static SignalStrength convertHalSignalStrength_1_2(
5537e6702220aa471f98579102516afa8aa268820856Wei Huang            android.hardware.radio.V1_2.SignalStrength signalStrength) {
5538e6702220aa471f98579102516afa8aa268820856Wei Huang        return new SignalStrength(
5539e6702220aa471f98579102516afa8aa268820856Wei Huang                signalStrength.gsm.signalStrength,
5540e6702220aa471f98579102516afa8aa268820856Wei Huang                signalStrength.gsm.bitErrorRate,
5541e6702220aa471f98579102516afa8aa268820856Wei Huang                signalStrength.cdma.dbm,
5542e6702220aa471f98579102516afa8aa268820856Wei Huang                signalStrength.cdma.ecio,
5543e6702220aa471f98579102516afa8aa268820856Wei Huang                signalStrength.evdo.dbm,
5544e6702220aa471f98579102516afa8aa268820856Wei Huang                signalStrength.evdo.ecio,
5545e6702220aa471f98579102516afa8aa268820856Wei Huang                signalStrength.evdo.signalNoiseRatio,
5546e6702220aa471f98579102516afa8aa268820856Wei Huang                signalStrength.lte.signalStrength,
5547e6702220aa471f98579102516afa8aa268820856Wei Huang                signalStrength.lte.rsrp,
5548e6702220aa471f98579102516afa8aa268820856Wei Huang                signalStrength.lte.rsrq,
5549e6702220aa471f98579102516afa8aa268820856Wei Huang                signalStrength.lte.rssnr,
5550e6702220aa471f98579102516afa8aa268820856Wei Huang                signalStrength.lte.cqi,
555185fae19c81c9b12acdfc675ff4ab62b00475443dWei Huang                signalStrength.tdScdma.rscp,
555285fae19c81c9b12acdfc675ff4ab62b00475443dWei Huang                signalStrength.wcdma.base.signalStrength,
555385fae19c81c9b12acdfc675ff4ab62b00475443dWei Huang                signalStrength.wcdma.rscp);
5554e6702220aa471f98579102516afa8aa268820856Wei Huang    }
55550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
5556