1dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee/*
2dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee * Copyright (C) 2013 The Android Open Source Project
3dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee *
4dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee * Licensed under the Apache License, Version 2.0 (the "License");
5dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee * you may not use this file except in compliance with the License.
6dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee * You may obtain a copy of the License at
7dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee *
8dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee *      http://www.apache.org/licenses/LICENSE-2.0
9dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee *
10dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee * Unless required by applicable law or agreed to in writing, software
11dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee * distributed under the License is distributed on an "AS IS" BASIS,
12dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee * See the License for the specific language governing permissions and
14dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee * limitations under the License.
15dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee */
16dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Leepackage com.android.dialer.list;
17dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee
18dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Leeimport android.content.ContentUris;
19dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Leeimport android.content.Context;
20dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Leeimport android.database.Cursor;
21dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Leeimport android.net.Uri;
22dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Leeimport android.provider.ContactsContract;
23dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Leeimport android.telephony.PhoneNumberUtils;
24fc1fed72d6adf5158be271646655056b14d1ccf2Andrew Leeimport android.text.TextUtils;
25dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Leeimport android.util.Log;
26dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee
2792b0e2fc719f925d22d8d77f0b51bb897453c448Paul Soulosimport com.android.contacts.common.CallUtil;
28dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Leeimport com.android.contacts.common.list.ContactListItemView;
29dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Leeimport com.android.dialer.dialpad.SmartDialCursorLoader;
30dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Leeimport com.android.dialer.dialpad.SmartDialNameMatcher;
31dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Leeimport com.android.dialer.dialpad.SmartDialPrefix;
32dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Leeimport com.android.dialer.dialpad.SmartDialMatchPosition;
33dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee
34dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Leeimport java.util.ArrayList;
35dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee
36dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee/**
37dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee * List adapter to display the SmartDial search results.
38dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee */
39e142481570d7fbda5d035555fe217314e396ae90Yorke Leepublic class SmartDialNumberListAdapter extends DialerPhoneNumberListAdapter {
40dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee
41dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee    private static final String TAG = SmartDialNumberListAdapter.class.getSimpleName();
42dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee    private static final boolean DEBUG = false;
43dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee
44dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee    private SmartDialNameMatcher mNameMatcher;
45dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee
46dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee    public SmartDialNumberListAdapter(Context context) {
47dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        super(context);
48e16ffa2f43819d8a393f96f182ea7422c0f5ccf6Andrew Lee        mNameMatcher = new SmartDialNameMatcher("", SmartDialPrefix.getMap());
495b8a5cb6b8e15913bb6faa8f44b4b69a62eff85eAndrew Lee        setShortcutEnabled(SmartDialNumberListAdapter.SHORTCUT_DIRECT_CALL, false);
50e16ffa2f43819d8a393f96f182ea7422c0f5ccf6Andrew Lee
51dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        if (DEBUG) {
52dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee            Log.v(TAG, "Constructing List Adapter");
53dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        }
54dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee    }
55dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee
56dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee    /**
57dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee     * Sets query for the SmartDialCursorLoader.
58dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee     */
59dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee    public void configureLoader(SmartDialCursorLoader loader) {
60dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        if (DEBUG) {
6131a760be9135b5ef05e504dbd1594e1617af0326Jay Shrauner            Log.v(TAG, "Configure Loader with query" + getQueryString());
62dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        }
63dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee
64dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        if (getQueryString() == null) {
65dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee            loader.configureQuery("");
66e16ffa2f43819d8a393f96f182ea7422c0f5ccf6Andrew Lee            mNameMatcher.setQuery("");
67dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        } else {
68dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee            loader.configureQuery(getQueryString());
69e16ffa2f43819d8a393f96f182ea7422c0f5ccf6Andrew Lee            mNameMatcher.setQuery(PhoneNumberUtils.normalizeNumber(getQueryString()));
70dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        }
71dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee    }
72dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee
73dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee    /**
74dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee     * Sets highlight options for a List item in the SmartDial search results.
75dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee     * @param view ContactListItemView where the result will be displayed.
76dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee     * @param cursor Object containing information of the associated List item.
77dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee     */
78dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee    @Override
79dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee    protected void setHighlight(ContactListItemView view, Cursor cursor) {
80dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        view.clearHighlightSequences();
81dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee
8231a760be9135b5ef05e504dbd1594e1617af0326Jay Shrauner        if (mNameMatcher.matches(cursor.getString(PhoneQuery.DISPLAY_NAME))) {
83dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee            final ArrayList<SmartDialMatchPosition> nameMatches = mNameMatcher.getMatchPositions();
84dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee            for (SmartDialMatchPosition match:nameMatches) {
85dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee                view.addNameHighlightSequence(match.start, match.end);
86dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee                if (DEBUG) {
8731a760be9135b5ef05e504dbd1594e1617af0326Jay Shrauner                    Log.v(TAG, cursor.getString(PhoneQuery.DISPLAY_NAME) + " " +
88dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee                            mNameMatcher.getQuery() + " " + String.valueOf(match.start));
89dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee                }
90dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee            }
91dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        }
92dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee
93dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        final SmartDialMatchPosition numberMatch = mNameMatcher.matchesNumber(cursor.getString(
9431a760be9135b5ef05e504dbd1594e1617af0326Jay Shrauner                PhoneQuery.PHONE_NUMBER));
95dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        if (numberMatch != null) {
96dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee            view.addNumberHighlightSequence(numberMatch.start, numberMatch.end);
97dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        }
98dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee    }
99dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee
100dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee    /**
101dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee     * Gets Uri for the list item at the given position.
102dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee     * @param position Location of the data of interest.
103dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee     * @return Data Uri of the entry.
104dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee     */
105dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee    public Uri getDataUri(int position) {
106dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        Cursor cursor = ((Cursor)getItem(position));
107dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        if (cursor != null) {
10831a760be9135b5ef05e504dbd1594e1617af0326Jay Shrauner            long id = cursor.getLong(PhoneQuery.PHONE_ID);
109dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee            return ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, id);
110dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        } else {
111dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee            Log.w(TAG, "Cursor was null in getDataUri() call. Returning null instead.");
112dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee            return null;
113dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee        }
114dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee    }
115fc1fed72d6adf5158be271646655056b14d1ccf2Andrew Lee
116fc1fed72d6adf5158be271646655056b14d1ccf2Andrew Lee    @Override
117fc1fed72d6adf5158be271646655056b14d1ccf2Andrew Lee    public void setQueryString(String queryString) {
118fc1fed72d6adf5158be271646655056b14d1ccf2Andrew Lee        final boolean showNumberShortcuts = !TextUtils.isEmpty(getFormattedQueryString());
119dd39e83aa818350b9c92fb0fd606c1fe09b1f24eYorke Lee        boolean changed = false;
12087dc7309388941ec0017f3ff1aee329364dec484Andrew Lee        changed |= setShortcutEnabled(SHORTCUT_CREATE_NEW_CONTACT, showNumberShortcuts);
1210247a9b7e357c05155081bd4e4bee3333c5179b5Andrew Lee        changed |= setShortcutEnabled(SHORTCUT_ADD_TO_EXISTING_CONTACT, showNumberShortcuts);
122ad3d871e15e615b0dc36045606452c54e94b93f8Andrew Lee        changed |= setShortcutEnabled(SHORTCUT_SEND_SMS_MESSAGE, showNumberShortcuts);
123dd39e83aa818350b9c92fb0fd606c1fe09b1f24eYorke Lee        changed |= setShortcutEnabled(SHORTCUT_MAKE_VIDEO_CALL,
1240927dc6ef623bec56415d087885f6d2607da35f7Andrew Lee                showNumberShortcuts && CallUtil.isVideoEnabled(getContext()));
125dd39e83aa818350b9c92fb0fd606c1fe09b1f24eYorke Lee        if (changed) {
126dd39e83aa818350b9c92fb0fd606c1fe09b1f24eYorke Lee            notifyDataSetChanged();
127dd39e83aa818350b9c92fb0fd606c1fe09b1f24eYorke Lee        }
128fc1fed72d6adf5158be271646655056b14d1ccf2Andrew Lee        super.setQueryString(queryString);
129fc1fed72d6adf5158be271646655056b14d1ccf2Andrew Lee    }
130dfb2eee7d98f8540fd1614db66bb03e8e1f3a26aYorke Lee}
131