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
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
23b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Cataniaimport android.database.Cursor;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
25e23362a54d4aed4616e6e3a9fd4f70c676dac6caDaisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Callable;
26f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Phone;
27f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawaimport android.provider.ContactsContract.DataUsageFeedback;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Chengimport com.android.internal.telephony.CallerInfo;
31509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Chengimport com.android.internal.telephony.PhoneConstants;
32509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Cheng
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        /**
62509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Cheng         * Query parameter used to limit the number of call logs returned.
63509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Cheng         * <p>
64509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Cheng         * TYPE: integer
65509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Cheng         */
66509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Cheng        public static final String LIMIT_PARAM_KEY = "limit";
67509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Cheng
68509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Cheng        /**
69509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Cheng         * Query parameter used to specify the starting record to return.
70509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Cheng         * <p>
71509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Cheng         * TYPE: integer
72509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Cheng         */
73509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Cheng        public static final String OFFSET_PARAM_KEY = "offset";
74509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Cheng
75509e1f1a97d65ca3356794ac9a85b5c38329c2eaChiao Cheng        /**
769ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * An optional URI parameter which instructs the provider to allow the operation to be
779ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * applied to voicemail records as well.
789ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * <p>
799ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * TYPE: Boolean
809ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * <p>
819ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * Using this parameter with a value of {@code true} will result in a security error if the
829ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * calling package does not have appropriate permissions to access voicemails.
839ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         *
849ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * @hide
859ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         */
869ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda        public static final String ALLOW_VOICEMAILS_PARAM_KEY = "allow_voicemails";
879ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda
889ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda        /**
899ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * Content uri with {@link #ALLOW_VOICEMAILS_PARAM_KEY} set. This can directly be used to
909ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * access call log entries that includes voicemail records.
919ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         *
929ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * @hide
939ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         */
949ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda        public static final Uri CONTENT_URI_WITH_VOICEMAIL = CONTENT_URI.buildUpon()
959ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda                .appendQueryParameter(ALLOW_VOICEMAILS_PARAM_KEY, "true")
969ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda                .build();
979ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda
989ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda        /**
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The default sort order for this table
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DEFAULT_SORT_ORDER = "date DESC";
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The MIME type of {@link #CONTENT_URI} and {@link #CONTENT_FILTER_URI}
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * providing a directory of calls.
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CONTENT_TYPE = "vnd.android.cursor.dir/calls";
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The MIME type of a {@link #CONTENT_URI} sub-directory of a single
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * call.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/calls";
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
116f6737d3ae0f0ca49112807502cc0a272febf3b35Yusuf T. Mobile         * The type of the call (incoming, outgoing or missed).
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String TYPE = "type";
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
121412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        /** Call log type for incoming calls. */
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int INCOMING_TYPE = 1;
123412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        /** Call log type for outgoing calls. */
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int OUTGOING_TYPE = 2;
125412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        /** Call log type for missed calls. */
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int MISSED_TYPE = 3;
127412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        /**
128412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         * Call log type for voicemails.
129412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         * @hide
130412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         */
131412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        public static final int VOICEMAIL_TYPE = 4;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The phone number as the user entered it.
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String NUMBER = "number";
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
140224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * The ISO 3166-1 two letters country code of the country where the
141224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * user received or made the call.
142224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * <P>
143224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * Type: TEXT
144224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * </P>
145224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         *
146224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * @hide
147224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         */
148224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao        public static final String COUNTRY_ISO = "countryiso";
149224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao
150224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao        /**
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The date the call occured, in milliseconds since the epoch
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long)</P>
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DATE = "date";
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The duration of the call in seconds
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long)</P>
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DURATION = "duration";
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Whether or not the call has been acknowledged
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (boolean)</P>
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String NEW = "new";
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The cached name associated with the phone number, if it exists.
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This value is not guaranteed to be current, if the contact information
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * associated with this number has changed.
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CACHED_NAME = "name";
175b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The cached number type (Home, Work, etc) associated with the
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * phone number, if it exists.
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This value is not guaranteed to be current, if the contact information
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * associated with this number has changed.
181b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * <P>Type: INTEGER</P>
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CACHED_NUMBER_TYPE = "numbertype";
184b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The cached number label, for a custom number type, associated with the
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * phone number, if it exists.
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This value is not guaranteed to be current, if the contact information
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * associated with this number has changed.
190b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * <P>Type: TEXT</P>
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CACHED_NUMBER_LABEL = "numberlabel";
193b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
195412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         * URI of the voicemail entry. Populated only for {@link #VOICEMAIL_TYPE}.
196412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         * <P>Type: TEXT</P>
197412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         * @hide
198412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         */
199412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        public static final String VOICEMAIL_URI = "voicemail_uri";
200412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee
201412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        /**
202651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         * Whether this item has been read or otherwise consumed by the user.
203651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         * <p>
204651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         * Unlike the {@link #NEW} field, which requires the user to have acknowledged the
205651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         * existence of the entry, this implies the user has interacted with the entry.
206651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         * <P>Type: INTEGER (boolean)</P>
207651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         */
208651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda        public static final String IS_READ = "is_read";
209651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda
210651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda        /**
211270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         * A geocoded location for the number associated with this call.
212270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         * <p>
213270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         * The string represents a city, state, or country associated with the number.
214270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         * <P>Type: TEXT</P>
215270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         * @hide
216270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         */
217270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda        public static final String GEOCODED_LOCATION = "geocoded_location";
218270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda
219270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda        /**
2202d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * The cached URI to look up the contact associated with the phone number, if it exists.
2212d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * This value is not guaranteed to be current, if the contact information
2222d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * associated with this number has changed.
2232d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * <P>Type: TEXT</P>
2242d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * @hide
2252d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         */
2262d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda        public static final String CACHED_LOOKUP_URI = "lookup_uri";
2272d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda
2282d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda        /**
2292d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * The cached phone number of the contact which matches this entry, if it exists.
2302d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * This value is not guaranteed to be current, if the contact information
2312d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * associated with this number has changed.
2322d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * <P>Type: TEXT</P>
2332d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * @hide
2342d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         */
2352d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda        public static final String CACHED_MATCHED_NUMBER = "matched_number";
2362d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda
2372d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda        /**
2382d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * The cached normalized version of the phone number, if it exists.
2392d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * This value is not guaranteed to be current, if the contact information
2402d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * associated with this number has changed.
2412d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * <P>Type: TEXT</P>
2422d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * @hide
2432d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         */
2442d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda        public static final String CACHED_NORMALIZED_NUMBER = "normalized_number";
2452d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda
2462d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda        /**
2472d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * The cached photo id of the picture associated with the phone number, if it exists.
2482d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * This value is not guaranteed to be current, if the contact information
2492d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * associated with this number has changed.
2502d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * <P>Type: INTEGER (long)</P>
2512d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         * @hide
2522d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda         */
2532d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda        public static final String CACHED_PHOTO_ID = "photo_id";
2542d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda
2552d538d44e2f88808e7d2212492086cc2c53852b6Flavio Lerda        /**
2560fce15b03c06cf3ece42a1ec636349f525f16ea1Flavio Lerda         * The cached formatted phone number.
2570fce15b03c06cf3ece42a1ec636349f525f16ea1Flavio Lerda         * This value is not guaranteed to be present.
2580fce15b03c06cf3ece42a1ec636349f525f16ea1Flavio Lerda         * <P>Type: TEXT</P>
2590fce15b03c06cf3ece42a1ec636349f525f16ea1Flavio Lerda         * @hide
2600fce15b03c06cf3ece42a1ec636349f525f16ea1Flavio Lerda         */
2610fce15b03c06cf3ece42a1ec636349f525f16ea1Flavio Lerda        public static final String CACHED_FORMATTED_NUMBER = "formatted_number";
2620fce15b03c06cf3ece42a1ec636349f525f16ea1Flavio Lerda
2630fce15b03c06cf3ece42a1ec636349f525f16ea1Flavio Lerda        /**
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Adds a call to the call log.
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param ci the CallerInfo object to get the target contact from.  Can be null
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if the contact is unknown.
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param context the context used to get the ContentResolver
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param number the phone number to be added to the calls db
270b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * @param presentation the number presenting rules set by the network for
271105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project         *        "allowed", "payphone", "restricted" or "unknown"
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param callType enumerated values for "incoming", "outgoing", or "missed"
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param start time stamp for the call in milliseconds
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param duration call duration in seconds
275b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         *
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
278b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania        public static Uri addCall(CallerInfo ci, Context context, String number,
279105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                int presentation, int callType, long start, int duration) {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ContentResolver resolver = context.getContentResolver();
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
282e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman            // If this is a private number then set the number to Private, otherwise check
283e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman            // if the number field is empty and set the number to Unavailable
284a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville            if (presentation == PhoneConstants.PRESENTATION_RESTRICTED) {
285dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                number = CallerInfo.PRIVATE_NUMBER;
286e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman                if (ci != null) ci.name = "";
287a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville            } else if (presentation == PhoneConstants.PRESENTATION_PAYPHONE) {
288dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                number = CallerInfo.PAYPHONE_NUMBER;
289e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman                if (ci != null) ci.name = "";
290e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman            } else if (TextUtils.isEmpty(number)
291a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville                    || presentation == PhoneConstants.PRESENTATION_UNKNOWN) {
292dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                number = CallerInfo.UNKNOWN_NUMBER;
293e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman                if (ci != null) ci.name = "";
294dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            }
295e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentValues values = new ContentValues(5);
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(NUMBER, number);
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(TYPE, Integer.valueOf(callType));
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(DATE, Long.valueOf(start));
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(DURATION, Long.valueOf(duration));
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(NEW, Integer.valueOf(1));
3034efaf4ba84187a9e25c081a2d1c0d409cbd94911Debashish Chatterjee            if (callType == MISSED_TYPE) {
3044efaf4ba84187a9e25c081a2d1c0d409cbd94911Debashish Chatterjee                values.put(IS_READ, Integer.valueOf(0));
3054efaf4ba84187a9e25c081a2d1c0d409cbd94911Debashish Chatterjee            }
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ci != null) {
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(CACHED_NAME, ci.name);
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(CACHED_NUMBER_TYPE, ci.numberType);
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(CACHED_NUMBER_LABEL, ci.numberLabel);
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
311b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((ci != null) && (ci.person_id > 0)) {
313f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                // Update usage information for the number associated with the contact ID.
314f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                // We need to use both the number and the ID for obtaining a data ID since other
315f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                // contacts may have the same number.
316f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa
317f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                final Cursor cursor;
318f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa
319f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                // We should prefer normalized one (probably coming from
320f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                // Phone.NORMALIZED_NUMBER column) first. If it isn't available try others.
321f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                if (ci.normalizedNumber != null) {
322f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    final String normalizedPhoneNumber = ci.normalizedNumber;
323f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    cursor = resolver.query(Phone.CONTENT_URI,
324f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            new String[] { Phone._ID },
325f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            Phone.CONTACT_ID + " =? AND " + Phone.NORMALIZED_NUMBER + " =?",
326f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            new String[] { String.valueOf(ci.person_id), normalizedPhoneNumber},
327f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            null);
328f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                } else {
329f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    final String phoneNumber = ci.phoneNumber != null ? ci.phoneNumber : number;
330e23362a54d4aed4616e6e3a9fd4f70c676dac6caDaisuke Miyakawa                    cursor = resolver.query(
331e23362a54d4aed4616e6e3a9fd4f70c676dac6caDaisuke Miyakawa                            Uri.withAppendedPath(Callable.CONTENT_FILTER_URI,
332e23362a54d4aed4616e6e3a9fd4f70c676dac6caDaisuke Miyakawa                                    Uri.encode(phoneNumber)),
333f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            new String[] { Phone._ID },
334e23362a54d4aed4616e6e3a9fd4f70c676dac6caDaisuke Miyakawa                            Phone.CONTACT_ID + " =?",
335e23362a54d4aed4616e6e3a9fd4f70c676dac6caDaisuke Miyakawa                            new String[] { String.valueOf(ci.person_id) },
336f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            null);
337f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                }
338f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa
339f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                if (cursor != null) {
340f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    try {
341f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                        if (cursor.getCount() > 0 && cursor.moveToFirst()) {
342f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            final Uri feedbackUri = DataUsageFeedback.FEEDBACK_URI.buildUpon()
343f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                                    .appendPath(cursor.getString(0))
344f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                                    .appendQueryParameter(DataUsageFeedback.USAGE_TYPE,
345f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                                                DataUsageFeedback.USAGE_TYPE_CALL)
346f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                                    .build();
347f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            resolver.update(feedbackUri, new ContentValues(), null, null);
348f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                        }
349f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    } finally {
350f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                        cursor.close();
351f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    }
352f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                }
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
354b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri result = resolver.insert(CONTENT_URI, values);
356b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeExpiredEntries(context);
358b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return result;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
361b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
362b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania        /**
363b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * Query the call log database for the last dialed number.
364b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * @param context Used to get the content resolver.
365b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * @return The last phone number dialed (outgoing) or an empty
366b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * string if none exist yet.
367b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         */
368b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania        public static String getLastOutgoingCall(Context context) {
369b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania            final ContentResolver resolver = context.getContentResolver();
370b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania            Cursor c = null;
371b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania            try {
372b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                c = resolver.query(
373b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    CONTENT_URI,
374b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    new String[] {NUMBER},
375b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    TYPE + " = " + OUTGOING_TYPE,
376b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    null,
377b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    DEFAULT_SORT_ORDER + " LIMIT 1");
378b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                if (c == null || !c.moveToFirst()) {
379b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    return "";
380b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                }
381b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                return c.getString(0);
382b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania            } finally {
383b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                if (c != null) c.close();
384b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania            }
385b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania        }
386b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static void removeExpiredEntries(Context context) {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ContentResolver resolver = context.getContentResolver();
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            resolver.delete(CONTENT_URI, "_id IN " +
390b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    "(SELECT _id FROM calls ORDER BY " + DEFAULT_SORT_ORDER
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " LIMIT -1 OFFSET 500)", null);
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
395