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