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