Example usage for android.content ContentProviderOperation toString

List of usage examples for android.content ContentProviderOperation toString

Introduction

In this page you can find the example usage for android.content ContentProviderOperation toString.

Prototype

@Override
    public String toString() 

Source Link

Usage

From source file:com.android.contacts.ContactSaveService.java

private void addMembersToGroup(ContentResolver resolver, long[] rawContactsToAdd, long groupId) {
    if (rawContactsToAdd == null) {
        return;/*w w w.j a  v  a2  s .  c o m*/
    }
    for (long rawContactId : rawContactsToAdd) {
        try {
            final ArrayList<ContentProviderOperation> rawContactOperations = new ArrayList<ContentProviderOperation>();

            // Build an assert operation to ensure the contact is not already in the group
            final ContentProviderOperation.Builder assertBuilder = ContentProviderOperation
                    .newAssertQuery(Data.CONTENT_URI);
            assertBuilder.withSelection(
                    Data.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=? AND " + GroupMembership.GROUP_ROW_ID
                            + "=?",
                    new String[] { String.valueOf(rawContactId), GroupMembership.CONTENT_ITEM_TYPE,
                            String.valueOf(groupId) });
            assertBuilder.withExpectedCount(0);
            rawContactOperations.add(assertBuilder.build());

            // Build an insert operation to add the contact to the group
            final ContentProviderOperation.Builder insertBuilder = ContentProviderOperation
                    .newInsert(Data.CONTENT_URI);
            insertBuilder.withValue(Data.RAW_CONTACT_ID, rawContactId);
            insertBuilder.withValue(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE);
            insertBuilder.withValue(GroupMembership.GROUP_ROW_ID, groupId);
            rawContactOperations.add(insertBuilder.build());

            if (DEBUG) {
                for (ContentProviderOperation operation : rawContactOperations) {
                    Log.v(TAG, operation.toString());
                }
            }

            // Apply batch
            if (!rawContactOperations.isEmpty()) {
                resolver.applyBatch(ContactsContract.AUTHORITY, rawContactOperations);
            }
        } catch (RemoteException e) {
            // Something went wrong, bail without success
            FeedbackHelper.sendFeedback(this, TAG,
                    "Problem persisting user edits for raw contact ID " + String.valueOf(rawContactId), e);
        } catch (OperationApplicationException e) {
            // The assert could have failed because the contact is already in the group,
            // just continue to the next contact
            FeedbackHelper.sendFeedback(this, TAG, "Assert failed in adding raw contact ID "
                    + String.valueOf(rawContactId) + ". Already exists in group " + String.valueOf(groupId), e);
        }
    }
}

From source file:com.android.contacts.ContactSaveService.java

private void saveContact(Intent intent) {
    RawContactDeltaList state = intent.getParcelableExtra(EXTRA_CONTACT_STATE);
    boolean isProfile = intent.getBooleanExtra(EXTRA_SAVE_IS_PROFILE, false);
    Bundle updatedPhotos = intent.getParcelableExtra(EXTRA_UPDATED_PHOTOS);

    if (state == null) {
        Log.e(TAG, "Invalid arguments for saveContact request");
        return;/*from  ww w. j  a  v a  2s  . c om*/
    }

    int saveMode = intent.getIntExtra(EXTRA_SAVE_MODE, -1);
    // Trim any empty fields, and RawContacts, before persisting
    final AccountTypeManager accountTypes = AccountTypeManager.getInstance(this);
    RawContactModifier.trimEmpty(state, accountTypes);

    Uri lookupUri = null;

    final ContentResolver resolver = getContentResolver();

    boolean succeeded = false;

    // Keep track of the id of a newly raw-contact (if any... there can be at most one).
    long insertedRawContactId = -1;

    // Attempt to persist changes
    int tries = 0;
    while (tries++ < PERSIST_TRIES) {
        try {
            // Build operations and try applying
            final ArrayList<CPOWrapper> diffWrapper = state.buildDiffWrapper();

            final ArrayList<ContentProviderOperation> diff = Lists.newArrayList();

            for (CPOWrapper cpoWrapper : diffWrapper) {
                diff.add(cpoWrapper.getOperation());
            }

            if (DEBUG) {
                Log.v(TAG, "Content Provider Operations:");
                for (ContentProviderOperation operation : diff) {
                    Log.v(TAG, operation.toString());
                }
            }

            int numberProcessed = 0;
            boolean batchFailed = false;
            final ContentProviderResult[] results = new ContentProviderResult[diff.size()];
            while (numberProcessed < diff.size()) {
                final int subsetCount = applyDiffSubset(diff, numberProcessed, results, resolver);
                if (subsetCount == -1) {
                    Log.w(TAG, "Resolver.applyBatch failed in saveContacts");
                    batchFailed = true;
                    break;
                } else {
                    numberProcessed += subsetCount;
                }
            }

            if (batchFailed) {
                // Retry save
                continue;
            }

            final long rawContactId = getRawContactId(state, diffWrapper, results);
            if (rawContactId == -1) {
                throw new IllegalStateException("Could not determine RawContact ID after save");
            }
            // We don't have to check to see if the value is still -1.  If we reach here,
            // the previous loop iteration didn't succeed, so any ID that we obtained is bogus.
            insertedRawContactId = getInsertedRawContactId(diffWrapper, results);
            if (isProfile) {
                // Since the profile supports local raw contacts, which may have been completely
                // removed if all information was removed, we need to do a special query to
                // get the lookup URI for the profile contact (if it still exists).
                Cursor c = resolver.query(Profile.CONTENT_URI,
                        new String[] { Contacts._ID, Contacts.LOOKUP_KEY }, null, null, null);
                if (c == null) {
                    continue;
                }
                try {
                    if (c.moveToFirst()) {
                        final long contactId = c.getLong(0);
                        final String lookupKey = c.getString(1);
                        lookupUri = Contacts.getLookupUri(contactId, lookupKey);
                    }
                } finally {
                    c.close();
                }
            } else {
                final Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
                lookupUri = RawContacts.getContactLookupUri(resolver, rawContactUri);
            }
            if (lookupUri != null && Log.isLoggable(TAG, Log.VERBOSE)) {
                Log.v(TAG, "Saved contact. New URI: " + lookupUri);
            }

            // We can change this back to false later, if we fail to save the contact photo.
            succeeded = true;
            break;

        } catch (RemoteException e) {
            // Something went wrong, bail without success
            FeedbackHelper.sendFeedback(this, TAG, "Problem persisting user edits", e);
            break;

        } catch (IllegalArgumentException e) {
            // This is thrown by applyBatch on malformed requests
            FeedbackHelper.sendFeedback(this, TAG, "Problem persisting user edits", e);
            showToast(R.string.contactSavedErrorToast);
            break;

        } catch (OperationApplicationException e) {
            // Version consistency failed, re-parent change and try again
            Log.w(TAG, "Version consistency failed, re-parenting: " + e.toString());
            final StringBuilder sb = new StringBuilder(RawContacts._ID + " IN(");
            boolean first = true;
            final int count = state.size();
            for (int i = 0; i < count; i++) {
                Long rawContactId = state.getRawContactId(i);
                if (rawContactId != null && rawContactId != -1) {
                    if (!first) {
                        sb.append(',');
                    }
                    sb.append(rawContactId);
                    first = false;
                }
            }
            sb.append(")");

            if (first) {
                throw new IllegalStateException("Version consistency failed for a new contact", e);
            }

            final RawContactDeltaList newState = RawContactDeltaList.fromQuery(
                    isProfile ? RawContactsEntity.PROFILE_CONTENT_URI : RawContactsEntity.CONTENT_URI, resolver,
                    sb.toString(), null, null);
            state = RawContactDeltaList.mergeAfter(newState, state);

            // Update the new state to use profile URIs if appropriate.
            if (isProfile) {
                for (RawContactDelta delta : state) {
                    delta.setProfileQueryUri();
                }
            }
        }
    }

    // Now save any updated photos.  We do this at the end to ensure that
    // the ContactProvider already knows about newly-created contacts.
    if (updatedPhotos != null) {
        for (String key : updatedPhotos.keySet()) {
            Uri photoUri = updatedPhotos.getParcelable(key);
            long rawContactId = Long.parseLong(key);

            // If the raw-contact ID is negative, we are saving a new raw-contact;
            // replace the bogus ID with the new one that we actually saved the contact at.
            if (rawContactId < 0) {
                rawContactId = insertedRawContactId;
            }

            // If the save failed, insertedRawContactId will be -1
            if (rawContactId < 0 || !saveUpdatedPhoto(rawContactId, photoUri, saveMode)) {
                succeeded = false;
            }
        }
    }

    Intent callbackIntent = intent.getParcelableExtra(EXTRA_CALLBACK_INTENT);
    if (callbackIntent != null) {
        if (succeeded) {
            // Mark the intent to indicate that the save was successful (even if the lookup URI
            // is now null).  For local contacts or the local profile, it's possible that the
            // save triggered removal of the contact, so no lookup URI would exist..
            callbackIntent.putExtra(EXTRA_SAVE_SUCCEEDED, true);
        }
        callbackIntent.setData(lookupUri);
        deliverCallback(callbackIntent);
    }
}