CallLog.java revision 270f930ce8a5b2c3b088d0864d1643665253fbf4
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;
28f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawaimport android.provider.ContactsContract.CommonDataKinds.Phone;
29f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawaimport android.provider.ContactsContract.DataUsageFeedback;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The CallLog provider contains information about placed and received calls.
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class CallLog {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String AUTHORITY = "call_log";
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The content:// style URL for this provider
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Uri CONTENT_URI =
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uri.parse("content://" + AUTHORITY);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Contains the recent calls.
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Calls implements BaseColumns {
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The content:// style URL for this table
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Uri CONTENT_URI =
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uri.parse("content://call_log/calls");
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The content:// style URL for filtering this table on phone numbers
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Uri CONTENT_FILTER_URI =
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uri.parse("content://call_log/calls/filter");
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
619ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * An optional URI parameter which instructs the provider to allow the operation to be
629ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * applied to voicemail records as well.
639ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * <p>
649ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * TYPE: Boolean
659ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * <p>
669ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * Using this parameter with a value of {@code true} will result in a security error if the
679ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * calling package does not have appropriate permissions to access voicemails.
689ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         *
699ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * @hide
709ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         */
719ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda        public static final String ALLOW_VOICEMAILS_PARAM_KEY = "allow_voicemails";
729ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda
739ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda        /**
749ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * Content uri with {@link #ALLOW_VOICEMAILS_PARAM_KEY} set. This can directly be used to
759ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * access call log entries that includes voicemail records.
769ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         *
779ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         * @hide
789ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda         */
799ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda        public static final Uri CONTENT_URI_WITH_VOICEMAIL = CONTENT_URI.buildUpon()
809ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda                .appendQueryParameter(ALLOW_VOICEMAILS_PARAM_KEY, "true")
819ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda                .build();
829ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda
839ef78f00d2950ab7f31a22beaa54bf6ad4206886Flavio Lerda        /**
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The default sort order for this table
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DEFAULT_SORT_ORDER = "date DESC";
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The MIME type of {@link #CONTENT_URI} and {@link #CONTENT_FILTER_URI}
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * providing a directory of calls.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CONTENT_TYPE = "vnd.android.cursor.dir/calls";
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The MIME type of a {@link #CONTENT_URI} sub-directory of a single
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * call.
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/calls";
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
101f6737d3ae0f0ca49112807502cc0a272febf3b35Yusuf T. Mobile         * The type of the call (incoming, outgoing or missed).
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (int)</P>
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String TYPE = "type";
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
106412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        /** Call log type for incoming calls. */
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int INCOMING_TYPE = 1;
108412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        /** Call log type for outgoing calls. */
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int OUTGOING_TYPE = 2;
110412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        /** Call log type for missed calls. */
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int MISSED_TYPE = 3;
112412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        /**
113412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         * Call log type for voicemails.
114412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         * @hide
115412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         */
116412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        public static final int VOICEMAIL_TYPE = 4;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The phone number as the user entered it.
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String NUMBER = "number";
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
125224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * The ISO 3166-1 two letters country code of the country where the
126224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * user received or made the call.
127224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * <P>
128224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * Type: TEXT
129224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * </P>
130224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         *
131224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         * @hide
132224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao         */
133224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao        public static final String COUNTRY_ISO = "countryiso";
134224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao
135224744cc72aa7799fb3e5c505123d09d64d4e0c4Bai Tao        /**
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The date the call occured, in milliseconds since the epoch
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long)</P>
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DATE = "date";
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The duration of the call in seconds
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long)</P>
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DURATION = "duration";
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Whether or not the call has been acknowledged
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (boolean)</P>
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String NEW = "new";
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The cached name associated with the phone number, if it exists.
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This value is not guaranteed to be current, if the contact information
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * associated with this number has changed.
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CACHED_NAME = "name";
160b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The cached number type (Home, Work, etc) associated with the
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * phone number, if it exists.
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This value is not guaranteed to be current, if the contact information
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * associated with this number has changed.
166b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * <P>Type: INTEGER</P>
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CACHED_NUMBER_TYPE = "numbertype";
169b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The cached number label, for a custom number type, associated with the
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * phone number, if it exists.
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * This value is not guaranteed to be current, if the contact information
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * associated with this number has changed.
175b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * <P>Type: TEXT</P>
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String CACHED_NUMBER_LABEL = "numberlabel";
178b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
180412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         * URI of the voicemail entry. Populated only for {@link #VOICEMAIL_TYPE}.
181412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         * <P>Type: TEXT</P>
182412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         * @hide
183412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee         */
184412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        public static final String VOICEMAIL_URI = "voicemail_uri";
185412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee
186412359f9239037503589859f1989cf6aa14491bcDebashish Chatterjee        /**
187651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         * Whether this item has been read or otherwise consumed by the user.
188651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         * <p>
189651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         * Unlike the {@link #NEW} field, which requires the user to have acknowledged the
190651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         * existence of the entry, this implies the user has interacted with the entry.
191651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         * <P>Type: INTEGER (boolean)</P>
192651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda         */
193651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda        public static final String IS_READ = "is_read";
194651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda
195651212d37db9aa6d03b30a8a09a2a44627862eeaFlavio Lerda        /**
196270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         * A geocoded location for the number associated with this call.
197270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         * <p>
198270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         * The string represents a city, state, or country associated with the number.
199270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         * <P>Type: TEXT</P>
200270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         * @hide
201270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda         */
202270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda        public static final String GEOCODED_LOCATION = "geocoded_location";
203270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda
204270f930ce8a5b2c3b088d0864d1643665253fbf4Flavio Lerda        /**
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Adds a call to the call log.
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param ci the CallerInfo object to get the target contact from.  Can be null
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if the contact is unknown.
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param context the context used to get the ContentResolver
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param number the phone number to be added to the calls db
211b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * @param presentation the number presenting rules set by the network for
212105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project         *        "allowed", "payphone", "restricted" or "unknown"
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param callType enumerated values for "incoming", "outgoing", or "missed"
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param start time stamp for the call in milliseconds
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param duration call duration in seconds
216b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         *
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@hide}
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
219b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania        public static Uri addCall(CallerInfo ci, Context context, String number,
220105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                int presentation, int callType, long start, int duration) {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ContentResolver resolver = context.getContentResolver();
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
223e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman            // If this is a private number then set the number to Private, otherwise check
224e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman            // if the number field is empty and set the number to Unavailable
225dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            if (presentation == Connection.PRESENTATION_RESTRICTED) {
226dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                number = CallerInfo.PRIVATE_NUMBER;
227e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman                if (ci != null) ci.name = "";
228dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            } else if (presentation == Connection.PRESENTATION_PAYPHONE) {
229dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                number = CallerInfo.PAYPHONE_NUMBER;
230e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman                if (ci != null) ci.name = "";
231e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman            } else if (TextUtils.isEmpty(number)
232e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman                    || presentation == Connection.PRESENTATION_UNKNOWN) {
233dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                number = CallerInfo.UNKNOWN_NUMBER;
234e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman                if (ci != null) ci.name = "";
235dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            }
236e1dc2baee7e3c5cfc03cc573567c3146da24dab0Pauyl l Berman
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ContentValues values = new ContentValues(5);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(NUMBER, number);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(TYPE, Integer.valueOf(callType));
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(DATE, Long.valueOf(start));
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(DURATION, Long.valueOf(duration));
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            values.put(NEW, Integer.valueOf(1));
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ci != null) {
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(CACHED_NAME, ci.name);
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(CACHED_NUMBER_TYPE, ci.numberType);
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(CACHED_NUMBER_LABEL, ci.numberLabel);
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
249b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((ci != null) && (ci.person_id > 0)) {
251f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                // Update usage information for the number associated with the contact ID.
252f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                // We need to use both the number and the ID for obtaining a data ID since other
253f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                // contacts may have the same number.
254f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa
255f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                final Cursor cursor;
256f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa
257f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                // We should prefer normalized one (probably coming from
258f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                // Phone.NORMALIZED_NUMBER column) first. If it isn't available try others.
259f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                if (ci.normalizedNumber != null) {
260f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    final String normalizedPhoneNumber = ci.normalizedNumber;
261f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    cursor = resolver.query(Phone.CONTENT_URI,
262f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            new String[] { Phone._ID },
263f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            Phone.CONTACT_ID + " =? AND " + Phone.NORMALIZED_NUMBER + " =?",
264f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            new String[] { String.valueOf(ci.person_id), normalizedPhoneNumber},
265f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            null);
266f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                } else {
267f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    final String phoneNumber = ci.phoneNumber != null ? ci.phoneNumber : number;
268f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    cursor = resolver.query(Phone.CONTENT_URI,
269f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            new String[] { Phone._ID },
270f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            Phone.CONTACT_ID + " =? AND " + Phone.NUMBER + " =?",
271f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            new String[] { String.valueOf(ci.person_id), phoneNumber},
272f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            null);
273f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                }
274f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa
275f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                if (cursor != null) {
276f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    try {
277f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                        if (cursor.getCount() > 0 && cursor.moveToFirst()) {
278f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            final Uri feedbackUri = DataUsageFeedback.FEEDBACK_URI.buildUpon()
279f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                                    .appendPath(cursor.getString(0))
280f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                                    .appendQueryParameter(DataUsageFeedback.USAGE_TYPE,
281f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                                                DataUsageFeedback.USAGE_TYPE_CALL)
282f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                                    .build();
283f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                            resolver.update(feedbackUri, new ContentValues(), null, null);
284f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                        }
285f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    } finally {
286f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                        cursor.close();
287f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                    }
288f468591cafb797a494d09bb0dd6adfcc439e7b8cDaisuke Miyakawa                }
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
290b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uri result = resolver.insert(CONTENT_URI, values);
292b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeExpiredEntries(context);
294b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return result;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
297b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
298b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania        /**
299b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * Query the call log database for the last dialed number.
300b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * @param context Used to get the content resolver.
301b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * @return The last phone number dialed (outgoing) or an empty
302b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         * string if none exist yet.
303b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania         */
304b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania        public static String getLastOutgoingCall(Context context) {
305b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania            final ContentResolver resolver = context.getContentResolver();
306b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania            Cursor c = null;
307b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania            try {
308b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                c = resolver.query(
309b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    CONTENT_URI,
310b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    new String[] {NUMBER},
311b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    TYPE + " = " + OUTGOING_TYPE,
312b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    null,
313b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    DEFAULT_SORT_ORDER + " LIMIT 1");
314b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                if (c == null || !c.moveToFirst()) {
315b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    return "";
316b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                }
317b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                return c.getString(0);
318b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania            } finally {
319b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                if (c != null) c.close();
320b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania            }
321b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania        }
322b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static void removeExpiredEntries(Context context) {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ContentResolver resolver = context.getContentResolver();
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            resolver.delete(CONTENT_URI, "_id IN " +
326b8a2aafdef732764bd6b189d035e9f0765bb027aNicolas Catania                    "(SELECT _id FROM calls ORDER BY " + DEFAULT_SORT_ORDER
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " LIMIT -1 OFFSET 500)", null);
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
331