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; 23c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wangimport android.content.ContentProviderResult; 247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.ContentResolver; 257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.ContentValues; 26c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wangimport android.content.Context; 277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.DialogInterface; 287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.DialogInterface.OnCancelListener; 297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.DialogInterface.OnClickListener; 307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Intent; 317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.OperationApplicationException; 327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.database.Cursor; 337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.Uri; 347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Bundle; 357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.RemoteException; 367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.provider.ContactsContract; 377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.provider.ContactsContract.CommonDataKinds.Email; 387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.provider.ContactsContract.CommonDataKinds.Phone; 407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.provider.ContactsContract.Data; 427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.provider.ContactsContract.RawContacts; 434d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.PhoneAccount; 44c35836d0c9966727d486628752f74373c3cf1232Brian Attwellimport android.telephony.SubscriptionManager; 457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.text.TextUtils; 467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log; 477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.ContextMenu; 487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.KeyEvent; 497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.Menu; 507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.MenuItem; 517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.View; 527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.AdapterView; 537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.CursorAdapter; 547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.ListView; 557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.SimpleCursorAdapter; 567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.TextView; 57c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wangimport android.widget.Toast; 587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.ArrayList; 607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/** 627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * SIM Address Book UI for the Phone app. 637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class SimContacts extends ADNList { 657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String LOG_TAG = "SimContacts"; 667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon static final ContentValues sEmptyContentValues = new ContentValues(); 687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int MENU_IMPORT_ONE = 1; 707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int MENU_IMPORT_ALL = 2; 717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private ProgressDialog mProgressDialog; 727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private Account mAccount; 747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static class NamePhoneTypePair { 767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String name; 777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final int phoneType; 787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public NamePhoneTypePair(String nameWithPhoneType) { 797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Look for /W /H /M or /O at the end of the name signifying the type 807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int nameLen = nameWithPhoneType.length(); 817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (nameLen - 2 >= 0 && nameWithPhoneType.charAt(nameLen - 2) == '/') { 827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon char c = Character.toUpperCase(nameWithPhoneType.charAt(nameLen - 1)); 837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (c == 'W') { 847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon phoneType = Phone.TYPE_WORK; 857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else if (c == 'M' || c == 'O') { 867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon phoneType = Phone.TYPE_MOBILE; 877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else if (c == 'H') { 887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon phoneType = Phone.TYPE_HOME; 897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon phoneType = Phone.TYPE_OTHER; 917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon name = nameWithPhoneType.substring(0, nameLen - 2); 937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon phoneType = Phone.TYPE_OTHER; 957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon name = nameWithPhoneType; 967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private class ImportAllSimContactsThread extends Thread 1017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon implements OnCancelListener, OnClickListener { 1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon boolean mCanceled = false; 1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public ImportAllSimContactsThread() { 1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super("ImportAllSimContactsThread"); 1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void run() { 1117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final ContentValues emptyContentValues = new ContentValues(); 1127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final ContentResolver resolver = getContentResolver(); 1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mCursor.moveToPosition(-1); 1157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon while (!mCanceled && mCursor.moveToNext()) { 1167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon actuallyImportOneSimContact(mCursor, resolver, mAccount); 1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.incrementProgressBy(1); 1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.dismiss(); 1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon finish(); 1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onCancel(DialogInterface dialog) { 1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mCanceled = true; 1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onClick(DialogInterface dialog, int which) { 1297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (which == DialogInterface.BUTTON_NEGATIVE) { 1307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mCanceled = true; 1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.dismiss(); 1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(LOG_TAG, "Unknown button event has come: " + dialog.toString()); 1347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 138c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wang private static boolean actuallyImportOneSimContact( 1397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final Cursor cursor, final ContentResolver resolver, Account account) { 1407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final NamePhoneTypePair namePhoneTypePair = 1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new NamePhoneTypePair(cursor.getString(NAME_COLUMN)); 1427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String name = namePhoneTypePair.name; 1437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final int phoneType = namePhoneTypePair.phoneType; 1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String phoneNumber = cursor.getString(NUMBER_COLUMN); 1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String emailAddresses = cursor.getString(EMAILS_COLUMN); 1467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String[] emailAddressArray; 1477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!TextUtils.isEmpty(emailAddresses)) { 1487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon emailAddressArray = emailAddresses.split(","); 1497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon emailAddressArray = null; 1517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final ArrayList<ContentProviderOperation> operationList = 1547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new ArrayList<ContentProviderOperation>(); 1557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ContentProviderOperation.Builder builder = 1567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ContentProviderOperation.newInsert(RawContacts.CONTENT_URI); 1577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String myGroupsId = null; 1587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (account != null) { 1597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(RawContacts.ACCOUNT_NAME, account.name); 1607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(RawContacts.ACCOUNT_TYPE, account.type); 1617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValues(sEmptyContentValues); 1637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon operationList.add(builder.build()); 1657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder = ContentProviderOperation.newInsert(Data.CONTENT_URI); 1677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValueBackReference(StructuredName.RAW_CONTACT_ID, 0); 1687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 1697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(StructuredName.DISPLAY_NAME, name); 1707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon operationList.add(builder.build()); 1717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder = ContentProviderOperation.newInsert(Data.CONTENT_URI); 1737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValueBackReference(Phone.RAW_CONTACT_ID, 0); 1747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 1757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Phone.TYPE, phoneType); 1767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Phone.NUMBER, phoneNumber); 1777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Data.IS_PRIMARY, 1); 1787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon operationList.add(builder.build()); 1797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (emailAddresses != null) { 1817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon for (String emailAddress : emailAddressArray) { 1827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder = ContentProviderOperation.newInsert(Data.CONTENT_URI); 1837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValueBackReference(Email.RAW_CONTACT_ID, 0); 1847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); 1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Email.TYPE, Email.TYPE_MOBILE); 1867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Email.DATA, emailAddress); 1877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon operationList.add(builder.build()); 1887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (myGroupsId != null) { 1927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder = ContentProviderOperation.newInsert(Data.CONTENT_URI); 1937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValueBackReference(GroupMembership.RAW_CONTACT_ID, 0); 1947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 1957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.withValue(GroupMembership.GROUP_SOURCE_ID, myGroupsId); 1967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon operationList.add(builder.build()); 1977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 200c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wang final ContentProviderResult[] results = resolver.applyBatch(ContactsContract.AUTHORITY, 201c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wang operationList); 202c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wang return results.length > 0; // Batch operations either all succeed or all fail. 2037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (RemoteException e) { 2047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(LOG_TAG, String.format("%s: %s", e.toString(), e.getMessage())); 2057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (OperationApplicationException e) { 2067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(LOG_TAG, String.format("%s: %s", e.toString(), e.getMessage())); 2077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 208c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wang return false; 2097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void importOneSimContact(int position) { 2127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final ContentResolver resolver = getContentResolver(); 213c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wang final Context context = getApplicationContext(); 2147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mCursor.moveToPosition(position)) { 215c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wang if (actuallyImportOneSimContact(mCursor, resolver, mAccount)){ 216c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wang Toast.makeText(context, R.string.singleContactImportedMsg, Toast.LENGTH_SHORT) 217c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wang .show(); 218c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wang } else { 219c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wang Toast.makeText(context, R.string.failedToImportSingleContactMsg, Toast.LENGTH_SHORT) 220c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wang .show(); 221c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wang } 2227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 2237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(LOG_TAG, "Failed to move the cursor to the position \"" + position + "\""); 224c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wang Toast.makeText(context, R.string.failedToImportSingleContactMsg, Toast.LENGTH_SHORT) 225c32e0afd95ee0602152bd51a23cf6cf867a788caWenyi Wang .show(); 2267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /* Followings are overridden methods */ 2307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onCreate(Bundle icicle) { 2337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onCreate(icicle); 2347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent intent = getIntent(); 2367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (intent != null) { 2377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String accountName = intent.getStringExtra("account_name"); 2387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String accountType = intent.getStringExtra("account_type"); 2397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!TextUtils.isEmpty(accountName) && !TextUtils.isEmpty(accountType)) { 2407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mAccount = new Account(accountName, accountType); 2417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon registerForContextMenu(getListView()); 2457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ActionBar actionBar = getActionBar(); 2477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (actionBar != null) { 2487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // android.R.id.home will be triggered in onOptionsItemSelected() 2497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon actionBar.setDisplayHomeAsUpEnabled(true); 2507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected CursorAdapter newAdapter() { 2557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return new SimpleCursorAdapter(this, R.layout.sim_import_list_entry, mCursor, 2567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new String[] { "name" }, new int[] { android.R.id.text1 }); 2577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected Uri resolveIntent() { 261c35836d0c9966727d486628752f74373c3cf1232Brian Attwell final Intent intent = getIntent(); 262c46700bf653776ee3c59f37e8fde04212418e297Jay Shrauner int subId = -1; 263c35836d0c9966727d486628752f74373c3cf1232Brian Attwell if (intent.hasExtra("subscription_id")) { 264c46700bf653776ee3c59f37e8fde04212418e297Jay Shrauner subId = intent.getIntExtra("subscription_id", -1); 265c46700bf653776ee3c59f37e8fde04212418e297Jay Shrauner } 266c46700bf653776ee3c59f37e8fde04212418e297Jay Shrauner if (subId != -1) { 267c35836d0c9966727d486628752f74373c3cf1232Brian Attwell intent.setData(Uri.parse("content://icc/adn/subId/" + subId)); 268c35836d0c9966727d486628752f74373c3cf1232Brian Attwell } else { 269c35836d0c9966727d486628752f74373c3cf1232Brian Attwell intent.setData(Uri.parse("content://icc/adn")); 270c35836d0c9966727d486628752f74373c3cf1232Brian Attwell } 2717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (Intent.ACTION_PICK.equals(intent.getAction())) { 2727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // "index" is 1-based 2737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mInitialSelection = intent.getIntExtra("index", 0) - 1; 2747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return intent.getData(); 2767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onCreateOptionsMenu(Menu menu) { 2807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onCreateOptionsMenu(menu); 2817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon menu.add(0, MENU_IMPORT_ALL, 0, R.string.importAllSimEntries); 2827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 2837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onPrepareOptionsMenu(Menu menu) { 2877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon MenuItem item = menu.findItem(MENU_IMPORT_ALL); 2887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (item != null) { 2897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon item.setVisible(mCursor != null && mCursor.getCount() > 0); 2907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return super.onPrepareOptionsMenu(menu); 2927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onOptionsItemSelected(MenuItem item) { 2967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (item.getItemId()) { 2977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case android.R.id.home: 2983a124e6e537077ea932f2072a08de2e8e72af3bdJay Shrauner onBackPressed(); 2997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 3007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case MENU_IMPORT_ALL: 3017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CharSequence title = getString(R.string.importAllSimEntries); 3027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CharSequence message = getString(R.string.importingSimContacts); 3037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ImportAllSimContactsThread thread = new ImportAllSimContactsThread(); 3057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // TODO: need to show some error dialog. 3077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mCursor == null) { 3087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(LOG_TAG, "cursor is null. Ignore silently."); 3097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog = new ProgressDialog(this); 3127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.setTitle(title); 3137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.setMessage(message); 3147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 3157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, 3167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon getString(R.string.cancel), thread); 3177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.setProgress(0); 3187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.setMax(mCursor.getCount()); 3197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProgressDialog.show(); 3207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon thread.start(); 3227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 3247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return super.onOptionsItemSelected(item); 3267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onContextItemSelected(MenuItem item) { 3307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (item.getItemId()) { 3317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case MENU_IMPORT_ONE: 3327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ContextMenu.ContextMenuInfo menuInfo = item.getMenuInfo(); 3337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (menuInfo instanceof AdapterView.AdapterContextMenuInfo) { 3347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int position = ((AdapterView.AdapterContextMenuInfo)menuInfo).position; 3357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon importOneSimContact(position); 3367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 3377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return super.onContextItemSelected(item); 3407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onCreateContextMenu(ContextMenu menu, View v, 3447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ContextMenu.ContextMenuInfo menuInfo) { 3457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (menuInfo instanceof AdapterView.AdapterContextMenuInfo) { 3467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon AdapterView.AdapterContextMenuInfo itemInfo = 3477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon (AdapterView.AdapterContextMenuInfo) menuInfo; 3487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon TextView textView = (TextView) itemInfo.targetView.findViewById(android.R.id.text1); 3497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (textView != null) { 3507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon menu.setHeaderTitle(textView.getText()); 3517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon menu.add(0, MENU_IMPORT_ONE, 0, R.string.importSimEntry); 3537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onListItemClick(ListView l, View v, int position, long id) { 3587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon importOneSimContact(position); 3597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onKeyDown(int keyCode, KeyEvent event) { 3637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (keyCode) { 3647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case KeyEvent.KEYCODE_CALL: { 3657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mCursor != null && mCursor.moveToPosition(getSelectedItemPosition())) { 3667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String phoneNumber = mCursor.getString(NUMBER_COLUMN); 3677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (phoneNumber == null || !TextUtils.isGraphic(phoneNumber)) { 3687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // There is no number entered. 3697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //TODO play error sound or something... 3707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 3717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED, 373137458b4bf3516941483e59c123c22cbee27ed43Jay Shrauner Uri.fromParts(PhoneAccount.SCHEME_TEL, phoneNumber, null)); 3747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 3757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 3767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon startActivity(intent); 3777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon finish(); 3787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 3797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return super.onKeyDown(keyCode, event); 3837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon} 385