Create new SIM contacts import screen.
This is needed since SIM import is going be surfaced more prominently via an
assistant.
Test
Automated: Ran GoogleContactsTests
Manual: verify that contacts are imported when launched from settings
Bug 31781331
Change-Id: I55ea078056038d348d5b6f05f91f5159e1ee39d3
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index d4da588..1ed36b5 100755
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -16,7 +16,6 @@
package com.android.contacts;
-import static android.Manifest.permission.WRITE_CONTACTS;
import android.app.Activity;
import android.app.IntentService;
import android.content.ContentProviderOperation;
@@ -54,16 +53,17 @@
import com.android.contacts.activities.ContactEditorActivity;
import com.android.contacts.common.compat.CompatUtils;
import com.android.contacts.common.database.ContactUpdateUtils;
+import com.android.contacts.common.database.SimContactDao;
import com.android.contacts.common.model.AccountTypeManager;
import com.android.contacts.common.model.CPOWrapper;
import com.android.contacts.common.model.RawContactDelta;
import com.android.contacts.common.model.RawContactDeltaList;
import com.android.contacts.common.model.RawContactModifier;
+import com.android.contacts.common.model.SimContact;
import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.common.util.PermissionsUtil;
import com.android.contacts.compat.PinnedPositionsCompat;
import com.android.contacts.util.ContactPhotoUtils;
-
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
@@ -72,6 +72,8 @@
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
+import static android.Manifest.permission.WRITE_CONTACTS;
+
/**
* A service responsible for saving changes to the content provider.
*/
@@ -86,6 +88,7 @@
public static final String EXTRA_ACCOUNT_NAME = "accountName";
public static final String EXTRA_ACCOUNT_TYPE = "accountType";
public static final String EXTRA_DATA_SET = "dataSet";
+ public static final String EXTRA_ACCOUNT = "account";
public static final String EXTRA_CONTENT_VALUES = "contentValues";
public static final String EXTRA_CALLBACK_INTENT = "callbackIntent";
public static final String EXTRA_RESULT_RECEIVER = "resultReceiver";
@@ -136,12 +139,23 @@
public static final String EXTRA_UNDO_ACTION = "undoAction";
public static final String EXTRA_UNDO_DATA = "undoData";
- public static final String BROADCAST_ACTION_GROUP_DELETED = "groupDeleted";
+ public static final String ACTION_IMPORT_FROM_SIM = "importFromSim";
+ public static final String EXTRA_SIM_CONTACTS = "simContacts";
+
+ public static final String BROADCAST_GROUP_DELETED = "groupDeleted";
+ public static final String BROADCAST_SIM_IMPORT_COMPLETE = "simImportComplete";
+
+ public static final String EXTRA_RESULT_CODE = "resultCode";
+ public static final String EXTRA_RESULT_COUNT = "count";
+ public static final String EXTRA_OPERATION_REQUESTED_AT_TIME = "requestedTime";
public static final int CP2_ERROR = 0;
public static final int CONTACTS_LINKED = 1;
public static final int CONTACTS_SPLIT = 2;
public static final int BAD_ARGUMENTS = 3;
+ public static final int RESULT_UNKNOWN = 0;
+ public static final int RESULT_SUCCESS = 1;
+ public static final int RESULT_FAILURE = 2;
private static final HashSet<String> ALLOWED_DATA_COLUMNS = Sets.newHashSet(
Data.MIMETYPE,
@@ -176,6 +190,7 @@
private Handler mMainHandler;
private GroupsDao mGroupsDao;
+ private SimContactDao mSimContactDao;
public ContactSaveService() {
super(TAG);
@@ -187,6 +202,7 @@
public void onCreate() {
super.onCreate();
mGroupsDao = new GroupsDaoImpl(this);
+ mSimContactDao = new SimContactDao(this);
}
public static void registerListener(Listener listener) {
@@ -305,6 +321,8 @@
setRingtone(intent);
} else if (ACTION_UNDO.equals(action)) {
undo(intent);
+ } else if (ACTION_IMPORT_FROM_SIM.equals(action)) {
+ importFromSim(intent);
}
}
@@ -812,7 +830,7 @@
}
final Uri groupUri = ContentUris.withAppendedId(Groups.CONTENT_URI, groupId);
- final Intent callbackIntent = new Intent(BROADCAST_ACTION_GROUP_DELETED);
+ final Intent callbackIntent = new Intent(BROADCAST_GROUP_DELETED);
final Bundle undoData = mGroupsDao.captureDeletionUndoData(groupUri);
callbackIntent.putExtra(EXTRA_UNDO_ACTION, ACTION_DELETE_GROUP);
callbackIntent.putExtra(EXTRA_UNDO_DATA, undoData);
@@ -1628,6 +1646,36 @@
operations.add(builder.build());
}
+ public static Intent createImportFromSimIntent(Context context,
+ ArrayList<SimContact> contacts, AccountWithDataSet targetAccount) {
+ return new Intent(context, ContactSaveService.class)
+ .setAction(ACTION_IMPORT_FROM_SIM)
+ .putExtra(EXTRA_SIM_CONTACTS, contacts)
+ .putExtra(EXTRA_ACCOUNT, targetAccount);
+ }
+
+ private void importFromSim(Intent intent) {
+ final Intent result = new Intent(BROADCAST_SIM_IMPORT_COMPLETE)
+ .putExtra(EXTRA_OPERATION_REQUESTED_AT_TIME, System.currentTimeMillis());
+ try {
+ final AccountWithDataSet targetAccount = intent.getParcelableExtra(EXTRA_ACCOUNT);
+ final ArrayList<SimContact> contacts =
+ intent.getParcelableArrayListExtra(EXTRA_SIM_CONTACTS);
+ mSimContactDao.importContacts(contacts, targetAccount);
+ // notify success
+ LocalBroadcastManager.getInstance(this).sendBroadcast(result
+ .putExtra(EXTRA_RESULT_COUNT, contacts.size())
+ .putExtra(EXTRA_RESULT_CODE, RESULT_SUCCESS));
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "importFromSim completed successfully");
+ }
+ } catch (RemoteException|OperationApplicationException e) {
+ Log.e(TAG, "Failed to import contacts from SIM card", e);
+ LocalBroadcastManager.getInstance(this).sendBroadcast(result
+ .putExtra(EXTRA_RESULT_CODE, RESULT_FAILURE));
+ }
+ }
+
/**
* Shows a toast on the UI thread.
*/