CallLog.java revision e23362a54d4aed4616e6e3a9fd4f70c676dac6ca
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1729c1575bf6d11e76c5869fbbdd1cdea1d09ca0e0Debashish Chatterjee
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.provider;
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2056a108220f42bb9d16369c5252c64d5afea4c9aeJeff Hamiltonimport com.android.internal.telephony.CallerInfo;
2156a108220f42bb9d16369c5252c64d5afea4c9aeJeff Hamiltonimport com.android.internal.telephony.Connection;
2256a108220f42bb9d16369c5252c64d5afea4c9aeJeff Hamilton
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
26b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Cataniaimport android.database.Cursor;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
28e23362a54d4aed4616e6e3a9fd4f70c676dac6caDaisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Callable;
29f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Phone;
30f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawaimport android.provider.ContactsContract.DataUsageFeedback;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The CallLog provider contains information about placed and received calls.
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class CallLog {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String AUTHORITY = "call_log";
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The content:// style URL for this provider
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Uri CONTENT_URI =
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uri.parse("content://" + AUTHORITY);
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Contains the recent calls.
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Calls implements BaseColumns {
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The content:// style URL for this table
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Uri CONTENT_URI =
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uri.parse("content://call_log/calls");
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The content:// style URL for filtering this table on phone numbers
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Uri CONTENT_FILTER_URI =
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uri.parse("content://call_log/calls/filter");
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
629ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * An optional URI parameter which instructs the provider to allow the operation to be
639ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * applied to voicemail records as well.
649ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * <p>
659ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * TYPE: Boolean
669ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * <p>
679ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * Using this parameter with a value of {@code true} will result in a security error if the
689ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * calling package does not have appropriate permissions to access voicemails.
699ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         *
709ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * @hide
719ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         */
729ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda        public static final String ALLOW_VOICEMAILS_PARAM_KEY = "allow_voicemails";
739ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda
749ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda        /**
759ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * Content uri with {@link #ALLOW_VOICEMAILS_PARAM_KEY} set. This can directly be used to
769ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * access call log entries that includes voicemail records.
779ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         *
789ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * @hide
799ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         */
809ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda        public static final Uri CONTENT_URI_WITH_VOICEMAIL = CONTENT_URI.buildUpon()
819ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda                .appendQueryParameter(ALLOW_VOICEMAILS_PARAM_KEY, "true")
829ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda                .build();
839ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda
849ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda        /**
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The default sort order for this table
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DEFAULT_SORT_ORDER = "date DESC";
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The MIME type of {@link #CONTENT_URI} and {@link #CONTENT_FILTER_URI}
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * providing a directory of calls.
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CONTENT_TYPE = "vnd.android.cursor.dir/calls";
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The MIME type of a {@link #CONTENT_URI} sub-directory of a single
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * call.
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/calls";
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
102f6737d3ae0f0ca49112807502cc0a272febf3b35Yusuf T. Mobile         * The type of the call (incoming, outgoing or missed).
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String TYPE = "type";
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
107412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        /** Call log type for incoming calls. */
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int INCOMING_TYPE = 1;
109412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        /** Call log type for outgoing calls. */
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int OUTGOING_TYPE = 2;
111412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        /** Call log type for missed calls. */
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int MISSED_TYPE = 3;
113412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        /**
114412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         * Call log type for voicemails.
115412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         * @hide
116412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         */
117412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        public static final int VOICEMAIL_TYPE = 4;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The phone number as the user entered it.
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String NUMBER = "number";
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
126224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * The ISO 3166-1 two letters country code of the country where the
127224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * user received or made the call.
128224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * <P>
129224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * Type: TEXT
130224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * </P>
131224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         *
132224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * @hide
133224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         */
134224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao        public static final String COUNTRY_ISO = "countryiso";
135224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao
136224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao        /**
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The date the call occured, in milliseconds since the epoch
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long)</P>
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DATE = "date";
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The duration of the call in seconds
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long)</P>
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DURATION = "duration";
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Whether or not the call has been acknowledged
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (boolean)</P>
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String NEW = "new";
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The cached name associated with the phone number, if it exists.
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This value is not guaranteed to be current, if the contact information
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * associated with this number has changed.
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CACHED_NAME = "name";
161b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The cached number type (Home, Work, etc) associated with the
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * phone number, if it exists.
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This value is not guaranteed to be current, if the contact information
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * associated with this number has changed.
167b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * <P>Type: INTEGER</P>
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CACHED_NUMBER_TYPE = "numbertype";
170b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The cached number label, for a custom number type, associated with the
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * phone number, if it exists.
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This value is not guaranteed to be current, if the contact information
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * associated with this number has changed.
176b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * <P>Type: TEXT</P>
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CACHED_NUMBER_LABEL = "numberlabel";
179b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
181412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         * URI of the voicemail entry. Populated only for {@link #VOICEMAIL_TYPE}.
182412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         * <P>Type: TEXT</P>
183412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         * @hide
184412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         */
185412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        public static final String VOICEMAIL_URI = "voicemail_uri";
186412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee
187412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        /**
188651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         * Whether this item has been read or otherwise consumed by the user.
189651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         * <p>
190651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         * Unlike the {@link #NEW} field, which requires the user to have acknowledged the
191651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         * existence of the entry, this implies the user has interacted with the entry.
192651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         * <P>Type: INTEGER (boolean)</P>
193651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         */
194651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda        public static final String IS_READ = "is_read";
195651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda
196651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda        /**
197270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         * A geocoded location for the number associated with this call.
198270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         * <p>
199270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         * The string represents a city, state, or country associated with the number.
200270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         * <P>Type: TEXT</P>
201270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         * @hide
202270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         */
203270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda        public static final String GEOCODED_LOCATION = "geocoded_location";
204270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda
205270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda        /**
2062d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * The cached URI to look up the contact associated with the phone number, if it exists.
2072d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * This value is not guaranteed to be current, if the contact information
2082d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * associated with this number has changed.
2092d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * <P>Type: TEXT</P>
2102d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * @hide
2112d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         */
2122d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda        public static final String CACHED_LOOKUP_URI = "lookup_uri";
2132d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda
2142d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda        /**
2152d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * The cached phone number of the contact which matches this entry, if it exists.
2162d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * This value is not guaranteed to be current, if the contact information
2172d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * associated with this number has changed.
2182d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * <P>Type: TEXT</P>
2192d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * @hide
2202d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         */
2212d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda        public static final String CACHED_MATCHED_NUMBER = "matched_number";
2222d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda
2232d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda        /**
2242d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * The cached normalized version of the phone number, if it exists.
2252d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * This value is not guaranteed to be current, if the contact information
2262d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * associated with this number has changed.
2272d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * <P>Type: TEXT</P>
2282d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * @hide
2292d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         */
2302d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda        public static final String CACHED_NORMALIZED_NUMBER = "normalized_number";
2312d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda
2322d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda        /**
2332d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * The cached photo id of the picture associated with the phone number, if it exists.
2342d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * This value is not guaranteed to be current, if the contact information
2352d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * associated with this number has changed.
2362d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * <P>Type: INTEGER (long)</P>
2372d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * @hide
2382d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         */
2392d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda        public static final String CACHED_PHOTO_ID = "photo_id";
2402d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda
2412d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda        /**
2420fce15b03c06cf3ece42a1ec636349f525f16ea1Flavio Lerda         * The cached formatted phone number.
2430fce15b03c06cf3ece42a1ec636349f525f16ea1Flavio Lerda         * This value is not guaranteed to be present.
2440fce15b03c06cf3ece42a1ec636349f525f16ea1Flavio Lerda         * <P>Type: TEXT</P>
2450fce15b03c06cf3ece42a1ec636349f525f16ea1Flavio Lerda         * @hide
2460fce15b03c06cf3ece42a1ec636349f525f16ea1Flavio Lerda         */
2470fce15b03c06cf3ece42a1ec636349f525f16ea1Flavio Lerda        public static final String CACHED_FORMATTED_NUMBER = "formatted_number";
2480fce15b03c06cf3ece42a1ec636349f525f16ea1Flavio Lerda
2490fce15b03c06cf3ece42a1ec636349f525f16ea1Flavio Lerda        /**
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Adds a call to the call log.
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param ci the CallerInfo object to get the target contact from.  Can be null
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if the contact is unknown.
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param context the context used to get the ContentResolver
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param number the phone number to be added to the calls db
256b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * @param presentation the number presenting rules set by the network for
257105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project         *        "allowed", "payphone", "restricted" or "unknown"
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param callType enumerated values for "incoming", "outgoing", or "missed"
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param start time stamp for the call in milliseconds
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param duration call duration in seconds
261b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         *
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
264b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania        public static Uri addCall(CallerInfo ci, Context context, String number,
265105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                int presentation, int callType, long start, int duration) {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ContentResolver resolver = context.getContentResolver();
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
268e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman            // If this is a private number then set the number to Private, otherwise check
269e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman            // if the number field is empty and set the number to Unavailable
270dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            if (presentation == Connection.PRESENTATION_RESTRICTED) {
271dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                number = CallerInfo.PRIVATE_NUMBER;
272e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman                if (ci != null) ci.name = "";
273dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            } else if (presentation == Connection.PRESENTATION_PAYPHONE) {
274dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                number = CallerInfo.PAYPHONE_NUMBER;
275e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman                if (ci != null) ci.name = "";
276e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman            } else if (TextUtils.isEmpty(number)
277e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman                    || presentation == Connection.PRESENTATION_UNKNOWN) {
278dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                number = CallerInfo.UNKNOWN_NUMBER;
279e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman                if (ci != null) ci.name = "";
280dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            }
281e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentValues values = new ContentValues(5);
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(NUMBER, number);
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(TYPE, Integer.valueOf(callType));
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(DATE, Long.valueOf(start));
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(DURATION, Long.valueOf(duration));
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(NEW, Integer.valueOf(1));
2894efaf4ba84187a9e25c081a2d1c0d409cbd94911Debashish Chatterjee            if (callType == MISSED_TYPE) {
2904efaf4ba84187a9e25c081a2d1c0d409cbd94911Debashish Chatterjee                values.put(IS_READ, Integer.valueOf(0));
2914efaf4ba84187a9e25c081a2d1c0d409cbd94911Debashish Chatterjee            }
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ci != null) {
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(CACHED_NAME, ci.name);
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(CACHED_NUMBER_TYPE, ci.numberType);
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(CACHED_NUMBER_LABEL, ci.numberLabel);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
297b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((ci != null) && (ci.person_id > 0)) {
299f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                // Update usage information for the number associated with the contact ID.
300f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                // We need to use both the number and the ID for obtaining a data ID since other
301f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                // contacts may have the same number.
302f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa
303f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                final Cursor cursor;
304f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa
305f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                // We should prefer normalized one (probably coming from
306f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                // Phone.NORMALIZED_NUMBER column) first. If it isn't available try others.
307f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                if (ci.normalizedNumber != null) {
308f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    final String normalizedPhoneNumber = ci.normalizedNumber;
309f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    cursor = resolver.query(Phone.CONTENT_URI,
310f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            new String[] { Phone._ID },
311f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            Phone.CONTACT_ID + " =? AND " + Phone.NORMALIZED_NUMBER + " =?",
312f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            new String[] { String.valueOf(ci.person_id), normalizedPhoneNumber},
313f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            null);
314f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                } else {
315f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    final String phoneNumber = ci.phoneNumber != null ? ci.phoneNumber : number;
316e23362a54d4aed4616e6e3a9fd4f70c676dac6caDaisuke Miyakawa                    cursor = resolver.query(
317e23362a54d4aed4616e6e3a9fd4f70c676dac6caDaisuke Miyakawa                            Uri.withAppendedPath(Callable.CONTENT_FILTER_URI,
318e23362a54d4aed4616e6e3a9fd4f70c676dac6caDaisuke Miyakawa                                    Uri.encode(phoneNumber)),
319f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            new String[] { Phone._ID },
320e23362a54d4aed4616e6e3a9fd4f70c676dac6caDaisuke Miyakawa                            Phone.CONTACT_ID + " =?",
321e23362a54d4aed4616e6e3a9fd4f70c676dac6caDaisuke Miyakawa                            new String[] { String.valueOf(ci.person_id) },
322f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            null);
323f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                }
324f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa
325f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                if (cursor != null) {
326f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    try {
327f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                        if (cursor.getCount() > 0 && cursor.moveToFirst()) {
328f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            final Uri feedbackUri = DataUsageFeedback.FEEDBACK_URI.buildUpon()
329f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                                    .appendPath(cursor.getString(0))
330f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                                    .appendQueryParameter(DataUsageFeedback.USAGE_TYPE,
331f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                                                DataUsageFeedback.USAGE_TYPE_CALL)
332f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                                    .build();
333f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            resolver.update(feedbackUri, new ContentValues(), null, null);
334f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                        }
335f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    } finally {
336f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                        cursor.close();
337f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    }
338f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
340b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri result = resolver.insert(CONTENT_URI, values);
342b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeExpiredEntries(context);
344b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return result;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
347b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
348b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania        /**
349b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * Query the call log database for the last dialed number.
350b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * @param context Used to get the content resolver.
351b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * @return The last phone number dialed (outgoing) or an empty
352b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * string if none exist yet.
353b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         */
354b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania        public static String getLastOutgoingCall(Context context) {
355b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania            final ContentResolver resolver = context.getContentResolver();
356b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania            Cursor c = null;
357b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania            try {
358b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                c = resolver.query(
359b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    CONTENT_URI,
360b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    new String[] {NUMBER},
361b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    TYPE + " = " + OUTGOING_TYPE,
362b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    null,
363b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    DEFAULT_SORT_ORDER + " LIMIT 1");
364b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                if (c == null || !c.moveToFirst()) {
365b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    return "";
366b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                }
367b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                return c.getString(0);
368b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania            } finally {
369b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                if (c != null) c.close();
370b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania            }
371b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania        }
372b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static void removeExpiredEntries(Context context) {
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ContentResolver resolver = context.getContentResolver();
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            resolver.delete(CONTENT_URI, "_id IN " +
376b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    "(SELECT _id FROM calls ORDER BY " + DEFAULT_SORT_ORDER
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " LIMIT -1 OFFSET 500)", null);
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
381