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;
222269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport android.database.AbstractCursor;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
242269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport android.database.CursorWindow;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemProperties;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport com.android.internal.telephony.IccConstants;
3604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport com.android.internal.telephony.AdnRecord;
3704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport com.android.internal.telephony.IIccPhoneBook;
3804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
392269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn/**
402269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn * XXX old code -- should be replaced with MatrixCursor.
412269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn * @deprecated This is has been replaced by MatrixCursor.
422269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn*/
432269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornclass ArrayListCursor extends AbstractCursor {
442269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    private String[] mColumnNames;
452269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    private ArrayList<Object>[] mRows;
462269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
472269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    @SuppressWarnings({"unchecked"})
482269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    public ArrayListCursor(String[] columnNames, ArrayList<ArrayList> rows) {
492269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        int colCount = columnNames.length;
502269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        boolean foundID = false;
512269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        // Add an _id column if not in columnNames
522269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        for (int i = 0; i < colCount; ++i) {
532269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            if (columnNames[i].compareToIgnoreCase("_id") == 0) {
542269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                mColumnNames = columnNames;
552269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                foundID = true;
562269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                break;
572269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            }
582269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        }
592269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
602269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        if (!foundID) {
612269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            mColumnNames = new String[colCount + 1];
622269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            System.arraycopy(columnNames, 0, mColumnNames, 0, columnNames.length);
632269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            mColumnNames[colCount] = "_id";
642269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        }
652269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
662269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        int rowCount = rows.size();
672269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        mRows = new ArrayList[rowCount];
682269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
692269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        for (int i = 0; i < rowCount; ++i) {
702269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            mRows[i] = rows.get(i);
712269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            if (!foundID) {
722269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                mRows[i].add(i);
732269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            }
742269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        }
752269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    }
762269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
772269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    @Override
782269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    public void fillWindow(int position, CursorWindow window) {
792269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        if (position < 0 || position > getCount()) {
802269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            return;
812269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        }
822269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
832269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        window.acquireReference();
842269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        try {
852269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            int oldpos = mPos;
862269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            mPos = position - 1;
872269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            window.clear();
882269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            window.setStartPosition(position);
892269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            int columnNum = getColumnCount();
902269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            window.setNumColumns(columnNum);
912269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            while (moveToNext() && window.allocRow()) {
922269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                for (int i = 0; i < columnNum; i++) {
932269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                    final Object data = mRows[mPos].get(i);
942269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                    if (data != null) {
952269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                        if (data instanceof byte[]) {
962269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                            byte[] field = (byte[]) data;
972269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                            if (!window.putBlob(field, mPos, i)) {
982269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                                window.freeLastRow();
992269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                                break;
1002269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                            }
1012269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                        } else {
1022269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                            String field = data.toString();
1032269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                            if (!window.putString(field, mPos, i)) {
1042269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                                window.freeLastRow();
1052269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                                break;
1062269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                            }
1072269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                        }
1082269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                    } else {
1092269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                        if (!window.putNull(mPos, i)) {
1102269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                            window.freeLastRow();
1112269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                            break;
1122269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                        }
1132269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                    }
1142269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn                }
1152269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            }
1162269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
1172269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            mPos = oldpos;
1182269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        } catch (IllegalStateException e){
1192269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            // simply ignore it
1202269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        } finally {
1212269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn            window.releaseReference();
1222269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        }
1232269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    }
1242269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
1252269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    @Override
1262269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    public int getCount() {
1272269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        return mRows.length;
1282269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    }
1292269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
1302269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    @Override
1312269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    public String[] getColumnNames() {
1322269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        return mColumnNames;
1332269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    }
1342269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
1352269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    @Override
1362269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    public byte[] getBlob(int columnIndex) {
1372269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        return (byte[]) mRows[mPos].get(columnIndex);
1382269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    }
1392269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
1402269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    @Override
1412269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    public String getString(int columnIndex) {
1422269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        Object cell = mRows[mPos].get(columnIndex);
1432269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        return (cell == null) ? null : cell.toString();
1442269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    }
1452269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
1462269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    @Override
1472269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    public short getShort(int columnIndex) {
1482269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        Number num = (Number) mRows[mPos].get(columnIndex);
1492269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        return num.shortValue();
1502269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    }
1512269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
1522269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    @Override
1532269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    public int getInt(int columnIndex) {
1542269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        Number num = (Number) mRows[mPos].get(columnIndex);
1552269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        return num.intValue();
1562269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    }
1572269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
1582269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    @Override
1592269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    public long getLong(int columnIndex) {
1602269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        Number num = (Number) mRows[mPos].get(columnIndex);
1612269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        return num.longValue();
1622269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    }
1632269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
1642269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    @Override
1652269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    public float getFloat(int columnIndex) {
1662269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        Number num = (Number) mRows[mPos].get(columnIndex);
1672269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        return num.floatValue();
1682269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    }
1692269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
1702269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    @Override
1712269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    public double getDouble(int columnIndex) {
1722269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        Number num = (Number) mRows[mPos].get(columnIndex);
1732269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        return num.doubleValue();
1742269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    }
1752269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
1762269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    @Override
1772269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    public boolean isNull(int columnIndex) {
1782269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn        return mRows[mPos].get(columnIndex) == null;
1792269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn    }
1802269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn}
1812269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn
18204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
18604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savillepublic class IccProvider extends ContentProvider {
18704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    private static final String TAG = "IccProvider";
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DBG = false;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String[] ADDRESS_BOOK_COLUMN_NAMES = new String[] {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "name",
19334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        "number",
19434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        "emails"
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int ADN = 1;
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int FDN = 2;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int SDN = 3;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String STR_TAG = "tag";
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String STR_NUMBER = "number";
20334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private static final String STR_EMAILS = "emails";
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String STR_PIN2 = "pin2";
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final UriMatcher URL_MATCHER =
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            new UriMatcher(UriMatcher.NO_MATCH);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static {
21004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        URL_MATCHER.addURI("icc", "adn", ADN);
21104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        URL_MATCHER.addURI("icc", "fdn", FDN);
21204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        URL_MATCHER.addURI("icc", "sdn", SDN);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mSimulator;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCreate() {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String device = SystemProperties.get("ro.product.device");
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!TextUtils.isEmpty(device)) {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSimulator = false;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // simulator
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSimulator = true;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Cursor query(Uri url, String[] projection, String selection,
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] selectionArgs, String sort) {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ArrayList<ArrayList> results;
23504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mSimulator) {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (URL_MATCHER.match(url)) {
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case ADN:
23904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    results = loadFromEf(IccConstants.EF_ADN);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
24104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case FDN:
24304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    results = loadFromEf(IccConstants.EF_FDN);
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
24504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case SDN:
24704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                    results = loadFromEf(IccConstants.EF_SDN);
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
24904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default:
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalArgumentException("Unknown URL " + url);
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Fake up some data for the simulator
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            results = new ArrayList<ArrayList>(4);
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ArrayList<String> contact;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contact = new ArrayList<String>();
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contact.add("Ron Stevens/H");
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contact.add("512-555-5038");
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            results.add(contact);
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contact = new ArrayList<String>();
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contact.add("Ron Stevens/M");
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contact.add("512-555-8305");
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            results.add(contact);
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contact = new ArrayList<String>();
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contact.add("Melissa Owens");
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contact.add("512-555-8305");
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            results.add(contact);
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contact = new ArrayList<String>();
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contact.add("Directory Assistence");
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contact.add("411");
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            results.add(contact);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new ArrayListCursor(ADDRESS_BOOK_COLUMN_NAMES, results);
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getType(Uri url) {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (URL_MATCHER.match(url)) {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ADN:
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case FDN:
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case SDN:
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "vnd.android.cursor.dir/sim-contact";
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalArgumentException("Unknown URL " + url);
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uri insert(Uri url, ContentValues initialValues) {
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uri resultUri;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int efType;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pin2 = null;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) log("insert");
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int match = URL_MATCHER.match(url);
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (match) {
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ADN:
30604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                efType = IccConstants.EF_ADN;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case FDN:
31004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                efType = IccConstants.EF_FDN;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pin2 = initialValues.getAsString("pin2");
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new UnsupportedOperationException(
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Cannot insert into URL: " + url);
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String tag = initialValues.getAsString("tag");
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String number = initialValues.getAsString("number");
32134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        // TODO(): Read email instead of sending null.
32234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        boolean success = addIccRecordToEf(efType, tag, number, null, pin2);
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!success) {
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32812f413d29e1fb32f00213b1eaae6d45c856dc0d6jsh        StringBuilder buf = new StringBuilder("content://icc/");
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (match) {
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ADN:
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                buf.append("adn/");
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case FDN:
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                buf.append("fdn/");
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: we need to find out the rowId for the newly added record
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        buf.append(0);
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        resultUri = Uri.parse(buf.toString());
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // notify interested parties that an insertion happened
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getContext().getContentResolver().notifyInsert(
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resultUri, rowID, null);
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        */
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return resultUri;
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String normalizeValue(String inVal) {
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int len = inVal.length();
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String retVal = inVal;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (inVal.charAt(0) == '\'' && inVal.charAt(len-1) == '\'') {
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            retVal = inVal.substring(1, len-1);
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return retVal;
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int delete(Uri url, String where, String[] whereArgs) {
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int efType;
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) log("delete");
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int match = URL_MATCHER.match(url);
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (match) {
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ADN:
37304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                efType = IccConstants.EF_ADN;
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case FDN:
37704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                efType = IccConstants.EF_FDN;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new UnsupportedOperationException(
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Cannot insert into URL: " + url);
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // parse where clause
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String tag = null;
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String number = null;
38834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        String[] emails = null;
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pin2 = null;
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] tokens = where.split("AND");
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int n = tokens.length;
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (--n >= 0) {
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String param = tokens[n];
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) log("parsing '" + param + "'");
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] pair = param.split("=");
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (pair.length != 2) {
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(TAG, "resolve: bad whereClause parameter: " + param);
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                continue;
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String key = pair[0].trim();
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String val = pair[1].trim();
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (STR_TAG.equals(key)) {
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tag = normalizeValue(val);
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (STR_NUMBER.equals(key)) {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                number = normalizeValue(val);
41234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            } else if (STR_EMAILS.equals(key)) {
41334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                //TODO(): Email is null.
41434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                emails = null;
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (STR_PIN2.equals(key)) {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pin2 = normalizeValue(val);
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
420ac6461c69e213d66aac61e0c19602a2ac331e84dMikael Danielsson        if (TextUtils.isEmpty(number)) {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4249f36f51844a6d8936f27af925ce8c22729a63f27Jake Hamby        if (efType == IccConstants.EF_FDN && TextUtils.isEmpty(pin2)) {
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        boolean success = deleteIccRecordFromEf(efType, tag, number, emails, pin2);
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!success) {
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 1;
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int efType;
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pin2 = null;
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) log("update");
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int match = URL_MATCHER.match(url);
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (match) {
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ADN:
44604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                efType = IccConstants.EF_ADN;
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case FDN:
45004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                efType = IccConstants.EF_FDN;
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pin2 = values.getAsString("pin2");
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new UnsupportedOperationException(
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Cannot insert into URL: " + url);
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String tag = values.getAsString("tag");
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String number = values.getAsString("number");
46134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        String[] emails = null;
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String newTag = values.getAsString("newTag");
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String newNumber = values.getAsString("newNumber");
46434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        String[] newEmails = null;
46534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh        // TODO(): Update for email.
46604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        boolean success = updateIccRecordInEf(efType, tag, number,
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                newTag, newNumber, pin2);
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!success) {
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 1;
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ArrayList<ArrayList> loadFromEf(int efType) {
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ArrayList<ArrayList> results = new ArrayList<ArrayList>();
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        List<AdnRecord> adnRecords = null;
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) log("loadFromEf: efType=" + efType);
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
48304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ServiceManager.getService("simphonebook"));
48504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            if (iccIpb != null) {
48604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                adnRecords = iccIpb.getAdnRecordsInEf(efType);
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException ex) {
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // ignore it
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (SecurityException ex) {
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) log(ex.toString());
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (adnRecords != null) {
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Load the results
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = adnRecords.size();
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) log("adnRecords.size=" + N);
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0; i < N ; i++) {
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                loadRecord(adnRecords.get(i), results);
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // No results to load
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(TAG, "Cannot load ADN records");
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            results.clear();
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) log("loadFromEf: return results");
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return results;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean
51134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    addIccRecordToEf(int efType, String name, String number, String[] emails, String pin2) {
51204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (DBG) log("addIccRecordToEf: efType=" + efType + ", name=" + name +
51334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                ", number=" + number + ", emails=" + emails);
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean success = false;
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: do we need to call getAdnRecordsInEf() before calling
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // updateAdnRecordsInEfBySearch()? In any case, we will leave
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the UI level logic to fill that prereq if necessary. But
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // hopefully, we can remove this requirement.
52104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
52304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ServiceManager.getService("simphonebook"));
52504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            if (iccIpb != null) {
52604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                success = iccIpb.updateAdnRecordsInEfBySearch(efType, "", "",
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        name, number, pin2);
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException ex) {
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // ignore it
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (SecurityException ex) {
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) log(ex.toString());
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (DBG) log("addIccRecordToEf: " + success);
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return success;
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean
53904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    updateIccRecordInEf(int efType, String oldName, String oldNumber,
54034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            String newName, String newNumber, String pin2) {
54104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (DBG) log("updateIccRecordInEf: efType=" + efType +
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ", oldname=" + oldName + ", oldnumber=" + oldNumber +
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ", newname=" + newName + ", newnumber=" + newNumber);
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean success = false;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
54704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ServiceManager.getService("simphonebook"));
54904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            if (iccIpb != null) {
55004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                success = iccIpb.updateAdnRecordsInEfBySearch(efType,
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        oldName, oldNumber, newName, newNumber, pin2);
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException ex) {
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // ignore it
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (SecurityException ex) {
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) log(ex.toString());
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (DBG) log("updateIccRecordInEf: " + success);
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return success;
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh    private boolean deleteIccRecordFromEf(int efType, String name, String number, String[] emails,
56434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            String pin2) {
56504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (DBG) log("deleteIccRecordFromEf: efType=" + efType +
56634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                ", name=" + name + ", number=" + number + ", emails=" + emails + ", pin2=" + pin2);
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean success = false;
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
57104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ServiceManager.getService("simphonebook"));
57304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            if (iccIpb != null) {
57404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                success = iccIpb.updateAdnRecordsInEfBySearch(efType,
57504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                        name, number, "", "", pin2);
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException ex) {
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // ignore it
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (SecurityException ex) {
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DBG) log(ex.toString());
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
58204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (DBG) log("deleteIccRecordFromEf: " + success);
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return success;
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Loads an AdnRecord into an ArrayList. Must be called with mLock held.
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param record the ADN record to load from
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param results the array list to put the results in
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadRecord(AdnRecord record,
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ArrayList<ArrayList> results) {
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!record.isEmpty()) {
59534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            ArrayList<String> contact = new ArrayList<String>();
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String alphaTag = record.getAlphaTag();
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String number = record.getNumber();
59834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            String[] emails = record.getEmails();
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (DBG) log("loadRecord: " + alphaTag + ", " + number + ",");
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contact.add(alphaTag);
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            contact.add(number);
60334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            StringBuilder emailString = new StringBuilder();
60434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh
60534efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            if (emails != null) {
60634efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                for (String email: emails) {
60734efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    if (DBG) log("Adding email:" + email);
60834efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    emailString.append(email);
60934efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                    emailString.append(",");
61034efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                }
61134efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                contact.add(emailString.toString());
61234efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            } else {
61334efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh                contact.add(null);
61434efc39f256d5833687c7bd7d83258d6394c9307Jaikumar Ganesh            }
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            results.add(contact);
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void log(String msg) {
62004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        Log.d(TAG, "[IccProvider] " + msg);
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
624