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
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.ContentProvider;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.UriMatcher;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.ContentValues;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.database.Cursor;
23a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.database.MergeCursor;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.database.MatrixCursor;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.Uri;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.RemoteException;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.ServiceManager;
28a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.SubInfoRecord;
29a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.SubscriptionManager;
30a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.TelephonyManager;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.TextUtils;
32ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog;
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List;
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.IIccPhoneBook;
37d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.AdnRecord;
38d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccConstants;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class IccProvider extends ContentProvider {
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String TAG = "IccProvider";
46a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final boolean DBG = true;
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String[] ADDRESS_BOOK_COLUMN_NAMES = new String[] {
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        "name",
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        "number",
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        "emails",
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        "_id"
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    };
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
56a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected static final int ADN = 1;
57a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected static final int ADN_SUB = 2;
58a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected static final int FDN = 3;
59a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected static final int FDN_SUB = 4;
60a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected static final int SDN = 5;
61a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected static final int SDN_SUB = 6;
62a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected static final int ADN_ALL = 7;
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
64a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected static final String STR_TAG = "tag";
65a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected static final String STR_NUMBER = "number";
66a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected static final String STR_EMAILS = "emails";
67a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected static final String STR_PIN2 = "pin2";
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final UriMatcher URL_MATCHER =
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            new UriMatcher(UriMatcher.NO_MATCH);
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static {
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        URL_MATCHER.addURI("icc", "adn", ADN);
74a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        URL_MATCHER.addURI("icc", "adn/subId/#", ADN_SUB);
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        URL_MATCHER.addURI("icc", "fdn", FDN);
76a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        URL_MATCHER.addURI("icc", "fdn/subId/#", FDN_SUB);
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        URL_MATCHER.addURI("icc", "sdn", SDN);
78a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        URL_MATCHER.addURI("icc", "sdn/subId/#", SDN_SUB);
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean onCreate() {
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return true;
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Cursor query(Uri url, String[] projection, String selection,
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String[] selectionArgs, String sort) {
89a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (DBG) log("query");
90a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (URL_MATCHER.match(url)) {
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case ADN:
93a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                return loadFromEf(IccConstants.EF_ADN, SubscriptionManager.getDefaultSubId());
94a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
95a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case ADN_SUB:
96a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                return loadFromEf(IccConstants.EF_ADN, getRequestSubId(url));
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case FDN:
99a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                return loadFromEf(IccConstants.EF_FDN, SubscriptionManager.getDefaultSubId());
100a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
101a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case FDN_SUB:
102a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                return loadFromEf(IccConstants.EF_FDN, getRequestSubId(url));
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case SDN:
105a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                return loadFromEf(IccConstants.EF_SDN, SubscriptionManager.getDefaultSubId());
106a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case SDN_SUB:
108a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                return loadFromEf(IccConstants.EF_SDN, getRequestSubId(url));
109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
110a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case ADN_ALL:
111a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                return loadAllSimContacts(IccConstants.EF_ADN);
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                throw new IllegalArgumentException("Unknown URL " + url);
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
118a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private Cursor loadAllSimContacts(int efType) {
119a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        Cursor [] result;
120440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville        List<SubInfoRecord> subInfoList = SubscriptionManager.getActiveSubInfoList();
121a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
122a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if ((subInfoList == null) || (subInfoList.size() == 0)) {
123a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            result = new Cursor[0];
124a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else {
125a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            int subIdCount = subInfoList.size();
126a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            result = new Cursor[subIdCount];
127a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            long subId;
128a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
129a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            for (int i = 0; i < subIdCount; i++) {
130ba2ee8969eb4a6c7292dc257beb1a125b34b30b6Wink Saville                subId = subInfoList.get(i).subId;
131a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                result[i] = loadFromEf(efType, subId);
132a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                Rlog.i(TAG,"ADN Records loaded for Subscription ::" + subId);
133a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
134a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
135a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
136a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return new MergeCursor(result);
137a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
138a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getType(Uri url) {
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (URL_MATCHER.match(url)) {
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case ADN:
143a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case ADN_SUB:
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case FDN:
145a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case FDN_SUB:
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case SDN:
147a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case SDN_SUB:
148a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case ADN_ALL:
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return "vnd.android.cursor.dir/sim-contact";
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                throw new IllegalArgumentException("Unknown URL " + url);
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Uri insert(Uri url, ContentValues initialValues) {
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Uri resultUri;
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int efType;
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String pin2 = null;
161a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        long subId;
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("insert");
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int match = URL_MATCHER.match(url);
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (match) {
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case ADN:
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                efType = IccConstants.EF_ADN;
169a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                subId = SubscriptionManager.getDefaultSubId();
170a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                break;
171a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
172a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case ADN_SUB:
173a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                efType = IccConstants.EF_ADN;
174a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                subId = getRequestSubId(url);
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case FDN:
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                efType = IccConstants.EF_FDN;
179a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                subId = SubscriptionManager.getDefaultSubId();
180a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                pin2 = initialValues.getAsString("pin2");
181a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                break;
182a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
183a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case FDN_SUB:
184a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                efType = IccConstants.EF_FDN;
185a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                subId = getRequestSubId(url);
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                pin2 = initialValues.getAsString("pin2");
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                throw new UnsupportedOperationException(
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        "Cannot insert into URL: " + url);
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String tag = initialValues.getAsString("tag");
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String number = initialValues.getAsString("number");
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO(): Read email instead of sending null.
197a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        boolean success = addIccRecordToEf(efType, tag, number, null, pin2, subId);
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!success) {
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return null;
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        StringBuilder buf = new StringBuilder("content://icc/");
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (match) {
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case ADN:
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                buf.append("adn/");
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
209a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case ADN_SUB:
210a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                buf.append("adn/subId/");
211a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                break;
212a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case FDN:
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                buf.append("fdn/");
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
216a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
217a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case FDN_SUB:
218a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                buf.append("fdn/subId/");
219a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                break;
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO: we need to find out the rowId for the newly added record
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        buf.append(0);
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        resultUri = Uri.parse(buf.toString());
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
227a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        getContext().getContentResolver().notifyChange(url, null);
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /*
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // notify interested parties that an insertion happened
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        getContext().getContentResolver().notifyInsert(
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                resultUri, rowID, null);
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        */
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return resultUri;
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String normalizeValue(String inVal) {
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int len = inVal.length();
239a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        // If name is empty in contact return null to avoid crash.
240a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (len == 0) {
241a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (DBG) log("len of input String is 0");
242a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return inVal;
243a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String retVal = inVal;
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (inVal.charAt(0) == '\'' && inVal.charAt(len-1) == '\'') {
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            retVal = inVal.substring(1, len-1);
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return retVal;
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int delete(Uri url, String where, String[] whereArgs) {
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int efType;
256a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        long subId;
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int match = URL_MATCHER.match(url);
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (match) {
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case ADN:
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                efType = IccConstants.EF_ADN;
262a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                subId = SubscriptionManager.getDefaultSubId();
263a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                break;
264a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
265a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case ADN_SUB:
266a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                efType = IccConstants.EF_ADN;
267a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                subId = getRequestSubId(url);
2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case FDN:
2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                efType = IccConstants.EF_FDN;
272a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                subId = SubscriptionManager.getDefaultSubId();
273a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                break;
274a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
275a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case FDN_SUB:
276a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                efType = IccConstants.EF_FDN;
277a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                subId = getRequestSubId(url);
2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                throw new UnsupportedOperationException(
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        "Cannot insert into URL: " + url);
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
285a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (DBG) log("delete");
286a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // parse where clause
2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String tag = null;
2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String number = null;
2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String[] emails = null;
2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String pin2 = null;
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String[] tokens = where.split("AND");
2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int n = tokens.length;
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        while (--n >= 0) {
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String param = tokens[n];
2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("parsing '" + param + "'");
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
300a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            String[] pair = param.split("=");
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
302a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (pair.length != 2) {
303a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                Rlog.e(TAG, "resolve: bad whereClause parameter: " + param);
304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                continue;
305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String key = pair[0].trim();
3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String val = pair[1].trim();
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (STR_TAG.equals(key)) {
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                tag = normalizeValue(val);
3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (STR_NUMBER.equals(key)) {
3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                number = normalizeValue(val);
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (STR_EMAILS.equals(key)) {
3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                //TODO(): Email is null.
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                emails = null;
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (STR_PIN2.equals(key)) {
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                pin2 = normalizeValue(val);
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
321a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (efType == FDN && TextUtils.isEmpty(pin2)) {
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return 0;
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
325a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        boolean success = deleteIccRecordFromEf(efType, tag, number, emails, pin2, subId);
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!success) {
3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return 0;
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
330a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        getContext().getContentResolver().notifyChange(url, null);
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return 1;
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String pin2 = null;
337a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        int efType;
338a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        long subId;
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("update");
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int match = URL_MATCHER.match(url);
3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (match) {
3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case ADN:
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                efType = IccConstants.EF_ADN;
346a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                subId = SubscriptionManager.getDefaultSubId();
347a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                break;
348a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
349a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case ADN_SUB:
350a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                efType = IccConstants.EF_ADN;
351a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                subId = getRequestSubId(url);
3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case FDN:
3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                efType = IccConstants.EF_FDN;
356a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                subId = SubscriptionManager.getDefaultSubId();
357a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                pin2 = values.getAsString("pin2");
358a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                break;
359a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
360a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case FDN_SUB:
361a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                efType = IccConstants.EF_FDN;
362a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                subId = getRequestSubId(url);
3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                pin2 = values.getAsString("pin2");
3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                throw new UnsupportedOperationException(
3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        "Cannot insert into URL: " + url);
3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String tag = values.getAsString("tag");
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String number = values.getAsString("number");
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String[] emails = null;
3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String newTag = values.getAsString("newTag");
3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String newNumber = values.getAsString("newNumber");
3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String[] newEmails = null;
3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO(): Update for email.
3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean success = updateIccRecordInEf(efType, tag, number,
379a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                newTag, newNumber, pin2, subId);
3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!success) {
3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return 0;
3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
385a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        getContext().getContentResolver().notifyChange(url, null);
3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return 1;
3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
389a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private MatrixCursor loadFromEf(int efType, long subId) {
390a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (DBG) log("loadFromEf: efType=" + efType + ", subscription=" + subId);
3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        List<AdnRecord> adnRecords = null;
3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ServiceManager.getService("simphonebook"));
3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (iccIpb != null) {
3976a5ef38e6ae3d3a3ad90ae180388fe85de0495a2Wink Saville                adnRecords = iccIpb.getAdnRecordsInEfForSubscriber(subId, efType);
3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // ignore it
4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (SecurityException ex) {
4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log(ex.toString());
4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (adnRecords != null) {
4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Load the results
4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            final int N = adnRecords.size();
4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            final MatrixCursor cursor = new MatrixCursor(ADDRESS_BOOK_COLUMN_NAMES, N);
4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("adnRecords.size=" + N);
4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            for (int i = 0; i < N ; i++) {
4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                loadRecord(adnRecords.get(i), cursor, i);
4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return cursor;
4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // No results to load
416ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.w(TAG, "Cannot load ADN records");
4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return new MatrixCursor(ADDRESS_BOOK_COLUMN_NAMES);
4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean
422a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    addIccRecordToEf(int efType, String name, String number, String[] emails,
423a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            String pin2, long subId) {
4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("addIccRecordToEf: efType=" + efType + ", name=" + name +
425a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                ", number=" + number + ", emails=" + emails + ", subscription=" + subId);
4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean success = false;
4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO: do we need to call getAdnRecordsInEf() before calling
4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // updateAdnRecordsInEfBySearch()? In any case, we will leave
4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // the UI level logic to fill that prereq if necessary. But
4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // hopefully, we can remove this requirement.
4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ServiceManager.getService("simphonebook"));
4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (iccIpb != null) {
4386a5ef38e6ae3d3a3ad90ae180388fe85de0495a2Wink Saville                success = iccIpb.updateAdnRecordsInEfBySearchForSubscriber(subId, efType,
439a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        "", "", name, number, pin2);
4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // ignore it
4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (SecurityException ex) {
4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log(ex.toString());
4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("addIccRecordToEf: " + success);
4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return success;
4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean
4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    updateIccRecordInEf(int efType, String oldName, String oldNumber,
452a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            String newName, String newNumber, String pin2, long subId) {
4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("updateIccRecordInEf: efType=" + efType +
4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ", oldname=" + oldName + ", oldnumber=" + oldNumber +
455a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                ", newname=" + newName + ", newnumber=" + newNumber +
456a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                ", subscription=" + subId);
457a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean success = false;
4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ServiceManager.getService("simphonebook"));
4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (iccIpb != null) {
4646a5ef38e6ae3d3a3ad90ae180388fe85de0495a2Wink Saville                success = iccIpb.updateAdnRecordsInEfBySearchForSubscriber(subId, efType, oldName,
465a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        oldNumber, newName, newNumber, pin2);
4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // ignore it
4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (SecurityException ex) {
4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log(ex.toString());
4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("updateIccRecordInEf: " + success);
4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return success;
4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean deleteIccRecordFromEf(int efType, String name, String number, String[] emails,
478a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            String pin2, long subId) {
4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("deleteIccRecordFromEf: efType=" + efType +
480a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                ", name=" + name + ", number=" + number + ", emails=" + emails +
481a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                ", pin2=" + pin2 + ", subscription=" + subId);
4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean success = false;
4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ServiceManager.getService("simphonebook"));
4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (iccIpb != null) {
4896a5ef38e6ae3d3a3ad90ae180388fe85de0495a2Wink Saville                success = iccIpb.updateAdnRecordsInEfBySearchForSubscriber(subId, efType,
490a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                          name, number, "", "", pin2);
4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // ignore it
4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (SecurityException ex) {
4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log(ex.toString());
4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("deleteIccRecordFromEf: " + success);
4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return success;
4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Loads an AdnRecord into a MatrixCursor. Must be called with mLock held.
5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param record the ADN record to load from
5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param cursor the cursor to receive the results
5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void loadRecord(AdnRecord record, MatrixCursor cursor, int id) {
5080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!record.isEmpty()) {
5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Object[] contact = new Object[4];
5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String alphaTag = record.getAlphaTag();
5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String number = record.getNumber();
5120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("loadRecord: " + alphaTag + ", " + number + ",");
5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            contact[0] = alphaTag;
5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            contact[1] = number;
5160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String[] emails = record.getEmails();
5180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (emails != null) {
5190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                StringBuilder emailString = new StringBuilder();
5200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                for (String email: emails) {
5210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) log("Adding email:" + email);
5220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    emailString.append(email);
5230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    emailString.append(",");
5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
5250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                contact[2] = emailString.toString();
5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            contact[3] = id;
5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            cursor.addRow(contact);
5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void log(String msg) {
533ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.d(TAG, "[IccProvider] " + msg);
5340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
536a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private long getRequestSubId(Uri url) {
537a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (DBG) log("getRequestSubId url: " + url);
538a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
539a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        try {
540a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return Long.parseLong(url.getLastPathSegment());
541a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } catch (NumberFormatException ex) {
542a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            throw new IllegalArgumentException("Unknown URL " + url);
543a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
544a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
5450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
546