CallLog.java revision 6eb262c3515c927df19340b3eee8c74bc9478d16
1a5597fcd411badad50c1345b3eca26453da45bbbJason Sams/*
2a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * Copyright (C) 2006 The Android Open Source Project
3a5597fcd411badad50c1345b3eca26453da45bbbJason Sams *
4a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * you may not use this file except in compliance with the License.
6a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * You may obtain a copy of the License at
7a5597fcd411badad50c1345b3eca26453da45bbbJason Sams *
8a5597fcd411badad50c1345b3eca26453da45bbbJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9a5597fcd411badad50c1345b3eca26453da45bbbJason Sams *
10a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * Unless required by applicable law or agreed to in writing, software
11a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * See the License for the specific language governing permissions and
14a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * limitations under the License.
15a5597fcd411badad50c1345b3eca26453da45bbbJason Sams */
16a5597fcd411badad50c1345b3eca26453da45bbbJason Sams
17a5597fcd411badad50c1345b3eca26453da45bbbJason Sams
18fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukpackage android.provider;
19a5597fcd411badad50c1345b3eca26453da45bbbJason Sams
20fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukimport android.content.ContentResolver;
21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukimport android.content.ContentValues;
22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukimport android.content.Context;
23a5597fcd411badad50c1345b3eca26453da45bbbJason Samsimport android.content.Intent;
24a5597fcd411badad50c1345b3eca26453da45bbbJason Samsimport android.database.Cursor;
25a5597fcd411badad50c1345b3eca26453da45bbbJason Samsimport android.net.Uri;
26a5597fcd411badad50c1345b3eca26453da45bbbJason Samsimport android.provider.ContactsContract.CommonDataKinds.Callable;
27fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukimport android.provider.ContactsContract.CommonDataKinds.Phone;
28a5597fcd411badad50c1345b3eca26453da45bbbJason Samsimport android.provider.ContactsContract.DataUsageFeedback;
29d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchoukimport android.telecomm.PhoneAccountHandle;
30a5597fcd411badad50c1345b3eca26453da45bbbJason Samsimport android.text.TextUtils;
31a5597fcd411badad50c1345b3eca26453da45bbbJason Sams
32a5597fcd411badad50c1345b3eca26453da45bbbJason Samsimport com.android.internal.telephony.CallerInfo;
33afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukimport com.android.internal.telephony.PhoneConstants;
34fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
35fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk/**
36fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk * The CallLog provider contains information about placed and received calls.
37fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk */
385224a27798f89093b13722b41143551a057ce550Alex Sakhartchoukpublic class CallLog {
39fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    public static final String AUTHORITY = "call_log";
40fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
41fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    /**
42fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk     * The content:// style URL for this provider
43a5597fcd411badad50c1345b3eca26453da45bbbJason Sams     */
44a5597fcd411badad50c1345b3eca26453da45bbbJason Sams    public static final Uri CONTENT_URI =
45afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk        Uri.parse("content://" + AUTHORITY);
46afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
47fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    /**
48fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk     * Contains the recent calls.
49afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk     */
50fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    public static class Calls implements BaseColumns {
51fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        /**
52afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         * The content:// style URL for this table
53fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         */
54fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        public static final Uri CONTENT_URI =
55afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                Uri.parse("content://call_log/calls");
56fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
57fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        /**
58afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         * The content:// style URL for filtering this table on phone numbers
59fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         */
60fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        public static final Uri CONTENT_FILTER_URI =
615224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                Uri.parse("content://call_log/calls/filter");
625224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk
635224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk        /**
64a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * Query parameter used to limit the number of call logs returned.
65a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * <p>
66afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         * TYPE: integer
67b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         */
68b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final String LIMIT_PARAM_KEY = "limit";
69b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
70b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        /**
71b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * Query parameter used to specify the starting record to return.
72b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * <p>
73afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         * TYPE: integer
74b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         */
75b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final String OFFSET_PARAM_KEY = "offset";
76383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk
77b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        /**
78afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         * An optional URI parameter which instructs the provider to allow the operation to be
79b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * applied to voicemail records as well.
80b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * <p>
81afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         * TYPE: Boolean
82b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * <p>
83b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * Using this parameter with a value of {@code true} will result in a security error if the
84b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * calling package does not have appropriate permissions to access voicemails.
85b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         *
86b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * @hide
87b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         */
88b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final String ALLOW_VOICEMAILS_PARAM_KEY = "allow_voicemails";
89b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
905224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk        /**
915224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk         * An optional extra used with {@link #CONTENT_TYPE Calls.CONTENT_TYPE} and
925224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk         * {@link Intent#ACTION_VIEW} to specify that the presented list of calls should be
935224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk         * filtered for a particular call type.
945224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk         *
95afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         * Applications implementing a call log UI should check for this extra, and display a
96b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * filtered list of calls based on the specified call type. If not applicable within the
97b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * application's UI, it should be silently ignored.
98b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         *
99b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * <p>
100b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * The following example brings up the call log, showing only missed calls.
101b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * <pre>
102b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * Intent intent = new Intent(Intent.ACTION_VIEW);
103b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * intent.setType(CallLog.Calls.CONTENT_TYPE);
104b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * intent.putExtra(CallLog.Calls.EXTRA_CALL_TYPE_FILTER, CallLog.Calls.MISSED_TYPE);
105b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * startActivity(intent);
106b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * </pre>
107b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * </p>
108b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         */
109b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final String EXTRA_CALL_TYPE_FILTER = "extra_call_type_filter";
110afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
111b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        /**
112b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * Content uri used to access call log entries, including voicemail records. You must have
113b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * the READ_CALL_LOG and WRITE_CALL_LOG permissions to read and write to the call log.
114b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         */
115b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final Uri CONTENT_URI_WITH_VOICEMAIL = CONTENT_URI.buildUpon()
116b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                .appendQueryParameter(ALLOW_VOICEMAILS_PARAM_KEY, "true")
117b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                .build();
118afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
119b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        /**
120b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * The default sort order for this table
121b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         */
122b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final String DEFAULT_SORT_ORDER = "date DESC";
123dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk
124b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        /**
125b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * The MIME type of {@link #CONTENT_URI} and {@link #CONTENT_FILTER_URI}
126b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * providing a directory of calls.
127b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         */
128b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final String CONTENT_TYPE = "vnd.android.cursor.dir/calls";
129afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
130b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        /**
131b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * The MIME type of a {@link #CONTENT_URI} sub-directory of a single
132b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * call.
133b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         */
134b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/calls";
135b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
136b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        /**
137b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * The type of the call (incoming, outgoing or missed).
138afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         * <P>Type: INTEGER (int)</P>
139b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         */
140b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final String TYPE = "type";
141b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
142b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        /** Call log type for incoming calls. */
143dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk        public static final int INCOMING_TYPE = 1;
144b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        /** Call log type for outgoing calls. */
145b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final int OUTGOING_TYPE = 2;
146b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        /** Call log type for missed calls. */
147b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final int MISSED_TYPE = 3;
148b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        /** Call log type for voicemails. */
149afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk        public static final int VOICEMAIL_TYPE = 4;
150a5597fcd411badad50c1345b3eca26453da45bbbJason Sams
151a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        /**
152a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * Bit-mask describing features of the call (e.g. video).
153383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk         *
154a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * <P>Type: INTEGER (int)</P>
155a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         */
156a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        public static final String FEATURES = "features";
157a5597fcd411badad50c1345b3eca26453da45bbbJason Sams
158a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        /** Call had no associated features (e.g. voice-only). */
159a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        public static final int FEATURES_NONE = 0x0;
160fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        /** Call had video. */
161fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        public static final int FEATURES_VIDEO = 0x1;
162fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
163fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        /**
164a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * The phone number as the user entered it.
165a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * <P>Type: TEXT</P>
166a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         */
167fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        public static final String NUMBER = "number";
168afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
169a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        /**
170a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * The number presenting rules set by the network.
171a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         *
172fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * <p>
173fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * Allowed values:
174a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * <ul>
175a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * <li>{@link #PRESENTATION_ALLOWED}</li>
176fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * <li>{@link #PRESENTATION_RESTRICTED}</li>
177fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * <li>{@link #PRESENTATION_UNKNOWN}</li>
178fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * <li>{@link #PRESENTATION_PAYPHONE}</li>
179b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * </ul>
180fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * </p>
181b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         *
182fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * <P>Type: INTEGER</P>
183fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         */
184fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        public static final String NUMBER_PRESENTATION = "presentation";
185fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
186fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        /** Number is allowed to display for caller id. */
187a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        public static final int PRESENTATION_ALLOWED = 1;
188a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        /** Number is blocked by user. */
189383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        public static final int PRESENTATION_RESTRICTED = 2;
190a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        /** Number is not specified or unknown by network. */
191a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        public static final int PRESENTATION_UNKNOWN = 3;
192fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        /** Number is a pay phone. */
193a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        public static final int PRESENTATION_PAYPHONE = 4;
194a5597fcd411badad50c1345b3eca26453da45bbbJason Sams
195a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        /**
196a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * The ISO 3166-1 two letters country code of the country where the
197a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * user received or made the call.
198a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * <P>
199a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * Type: TEXT
200a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * </P>
201a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         */
202fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        public static final String COUNTRY_ISO = "countryiso";
203fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
204383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        /**
205fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * The date the call occured, in milliseconds since the epoch
206a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * <P>Type: INTEGER (long)</P>
207a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         */
208b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final String DATE = "date";
209fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
210a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        /**
211a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * The duration of the call in seconds
212b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * <P>Type: INTEGER (long)</P>
213afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         */
214fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        public static final String DURATION = "duration";
215a5597fcd411badad50c1345b3eca26453da45bbbJason Sams
216fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        /**
217fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * The data usage of the call in bytes.
218a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * <P>Type: INTEGER (long)</P>
219b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         */
220afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk        public static final String DATA_USAGE = "data_usage";
221b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
222b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        /**
223b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * Whether or not the call has been acknowledged
224b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * <P>Type: INTEGER (boolean)</P>
225afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         */
226fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        public static final String NEW = "new";
227a5597fcd411badad50c1345b3eca26453da45bbbJason Sams
228a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        /**
229afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         * The cached name associated with the phone number, if it exists.
230b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * This value is not guaranteed to be current, if the contact information
231b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * associated with this number has changed.
232b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * <P>Type: TEXT</P>
233b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         */
234fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        public static final String CACHED_NAME = "name";
235fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
236fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        /**
237b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * The cached number type (Home, Work, etc) associated with the
238fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * phone number, if it exists.
239b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * This value is not guaranteed to be current, if the contact information
240b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * associated with this number has changed.
241b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * <P>Type: INTEGER</P>
242b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         */
243b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final String CACHED_NUMBER_TYPE = "numbertype";
244b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
245b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        /**
246b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * The cached number label, for a custom number type, associated with the
247b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * phone number, if it exists.
248b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * This value is not guaranteed to be current, if the contact information
249b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * associated with this number has changed.
250b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * <P>Type: TEXT</P>
251b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         */
252b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final String CACHED_NUMBER_LABEL = "numberlabel";
253b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
254b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        /**
255b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * URI of the voicemail entry. Populated only for {@link #VOICEMAIL_TYPE}.
256b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * <P>Type: TEXT</P>
257b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         */
258b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final String VOICEMAIL_URI = "voicemail_uri";
259b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
260b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        /**
261b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * Whether this item has been read or otherwise consumed by the user.
262b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * <p>
263b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * Unlike the {@link #NEW} field, which requires the user to have acknowledged the
264b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * existence of the entry, this implies the user has interacted with the entry.
265b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * <P>Type: INTEGER (boolean)</P>
266b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         */
267b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final String IS_READ = "is_read";
268b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
269b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        /**
270b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * A geocoded location for the number associated with this call.
271b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * <p>
272b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * The string represents a city, state, or country associated with the number.
273b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * <P>Type: TEXT</P>
274b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         */
275b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        public static final String GEOCODED_LOCATION = "geocoded_location";
276fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
277a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        /**
278afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         * The cached URI to look up the contact associated with the phone number, if it exists.
279b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * This value may not be current if the contact information associated with this number
280b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * has changed.
281b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * <P>Type: TEXT</P>
282a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         */
283a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        public static final String CACHED_LOOKUP_URI = "lookup_uri";
284afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
285afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk        /**
286fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * The cached phone number of the contact which matches this entry, if it exists.
287fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * This value may not be current if the contact information associated with this number
288a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * has changed.
289afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         * <P>Type: TEXT</P>
290fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         */
291fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        public static final String CACHED_MATCHED_NUMBER = "matched_number";
292a5597fcd411badad50c1345b3eca26453da45bbbJason Sams
293a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        /**
294fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * The cached normalized(E164) version of the phone number, if it exists.
295afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         * This value may not be current if the contact information associated with this number
296fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * has changed.
297fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * <P>Type: TEXT</P>
298b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams         */
299b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams        public static final String CACHED_NORMALIZED_NUMBER = "normalized_number";
300fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
301fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        /**
302fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * The cached photo id of the picture associated with the phone number, if it exists.
303fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * This value may not be current if the contact information associated with this number
304fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * has changed.
305fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * <P>Type: INTEGER (long)</P>
306fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         */
307fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        public static final String CACHED_PHOTO_ID = "photo_id";
308fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
309afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk        /**
310b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * The cached phone number, formatted with formatting rules based on the country the
311fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * user was in when the call was made or received.
312afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         * This value is not guaranteed to be present, and may not be current if the contact
313fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * information associated with this number
314b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk         * has changed.
315afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         * <P>Type: TEXT</P>
316fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         */
317fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        public static final String CACHED_FORMATTED_NUMBER = "formatted_number";
318b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
319b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk        // Note: PHONE_ACCOUNT_* constant values are "subscription_*" due to a historic naming
320b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams        // that was encoded into call log databases.
321a5597fcd411badad50c1345b3eca26453da45bbbJason Sams
322a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        /**
323fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * The component name of the account in string form.
324fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * <P>Type: TEXT</P>
325fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         */
326a5597fcd411badad50c1345b3eca26453da45bbbJason Sams        public static final String PHONE_ACCOUNT_COMPONENT_NAME = "subscription_component_name";
327fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
328fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        /**
329fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * The identifier of a account that is unique to a specified component.
330a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * <P>Type: TEXT</P>
331fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         */
332fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        public static final String PHONE_ACCOUNT_ID = "subscription_id";
333a5597fcd411badad50c1345b3eca26453da45bbbJason Sams
334fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        /**
335fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * Adds a call to the call log.
336fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         *
337a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * @param ci the CallerInfo object to get the target contact from.  Can be null
338fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * if the contact is unknown.
339b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams         * @param context the context used to get the ContentResolver
340fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * @param number the phone number to be added to the calls db
341a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * @param presentation enum value from PhoneConstants.PRESENTATION_xxx, which
342afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         *        is set by the network and denotes the number presenting rules for
343fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         *        "allowed", "payphone", "restricted" or "unknown"
344fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * @param callType enumerated values for "incoming", "outgoing", or "missed"
345fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * @param features features of the call (e.g. Video).
346a5597fcd411badad50c1345b3eca26453da45bbbJason Sams         * @param account The account object describing the provider of the call
347fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * @param start time stamp for the call in milliseconds
348fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * @param duration call duration in seconds
349fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * @param dataUsage data usage for the call in bytes, null if data usage was not tracked for
350fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         *                  the call.
351afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk         *
352fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         * {@hide}
353fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk         */
354afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk        public static Uri addCall(CallerInfo ci, Context context, String number,
355fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                int presentation, int callType, int features, PhoneAccountHandle account,
356fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk                long start, int duration, Long dataUsage) {
357a5597fcd411badad50c1345b3eca26453da45bbbJason Sams            final ContentResolver resolver = context.getContentResolver();
358fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            int numberPresentation = PRESENTATION_ALLOWED;
359b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
360fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            // Remap network specified number presentation types
361fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            // PhoneConstants.PRESENTATION_xxx to calllog number presentation types
362b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk            // Calls.PRESENTATION_xxx, in order to insulate the persistent calllog
363fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            // from any future radio changes.
364fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk            // If the number field is empty set the presentation type to Unknown.
365b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk            if (presentation == PhoneConstants.PRESENTATION_RESTRICTED) {
366b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                numberPresentation = PRESENTATION_RESTRICTED;
367a5597fcd411badad50c1345b3eca26453da45bbbJason Sams            } else if (presentation == PhoneConstants.PRESENTATION_PAYPHONE) {
368a5597fcd411badad50c1345b3eca26453da45bbbJason Sams                numberPresentation = PRESENTATION_PAYPHONE;
369afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk            } else if (TextUtils.isEmpty(number)
370dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk                    || presentation == PhoneConstants.PRESENTATION_UNKNOWN) {
371afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                numberPresentation = PRESENTATION_UNKNOWN;
372dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk            }
373dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk            if (numberPresentation != PRESENTATION_ALLOWED) {
374dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk                number = "";
375dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk                if (ci != null) {
376dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk                    ci.name = "";
377dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk                }
378dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk            }
379dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk
380dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk            // account information
381dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk            String accountComponentString = null;
382dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk            String accountId = null;
383afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk            if (account != null) {
384b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                accountComponentString = account.getComponentName().flattenToString();
385b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                accountId = account.getId();
386afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk            }
387b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
388afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk            ContentValues values = new ContentValues(6);
389b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
390b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk            values.put(NUMBER, number);
391b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk            values.put(NUMBER_PRESENTATION, Integer.valueOf(numberPresentation));
392b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk            values.put(TYPE, Integer.valueOf(callType));
393afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk            values.put(FEATURES, features);
394b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk            values.put(DATE, Long.valueOf(start));
395b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk            values.put(DURATION, Long.valueOf(duration));
396afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk            if (dataUsage != null) {
397b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                values.put(DATA_USAGE, dataUsage);
398b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk            }
399b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk            values.put(PHONE_ACCOUNT_COMPONENT_NAME, accountComponentString);
400b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk            values.put(PHONE_ACCOUNT_ID, accountId);
401b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk            values.put(NEW, Integer.valueOf(1));
402afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk            if (callType == MISSED_TYPE) {
403b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                values.put(IS_READ, Integer.valueOf(0));
404b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk            }
405b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk            if (ci != null) {
406b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                values.put(CACHED_NAME, ci.name);
407afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                values.put(CACHED_NUMBER_TYPE, ci.numberType);
408b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                values.put(CACHED_NUMBER_LABEL, ci.numberLabel);
409b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk            }
410b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
411b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk            if ((ci != null) && (ci.contactIdOrZero > 0)) {
412b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                // Update usage information for the number associated with the contact ID.
413b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                // We need to use both the number and the ID for obtaining a data ID since other
4145224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                // contacts may have the same number.
415b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
416b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                final Cursor cursor;
417b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk
418b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                // We should prefer normalized one (probably coming from
419b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                // Phone.NORMALIZED_NUMBER column) first. If it isn't available try others.
420dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk                if (ci.normalizedNumber != null) {
421b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                    final String normalizedPhoneNumber = ci.normalizedNumber;
422b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                    cursor = resolver.query(Phone.CONTENT_URI,
423b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                            new String[] { Phone._ID },
424dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk                            Phone.CONTACT_ID + " =? AND " + Phone.NORMALIZED_NUMBER + " =?",
425b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                            new String[] { String.valueOf(ci.contactIdOrZero),
426b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk                                    normalizedPhoneNumber},
4275224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                            null);
4285224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                } else {
4295224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                    final String phoneNumber = ci.phoneNumber != null ? ci.phoneNumber : number;
4305224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                    cursor = resolver.query(
4315224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                            Uri.withAppendedPath(Callable.CONTENT_FILTER_URI,
4325224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                                    Uri.encode(phoneNumber)),
4335224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                            new String[] { Phone._ID },
4345224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                            Phone.CONTACT_ID + " =?",
4355224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                            new String[] { String.valueOf(ci.contactIdOrZero) },
4365224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                            null);
4375224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                }
4385224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk
4395224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                if (cursor != null) {
4405224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                    try {
4415224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                        if (cursor.getCount() > 0 && cursor.moveToFirst()) {
4425224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                            final Uri feedbackUri = DataUsageFeedback.FEEDBACK_URI.buildUpon()
4435224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                                    .appendPath(cursor.getString(0))
4445224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                                    .appendQueryParameter(DataUsageFeedback.USAGE_TYPE,
4455224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                                                DataUsageFeedback.USAGE_TYPE_CALL)
4465224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                                    .build();
4475224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                            resolver.update(feedbackUri, new ContentValues(), null, null);
4485224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                        }
4495224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                    } finally {
4505224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                        cursor.close();
4515224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                    }
4525224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk                }
4535224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk            }
4545224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk
4555224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk            Uri result = resolver.insert(CONTENT_URI, values);
4565224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk
4575224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk            removeExpiredEntries(context);
4585224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk
459            return result;
460        }
461
462        /**
463         * Query the call log database for the last dialed number.
464         * @param context Used to get the content resolver.
465         * @return The last phone number dialed (outgoing) or an empty
466         * string if none exist yet.
467         */
468        public static String getLastOutgoingCall(Context context) {
469            final ContentResolver resolver = context.getContentResolver();
470            Cursor c = null;
471            try {
472                c = resolver.query(
473                    CONTENT_URI,
474                    new String[] {NUMBER},
475                    TYPE + " = " + OUTGOING_TYPE,
476                    null,
477                    DEFAULT_SORT_ORDER + " LIMIT 1");
478                if (c == null || !c.moveToFirst()) {
479                    return "";
480                }
481                return c.getString(0);
482            } finally {
483                if (c != null) c.close();
484            }
485        }
486
487        private static void removeExpiredEntries(Context context) {
488            final ContentResolver resolver = context.getContentResolver();
489            resolver.delete(CONTENT_URI, "_id IN " +
490                    "(SELECT _id FROM calls ORDER BY " + DEFAULT_SORT_ORDER
491                    + " LIMIT -1 OFFSET 500)", null);
492        }
493    }
494}
495