1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17 package com.android.dialer.calllog.datasources; 18 19 import android.content.ContentValues; 20 import android.util.ArrayMap; 21 import android.util.ArraySet; 22 import com.android.dialer.common.Assert; 23 24 /** A collection of mutations to the annotated call log. */ 25 public final class CallLogMutations { 26 27 private final ArrayMap<Long, ContentValues> inserts = new ArrayMap<>(); 28 private final ArrayMap<Long, ContentValues> updates = new ArrayMap<>(); 29 private final ArraySet<Long> deletes = new ArraySet<>(); 30 31 /** 32 * @param contentValues an entire row not including the ID 33 * @throws IllegalStateException if this {@link CallLogMutations} already contains an insert, 34 * update, or delete with the provided id 35 */ insert(long id, ContentValues contentValues)36 public void insert(long id, ContentValues contentValues) { 37 Assert.checkArgument(!inserts.containsKey(id), "Can't insert row already scheduled for insert"); 38 Assert.checkArgument(!updates.containsKey(id), "Can't insert row scheduled for update"); 39 Assert.checkArgument(!deletes.contains(id), "Can't insert row scheduled for delete"); 40 41 inserts.put(id, contentValues); 42 } 43 44 /** 45 * Stores a database update using the provided ID and content values. If this {@link 46 * CallLogMutations} object already contains an update with the specified ID, the existing content 47 * values are merged with the provided ones, with the provided ones overwriting the existing ones 48 * for values with the same key. 49 * 50 * @param contentValues the specific columns to update, not including the ID. 51 * @throws IllegalStateException if this {@link CallLogMutations} already contains an insert or 52 * delete with the provided id 53 */ update(long id, ContentValues contentValues)54 public void update(long id, ContentValues contentValues) { 55 Assert.checkArgument(!inserts.containsKey(id), "Can't update row scheduled for insert"); 56 Assert.checkArgument(!deletes.contains(id), "Can't delete row scheduled for delete"); 57 58 ContentValues existingContentValues = updates.get(id); 59 if (existingContentValues != null) { 60 existingContentValues.putAll(contentValues); 61 } else { 62 updates.put(id, contentValues); 63 } 64 } 65 66 /** 67 * @throws IllegalStateException if this {@link CallLogMutations} already contains an insert, 68 * update, or delete with the provided id 69 */ delete(long id)70 public void delete(long id) { 71 Assert.checkArgument(!inserts.containsKey(id), "Can't delete row scheduled for insert"); 72 Assert.checkArgument(!updates.containsKey(id), "Can't delete row scheduled for update"); 73 Assert.checkArgument(!deletes.contains(id), "Can't delete row already scheduled for delete"); 74 75 deletes.add(id); 76 } 77 isEmpty()78 public boolean isEmpty() { 79 return inserts.isEmpty() && updates.isEmpty() && deletes.isEmpty(); 80 } 81 82 /** 83 * Get the pending inserts. 84 * 85 * @return the pending inserts where the key is the annotated call log database ID and the values 86 * are values to be inserted (not including the ID) 87 */ getInserts()88 public ArrayMap<Long, ContentValues> getInserts() { 89 return inserts; 90 } 91 92 /** 93 * Get the pending updates. 94 * 95 * @return the pending updates where the key is the annotated call log database ID and the values 96 * are values to be updated (not including the ID) 97 */ getUpdates()98 public ArrayMap<Long, ContentValues> getUpdates() { 99 return updates; 100 } 101 102 /** 103 * Get the pending deletes. 104 * 105 * @return the annotated call log database IDs corresponding to the rows to be deleted 106 */ getDeletes()107 public ArraySet<Long> getDeletes() { 108 return deletes; 109 } 110 } 111