DataRowHandlerForPhoneNumber.java revision eeeed5669d98897501bf2b18c88579c7effd0955
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5 * use this file except in compliance with the License. You may obtain a copy of
6 * 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, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations under
14 * the License
15 */
16package com.android.providers.contacts;
17
18import com.android.providers.contacts.ContactsDatabaseHelper.PhoneColumns;
19import com.android.providers.contacts.ContactsDatabaseHelper.PhoneLookupColumns;
20import com.android.providers.contacts.ContactsDatabaseHelper.Tables;
21import com.android.providers.contacts.SearchIndexManager.IndexBuilder;
22
23import android.content.ContentValues;
24import android.database.Cursor;
25import android.database.sqlite.SQLiteDatabase;
26import android.provider.ContactsContract.CommonDataKinds.Phone;
27import android.telephony.PhoneNumberUtils;
28import android.text.TextUtils;
29
30/**
31 * Handler for phone number data rows.
32 */
33public class DataRowHandlerForPhoneNumber extends DataRowHandlerForCommonDataKind {
34
35    public DataRowHandlerForPhoneNumber(
36            ContactsDatabaseHelper dbHelper, ContactAggregator aggregator) {
37        super(dbHelper, aggregator, Phone.CONTENT_ITEM_TYPE, Phone.TYPE, Phone.LABEL);
38    }
39
40    @Override
41    public long insert(SQLiteDatabase db, TransactionContext txContext, long rawContactId,
42            ContentValues values) {
43        long dataId;
44        if (values.containsKey(Phone.NUMBER)) {
45            String number = values.getAsString(Phone.NUMBER);
46
47            String numberE164 =
48                    PhoneNumberUtils.formatNumberToE164(number, mDbHelper.getCurrentCountryIso());
49            if (numberE164 != null) {
50                values.put(PhoneColumns.NORMALIZED_NUMBER, numberE164);
51            }
52            dataId = super.insert(db, txContext, rawContactId, values);
53
54            updatePhoneLookup(db, rawContactId, dataId, number, numberE164);
55            mContactAggregator.updateHasPhoneNumber(db, rawContactId);
56            fixRawContactDisplayName(db, txContext, rawContactId);
57            if (numberE164 != null) {
58                triggerAggregation(rawContactId);
59            }
60        } else {
61            dataId = super.insert(db, txContext, rawContactId, values);
62        }
63        return dataId;
64    }
65
66    @Override
67    public boolean update(SQLiteDatabase db, TransactionContext txContext, ContentValues values,
68            Cursor c, boolean callerIsSyncAdapter) {
69        String number = null;
70        String numberE164 = null;
71        if (values.containsKey(Phone.NUMBER)) {
72            number = values.getAsString(Phone.NUMBER);
73            if (number != null) {
74                numberE164 = PhoneNumberUtils.formatNumberToE164(number,
75                        mDbHelper.getCurrentCountryIso());
76            }
77            if (numberE164 != null) {
78                values.put(PhoneColumns.NORMALIZED_NUMBER, numberE164);
79            }
80        }
81
82        if (!super.update(db, txContext, values, c, callerIsSyncAdapter)) {
83            return false;
84        }
85
86        if (values.containsKey(Phone.NUMBER)) {
87            long dataId = c.getLong(DataUpdateQuery._ID);
88            long rawContactId = c.getLong(DataUpdateQuery.RAW_CONTACT_ID);
89            updatePhoneLookup(db, rawContactId, dataId, number, numberE164);
90            mContactAggregator.updateHasPhoneNumber(db, rawContactId);
91            fixRawContactDisplayName(db, txContext, rawContactId);
92            triggerAggregation(rawContactId);
93        }
94        return true;
95    }
96
97    @Override
98    public int delete(SQLiteDatabase db, TransactionContext txContext, Cursor c) {
99        long dataId = c.getLong(DataDeleteQuery._ID);
100        long rawContactId = c.getLong(DataDeleteQuery.RAW_CONTACT_ID);
101
102        int count = super.delete(db, txContext, c);
103
104        updatePhoneLookup(db, rawContactId, dataId, null, null);
105        mContactAggregator.updateHasPhoneNumber(db, rawContactId);
106        fixRawContactDisplayName(db, txContext, rawContactId);
107        triggerAggregation(rawContactId);
108        return count;
109    }
110
111    private void updatePhoneLookup(SQLiteDatabase db, long rawContactId, long dataId,
112            String number, String numberE164) {
113        mSelectionArgs1[0] = String.valueOf(dataId);
114        db.delete(Tables.PHONE_LOOKUP, PhoneLookupColumns.DATA_ID + "=?", mSelectionArgs1);
115        if (number != null) {
116            String normalizedNumber = PhoneNumberUtils.normalizeNumber(number);
117            if (!TextUtils.isEmpty(normalizedNumber)) {
118                ContentValues phoneValues = new ContentValues();
119                phoneValues.put(PhoneLookupColumns.RAW_CONTACT_ID, rawContactId);
120                phoneValues.put(PhoneLookupColumns.DATA_ID, dataId);
121                phoneValues.put(PhoneLookupColumns.NORMALIZED_NUMBER, normalizedNumber);
122                phoneValues.put(PhoneLookupColumns.MIN_MATCH,
123                        PhoneNumberUtils.toCallerIDMinMatch(normalizedNumber));
124                db.insert(Tables.PHONE_LOOKUP, null, phoneValues);
125
126                if (numberE164 != null && !numberE164.equals(normalizedNumber)) {
127                    phoneValues.put(PhoneLookupColumns.NORMALIZED_NUMBER, numberE164);
128                    phoneValues.put(PhoneLookupColumns.MIN_MATCH,
129                            PhoneNumberUtils.toCallerIDMinMatch(numberE164));
130                    db.insert(Tables.PHONE_LOOKUP, null, phoneValues);
131                }
132            }
133        }
134    }
135
136    @Override
137    protected int getTypeRank(int type) {
138        switch (type) {
139            case Phone.TYPE_MOBILE: return 0;
140            case Phone.TYPE_WORK: return 1;
141            case Phone.TYPE_HOME: return 2;
142            case Phone.TYPE_PAGER: return 3;
143            case Phone.TYPE_CUSTOM: return 4;
144            case Phone.TYPE_OTHER: return 5;
145            case Phone.TYPE_FAX_WORK: return 6;
146            case Phone.TYPE_FAX_HOME: return 7;
147            default: return 1000;
148        }
149    }
150
151    @Override
152    public boolean containsSearchableColumns(ContentValues values) {
153        return values.containsKey(Phone.NUMBER);
154    }
155
156    @Override
157    public void appendSearchableData(IndexBuilder builder) {
158        String number = builder.getString(Phone.NUMBER);
159        String normalizedNumber = PhoneNumberUtils.normalizeNumber(number);
160        if (TextUtils.isEmpty(normalizedNumber)) {
161            return;
162        }
163
164        builder.appendToken(normalizedNumber);
165
166        String numberE164 = PhoneNumberUtils.formatNumberToE164(
167                number, mDbHelper.getCurrentCountryIso());
168        if (numberE164 != null && !numberE164.equals(normalizedNumber)) {
169            builder.appendToken(numberE164);
170        }
171    }
172}
173