19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savillepackage com.android.internal.telephony;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentProvider;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.UriMatcher;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
23c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brownimport android.database.MatrixCursor;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport com.android.internal.telephony.IccConstants;
3304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport com.android.internal.telephony.AdnRecord;
3404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport com.android.internal.telephony.IIccPhoneBook;
3504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
3604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
4004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savillepublic class IccProvider extends ContentProvider {
4104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    private static final String TAG = "IccProvider";
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DBG = false;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String[] ADDRESS_BOOK_COLUMN_NAMES = new String[] {
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "name",
4734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        "number",
48c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown        "emails",
49c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown        "_id"
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int ADN = 1;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int FDN = 2;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int SDN = 3;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String STR_TAG = "tag";
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String STR_NUMBER = "number";
5834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final String STR_EMAILS = "emails";
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String STR_PIN2 = "pin2";
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final UriMatcher URL_MATCHER =
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            new UriMatcher(UriMatcher.NO_MATCH);
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static {
6504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        URL_MATCHER.addURI("icc", "adn", ADN);
6604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        URL_MATCHER.addURI("icc", "fdn", FDN);
6704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        URL_MATCHER.addURI("icc", "sdn", SDN);
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreate() {
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Cursor query(Uri url, String[] projection, String selection,
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] selectionArgs, String sort) {
79c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown        switch (URL_MATCHER.match(url)) {
80c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown            case ADN:
81c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown                return loadFromEf(IccConstants.EF_ADN);
8204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
83c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown            case FDN:
84c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown                return loadFromEf(IccConstants.EF_FDN);
8504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
86c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown            case SDN:
87c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown                return loadFromEf(IccConstants.EF_SDN);
8804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
89c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown            default:
90c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown                throw new IllegalArgumentException("Unknown URL " + url);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getType(Uri url) {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (URL_MATCHER.match(url)) {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ADN:
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case FDN:
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case SDN:
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "vnd.android.cursor.dir/sim-contact";
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalArgumentException("Unknown URL " + url);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uri insert(Uri url, ContentValues initialValues) {
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uri resultUri;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int efType;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pin2 = null;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) log("insert");
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int match = URL_MATCHER.match(url);
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (match) {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ADN:
11804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                efType = IccConstants.EF_ADN;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case FDN:
12204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                efType = IccConstants.EF_FDN;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pin2 = initialValues.getAsString("pin2");
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new UnsupportedOperationException(
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Cannot insert into URL: " + url);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String tag = initialValues.getAsString("tag");
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String number = initialValues.getAsString("number");
13334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        // TODO(): Read email instead of sending null.
13434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        boolean success = addIccRecordToEf(efType, tag, number, null, pin2);
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!success) {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14012f413d29e1fb32f00213b1eaae6d45c856dc0d6jsh        StringBuilder buf = new StringBuilder("content://icc/");
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (match) {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ADN:
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                buf.append("adn/");
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case FDN:
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                buf.append("fdn/");
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: we need to find out the rowId for the newly added record
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        buf.append(0);
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        resultUri = Uri.parse(buf.toString());
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // notify interested parties that an insertion happened
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getContext().getContentResolver().notifyInsert(
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resultUri, rowID, null);
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        */
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return resultUri;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String normalizeValue(String inVal) {
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int len = inVal.length();
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String retVal = inVal;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (inVal.charAt(0) == '\'' && inVal.charAt(len-1) == '\'') {
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            retVal = inVal.substring(1, len-1);
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return retVal;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int delete(Uri url, String where, String[] whereArgs) {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int efType;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) log("delete");
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int match = URL_MATCHER.match(url);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (match) {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ADN:
18504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                efType = IccConstants.EF_ADN;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case FDN:
18904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                efType = IccConstants.EF_FDN;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new UnsupportedOperationException(
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Cannot insert into URL: " + url);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // parse where clause
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String tag = null;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String number = null;
20034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        String[] emails = null;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pin2 = null;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] tokens = where.split("AND");
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int n = tokens.length;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (--n >= 0) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String param = tokens[n];
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) log("parsing '" + param + "'");
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] pair = param.split("=");
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (pair.length != 2) {
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(TAG, "resolve: bad whereClause parameter: " + param);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String key = pair[0].trim();
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String val = pair[1].trim();
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (STR_TAG.equals(key)) {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tag = normalizeValue(val);
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (STR_NUMBER.equals(key)) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                number = normalizeValue(val);
22434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            } else if (STR_EMAILS.equals(key)) {
22534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                //TODO(): Email is null.
22634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                emails = null;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (STR_PIN2.equals(key)) {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pin2 = normalizeValue(val);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
232ac6461c69e213d66aac61e0c19602a2ac331e84dMikael Danielsson        if (TextUtils.isEmpty(number)) {
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2369f36f51844a6d8936f27af925ce8c22729a63f27Jake Hamby        if (efType == IccConstants.EF_FDN && TextUtils.isEmpty(pin2)) {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        boolean success = deleteIccRecordFromEf(efType, tag, number, emails, pin2);
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!success) {
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 1;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int efType;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pin2 = null;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) log("update");
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int match = URL_MATCHER.match(url);
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (match) {
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ADN:
25804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                efType = IccConstants.EF_ADN;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case FDN:
26204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                efType = IccConstants.EF_FDN;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pin2 = values.getAsString("pin2");
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new UnsupportedOperationException(
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Cannot insert into URL: " + url);
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String tag = values.getAsString("tag");
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String number = values.getAsString("number");
27334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        String[] emails = null;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String newTag = values.getAsString("newTag");
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String newNumber = values.getAsString("newNumber");
27634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        String[] newEmails = null;
27734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        // TODO(): Update for email.
27804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        boolean success = updateIccRecordInEf(efType, tag, number,
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                newTag, newNumber, pin2);
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!success) {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 1;
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
288c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown    private MatrixCursor loadFromEf(int efType) {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) log("loadFromEf: efType=" + efType);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
291c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown        List<AdnRecord> adnRecords = null;
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
29304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ServiceManager.getService("simphonebook"));
29504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            if (iccIpb != null) {
29604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                adnRecords = iccIpb.getAdnRecordsInEf(efType);
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException ex) {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // ignore it
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (SecurityException ex) {
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) log(ex.toString());
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
303c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (adnRecords != null) {
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Load the results
306c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown            final int N = adnRecords.size();
307c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown            final MatrixCursor cursor = new MatrixCursor(ADDRESS_BOOK_COLUMN_NAMES, N);
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) log("adnRecords.size=" + N);
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < N ; i++) {
310c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown                loadRecord(adnRecords.get(i), cursor, i);
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
312c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown            return cursor;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // No results to load
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Cannot load ADN records");
316c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown            return new MatrixCursor(ADDRESS_BOOK_COLUMN_NAMES);
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean
32134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    addIccRecordToEf(int efType, String name, String number, String[] emails, String pin2) {
32204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (DBG) log("addIccRecordToEf: efType=" + efType + ", name=" + name +
32334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                ", number=" + number + ", emails=" + emails);
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean success = false;
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: do we need to call getAdnRecordsInEf() before calling
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // updateAdnRecordsInEfBySearch()? In any case, we will leave
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the UI level logic to fill that prereq if necessary. But
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // hopefully, we can remove this requirement.
33104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
33304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ServiceManager.getService("simphonebook"));
33504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            if (iccIpb != null) {
33604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                success = iccIpb.updateAdnRecordsInEfBySearch(efType, "", "",
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        name, number, pin2);
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException ex) {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // ignore it
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (SecurityException ex) {
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) log(ex.toString());
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (DBG) log("addIccRecordToEf: " + success);
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return success;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean
34904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    updateIccRecordInEf(int efType, String oldName, String oldNumber,
35034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            String newName, String newNumber, String pin2) {
35104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (DBG) log("updateIccRecordInEf: efType=" + efType +
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ", oldname=" + oldName + ", oldnumber=" + oldNumber +
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ", newname=" + newName + ", newnumber=" + newNumber);
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean success = false;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
35704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ServiceManager.getService("simphonebook"));
35904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            if (iccIpb != null) {
36004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                success = iccIpb.updateAdnRecordsInEfBySearch(efType,
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        oldName, oldNumber, newName, newNumber, pin2);
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException ex) {
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // ignore it
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (SecurityException ex) {
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) log(ex.toString());
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (DBG) log("updateIccRecordInEf: " + success);
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return success;
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private boolean deleteIccRecordFromEf(int efType, String name, String number, String[] emails,
37434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            String pin2) {
37504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (DBG) log("deleteIccRecordFromEf: efType=" + efType +
37634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                ", name=" + name + ", number=" + number + ", emails=" + emails + ", pin2=" + pin2);
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean success = false;
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
38104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ServiceManager.getService("simphonebook"));
38304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            if (iccIpb != null) {
38404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                success = iccIpb.updateAdnRecordsInEfBySearch(efType,
38504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                        name, number, "", "", pin2);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException ex) {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // ignore it
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (SecurityException ex) {
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) log(ex.toString());
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (DBG) log("deleteIccRecordFromEf: " + success);
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return success;
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
397c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown     * Loads an AdnRecord into a MatrixCursor. Must be called with mLock held.
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param record the ADN record to load from
400c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown     * @param cursor the cursor to receive the results
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
402c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown    private void loadRecord(AdnRecord record, MatrixCursor cursor, int id) {
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!record.isEmpty()) {
404c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown            Object[] contact = new Object[4];
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String alphaTag = record.getAlphaTag();
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String number = record.getNumber();
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (DBG) log("loadRecord: " + alphaTag + ", " + number + ",");
409c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown            contact[0] = alphaTag;
410c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown            contact[1] = number;
41134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
412c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown            String[] emails = record.getEmails();
41334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (emails != null) {
414c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown                StringBuilder emailString = new StringBuilder();
41534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                for (String email: emails) {
41634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    if (DBG) log("Adding email:" + email);
41734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    emailString.append(email);
41834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    emailString.append(",");
41934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                }
420c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown                contact[2] = emailString.toString();
42134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
422c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown            contact[3] = id;
423c755ae3b58096334aa25522b5212b1bb19dac1cfJeff Brown            cursor.addRow(contact);
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void log(String msg) {
42804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        Log.d(TAG, "[IccProvider] " + msg);
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
432