10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2008 The Android Open Source Project
36f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa * Copyright (c) 2013, The Linux Foundation. All rights reserved.
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony;
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
207fce994eb223105829becb6c26e3af7a9739752cDianne Hackbornimport android.Manifest;
217fce994eb223105829becb6c26e3af7a9739752cDianne Hackbornimport android.app.AppOpsManager;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.app.PendingIntent;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context;
24ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooksimport android.os.AsyncResult;
257fce994eb223105829becb6c26e3af7a9739752cDianne Hackbornimport android.os.Binder;
26ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooksimport android.os.Handler;
27ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooksimport android.os.Message;
286f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowaimport android.os.ServiceManager;
29ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
326f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowaimport com.android.internal.telephony.ISms;
336f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowaimport com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
346f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowaimport com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo;
35d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccConstants;
36ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooksimport com.android.internal.telephony.uicc.IccFileHandler;
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.util.HexDump;
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList;
40ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooksimport java.util.Arrays;
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List;
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static android.telephony.SmsManager.STATUS_ON_ICC_FREE;
44ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooksimport static android.telephony.SmsManager.STATUS_ON_ICC_READ;
45ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooksimport static android.telephony.SmsManager.STATUS_ON_ICC_UNREAD;
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * IccSmsInterfaceManager to provide an inter-process communication to
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * access Sms in Icc.
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
516f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowapublic class IccSmsInterfaceManager extends ISms.Stub {
52cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    static final String LOG_TAG = "IccSmsInterfaceManager";
53ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    static final boolean DBG = true;
54ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
55ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    protected final Object mLock = new Object();
56ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    protected boolean mSuccess;
57ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    private List<SmsRawData> mSms;
58ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
596f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    private CellBroadcastRangeManager mCellBroadcastRangeManager =
606f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            new CellBroadcastRangeManager();
616f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    private CdmaBroadcastRangeManager mCdmaBroadcastRangeManager =
626f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            new CdmaBroadcastRangeManager();
636f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
64ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    private static final int EVENT_LOAD_DONE = 1;
65ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    private static final int EVENT_UPDATE_DONE = 2;
66ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    protected static final int EVENT_SET_BROADCAST_ACTIVATION_DONE = 3;
67ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    protected static final int EVENT_SET_BROADCAST_CONFIG_DONE = 4;
686f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    private static final int SMS_CB_CODE_SCHEME_MIN = 0;
696f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    private static final int SMS_CB_CODE_SCHEME_MAX = 255;
70ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
716f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    protected PhoneBase mPhone;
727fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn    final protected Context mContext;
737fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn    final protected AppOpsManager mAppOps;
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected SMSDispatcher mDispatcher;
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
76ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    protected Handler mHandler = new Handler() {
77ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        @Override
78ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        public void handleMessage(Message msg) {
79ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            AsyncResult ar;
80ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
81ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            switch (msg.what) {
82ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                case EVENT_UPDATE_DONE:
83ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                    ar = (AsyncResult) msg.obj;
84ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                    synchronized (mLock) {
85ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                        mSuccess = (ar.exception == null);
86ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                        mLock.notifyAll();
87ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                    }
88ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                    break;
89ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                case EVENT_LOAD_DONE:
90ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                    ar = (AsyncResult)msg.obj;
91ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                    synchronized (mLock) {
92ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                        if (ar.exception == null) {
936f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                            mSms  = (List<SmsRawData>)
946f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                                    buildValidRawData((ArrayList<byte[]>) ar.result);
95ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                            //Mark SMS as read after importing it from card.
96ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                            markMessagesAsRead((ArrayList<byte[]>) ar.result);
97ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                        } else {
986f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                            if (Rlog.isLoggable("SMS", Log.DEBUG)) {
996f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                                log("Cannot load Sms records");
1006f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                            }
101ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                            if (mSms != null)
102ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                                mSms.clear();
103ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                        }
104ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                        mLock.notifyAll();
105ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                    }
106ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                    break;
107ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                case EVENT_SET_BROADCAST_ACTIVATION_DONE:
108ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                case EVENT_SET_BROADCAST_CONFIG_DONE:
109ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                    ar = (AsyncResult) msg.obj;
110ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                    synchronized (mLock) {
111ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                        mSuccess = (ar.exception == null);
112ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                        mLock.notifyAll();
113ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                    }
114ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                    break;
115ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            }
116ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        }
117ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    };
118ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
1196f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    protected IccSmsInterfaceManager(PhoneBase phone) {
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPhone = phone;
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mContext = phone.getContext();
1226f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        mAppOps = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
1231260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        mDispatcher = new ImsSMSDispatcher(phone,
1241260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                phone.mSmsStorageMonitor, phone.mSmsUsageMonitor);
1256f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (ServiceManager.getService("isms") == null) {
1266f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            ServiceManager.addService("isms", this);
1276f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
130ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    protected void markMessagesAsRead(ArrayList<byte[]> messages) {
131ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        if (messages == null) {
132ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            return;
133ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        }
134ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
135ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        //IccFileHandler can be null, if icc card is absent.
136ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        IccFileHandler fh = mPhone.getIccFileHandler();
137ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        if (fh == null) {
138ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            //shouldn't really happen, as messages are marked as read, only
139ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            //after importing it from icc.
140ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            if (Rlog.isLoggable("SMS", Log.DEBUG)) {
141ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                log("markMessagesAsRead - aborting, no icc card present.");
142ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            }
143ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            return;
144ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        }
145ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
146ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        int count = messages.size();
147ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
148ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        for (int i = 0; i < count; i++) {
149ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks             byte[] ba = messages.get(i);
150ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks             if (ba[0] == STATUS_ON_ICC_UNREAD) {
151ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                 int n = ba.length;
152ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                 byte[] nba = new byte[n - 1];
153ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                 System.arraycopy(ba, 1, nba, 0, n - 1);
154ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                 byte[] record = makeSmsRecordData(STATUS_ON_ICC_READ, nba);
155ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                 fh.updateEFLinearFixed(IccConstants.EF_SMS, i + 1, record, null, null);
156ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                 if (Rlog.isLoggable("SMS", Log.DEBUG)) {
157ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                     log("SMS " + (i + 1) + " marked as read");
158ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                 }
159ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks             }
160ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        }
161ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    }
162ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
1631260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    public void dispose() {
1641260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        mDispatcher.dispose();
1651260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
1661260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
1676f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    protected void updatePhoneObject(PhoneBase phone) {
1686f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        mPhone = phone;
1691260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        mDispatcher.updatePhoneObject(phone);
1706f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    }
1716f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void enforceReceiveAndSend(String message) {
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mContext.enforceCallingPermission(
1747fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn                Manifest.permission.RECEIVE_SMS, message);
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mContext.enforceCallingPermission(
1767fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn                Manifest.permission.SEND_SMS, message);
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
180ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     * Update the specified message on the Icc.
181ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     *
182ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     * @param index record index of message to update
183ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     * @param status new message status (STATUS_ON_ICC_READ,
184ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     *                  STATUS_ON_ICC_UNREAD, STATUS_ON_ICC_SENT,
185ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     *                  STATUS_ON_ICC_UNSENT, STATUS_ON_ICC_FREE)
186ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     * @param pdu the raw PDU to store
187ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     * @return success or not
188ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     *
189ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     */
190cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
191ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    public boolean
1927fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn    updateMessageOnIccEf(String callingPackage, int index, int status, byte[] pdu) {
193ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        if (DBG) log("updateMessageOnIccEf: index=" + index +
194ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                " status=" + status + " ==> " +
195ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                "("+ Arrays.toString(pdu) + ")");
196ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        enforceReceiveAndSend("Updating message on Icc");
1977fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn        if (mAppOps.noteOp(AppOpsManager.OP_WRITE_ICC_SMS, Binder.getCallingUid(),
1987fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn                callingPackage) != AppOpsManager.MODE_ALLOWED) {
1997fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn            return false;
2007fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn        }
201ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        synchronized(mLock) {
202ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            mSuccess = false;
203ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            Message response = mHandler.obtainMessage(EVENT_UPDATE_DONE);
204ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
205ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            if (status == STATUS_ON_ICC_FREE) {
206ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                // RIL_REQUEST_DELETE_SMS_ON_SIM vs RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM
207ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                // Special case FREE: call deleteSmsOnSim/Ruim instead of
208ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                // manipulating the record
209ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                // Will eventually fail if icc card is not present.
2106f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                if (PhoneConstants.PHONE_TYPE_GSM == mPhone.getPhoneType()) {
2116f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                    mPhone.mCi.deleteSmsOnSim(index, response);
2126f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                } else {
2136f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                    mPhone.mCi.deleteSmsOnRuim(index, response);
2146f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                }
215ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            } else {
216ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                //IccFilehandler can be null if ICC card is not present.
217ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                IccFileHandler fh = mPhone.getIccFileHandler();
218ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                if (fh == null) {
219ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                    response.recycle();
220ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                    return mSuccess; /* is false */
221ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                }
222ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                byte[] record = makeSmsRecordData(status, pdu);
223ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                fh.updateEFLinearFixed(
224ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                        IccConstants.EF_SMS,
225ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                        index, record, null, response);
226ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            }
227ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            try {
228ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                mLock.wait();
229ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            } catch (InterruptedException e) {
230ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                log("interrupted while trying to update by index");
231ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            }
232ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        }
233ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        return mSuccess;
234ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    }
235ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
236ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    /**
237ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     * Copy a raw SMS PDU to the Icc.
238ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     *
239ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     * @param pdu the raw PDU to store
240ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     * @param status message status (STATUS_ON_ICC_READ, STATUS_ON_ICC_UNREAD,
241ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     *               STATUS_ON_ICC_SENT, STATUS_ON_ICC_UNSENT)
242ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     * @return success or not
243ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     *
244ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     */
245cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
2467fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn    public boolean copyMessageToIccEf(String callingPackage, int status, byte[] pdu, byte[] smsc) {
247ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        //NOTE smsc not used in RUIM
248ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        if (DBG) log("copyMessageToIccEf: status=" + status + " ==> " +
249ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                "pdu=("+ Arrays.toString(pdu) +
250ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                "), smsc=(" + Arrays.toString(smsc) +")");
251ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        enforceReceiveAndSend("Copying message to Icc");
2527fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn        if (mAppOps.noteOp(AppOpsManager.OP_WRITE_ICC_SMS, Binder.getCallingUid(),
2537fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn                callingPackage) != AppOpsManager.MODE_ALLOWED) {
2547fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn            return false;
2557fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn        }
256ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        synchronized(mLock) {
257ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            mSuccess = false;
258ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            Message response = mHandler.obtainMessage(EVENT_UPDATE_DONE);
259ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
260ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            //RIL_REQUEST_WRITE_SMS_TO_SIM vs RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM
2616f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            if (PhoneConstants.PHONE_TYPE_GSM == mPhone.getPhoneType()) {
2626f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                mPhone.mCi.writeSmsToSim(status, IccUtils.bytesToHexString(smsc),
2636f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                        IccUtils.bytesToHexString(pdu), response);
2646f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            } else {
2656f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                mPhone.mCi.writeSmsToRuim(status, IccUtils.bytesToHexString(pdu),
2666f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                        response);
2676f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            }
268ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
269ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            try {
270ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                mLock.wait();
271ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            } catch (InterruptedException e) {
272ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                log("interrupted while trying to update by index");
273ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            }
274ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        }
275ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        return mSuccess;
276ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    }
277ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
278ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    /**
279ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     * Retrieves all messages currently stored on Icc.
280ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     *
281ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     * @return list of SmsRawData of all sms on Icc
282ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks     */
283cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
2847fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn    public List<SmsRawData> getAllMessagesFromIccEf(String callingPackage) {
285ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        if (DBG) log("getAllMessagesFromEF");
286ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
287e5d7a8d946bf9496ffbe7533bffdeb83963489c3Jake Hamby        mContext.enforceCallingOrSelfPermission(
2887fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn                Manifest.permission.RECEIVE_SMS,
289ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                "Reading messages from Icc");
2907fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn        if (mAppOps.noteOp(AppOpsManager.OP_READ_ICC_SMS, Binder.getCallingUid(),
2917fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn                callingPackage) != AppOpsManager.MODE_ALLOWED) {
2927fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn            return new ArrayList<SmsRawData>();
2937fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn        }
294ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        synchronized(mLock) {
295ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
296ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            IccFileHandler fh = mPhone.getIccFileHandler();
297ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            if (fh == null) {
298ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                Rlog.e(LOG_TAG, "Cannot load Sms records. No icc card?");
299ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                if (mSms != null) {
300ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                    mSms.clear();
301ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                    return mSms;
302ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                }
303ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            }
304ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
305ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            Message response = mHandler.obtainMessage(EVENT_LOAD_DONE);
306ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            fh.loadEFLinearFixedAll(IccConstants.EF_SMS, response);
307ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
308ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            try {
309ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                mLock.wait();
310ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            } catch (InterruptedException e) {
311ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks                log("interrupted while trying to load from the Icc");
312ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks            }
313ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        }
314ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks        return mSms;
315ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    }
316ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
317ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks    /**
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Send a data based SMS to a specific application port.
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param destAddr the address to send the message to
3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param scAddr is the service center address or null to use
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  the current default SMSC
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param destPort the port to deliver the message to
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param data the body of the message to send
3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param sentIntent if not NULL this <code>PendingIntent</code> is
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  broadcast when the message is successfully sent, or failed.
3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  The result code will be <code>Activity.RESULT_OK<code> for success,
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  or one of these errors:<br>
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  <code>RESULT_ERROR_GENERIC_FAILURE</code><br>
3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  <code>RESULT_ERROR_RADIO_OFF</code><br>
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  <code>RESULT_ERROR_NULL_PDU</code><br>
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  the extra "errorCode" containing a radio technology specific value,
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  generally only useful for troubleshooting.<br>
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  The per-application based SMS control checks sentIntent. If sentIntent
3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  is NULL the caller will be checked against all unknown applications,
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  which cause smaller number of SMS to be sent in checking period.
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param deliveryIntent if not NULL this <code>PendingIntent</code> is
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  broadcast when the message is delivered to the recipient.  The
3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  raw pdu of the status report is in the extended data ("pdu").
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
342cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
3437fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn    public void sendData(String callingPackage, String destAddr, String scAddr, int destPort,
3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) {
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPhone.getContext().enforceCallingPermission(
3467fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn                Manifest.permission.SEND_SMS,
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                "Sending SMS message");
348ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        if (Rlog.isLoggable("SMS", Log.VERBOSE)) {
3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("sendData: destAddr=" + destAddr + " scAddr=" + scAddr + " destPort=" +
3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                destPort + " data='"+ HexDump.toHexString(data)  + "' sentIntent=" +
3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                sentIntent + " deliveryIntent=" + deliveryIntent);
3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3537fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn        if (mAppOps.noteOp(AppOpsManager.OP_SEND_SMS, Binder.getCallingUid(),
3547fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn                callingPackage) != AppOpsManager.MODE_ALLOWED) {
3557fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn            return;
3567fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn        }
3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDispatcher.sendData(destAddr, scAddr, destPort, data, sentIntent, deliveryIntent);
3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Send a text based SMS.
3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param destAddr the address to send the message to
3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param scAddr is the service center address or null to use
3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  the current default SMSC
3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param text the body of the message to send
3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param sentIntent if not NULL this <code>PendingIntent</code> is
3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  broadcast when the message is successfully sent, or failed.
3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  The result code will be <code>Activity.RESULT_OK<code> for success,
3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  or one of these errors:<br>
3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  <code>RESULT_ERROR_GENERIC_FAILURE</code><br>
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  <code>RESULT_ERROR_RADIO_OFF</code><br>
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  <code>RESULT_ERROR_NULL_PDU</code><br>
3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include
3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  the extra "errorCode" containing a radio technology specific value,
3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  generally only useful for troubleshooting.<br>
3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  The per-application based SMS control checks sentIntent. If sentIntent
3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  is NULL the caller will be checked against all unknown applications,
3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  which cause smaller number of SMS to be sent in checking period.
3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param deliveryIntent if not NULL this <code>PendingIntent</code> is
3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  broadcast when the message is delivered to the recipient.  The
3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  raw pdu of the status report is in the extended data ("pdu").
3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
384cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
3857fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn    public void sendText(String callingPackage, String destAddr, String scAddr,
3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String text, PendingIntent sentIntent, PendingIntent deliveryIntent) {
3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPhone.getContext().enforceCallingPermission(
3887fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn                Manifest.permission.SEND_SMS,
3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                "Sending SMS message");
390ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        if (Rlog.isLoggable("SMS", Log.VERBOSE)) {
3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("sendText: destAddr=" + destAddr + " scAddr=" + scAddr +
3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                " text='"+ text + "' sentIntent=" +
3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                sentIntent + " deliveryIntent=" + deliveryIntent);
3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3957fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn        if (mAppOps.noteOp(AppOpsManager.OP_SEND_SMS, Binder.getCallingUid(),
3967fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn                callingPackage) != AppOpsManager.MODE_ALLOWED) {
3977fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn            return;
3987fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn        }
3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDispatcher.sendText(destAddr, scAddr, text, sentIntent, deliveryIntent);
4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Send a multi-part text based SMS.
4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param destAddr the address to send the message to
4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param scAddr is the service center address or null to use
4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   the current default SMSC
4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param parts an <code>ArrayList</code> of strings that, in order,
4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   comprise the original message
4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param sentIntents if not null, an <code>ArrayList</code> of
4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   <code>PendingIntent</code>s (one for each message part) that is
4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   broadcast when the corresponding message part has been sent.
4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   The result code will be <code>Activity.RESULT_OK<code> for success,
4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   or one of these errors:
4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   <code>RESULT_ERROR_GENERIC_FAILURE</code>
4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   <code>RESULT_ERROR_RADIO_OFF</code>
4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   <code>RESULT_ERROR_NULL_PDU</code>.
4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  The per-application based SMS control checks sentIntent. If sentIntent
4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  is NULL the caller will be checked against all unknown applications,
4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  which cause smaller number of SMS to be sent in checking period.
4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param deliveryIntents if not null, an <code>ArrayList</code> of
4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   <code>PendingIntent</code>s (one for each message part) that is
4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   broadcast when the corresponding message part has been delivered
4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   to the recipient.  The raw pdu of the status report is in the
4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *   extended data ("pdu").
4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
427cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4287fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn    public void sendMultipartText(String callingPackage, String destAddr, String scAddr,
4297fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn            List<String> parts, List<PendingIntent> sentIntents,
4307fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn            List<PendingIntent> deliveryIntents) {
4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPhone.getContext().enforceCallingPermission(
4327fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn                Manifest.permission.SEND_SMS,
4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                "Sending SMS message");
434ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        if (Rlog.isLoggable("SMS", Log.VERBOSE)) {
4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int i = 0;
4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            for (String part : parts) {
4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                log("sendMultipartText: destAddr=" + destAddr + ", srAddr=" + scAddr +
4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        ", part[" + (i++) + "]=" + part);
4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4417fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn        if (mAppOps.noteOp(AppOpsManager.OP_SEND_SMS, Binder.getCallingUid(),
4427fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn                callingPackage) != AppOpsManager.MODE_ALLOWED) {
4437fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn            return;
4447fce994eb223105829becb6c26e3af7a9739752cDianne Hackborn        }
4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDispatcher.sendMultipartText(destAddr, scAddr, (ArrayList<String>) parts,
4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                (ArrayList<PendingIntent>) sentIntents, (ArrayList<PendingIntent>) deliveryIntents);
4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
449cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4504658a1a8c23111d5cc89feb040ce547a7b65dfb0Jake Hamby    public int getPremiumSmsPermission(String packageName) {
4514658a1a8c23111d5cc89feb040ce547a7b65dfb0Jake Hamby        return mDispatcher.getPremiumSmsPermission(packageName);
4524658a1a8c23111d5cc89feb040ce547a7b65dfb0Jake Hamby    }
4534658a1a8c23111d5cc89feb040ce547a7b65dfb0Jake Hamby
454cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4554658a1a8c23111d5cc89feb040ce547a7b65dfb0Jake Hamby    public void setPremiumSmsPermission(String packageName, int permission) {
4564658a1a8c23111d5cc89feb040ce547a7b65dfb0Jake Hamby        mDispatcher.setPremiumSmsPermission(packageName, permission);
4574658a1a8c23111d5cc89feb040ce547a7b65dfb0Jake Hamby    }
4584658a1a8c23111d5cc89feb040ce547a7b65dfb0Jake Hamby
4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * create SmsRawData lists from all sms record byte[]
4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Use null to indicate "free" record
4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param messages List of message records from EF_SMS.
4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return SmsRawData list of all in-used records
4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected ArrayList<SmsRawData> buildValidRawData(ArrayList<byte[]> messages) {
4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int count = messages.size();
4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ArrayList<SmsRawData> ret;
4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ret = new ArrayList<SmsRawData>(count);
4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0; i < count; i++) {
4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            byte[] ba = messages.get(i);
4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (ba[0] == STATUS_ON_ICC_FREE) {
4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ret.add(null);
4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ret.add(new SmsRawData(messages.get(i)));
4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ret;
4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Generates an EF_SMS record from status and raw PDU.
4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param status Message status.  See TS 51.011 10.5.3.
4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param pdu Raw message PDU.
4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return byte array for the record.
4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected byte[] makeSmsRecordData(int status, byte[] pdu) {
4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        byte[] data = new byte[IccConstants.SMS_RECORD_LENGTH];
4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Status bits for this record.  See TS 51.011 10.5.3
4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        data[0] = (byte)(status & 7);
4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        System.arraycopy(pdu, 0, data, 1, pdu.length);
4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Pad out with 0xFF's.
5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int j = pdu.length+1; j < IccConstants.SMS_RECORD_LENGTH; j++) {
5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            data[j] = -1;
5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return data;
5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5076f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    public boolean enableCellBroadcast(int messageIdentifier) {
5086f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        return enableCellBroadcastRange(messageIdentifier, messageIdentifier);
5096f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    }
5106f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5116f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    public boolean disableCellBroadcast(int messageIdentifier) {
5126f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        return disableCellBroadcastRange(messageIdentifier, messageIdentifier);
5136f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    }
5146f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5156f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    public boolean enableCellBroadcastRange(int startMessageId, int endMessageId) {
5166f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (PhoneConstants.PHONE_TYPE_GSM == mPhone.getPhoneType()) {
5176f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            return enableGsmBroadcastRange(startMessageId, endMessageId);
5186f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        } else {
5196f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            return enableCdmaBroadcastRange(startMessageId, endMessageId);
5206f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
5216f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    }
5226f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5236f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    public boolean disableCellBroadcastRange(int startMessageId, int endMessageId) {
5246f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (PhoneConstants.PHONE_TYPE_GSM == mPhone.getPhoneType()) {
5256f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            return disableGsmBroadcastRange(startMessageId, endMessageId);
5266f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        } else {
5276f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            return disableCdmaBroadcastRange(startMessageId, endMessageId);
5286f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
5296f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    }
5306f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5316f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    synchronized public boolean enableGsmBroadcastRange(int startMessageId, int endMessageId) {
5326f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (DBG) log("enableGsmBroadcastRange");
5336f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5346f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        Context context = mPhone.getContext();
5356f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5366f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        context.enforceCallingPermission(
5376f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                "android.permission.RECEIVE_SMS",
5386f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                "Enabling cell broadcast SMS");
5396f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5406f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        String client = context.getPackageManager().getNameForUid(
5416f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                Binder.getCallingUid());
5426f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5436f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (!mCellBroadcastRangeManager.enableRange(startMessageId, endMessageId, client)) {
5446f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            log("Failed to add cell broadcast subscription for MID range " + startMessageId
5456f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                    + " to " + endMessageId + " from client " + client);
5466f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            return false;
5476f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
5486f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5496f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (DBG)
5506f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            log("Added cell broadcast subscription for MID range " + startMessageId
5516f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                    + " to " + endMessageId + " from client " + client);
5526f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5536f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        setCellBroadcastActivation(!mCellBroadcastRangeManager.isEmpty());
5546f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5556f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        return true;
5566f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    }
5576f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5586f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    synchronized public boolean disableGsmBroadcastRange(int startMessageId, int endMessageId) {
5596f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (DBG) log("disableGsmBroadcastRange");
5606f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5616f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        Context context = mPhone.getContext();
5626f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5636f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        context.enforceCallingPermission(
5646f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                "android.permission.RECEIVE_SMS",
5656f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                "Disabling cell broadcast SMS");
5666f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5676f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        String client = context.getPackageManager().getNameForUid(
5686f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                Binder.getCallingUid());
5696f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5706f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (!mCellBroadcastRangeManager.disableRange(startMessageId, endMessageId, client)) {
5716f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            log("Failed to remove cell broadcast subscription for MID range " + startMessageId
5726f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                    + " to " + endMessageId + " from client " + client);
5736f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            return false;
5746f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
5756f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5766f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (DBG)
5776f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            log("Removed cell broadcast subscription for MID range " + startMessageId
5786f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                    + " to " + endMessageId + " from client " + client);
5796f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5806f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        setCellBroadcastActivation(!mCellBroadcastRangeManager.isEmpty());
5816f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5826f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        return true;
5836f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    }
5846f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5856f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    synchronized public boolean enableCdmaBroadcastRange(int startMessageId, int endMessageId) {
5866f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (DBG) log("enableCdmaBroadcastRange");
5876f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5886f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        Context context = mPhone.getContext();
5896f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5906f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        context.enforceCallingPermission(
5916f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                "android.permission.RECEIVE_SMS",
5926f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                "Enabling cdma broadcast SMS");
5936f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5946f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        String client = context.getPackageManager().getNameForUid(
5956f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                Binder.getCallingUid());
5966f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
5976f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (!mCdmaBroadcastRangeManager.enableRange(startMessageId, endMessageId, client)) {
5986f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            log("Failed to add cdma broadcast subscription for MID range " + startMessageId
5996f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                    + " to " + endMessageId + " from client " + client);
6006f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            return false;
6016f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
6026f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6036f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (DBG)
6046f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            log("Added cdma broadcast subscription for MID range " + startMessageId
6056f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                    + " to " + endMessageId + " from client " + client);
6066f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6076f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        setCdmaBroadcastActivation(!mCdmaBroadcastRangeManager.isEmpty());
6086f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6096f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        return true;
6106f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    }
6116f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6126f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    synchronized public boolean disableCdmaBroadcastRange(int startMessageId, int endMessageId) {
6136f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (DBG) log("disableCdmaBroadcastRange");
6146f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6156f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        Context context = mPhone.getContext();
6166f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6176f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        context.enforceCallingPermission(
6186f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                "android.permission.RECEIVE_SMS",
6196f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                "Disabling cell broadcast SMS");
6206f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6216f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        String client = context.getPackageManager().getNameForUid(
6226f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                Binder.getCallingUid());
6236f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6246f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (!mCdmaBroadcastRangeManager.disableRange(startMessageId, endMessageId, client)) {
6256f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            log("Failed to remove cdma broadcast subscription for MID range " + startMessageId
6266f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                    + " to " + endMessageId + " from client " + client);
6276f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            return false;
6286f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
6296f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6306f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (DBG)
6316f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            log("Removed cdma broadcast subscription for MID range " + startMessageId
6326f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                    + " to " + endMessageId + " from client " + client);
6336f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6346f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        setCdmaBroadcastActivation(!mCdmaBroadcastRangeManager.isEmpty());
6356f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6366f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        return true;
6376f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    }
6386f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6396f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    class CellBroadcastRangeManager extends IntRangeManager {
6406f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        private ArrayList<SmsBroadcastConfigInfo> mConfigList =
6416f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                new ArrayList<SmsBroadcastConfigInfo>();
6426f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6436f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        /**
6446f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * Called when the list of enabled ranges has changed. This will be
6456f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * followed by zero or more calls to {@link #addRange} followed by
6466f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * a call to {@link #finishUpdate}.
6476f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         */
6486f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        protected void startUpdate() {
6496f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            mConfigList.clear();
6506f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
6516f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6526f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        /**
6536f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * Called after {@link #startUpdate} to indicate a range of enabled
6546f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * values.
6556f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * @param startId the first id included in the range
6566f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * @param endId the last id included in the range
6576f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         */
6586f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        protected void addRange(int startId, int endId, boolean selected) {
6596f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            mConfigList.add(new SmsBroadcastConfigInfo(startId, endId,
6606f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                        SMS_CB_CODE_SCHEME_MIN, SMS_CB_CODE_SCHEME_MAX, selected));
6616f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
6626f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6636f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        /**
6646f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * Called to indicate the end of a range update started by the
6656f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * previous call to {@link #startUpdate}.
6666f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * @return true if successful, false otherwise
6676f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         */
6686f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        protected boolean finishUpdate() {
6696f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            if (mConfigList.isEmpty()) {
6706f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                return true;
6716f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            } else {
6726f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                SmsBroadcastConfigInfo[] configs =
6736f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                        mConfigList.toArray(new SmsBroadcastConfigInfo[mConfigList.size()]);
6746f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                return setCellBroadcastConfig(configs);
6756f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            }
6766f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
6776f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    }
6786f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6796f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    class CdmaBroadcastRangeManager extends IntRangeManager {
6806f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        private ArrayList<CdmaSmsBroadcastConfigInfo> mConfigList =
6816f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                new ArrayList<CdmaSmsBroadcastConfigInfo>();
6826f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
6836f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        /**
6846f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * Called when the list of enabled ranges has changed. This will be
6856f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * followed by zero or more calls to {@link #addRange} followed by a
6866f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * call to {@link #finishUpdate}.
6876f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         */
6886f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        protected void startUpdate() {
6896f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            mConfigList.clear();
6906f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
691ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
6926f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        /**
6936f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * Called after {@link #startUpdate} to indicate a range of enabled
6946f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * values.
6956f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * @param startId the first id included in the range
6966f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * @param endId the last id included in the range
6976f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         */
6986f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        protected void addRange(int startId, int endId, boolean selected) {
6996f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            mConfigList.add(new CdmaSmsBroadcastConfigInfo(startId, endId,
7006f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                    1, selected));
7016f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
702ebc3f0565ad0f9b8b7d3531afd8744843d96aadbRika Brooks
7036f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        /**
7046f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * Called to indicate the end of a range update started by the previous
7056f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * call to {@link #startUpdate}.
7066f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         * @return true if successful, false otherwise
7076f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa         */
7086f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        protected boolean finishUpdate() {
7096f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            if (mConfigList.isEmpty()) {
7106f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                return true;
7116f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            } else {
7126f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                CdmaSmsBroadcastConfigInfo[] configs =
7136f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                        mConfigList.toArray(new CdmaSmsBroadcastConfigInfo[mConfigList.size()]);
7146f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                return setCdmaBroadcastConfig(configs);
7156f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            }
7166f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
7176f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    }
7186f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7196f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    private boolean setCellBroadcastConfig(SmsBroadcastConfigInfo[] configs) {
7206f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (DBG)
7216f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            log("Calling setGsmBroadcastConfig with " + configs.length + " configurations");
7220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7236f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        synchronized (mLock) {
7246f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            Message response = mHandler.obtainMessage(EVENT_SET_BROADCAST_CONFIG_DONE);
7256f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7266f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            mSuccess = false;
7276f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            mPhone.mCi.setGsmBroadcastConfig(configs, response);
7286f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7296f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            try {
7306f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                mLock.wait();
7316f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            } catch (InterruptedException e) {
7326f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                log("interrupted while trying to set cell broadcast config");
7336f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            }
7346f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
7356f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7366f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        return mSuccess;
7376f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    }
7386f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7396f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    private boolean setCellBroadcastActivation(boolean activate) {
7406f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (DBG)
7416f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            log("Calling setCellBroadcastActivation(" + activate + ')');
7426f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7436f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        synchronized (mLock) {
7446f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            Message response = mHandler.obtainMessage(EVENT_SET_BROADCAST_ACTIVATION_DONE);
7456f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7466f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            mSuccess = false;
7476f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            mPhone.mCi.setGsmBroadcastActivation(activate, response);
7486f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7496f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            try {
7506f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                mLock.wait();
7516f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            } catch (InterruptedException e) {
7526f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                log("interrupted while trying to set cell broadcast activation");
7536f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            }
7546f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
7556f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7566f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        return mSuccess;
7576f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    }
7586f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7596f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    private boolean setCdmaBroadcastConfig(CdmaSmsBroadcastConfigInfo[] configs) {
7606f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (DBG)
7616f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            log("Calling setCdmaBroadcastConfig with " + configs.length + " configurations");
7626f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7636f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        synchronized (mLock) {
7646f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            Message response = mHandler.obtainMessage(EVENT_SET_BROADCAST_CONFIG_DONE);
7656f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7666f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            mSuccess = false;
7676f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            mPhone.mCi.setCdmaBroadcastConfig(configs, response);
7686f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7696f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            try {
7706f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                mLock.wait();
7716f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            } catch (InterruptedException e) {
7726f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                log("interrupted while trying to set cdma broadcast config");
7736f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            }
7746f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
7756f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7766f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        return mSuccess;
7776f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    }
7786f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7796f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    private boolean setCdmaBroadcastActivation(boolean activate) {
7806f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        if (DBG)
7816f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            log("Calling setCdmaBroadcastActivation(" + activate + ")");
7826f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7836f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        synchronized (mLock) {
7846f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            Message response = mHandler.obtainMessage(EVENT_SET_BROADCAST_ACTIVATION_DONE);
7856f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7866f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            mSuccess = false;
7876f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            mPhone.mCi.setCdmaBroadcastActivation(activate, response);
7886f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7896f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            try {
7906f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                mLock.wait();
7916f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            } catch (InterruptedException e) {
7926f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa                log("interrupted while trying to set cdma broadcast activation");
7936f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa            }
7946f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        }
7956f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7966f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        return mSuccess;
7976f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    }
7986f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa
7996f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    protected void log(String msg) {
8006f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa        Log.d(LOG_TAG, "[IccSmsInterfaceManager] " + msg);
8016f2a3e1ea86ae7ae2e04eb95582e54eec7a2f864Sukanya Rajkhowa    }
8021260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
8031260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    public boolean isImsSmsSupported() {
8041260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        return mDispatcher.isIms();
8051260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
8061260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
8071260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    public String getImsSmsFormat() {
8081260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        return mDispatcher.getImsSmsFormat();
8091260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
8100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
811