1 /* 2 * Copyright (C) 2010 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.providers.contacts; 18 19 import android.util.ArrayMap; 20 import android.util.ArraySet; 21 22 import com.google.android.collect.Maps; 23 import com.google.android.collect.Sets; 24 25 import java.util.Map.Entry; 26 import java.util.Set; 27 28 /** 29 * Accumulates information for an entire transaction. {@link ContactsProvider2} consumes 30 * it at commit time. 31 */ 32 public class TransactionContext { 33 34 private final boolean mForProfile; 35 /** Map from raw contact id to account Id */ 36 private ArrayMap<Long, Long> mInsertedRawContactsAccounts; 37 private ArraySet<Long> mUpdatedRawContacts; 38 private ArraySet<Long> mMetadataDirtyRawContacts; 39 private ArraySet<Long> mBackupIdChangedRawContacts; 40 private ArraySet<Long> mDirtyRawContacts; 41 // Set used to track what has been changed and deleted. This is needed so we can update the 42 // contact last touch timestamp. Dirty set above is only set when sync adapter is false. 43 // {@see android.provider.ContactsContract#CALLER_IS_SYNCADAPTER}. While the set below will 44 // contain all changed contacts. 45 private ArraySet<Long> mChangedRawContacts; 46 private ArraySet<Long> mStaleSearchIndexRawContacts; 47 private ArraySet<Long> mStaleSearchIndexContacts; 48 private ArrayMap<Long, Object> mUpdatedSyncStates; 49 TransactionContext(boolean forProfile)50 public TransactionContext(boolean forProfile) { 51 mForProfile = forProfile; 52 } 53 isForProfile()54 public boolean isForProfile() { 55 return mForProfile; 56 } 57 rawContactInserted(long rawContactId, long accountId)58 public void rawContactInserted(long rawContactId, long accountId) { 59 if (mInsertedRawContactsAccounts == null) mInsertedRawContactsAccounts = new ArrayMap<>(); 60 mInsertedRawContactsAccounts.put(rawContactId, accountId); 61 62 markRawContactChangedOrDeletedOrInserted(rawContactId); 63 } 64 rawContactUpdated(long rawContactId)65 public void rawContactUpdated(long rawContactId) { 66 if (mUpdatedRawContacts == null) mUpdatedRawContacts = new ArraySet<>(); 67 mUpdatedRawContacts.add(rawContactId); 68 } 69 markRawContactDirtyAndChanged(long rawContactId, boolean isSyncAdapter)70 public void markRawContactDirtyAndChanged(long rawContactId, boolean isSyncAdapter) { 71 if (!isSyncAdapter) { 72 if (mDirtyRawContacts == null) { 73 mDirtyRawContacts = new ArraySet<>(); 74 } 75 mDirtyRawContacts.add(rawContactId); 76 } 77 78 markRawContactChangedOrDeletedOrInserted(rawContactId); 79 } 80 markRawContactMetadataDirty(long rawContactId, boolean isMetadataSyncAdapter)81 public void markRawContactMetadataDirty(long rawContactId, boolean isMetadataSyncAdapter) { 82 if (!isMetadataSyncAdapter) { 83 if (mMetadataDirtyRawContacts == null) { 84 mMetadataDirtyRawContacts = new ArraySet<>(); 85 } 86 mMetadataDirtyRawContacts.add(rawContactId); 87 } 88 } 89 markBackupIdChangedRawContact(long rawContactId)90 public void markBackupIdChangedRawContact(long rawContactId) { 91 if (mBackupIdChangedRawContacts == null) { 92 mBackupIdChangedRawContacts = new ArraySet<>(); 93 } 94 mBackupIdChangedRawContacts.add(rawContactId); 95 } 96 markRawContactChangedOrDeletedOrInserted(long rawContactId)97 public void markRawContactChangedOrDeletedOrInserted(long rawContactId) { 98 if (mChangedRawContacts == null) { 99 mChangedRawContacts = new ArraySet<>(); 100 } 101 mChangedRawContacts.add(rawContactId); 102 } 103 syncStateUpdated(long rowId, Object data)104 public void syncStateUpdated(long rowId, Object data) { 105 if (mUpdatedSyncStates == null) mUpdatedSyncStates = new ArrayMap<>(); 106 mUpdatedSyncStates.put(rowId, data); 107 } 108 invalidateSearchIndexForRawContact(long rawContactId)109 public void invalidateSearchIndexForRawContact(long rawContactId) { 110 if (mStaleSearchIndexRawContacts == null) mStaleSearchIndexRawContacts = new ArraySet<>(); 111 mStaleSearchIndexRawContacts.add(rawContactId); 112 } 113 invalidateSearchIndexForContact(long contactId)114 public void invalidateSearchIndexForContact(long contactId) { 115 if (mStaleSearchIndexContacts == null) mStaleSearchIndexContacts = new ArraySet<>(); 116 mStaleSearchIndexContacts.add(contactId); 117 } 118 getInsertedRawContactIds()119 public Set<Long> getInsertedRawContactIds() { 120 if (mInsertedRawContactsAccounts == null) mInsertedRawContactsAccounts = new ArrayMap<>(); 121 return mInsertedRawContactsAccounts.keySet(); 122 } 123 getUpdatedRawContactIds()124 public Set<Long> getUpdatedRawContactIds() { 125 if (mUpdatedRawContacts == null) mUpdatedRawContacts = new ArraySet<>(); 126 return mUpdatedRawContacts; 127 } 128 getDirtyRawContactIds()129 public Set<Long> getDirtyRawContactIds() { 130 if (mDirtyRawContacts == null) mDirtyRawContacts = new ArraySet<>(); 131 return mDirtyRawContacts; 132 } 133 getMetadataDirtyRawContactIds()134 public Set<Long> getMetadataDirtyRawContactIds() { 135 if (mMetadataDirtyRawContacts == null) mMetadataDirtyRawContacts = new ArraySet<>(); 136 return mMetadataDirtyRawContacts; 137 } 138 getBackupIdChangedRawContacts()139 public Set<Long> getBackupIdChangedRawContacts() { 140 if (mBackupIdChangedRawContacts == null) mBackupIdChangedRawContacts = new ArraySet<>(); 141 return mBackupIdChangedRawContacts; 142 } 143 getChangedRawContactIds()144 public Set<Long> getChangedRawContactIds() { 145 if (mChangedRawContacts == null) mChangedRawContacts = new ArraySet<>(); 146 return mChangedRawContacts; 147 } 148 getStaleSearchIndexRawContactIds()149 public Set<Long> getStaleSearchIndexRawContactIds() { 150 if (mStaleSearchIndexRawContacts == null) mStaleSearchIndexRawContacts = new ArraySet<>(); 151 return mStaleSearchIndexRawContacts; 152 } 153 getStaleSearchIndexContactIds()154 public Set<Long> getStaleSearchIndexContactIds() { 155 if (mStaleSearchIndexContacts == null) mStaleSearchIndexContacts = new ArraySet<>(); 156 return mStaleSearchIndexContacts; 157 } 158 getUpdatedSyncStates()159 public Set<Entry<Long, Object>> getUpdatedSyncStates() { 160 if (mUpdatedSyncStates == null) mUpdatedSyncStates = new ArrayMap<>(); 161 return mUpdatedSyncStates.entrySet(); 162 } 163 getAccountIdOrNullForRawContact(long rawContactId)164 public Long getAccountIdOrNullForRawContact(long rawContactId) { 165 if (mInsertedRawContactsAccounts == null) mInsertedRawContactsAccounts = new ArrayMap<>(); 166 return mInsertedRawContactsAccounts.get(rawContactId); 167 } 168 isNewRawContact(long rawContactId)169 public boolean isNewRawContact(long rawContactId) { 170 if (mInsertedRawContactsAccounts == null) mInsertedRawContactsAccounts = new ArrayMap<>(); 171 return mInsertedRawContactsAccounts.containsKey(rawContactId); 172 } 173 clearExceptSearchIndexUpdates()174 public void clearExceptSearchIndexUpdates() { 175 mInsertedRawContactsAccounts = null; 176 mUpdatedRawContacts = null; 177 mUpdatedSyncStates = null; 178 mDirtyRawContacts = null; 179 mMetadataDirtyRawContacts = null; 180 mChangedRawContacts = null; 181 mBackupIdChangedRawContacts = null; 182 } 183 clearSearchIndexUpdates()184 public void clearSearchIndexUpdates() { 185 mStaleSearchIndexRawContacts = null; 186 mStaleSearchIndexContacts = null; 187 } 188 clearAll()189 public void clearAll() { 190 clearExceptSearchIndexUpdates(); 191 clearSearchIndexUpdates(); 192 } 193 } 194