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