15d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro/* 25d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro * Copyright (C) 2011 The Android Open Source Project 35d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro * 45d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro * Licensed under the Apache License, Version 2.0 (the "License"); 55d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro * you may not use this file except in compliance with the License. 65d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro * You may obtain a copy of the License at 75d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro * 85d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro * http://www.apache.org/licenses/LICENSE-2.0 95d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro * 105d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro * Unless required by applicable law or agreed to in writing, software 115d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro * distributed under the License is distributed on an "AS IS" BASIS, 125d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro * See the License for the specific language governing permissions and 145d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro * limitations under the License 155d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro */ 1649ed71913609193a00059df944f6259e9397b0bdMakoto Onukipackage com.android.providers.contacts.aggregation; 175d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro 185d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoroimport android.database.sqlite.SQLiteDatabase; 195d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoroimport android.database.sqlite.SQLiteDoneException; 205d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoroimport android.database.sqlite.SQLiteStatement; 215d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoroimport android.provider.ContactsContract.Contacts; 2249ed71913609193a00059df944f6259e9397b0bdMakoto Onuki 2349ed71913609193a00059df944f6259e9397b0bdMakoto Onukiimport com.android.providers.contacts.ContactLookupKey; 2449ed71913609193a00059df944f6259e9397b0bdMakoto Onukiimport com.android.providers.contacts.ContactsDatabaseHelper; 255d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoroimport com.android.providers.contacts.ContactsDatabaseHelper.Tables; 2649ed71913609193a00059df944f6259e9397b0bdMakoto Onukiimport com.android.providers.contacts.ContactsProvider2; 2749ed71913609193a00059df944f6259e9397b0bdMakoto Onukiimport com.android.providers.contacts.NameSplitter; 2849ed71913609193a00059df944f6259e9397b0bdMakoto Onukiimport com.android.providers.contacts.PhotoPriorityResolver; 2949ed71913609193a00059df944f6259e9397b0bdMakoto Onukiimport com.android.providers.contacts.TransactionContext; 3038210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.providers.contacts.aggregation.util.CommonNicknameCache; 315d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro 325d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro/** 335d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro * A version of the ContactAggregator for use against the profile database. 345d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro */ 355d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoropublic class ProfileAggregator extends ContactAggregator { 365d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro 37fabb89d3cead152f8bd768f62eeb5fc60406eab0Dave Santoro private long mContactId; 385d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro 395d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro public ProfileAggregator(ContactsProvider2 contactsProvider, 405d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro ContactsDatabaseHelper contactsDatabaseHelper, 415d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro PhotoPriorityResolver photoPriorityResolver, NameSplitter nameSplitter, 425d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro CommonNicknameCache commonNicknameCache) { 435d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro super(contactsProvider, contactsDatabaseHelper, photoPriorityResolver, nameSplitter, 445d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro commonNicknameCache); 455d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro } 465d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro 475d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro @Override 48d1f800d2712c9050f350bd940e3333c35f558e83Daniel Lehmann protected String computeLookupKeyForContact(SQLiteDatabase db, long contactId) { 495d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro return ContactLookupKey.PROFILE_LOOKUP_KEY; 505d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro } 515d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro 525d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro @Override 530a3ba72748faa8e3909ee7d5294fc07eb1c4de92Dave Santoro protected void appendLookupKey(StringBuilder sb, String accountTypeWithDataSet, 540a3ba72748faa8e3909ee7d5294fc07eb1c4de92Dave Santoro String accountName, long rawContactId, String sourceId, String displayName) { 550a3ba72748faa8e3909ee7d5294fc07eb1c4de92Dave Santoro 560a3ba72748faa8e3909ee7d5294fc07eb1c4de92Dave Santoro // The profile's lookup key should always be "profile". 570a3ba72748faa8e3909ee7d5294fc07eb1c4de92Dave Santoro sb.setLength(0); 580a3ba72748faa8e3909ee7d5294fc07eb1c4de92Dave Santoro sb.append(ContactLookupKey.PROFILE_LOOKUP_KEY); 59c5fdfb79564e8b46d6aae213a312d4e1560f3a3cDave Santoro } 60c5fdfb79564e8b46d6aae213a312d4e1560f3a3cDave Santoro 61c5fdfb79564e8b46d6aae213a312d4e1560f3a3cDave Santoro @Override 625d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro public long onRawContactInsert(TransactionContext txContext, SQLiteDatabase db, 635d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro long rawContactId) { 64fabb89d3cead152f8bd768f62eeb5fc60406eab0Dave Santoro aggregateContact(txContext, db, rawContactId); 65fabb89d3cead152f8bd768f62eeb5fc60406eab0Dave Santoro return mContactId; 66fabb89d3cead152f8bd768f62eeb5fc60406eab0Dave Santoro } 67fabb89d3cead152f8bd768f62eeb5fc60406eab0Dave Santoro 68fabb89d3cead152f8bd768f62eeb5fc60406eab0Dave Santoro @Override 69fabb89d3cead152f8bd768f62eeb5fc60406eab0Dave Santoro public void aggregateInTransaction(TransactionContext txContext, SQLiteDatabase db) { 70fabb89d3cead152f8bd768f62eeb5fc60406eab0Dave Santoro // Do nothing. The contact should already be aggregated. 71fabb89d3cead152f8bd768f62eeb5fc60406eab0Dave Santoro } 72fabb89d3cead152f8bd768f62eeb5fc60406eab0Dave Santoro 73fabb89d3cead152f8bd768f62eeb5fc60406eab0Dave Santoro @Override 74fabb89d3cead152f8bd768f62eeb5fc60406eab0Dave Santoro public void aggregateContact(TransactionContext txContext, SQLiteDatabase db, 75fabb89d3cead152f8bd768f62eeb5fc60406eab0Dave Santoro long rawContactId) { 76fabb89d3cead152f8bd768f62eeb5fc60406eab0Dave Santoro // Profile aggregation is simple - find the single contact in the database and attach to 776efb7db26598b105342d02207e0ca1c8725c10daDave Santoro // that. We look it up each time in case the profile was deleted by a previous operation 786efb7db26598b105342d02207e0ca1c8725c10daDave Santoro // and needs re-creation. 796efb7db26598b105342d02207e0ca1c8725c10daDave Santoro SQLiteStatement profileContactIdLookup = db.compileStatement( 806efb7db26598b105342d02207e0ca1c8725c10daDave Santoro "SELECT " + Contacts._ID + 816efb7db26598b105342d02207e0ca1c8725c10daDave Santoro " FROM " + Tables.CONTACTS + 826efb7db26598b105342d02207e0ca1c8725c10daDave Santoro " ORDER BY " + Contacts._ID + 836efb7db26598b105342d02207e0ca1c8725c10daDave Santoro " LIMIT 1"); 846efb7db26598b105342d02207e0ca1c8725c10daDave Santoro try { 856efb7db26598b105342d02207e0ca1c8725c10daDave Santoro mContactId = profileContactIdLookup.simpleQueryForLong(); 866efb7db26598b105342d02207e0ca1c8725c10daDave Santoro updateAggregateData(txContext, mContactId); 876efb7db26598b105342d02207e0ca1c8725c10daDave Santoro } catch (SQLiteDoneException e) { 886efb7db26598b105342d02207e0ca1c8725c10daDave Santoro // No valid contact ID found, so create one. 896efb7db26598b105342d02207e0ca1c8725c10daDave Santoro mContactId = insertContact(db, rawContactId); 906efb7db26598b105342d02207e0ca1c8725c10daDave Santoro } finally { 916efb7db26598b105342d02207e0ca1c8725c10daDave Santoro profileContactIdLookup.close(); 925d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro } 93fabb89d3cead152f8bd768f62eeb5fc60406eab0Dave Santoro setContactId(rawContactId, mContactId); 945d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro } 955d0a768b56ed4bd0dfef81b8389247ba74766659Dave Santoro} 96