Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d453bb80 authored by Wenyi Wang's avatar Wenyi Wang Committed by android-build-merger
Browse files

Don\'t pass read-only portions of RawContactDeltaList to contact save service

am: e5bac73a

* commit 'e5bac73a':
  Don't pass read-only portions of RawContactDeltaList to contact save service
parents 26b9e79f e5bac73a
Loading
Loading
Loading
Loading
+28 −2
Original line number Original line Diff line number Diff line
@@ -56,6 +56,7 @@ import com.android.contacts.common.model.CPOWrapper;
import com.android.contacts.common.model.RawContactDelta;
import com.android.contacts.common.model.RawContactDelta;
import com.android.contacts.common.model.RawContactDeltaList;
import com.android.contacts.common.model.RawContactDeltaList;
import com.android.contacts.common.model.RawContactModifier;
import com.android.contacts.common.model.RawContactModifier;
import com.android.contacts.common.model.account.AccountType;
import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.common.model.account.AccountWithDataSet;
import com.android.contacts.common.util.PermissionsUtil;
import com.android.contacts.common.util.PermissionsUtil;
import com.android.contacts.compat.PinnedPositionsCompat;
import com.android.contacts.compat.PinnedPositionsCompat;
@@ -66,6 +67,7 @@ import com.google.common.collect.Sets;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArrayList;


@@ -372,8 +374,12 @@ public class ContactSaveService extends IntentService {
            String saveModeExtraKey, int saveMode, boolean isProfile,
            String saveModeExtraKey, int saveMode, boolean isProfile,
            Class<? extends Activity> callbackActivity, String callbackAction,
            Class<? extends Activity> callbackActivity, String callbackAction,
            Bundle updatedPhotos, String joinContactIdExtraKey, Long joinContactId) {
            Bundle updatedPhotos, String joinContactIdExtraKey, Long joinContactId) {
        Intent serviceIntent = new Intent(
        // Don't pass read-only RawContactDeltas in RawContactDeltaList to contact save service,
                context, ContactSaveService.class);
        // because 1. read-only RawContactDeltas are not writable anyway; 2. read-only
        // RawContactDeltas may be problematic, see b/23896510.
        removeReadOnlyContacts(context, state);

        Intent serviceIntent = new Intent(context, ContactSaveService.class);
        serviceIntent.setAction(ContactSaveService.ACTION_SAVE_CONTACT);
        serviceIntent.setAction(ContactSaveService.ACTION_SAVE_CONTACT);
        serviceIntent.putExtra(EXTRA_CONTACT_STATE, (Parcelable) state);
        serviceIntent.putExtra(EXTRA_CONTACT_STATE, (Parcelable) state);
        serviceIntent.putExtra(EXTRA_SAVE_IS_PROFILE, isProfile);
        serviceIntent.putExtra(EXTRA_SAVE_IS_PROFILE, isProfile);
@@ -398,6 +404,26 @@ public class ContactSaveService extends IntentService {
        return serviceIntent;
        return serviceIntent;
    }
    }


    private static void removeReadOnlyContacts(Context context, RawContactDeltaList state) {
        if (Log.isLoggable(TAG, Log.VERBOSE)) {
            Log.v(TAG, "Before trimming: " + state.size());
        }
        int countReadOnly = 0;
        final Iterator<RawContactDelta> iterator = state.iterator();
        while (iterator.hasNext()) {
            final RawContactDelta rawContactDelta = iterator.next();
            final AccountType accountType = rawContactDelta.getRawContactAccountType(context);
            if (accountType != null && !accountType.areContactsWritable()) {
                countReadOnly++;
                iterator.remove();
            }
        }
        if (Log.isLoggable(TAG, Log.VERBOSE)) {
            Log.v(TAG, "# of read-only removed: " + countReadOnly);
            Log.v(TAG, "After trimming: " + state.size());
        }
    }

    private void saveContact(Intent intent) {
    private void saveContact(Intent intent) {
        RawContactDeltaList state = intent.getParcelableExtra(EXTRA_CONTACT_STATE);
        RawContactDeltaList state = intent.getParcelableExtra(EXTRA_CONTACT_STATE);
        boolean isProfile = intent.getBooleanExtra(EXTRA_SAVE_IS_PROFILE, false);
        boolean isProfile = intent.getBooleanExtra(EXTRA_SAVE_IS_PROFILE, false);
+1 −2
Original line number Original line Diff line number Diff line
@@ -979,8 +979,7 @@ abstract public class ContactEditorBaseFragment extends Fragment implements
    abstract protected boolean doSaveAction(int saveMode, Long joinContactId);
    abstract protected boolean doSaveAction(int saveMode, Long joinContactId);


    protected boolean startSaveService(Context context, Intent intent, int saveMode) {
    protected boolean startSaveService(Context context, Intent intent, int saveMode) {
        final boolean result = ContactSaveService.startService(
        final boolean result = ContactSaveService.startService(context, intent, saveMode);
                context, intent, saveMode);
        if (!result) {
        if (!result) {
            onCancelEditConfirmed();
            onCancelEditConfirmed();
        }
        }