17d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/* 27d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Copyright (C) 2007 The Android Open Source Project 37d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 47d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Licensed under the Apache License, Version 2.0 (the "License"); 57d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * you may not use this file except in compliance with the License. 67d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * You may obtain a copy of the License at 77d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 87d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * http://www.apache.org/licenses/LICENSE-2.0 97d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Unless required by applicable law or agreed to in writing, software 117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * distributed under the License is distributed on an "AS IS" BASIS, 127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * See the License for the specific language governing permissions and 147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * limitations under the License. 157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpackage com.android.phone; 187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.accounts.Account; 207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.ActionBar; 217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.ProgressDialog; 227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.ContentProviderOperation; 237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.ContentResolver; 247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.ContentValues; 257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.DialogInterface; 267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.DialogInterface.OnCancelListener; 277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.DialogInterface.OnClickListener; 287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Intent; 297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.OperationApplicationException; 307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.database.Cursor; 317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.Uri; 327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Bundle; 337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.RemoteException; 347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.provider.ContactsContract; 357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.provider.ContactsContract.CommonDataKinds.Email; 367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.provider.ContactsContract.CommonDataKinds.Phone; 387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.provider.ContactsContract.Data; 407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.provider.ContactsContract.RawContacts; 414d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.PhoneAccount; 427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.text.TextUtils; 437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log; 447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.ContextMenu; 457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.KeyEvent; 467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.Menu; 477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.MenuItem; 487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.View; 497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.AdapterView; 507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.CursorAdapter; 517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.ListView; 527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.SimpleCursorAdapter; 537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.TextView; 547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.ArrayList; 567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/** 587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * SIM Address Book UI for the Phone app. 597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class SimContacts extends ADNList { 617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String LOG_TAG = "SimContacts"; 627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon static final ContentValues sEmptyContentValues = new ContentValues(); 647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int MENU_IMPORT_ONE = 1; 667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int MENU_IMPORT_ALL = 2; 677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private ProgressDialog mProgressDialog; 687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private Account mAccount; 707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static class NamePhoneTypePair { 727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String name; 737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final int phoneType; 747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public NamePhoneTypePair(String nameWithPhoneType) { 757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Look for /W /H /M or /O at the end of the name signifying the type 767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int nameLen = nameWithPhoneType.length(); 777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (nameLen - 2 >= 0 && nameWithPhoneType.charAt(nameLen - 2) == '/') { 787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon char c = Character.toUpperCase(nameWithPhoneType.charAt(nameLen - 1)); 797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (c == 'W') { 807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon phoneType = Phone.TYPE_WORK; 817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else if (c == 'M' || c == 'O') { 827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon phoneType = Phone.TYPE_MOBILE; 837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else if (c == 'H') { 847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon phoneType = Phone.TYPE_HOME; 857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon phoneType = Phone.TYPE_OTHER; 877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon name = nameWithPhoneType.substring(0, nameLen - 2); 897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon phoneType = Phone.TYPE_OTHER; 917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon name = nameWithPhoneType; 927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private class ImportAllSimContactsThread extends Thread 977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon implements OnCancelListener, OnClickListener { 987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon boolean mCanceled = false; 1007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public ImportAllSimContactsThread() { 1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super("ImportAllSimContactsThread"); 1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void run() { 1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final ContentValues emptyContentValues = new ContentValues(); 1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final ContentResolver resolver = getContentResolver(); 1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mCursor.moveToPosition(-1); 1117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon while (!mCanceled && mCursor.moveToNext()) { 1127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon actuallyImportOneSimContact(mCursor, resolver, mAccount); 1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.incrementProgressBy(1); 1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.dismiss(); 1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon finish(); 1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onCancel(DialogInterface dialog) { 1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mCanceled = true; 1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onClick(DialogInterface dialog, int which) { 1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (which == DialogInterface.BUTTON_NEGATIVE) { 1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mCanceled = true; 1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.dismiss(); 1287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(LOG_TAG, "Unknown button event has come: " + dialog.toString()); 1307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static void actuallyImportOneSimContact( 1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final Cursor cursor, final ContentResolver resolver, Account account) { 1367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final NamePhoneTypePair namePhoneTypePair = 1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new NamePhoneTypePair(cursor.getString(NAME_COLUMN)); 1387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String name = namePhoneTypePair.name; 1397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final int phoneType = namePhoneTypePair.phoneType; 1407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String phoneNumber = cursor.getString(NUMBER_COLUMN); 1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String emailAddresses = cursor.getString(EMAILS_COLUMN); 1427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String[] emailAddressArray; 1437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!TextUtils.isEmpty(emailAddresses)) { 1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon emailAddressArray = emailAddresses.split(","); 1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon emailAddressArray = null; 1477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final ArrayList<ContentProviderOperation> operationList = 1507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new ArrayList<ContentProviderOperation>(); 1517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ContentProviderOperation.Builder builder = 1527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ContentProviderOperation.newInsert(RawContacts.CONTENT_URI); 1537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String myGroupsId = null; 1547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (account != null) { 1557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(RawContacts.ACCOUNT_NAME, account.name); 1567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(RawContacts.ACCOUNT_TYPE, account.type); 1577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValues(sEmptyContentValues); 1597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon operationList.add(builder.build()); 1617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder = ContentProviderOperation.newInsert(Data.CONTENT_URI); 1637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValueBackReference(StructuredName.RAW_CONTACT_ID, 0); 1647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 1657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(StructuredName.DISPLAY_NAME, name); 1667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon operationList.add(builder.build()); 1677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder = ContentProviderOperation.newInsert(Data.CONTENT_URI); 1697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValueBackReference(Phone.RAW_CONTACT_ID, 0); 1707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 1717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Phone.TYPE, phoneType); 1727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Phone.NUMBER, phoneNumber); 1737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Data.IS_PRIMARY, 1); 1747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon operationList.add(builder.build()); 1757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (emailAddresses != null) { 1777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon for (String emailAddress : emailAddressArray) { 1787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder = ContentProviderOperation.newInsert(Data.CONTENT_URI); 1797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValueBackReference(Email.RAW_CONTACT_ID, 0); 1807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 1817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Email.TYPE, Email.TYPE_MOBILE); 1827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Email.DATA, emailAddress); 1837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon operationList.add(builder.build()); 1847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (myGroupsId != null) { 1887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder = ContentProviderOperation.newInsert(Data.CONTENT_URI); 1897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValueBackReference(GroupMembership.RAW_CONTACT_ID, 0); 1907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 1917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(GroupMembership.GROUP_SOURCE_ID, myGroupsId); 1927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon operationList.add(builder.build()); 1937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 1967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon resolver.applyBatch(ContactsContract.AUTHORITY, operationList); 1977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (RemoteException e) { 1987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(LOG_TAG, String.format("%s: %s", e.toString(), e.getMessage())); 1997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (OperationApplicationException e) { 2007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(LOG_TAG, String.format("%s: %s", e.toString(), e.getMessage())); 2017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void importOneSimContact(int position) { 2057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final ContentResolver resolver = getContentResolver(); 2067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mCursor.moveToPosition(position)) { 2077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon actuallyImportOneSimContact(mCursor, resolver, mAccount); 2087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 2097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(LOG_TAG, "Failed to move the cursor to the position \"" + position + "\""); 2107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /* Followings are overridden methods */ 2147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onCreate(Bundle icicle) { 2177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onCreate(icicle); 2187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent intent = getIntent(); 2207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (intent != null) { 2217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String accountName = intent.getStringExtra("account_name"); 2227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String accountType = intent.getStringExtra("account_type"); 2237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!TextUtils.isEmpty(accountName) && !TextUtils.isEmpty(accountType)) { 2247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mAccount = new Account(accountName, accountType); 2257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon registerForContextMenu(getListView()); 2297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ActionBar actionBar = getActionBar(); 2317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (actionBar != null) { 2327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // android.R.id.home will be triggered in onOptionsItemSelected() 2337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon actionBar.setDisplayHomeAsUpEnabled(true); 2347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected CursorAdapter newAdapter() { 2397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return new SimpleCursorAdapter(this, R.layout.sim_import_list_entry, mCursor, 2407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new String[] { "name" }, new int[] { android.R.id.text1 }); 2417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected Uri resolveIntent() { 2457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent intent = getIntent(); 2467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intent.setData(Uri.parse("content://icc/adn")); 2477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (Intent.ACTION_PICK.equals(intent.getAction())) { 2487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // "index" is 1-based 2497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mInitialSelection = intent.getIntExtra("index", 0) - 1; 2507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return intent.getData(); 2527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onCreateOptionsMenu(Menu menu) { 2567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onCreateOptionsMenu(menu); 2577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon menu.add(0, MENU_IMPORT_ALL, 0, R.string.importAllSimEntries); 2587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 2597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onPrepareOptionsMenu(Menu menu) { 2637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon MenuItem item = menu.findItem(MENU_IMPORT_ALL); 2647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (item != null) { 2657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon item.setVisible(mCursor != null && mCursor.getCount() > 0); 2667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return super.onPrepareOptionsMenu(menu); 2687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onOptionsItemSelected(MenuItem item) { 2727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (item.getItemId()) { 2737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case android.R.id.home: 2743a124e6e537077ea932f2072a08de2e8e72af3bdJay Shrauner onBackPressed(); 2757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 2767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case MENU_IMPORT_ALL: 2777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CharSequence title = getString(R.string.importAllSimEntries); 2787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CharSequence message = getString(R.string.importingSimContacts); 2797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ImportAllSimContactsThread thread = new ImportAllSimContactsThread(); 2817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // TODO: need to show some error dialog. 2837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mCursor == null) { 2847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(LOG_TAG, "cursor is null. Ignore silently."); 2857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 2867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog = new ProgressDialog(this); 2887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.setTitle(title); 2897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.setMessage(message); 2907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 2917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, 2927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon getString(R.string.cancel), thread); 2937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.setProgress(0); 2947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.setMax(mCursor.getCount()); 2957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.show(); 2967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon thread.start(); 2987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 3007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return super.onOptionsItemSelected(item); 3027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onContextItemSelected(MenuItem item) { 3067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (item.getItemId()) { 3077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case MENU_IMPORT_ONE: 3087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ContextMenu.ContextMenuInfo menuInfo = item.getMenuInfo(); 3097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (menuInfo instanceof AdapterView.AdapterContextMenuInfo) { 3107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int position = ((AdapterView.AdapterContextMenuInfo)menuInfo).position; 3117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon importOneSimContact(position); 3127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 3137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return super.onContextItemSelected(item); 3167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onCreateContextMenu(ContextMenu menu, View v, 3207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ContextMenu.ContextMenuInfo menuInfo) { 3217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (menuInfo instanceof AdapterView.AdapterContextMenuInfo) { 3227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon AdapterView.AdapterContextMenuInfo itemInfo = 3237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon (AdapterView.AdapterContextMenuInfo) menuInfo; 3247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon TextView textView = (TextView) itemInfo.targetView.findViewById(android.R.id.text1); 3257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (textView != null) { 3267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon menu.setHeaderTitle(textView.getText()); 3277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon menu.add(0, MENU_IMPORT_ONE, 0, R.string.importSimEntry); 3297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onListItemClick(ListView l, View v, int position, long id) { 3347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon importOneSimContact(position); 3357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onKeyDown(int keyCode, KeyEvent event) { 3397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (keyCode) { 3407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case KeyEvent.KEYCODE_CALL: { 3417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mCursor != null && mCursor.moveToPosition(getSelectedItemPosition())) { 3427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String phoneNumber = mCursor.getString(NUMBER_COLUMN); 3437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (phoneNumber == null || !TextUtils.isGraphic(phoneNumber)) { 3447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // There is no number entered. 3457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //TODO play error sound or something... 3467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 3477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED, 349137458b4bf3516941483e59c123c22cbee27ed43Jay Shrauner Uri.fromParts(PhoneAccount.SCHEME_TEL, phoneNumber, null)); 3507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 3517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 3527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon startActivity(intent); 3537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon finish(); 3547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 3557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return super.onKeyDown(keyCode, event); 3597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon} 361