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