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