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