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;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.database.MatrixCursor;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.Uri;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.RemoteException;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.ServiceManager;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.TextUtils;
28ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.IIccPhoneBook;
33d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.AdnRecord;
34d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccConstants;
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class IccProvider extends ContentProvider {
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String TAG = "IccProvider";
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final boolean DBG = false;
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String[] ADDRESS_BOOK_COLUMN_NAMES = new String[] {
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        "name",
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        "number",
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        "emails",
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        "_id"
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    };
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int ADN = 1;
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int FDN = 2;
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int SDN = 3;
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String STR_TAG = "tag";
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String STR_NUMBER = "number";
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String STR_EMAILS = "emails";
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String STR_PIN2 = "pin2";
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final UriMatcher URL_MATCHER =
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            new UriMatcher(UriMatcher.NO_MATCH);
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static {
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        URL_MATCHER.addURI("icc", "adn", ADN);
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        URL_MATCHER.addURI("icc", "fdn", FDN);
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        URL_MATCHER.addURI("icc", "sdn", SDN);
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean onCreate() {
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return true;
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Cursor query(Uri url, String[] projection, String selection,
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String[] selectionArgs, String sort) {
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (URL_MATCHER.match(url)) {
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case ADN:
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return loadFromEf(IccConstants.EF_ADN);
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case FDN:
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return loadFromEf(IccConstants.EF_FDN);
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case SDN:
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return loadFromEf(IccConstants.EF_SDN);
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                throw new IllegalArgumentException("Unknown URL " + url);
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getType(Uri url) {
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (URL_MATCHER.match(url)) {
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case ADN:
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case FDN:
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case SDN:
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return "vnd.android.cursor.dir/sim-contact";
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                throw new IllegalArgumentException("Unknown URL " + url);
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Uri insert(Uri url, ContentValues initialValues) {
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Uri resultUri;
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int efType;
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String pin2 = null;
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("insert");
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int match = URL_MATCHER.match(url);
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (match) {
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case ADN:
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                efType = IccConstants.EF_ADN;
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case FDN:
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                efType = IccConstants.EF_FDN;
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                pin2 = initialValues.getAsString("pin2");
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                throw new UnsupportedOperationException(
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        "Cannot insert into URL: " + url);
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String tag = initialValues.getAsString("tag");
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String number = initialValues.getAsString("number");
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO(): Read email instead of sending null.
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean success = addIccRecordToEf(efType, tag, number, null, pin2);
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!success) {
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return null;
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        StringBuilder buf = new StringBuilder("content://icc/");
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (match) {
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case ADN:
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                buf.append("adn/");
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case FDN:
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                buf.append("fdn/");
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO: we need to find out the rowId for the newly added record
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        buf.append(0);
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        resultUri = Uri.parse(buf.toString());
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /*
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // notify interested parties that an insertion happened
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        getContext().getContentResolver().notifyInsert(
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                resultUri, rowID, null);
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        */
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return resultUri;
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String normalizeValue(String inVal) {
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int len = inVal.length();
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String retVal = inVal;
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (inVal.charAt(0) == '\'' && inVal.charAt(len-1) == '\'') {
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            retVal = inVal.substring(1, len-1);
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return retVal;
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int delete(Uri url, String where, String[] whereArgs) {
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int efType;
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("delete");
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int match = URL_MATCHER.match(url);
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (match) {
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case ADN:
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                efType = IccConstants.EF_ADN;
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case FDN:
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                efType = IccConstants.EF_FDN;
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                throw new UnsupportedOperationException(
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        "Cannot insert into URL: " + url);
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // parse where clause
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String tag = null;
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String number = null;
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String[] emails = null;
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String pin2 = null;
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String[] tokens = where.split("AND");
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int n = tokens.length;
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        while (--n >= 0) {
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String param = tokens[n];
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("parsing '" + param + "'");
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
21043198cf78f564c631ef08dddb7a183d4ba5b137dJeevaka Badrappan            String[] pair = param.split("=", 2);
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String key = pair[0].trim();
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String val = pair[1].trim();
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (STR_TAG.equals(key)) {
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                tag = normalizeValue(val);
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (STR_NUMBER.equals(key)) {
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                number = normalizeValue(val);
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (STR_EMAILS.equals(key)) {
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                //TODO(): Email is null.
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                emails = null;
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (STR_PIN2.equals(key)) {
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                pin2 = normalizeValue(val);
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (TextUtils.isEmpty(number)) {
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return 0;
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (efType == IccConstants.EF_FDN && TextUtils.isEmpty(pin2)) {
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return 0;
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean success = deleteIccRecordFromEf(efType, tag, number, emails, pin2);
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!success) {
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return 0;
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return 1;
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int efType;
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String pin2 = null;
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("update");
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int match = URL_MATCHER.match(url);
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (match) {
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case ADN:
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                efType = IccConstants.EF_ADN;
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case FDN:
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                efType = IccConstants.EF_FDN;
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                pin2 = values.getAsString("pin2");
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                throw new UnsupportedOperationException(
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        "Cannot insert into URL: " + url);
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String tag = values.getAsString("tag");
2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String number = values.getAsString("number");
2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String[] emails = null;
2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String newTag = values.getAsString("newTag");
2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String newNumber = values.getAsString("newNumber");
2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String[] newEmails = null;
2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO(): Update for email.
2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean success = updateIccRecordInEf(efType, tag, number,
2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                newTag, newNumber, pin2);
2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!success) {
2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return 0;
2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return 1;
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private MatrixCursor loadFromEf(int efType) {
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("loadFromEf: efType=" + efType);
2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        List<AdnRecord> adnRecords = null;
2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ServiceManager.getService("simphonebook"));
2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (iccIpb != null) {
2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                adnRecords = iccIpb.getAdnRecordsInEf(efType);
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // ignore it
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (SecurityException ex) {
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log(ex.toString());
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (adnRecords != null) {
3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Load the results
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            final int N = adnRecords.size();
3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            final MatrixCursor cursor = new MatrixCursor(ADDRESS_BOOK_COLUMN_NAMES, N);
3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("adnRecords.size=" + N);
3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            for (int i = 0; i < N ; i++) {
3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                loadRecord(adnRecords.get(i), cursor, i);
3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return cursor;
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // No results to load
310ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.w(TAG, "Cannot load ADN records");
3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return new MatrixCursor(ADDRESS_BOOK_COLUMN_NAMES);
3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    addIccRecordToEf(int efType, String name, String number, String[] emails, String pin2) {
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("addIccRecordToEf: efType=" + efType + ", name=" + name +
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ", number=" + number + ", emails=" + emails);
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean success = false;
3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO: do we need to call getAdnRecordsInEf() before calling
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // updateAdnRecordsInEfBySearch()? In any case, we will leave
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // the UI level logic to fill that prereq if necessary. But
3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // hopefully, we can remove this requirement.
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ServiceManager.getService("simphonebook"));
3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (iccIpb != null) {
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                success = iccIpb.updateAdnRecordsInEfBySearch(efType, "", "",
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        name, number, pin2);
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // ignore it
3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (SecurityException ex) {
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log(ex.toString());
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("addIccRecordToEf: " + success);
3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return success;
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean
3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    updateIccRecordInEf(int efType, String oldName, String oldNumber,
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String newName, String newNumber, String pin2) {
3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("updateIccRecordInEf: efType=" + efType +
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ", oldname=" + oldName + ", oldnumber=" + oldNumber +
3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ", newname=" + newName + ", newnumber=" + newNumber);
3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean success = false;
3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ServiceManager.getService("simphonebook"));
3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (iccIpb != null) {
3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                success = iccIpb.updateAdnRecordsInEfBySearch(efType,
3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        oldName, oldNumber, newName, newNumber, pin2);
3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // ignore it
3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (SecurityException ex) {
3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log(ex.toString());
3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("updateIccRecordInEf: " + success);
3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return success;
3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean deleteIccRecordFromEf(int efType, String name, String number, String[] emails,
3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String pin2) {
3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("deleteIccRecordFromEf: efType=" + efType +
3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ", name=" + name + ", number=" + number + ", emails=" + emails + ", pin2=" + pin2);
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean success = false;
3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ServiceManager.getService("simphonebook"));
3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (iccIpb != null) {
3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                success = iccIpb.updateAdnRecordsInEfBySearch(efType,
3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        name, number, "", "", pin2);
3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // ignore it
3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (SecurityException ex) {
3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log(ex.toString());
3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("deleteIccRecordFromEf: " + success);
3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return success;
3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Loads an AdnRecord into a MatrixCursor. Must be called with mLock held.
3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param record the ADN record to load from
3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param cursor the cursor to receive the results
3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void loadRecord(AdnRecord record, MatrixCursor cursor, int id) {
3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!record.isEmpty()) {
3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Object[] contact = new Object[4];
4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String alphaTag = record.getAlphaTag();
4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String number = record.getNumber();
4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("loadRecord: " + alphaTag + ", " + number + ",");
4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            contact[0] = alphaTag;
4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            contact[1] = number;
4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String[] emails = record.getEmails();
4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (emails != null) {
4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                StringBuilder emailString = new StringBuilder();
4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                for (String email: emails) {
4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) log("Adding email:" + email);
4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    emailString.append(email);
4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    emailString.append(",");
4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                contact[2] = emailString.toString();
4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            contact[3] = id;
4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            cursor.addRow(contact);
4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void log(String msg) {
423ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.d(TAG, "[IccProvider] " + msg);
4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
427