1538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project/* 2538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * 4538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * you may not use this file except in compliance with the License. 6538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * You may obtain a copy of the License at 7538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * 8538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * 10538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * See the License for the specific language governing permissions and 14538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * limitations under the License. 15538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 16538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 17538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectpackage com.android.voicedialer; 18538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 19538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.app.Activity; 20538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.database.Cursor; 210183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikovimport android.database.DatabaseUtils; 220183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Phone; 23538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.provider.CallLog; 24538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport android.util.Log; 25538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport java.io.BufferedReader; 26538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport java.io.File; 27538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport java.io.FileReader; 28538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport java.io.IOException; 29538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport java.util.ArrayList; 30538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectimport java.util.List; 31538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 32538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 33538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project/** 34538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * This class represents a person who may be called via the VoiceDialer app. 35538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * The person has a name and a list of phones (home, mobile, work, other). 36538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 37538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Projectpublic class VoiceContact { 38538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project private static final String TAG = "VoiceContact"; 390183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 40538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project /** 41538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Corresponding row doesn't exist. 42538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 43538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public static final long ID_UNDEFINED = -1; 44538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 45538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public final String mName; 460183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov public final long mContactId; 47538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public final long mPrimaryId; 48538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public final long mHomeId; 49538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public final long mMobileId; 50538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public final long mWorkId; 51538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public final long mOtherId; 5285a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa /** 5385a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa * Id for a phone number which doesn't belong to any other ids stored above. 5485a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa */ 5585a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa public final long mFallbackId; 56538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 57538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project /** 58538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * Constructor. 590183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov * 60538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * @param name person's name. 610183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov * @param contactId ID in person table. 62538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * @param primaryId primary ID in phone table. 63538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * @param homeId home ID in phone table. 64538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * @param mobileId mobile ID in phone table. 65538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * @param workId work ID in phone table. 66538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * @param otherId other ID in phone table. 67538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 680183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov private VoiceContact(String name, long contactId, long primaryId, 6985a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa long homeId, long mobileId, long workId, long otherId, long fallbackId) { 70538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mName = name; 710183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov mContactId = contactId; 72538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mPrimaryId = primaryId; 73538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mHomeId = homeId; 74538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mMobileId = mobileId; 75538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mWorkId = workId; 76538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mOtherId = otherId; 7785a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa mFallbackId = fallbackId; 78538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 790183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 80538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project @Override 81538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public int hashCode() { 82538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project final int LARGE_PRIME = 1610612741; 83538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project int hash = 0; 840183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov hash = LARGE_PRIME * (hash + (int)mContactId); 85538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project hash = LARGE_PRIME * (hash + (int)mPrimaryId); 86538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project hash = LARGE_PRIME * (hash + (int)mHomeId); 87538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project hash = LARGE_PRIME * (hash + (int)mMobileId); 88538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project hash = LARGE_PRIME * (hash + (int)mWorkId); 89538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project hash = LARGE_PRIME * (hash + (int)mOtherId); 9085a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa hash = LARGE_PRIME * (hash + (int)mFallbackId); 91538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return mName.hashCode() + hash; 92538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 930183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 94538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project @Override 95538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public String toString() { 96538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return "mName=" + mName 970183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov + " mPersonId=" + mContactId 98538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project + " mPrimaryId=" + mPrimaryId 99538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project + " mHomeId=" + mHomeId 100538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project + " mMobileId=" + mMobileId 101538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project + " mWorkId=" + mWorkId 10285a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa + " mOtherId=" + mOtherId 10385a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa + " mFallbackId=" + mFallbackId; 104538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 1050183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 106538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project /** 107538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * @param activity The VoiceDialerActivity instance. 108538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * @return List of {@link VoiceContact} from 109538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * the contact list content provider. 110538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 111538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public static List<VoiceContact> getVoiceContacts(Activity activity) { 112d3694c0511a27f1fb44fa2760ee0d4562ffe1066Joe Onorato if (false) Log.d(TAG, "VoiceContact.getVoiceContacts"); 1130183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 114538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project List<VoiceContact> contacts = new ArrayList<VoiceContact>(); 115538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 116538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project String[] phonesProjection = new String[] { 1170183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov Phone._ID, 1180183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov Phone.TYPE, 1190183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov Phone.IS_PRIMARY, 120538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // TODO: handle type != 0,1,2, and use LABEL 1210183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov Phone.LABEL, 1220183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov Phone.DISPLAY_NAME, 1230183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov Phone.CONTACT_ID, 124538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project }; 1250183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 1260183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov // Table is sorted by number of times contacted and name. If we cannot fit all contacts 1270183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov // in the recognizer, we will at least have the commonly used ones. 128538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project Cursor cursor = activity.getContentResolver().query( 1290183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov Phone.CONTENT_URI, phonesProjection, 1300183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov Phone.NUMBER + " NOT NULL", null, 13185a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa Phone.LAST_TIME_CONTACTED + " DESC, " 13285a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa + Phone.DISPLAY_NAME + " ASC, " 13385a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa + Phone._ID + " DESC"); 1340183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 1350183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov final int phoneIdColumn = cursor.getColumnIndexOrThrow(Phone._ID); 1360183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov final int typeColumn = cursor.getColumnIndexOrThrow(Phone.TYPE); 1370183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov final int isPrimaryColumn = cursor.getColumnIndexOrThrow(Phone.IS_PRIMARY); 138e5258ff473c778362d612389db79b740e9c35911Martin Hibdon final int labelColumn = cursor.getColumnIndexOrThrow(Phone.LABEL); 1390183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov final int nameColumn = cursor.getColumnIndexOrThrow(Phone.DISPLAY_NAME); 1400183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov final int personIdColumn = cursor.getColumnIndexOrThrow(Phone.CONTACT_ID); 1410183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 142538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // pieces of next VoiceContact 143538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project String name = null; 144538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project long personId = ID_UNDEFINED; 145538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project long primaryId = ID_UNDEFINED; 146538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project long homeId = ID_UNDEFINED; 147538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project long mobileId = ID_UNDEFINED; 148538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project long workId = ID_UNDEFINED; 149538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project long otherId = ID_UNDEFINED; 15085a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa long fallbackId = ID_UNDEFINED; 151538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 152538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // loop over phone table 1538c7aac011e578450a6837ed4ba55b1167c17bf46Martin Hibdon for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { 154538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project long phoneIdAtCursor = cursor.getLong(phoneIdColumn); 155538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project int typeAtCursor = cursor.getInt(typeColumn); 156538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project long isPrimaryAtCursor = cursor.getLong(isPrimaryColumn); 157538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project String labelAtCursor = cursor.getString(labelColumn); 158538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project String nameAtCursor = cursor.getString(nameColumn); 159538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project long personIdAtCursor = cursor.getLong(personIdColumn); 160538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 161538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project /* 162d3694c0511a27f1fb44fa2760ee0d4562ffe1066Joe Onorato if (false) { 163538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project Log.d(TAG, "phoneId=" + phoneIdAtCursor 164538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project + " type=" + typeAtCursor 165538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project + " isPrimary=" + isPrimaryAtCursor 166538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project + " label=" + labelAtCursor 167538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project + " name=" + nameAtCursor 168538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project + " personId=" + personIdAtCursor 169538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project ); 170538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 171538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 1720183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 173538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // encountered a new name, so generate current VoiceContact 174538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (name != null && !name.equals(nameAtCursor)) { 175538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project contacts.add(new VoiceContact(name, personId, primaryId, 17685a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa homeId, mobileId, workId, otherId, fallbackId)); 177538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project name = null; 178538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 1790183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 180538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // start accumulating pieces for a new VoiceContact 181538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (name == null) { 182538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project name = nameAtCursor; 183538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project personId = personIdAtCursor; 184538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project primaryId = ID_UNDEFINED; 185538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project homeId = ID_UNDEFINED; 186538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mobileId = ID_UNDEFINED; 187538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project workId = ID_UNDEFINED; 188538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project otherId = ID_UNDEFINED; 18985a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa fallbackId = ID_UNDEFINED; 190538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 1910183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 192538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // if labeled, then patch to HOME/MOBILE/WORK/OTHER 1930183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov if (typeAtCursor == Phone.TYPE_CUSTOM && 194538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project labelAtCursor != null) { 195538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project String label = labelAtCursor.toLowerCase(); 196538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (label.contains("home") || label.contains("house")) { 1970183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov typeAtCursor = Phone.TYPE_HOME; 198538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 199538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project else if (label.contains("mobile") || label.contains("cell")) { 2000183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov typeAtCursor = Phone.TYPE_MOBILE; 201538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 202538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project else if (label.contains("work") || label.contains("office")) { 2030183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov typeAtCursor = Phone.TYPE_WORK; 204538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 205538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project else if (label.contains("other")) { 2060183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov typeAtCursor = Phone.TYPE_OTHER; 207538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 208538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 2090183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 21085a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa boolean idAtCursorWasUsed = false; 211538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // save the home, mobile, or work phone id 212538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project switch (typeAtCursor) { 2130183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov case Phone.TYPE_HOME: 214538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project homeId = phoneIdAtCursor; 215538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (isPrimaryAtCursor != 0) { 216538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project primaryId = phoneIdAtCursor; 217538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 21885a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa idAtCursorWasUsed = true; 219538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project break; 2200183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov case Phone.TYPE_MOBILE: 221538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project mobileId = phoneIdAtCursor; 222538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (isPrimaryAtCursor != 0) { 223538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project primaryId = phoneIdAtCursor; 224538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 22585a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa idAtCursorWasUsed = true; 226538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project break; 2270183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov case Phone.TYPE_WORK: 228538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project workId = phoneIdAtCursor; 229538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (isPrimaryAtCursor != 0) { 230538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project primaryId = phoneIdAtCursor; 231538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 23285a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa idAtCursorWasUsed = true; 233538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project break; 2340183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov case Phone.TYPE_OTHER: 235538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project otherId = phoneIdAtCursor; 236538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (isPrimaryAtCursor != 0) { 237538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project primaryId = phoneIdAtCursor; 238538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 23985a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa idAtCursorWasUsed = true; 240538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project break; 241538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 24285a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa 24385a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa if (fallbackId == ID_UNDEFINED && !idAtCursorWasUsed) { 24485a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa fallbackId = phoneIdAtCursor; 24585a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa } 246538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 2470183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 248538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // generate the last VoiceContact 249538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (name != null) { 250538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project contacts.add(new VoiceContact(name, personId, primaryId, 25185a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa homeId, mobileId, workId, otherId, fallbackId)); 252538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 2530183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 254538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // clean up cursor 255538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project cursor.close(); 256538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 257d3694c0511a27f1fb44fa2760ee0d4562ffe1066Joe Onorato if (false) Log.d(TAG, "VoiceContact.getVoiceContacts " + contacts.size()); 2580183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 259538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return contacts; 260538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 2610183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 262538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project /** 263538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * @param contactsFile File containing a list of names, 264538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * one per line. 265538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * @return a List of {@link VoiceContact} in a File. 266538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 267538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public static List<VoiceContact> getVoiceContactsFromFile(File contactsFile) { 268d3694c0511a27f1fb44fa2760ee0d4562ffe1066Joe Onorato if (false) Log.d(TAG, "getVoiceContactsFromFile " + contactsFile); 269538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 270538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project List<VoiceContact> contacts = new ArrayList<VoiceContact>(); 271538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 272538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project // read from a file 273538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project BufferedReader br = null; 274538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project try { 275538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project br = new BufferedReader(new FileReader(contactsFile), 8192); 276538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project String name; 277538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project for (int id = 1; (name = br.readLine()) != null; id++) { 278538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project contacts.add(new VoiceContact(name, id, ID_UNDEFINED, 27985a421c6d6bf1fdbbee134d99c1a7450b00ce8fcDaisuke Miyakawa ID_UNDEFINED, ID_UNDEFINED, ID_UNDEFINED, ID_UNDEFINED, ID_UNDEFINED)); 280538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 281538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 282538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project catch (IOException e) { 283d3694c0511a27f1fb44fa2760ee0d4562ffe1066Joe Onorato if (false) Log.d(TAG, "getVoiceContactsFromFile failed " + e); 284538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 285538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project finally { 286538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project try { 287538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project br.close(); 288538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } catch (IOException e) { 289d3694c0511a27f1fb44fa2760ee0d4562ffe1066Joe Onorato if (false) Log.d(TAG, "getVoiceContactsFromFile failed during close " + e); 290538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 291538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 292538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 293d3694c0511a27f1fb44fa2760ee0d4562ffe1066Joe Onorato if (false) Log.d(TAG, "getVoiceContactsFromFile " + contacts.size()); 294538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 295538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return contacts; 296538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 2970183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 298538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project /** 299538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * @param activity The VoiceDialerActivity instance. 300538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project * @return String of last number dialed. 301538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project */ 302538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project public static String redialNumber(Activity activity) { 303538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project Cursor cursor = activity.getContentResolver().query( 304538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project CallLog.Calls.CONTENT_URI, 305538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project new String[] { CallLog.Calls.NUMBER }, 306538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project CallLog.Calls.TYPE + "=" + CallLog.Calls.OUTGOING_TYPE, 307538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project null, 308538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project CallLog.Calls.DEFAULT_SORT_ORDER + " LIMIT 1"); 309538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project String number = null; 310538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project if (cursor.getCount() >= 1) { 311538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project cursor.moveToNext(); 312538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project int column = cursor.getColumnIndexOrThrow(CallLog.Calls.NUMBER); 313538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project number = cursor.getString(column); 314538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 315538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project cursor.close(); 3160183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 317d3694c0511a27f1fb44fa2760ee0d4562ffe1066Joe Onorato if (false) Log.d(TAG, "redialNumber " + number); 3180183a55431caad22e504cea07b76f182822bb3afDmitri Plotnikov 319538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project return number; 320538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project } 321538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project 322538879a6f24ff7305e66d719e751b5d612029bf3The Android Open Source Project} 323