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