1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.dialer.app.list;
17
18import android.content.Context;
19import android.database.Cursor;
20import android.support.annotation.NonNull;
21import android.telephony.PhoneNumberUtils;
22import android.text.TextUtils;
23import android.util.Log;
24import com.android.contacts.common.list.ContactListItemView;
25import com.android.dialer.app.dialpad.SmartDialCursorLoader;
26import com.android.dialer.smartdial.SmartDialMatchPosition;
27import com.android.dialer.smartdial.SmartDialNameMatcher;
28import com.android.dialer.smartdial.SmartDialPrefix;
29import com.android.dialer.util.CallUtil;
30import java.util.ArrayList;
31
32/** List adapter to display the SmartDial search results. */
33public class SmartDialNumberListAdapter extends DialerPhoneNumberListAdapter {
34
35  private static final String TAG = SmartDialNumberListAdapter.class.getSimpleName();
36  private static final boolean DEBUG = false;
37
38  @NonNull private final SmartDialNameMatcher mNameMatcher;
39
40  public SmartDialNumberListAdapter(Context context) {
41    super(context);
42    mNameMatcher = new SmartDialNameMatcher("", SmartDialPrefix.getMap());
43    setShortcutEnabled(SmartDialNumberListAdapter.SHORTCUT_DIRECT_CALL, false);
44
45    if (DEBUG) {
46      Log.v(TAG, "Constructing List Adapter");
47    }
48  }
49
50  /** Sets query for the SmartDialCursorLoader. */
51  public void configureLoader(SmartDialCursorLoader loader) {
52    if (DEBUG) {
53      Log.v(TAG, "Configure Loader with query" + getQueryString());
54    }
55
56    if (getQueryString() == null) {
57      loader.configureQuery("");
58      mNameMatcher.setQuery("");
59    } else {
60      loader.configureQuery(getQueryString());
61      mNameMatcher.setQuery(PhoneNumberUtils.normalizeNumber(getQueryString()));
62    }
63  }
64
65  /**
66   * Sets highlight options for a List item in the SmartDial search results.
67   *
68   * @param view ContactListItemView where the result will be displayed.
69   * @param cursor Object containing information of the associated List item.
70   */
71  @Override
72  protected void setHighlight(ContactListItemView view, Cursor cursor) {
73    view.clearHighlightSequences();
74
75    if (mNameMatcher.matches(cursor.getString(PhoneQuery.DISPLAY_NAME))) {
76      final ArrayList<SmartDialMatchPosition> nameMatches = mNameMatcher.getMatchPositions();
77      for (SmartDialMatchPosition match : nameMatches) {
78        view.addNameHighlightSequence(match.start, match.end);
79        if (DEBUG) {
80          Log.v(
81              TAG,
82              cursor.getString(PhoneQuery.DISPLAY_NAME)
83                  + " "
84                  + mNameMatcher.getQuery()
85                  + " "
86                  + String.valueOf(match.start));
87        }
88      }
89    }
90
91    final SmartDialMatchPosition numberMatch =
92        mNameMatcher.matchesNumber(cursor.getString(PhoneQuery.PHONE_NUMBER));
93    if (numberMatch != null) {
94      view.addNumberHighlightSequence(numberMatch.start, numberMatch.end);
95    }
96  }
97
98  @Override
99  public void setQueryString(String queryString) {
100    final boolean showNumberShortcuts = !TextUtils.isEmpty(getFormattedQueryString());
101    boolean changed = false;
102    changed |= setShortcutEnabled(SHORTCUT_CREATE_NEW_CONTACT, showNumberShortcuts);
103    changed |= setShortcutEnabled(SHORTCUT_ADD_TO_EXISTING_CONTACT, showNumberShortcuts);
104    changed |= setShortcutEnabled(SHORTCUT_SEND_SMS_MESSAGE, showNumberShortcuts);
105    changed |=
106        setShortcutEnabled(
107            SHORTCUT_MAKE_VIDEO_CALL, showNumberShortcuts && CallUtil.isVideoEnabled(getContext()));
108    if (changed) {
109      notifyDataSetChanged();
110    }
111    super.setQueryString(queryString);
112  }
113
114  public void setShowEmptyListForNullQuery(boolean show) {
115    mNameMatcher.setShouldMatchEmptyQuery(!show);
116  }
117}
118