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