1e142481570d7fbda5d035555fe217314e396ae90Yorke Leepackage com.android.dialer.list;
2e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
3e142481570d7fbda5d035555fe217314e396ae90Yorke Leeimport android.content.Context;
4e142481570d7fbda5d035555fe217314e396ae90Yorke Leeimport android.content.res.Resources;
5e142481570d7fbda5d035555fe217314e396ae90Yorke Leeimport android.telephony.PhoneNumberUtils;
6e142481570d7fbda5d035555fe217314e396ae90Yorke Leeimport android.view.View;
7e142481570d7fbda5d035555fe217314e396ae90Yorke Leeimport android.view.ViewGroup;
8e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
9e142481570d7fbda5d035555fe217314e396ae90Yorke Leeimport com.android.contacts.common.GeoUtil;
10e142481570d7fbda5d035555fe217314e396ae90Yorke Leeimport com.android.contacts.common.list.ContactListItemView;
11e142481570d7fbda5d035555fe217314e396ae90Yorke Leeimport com.android.contacts.common.list.PhoneNumberListAdapter;
12e142481570d7fbda5d035555fe217314e396ae90Yorke Leeimport com.android.dialer.R;
13e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
14e142481570d7fbda5d035555fe217314e396ae90Yorke Lee/**
15e142481570d7fbda5d035555fe217314e396ae90Yorke Lee * {@link PhoneNumberListAdapter} with the following added shortcuts, that are displayed as list
16e142481570d7fbda5d035555fe217314e396ae90Yorke Lee * items:
17e142481570d7fbda5d035555fe217314e396ae90Yorke Lee * 1) Directly calling the phone number query
18e142481570d7fbda5d035555fe217314e396ae90Yorke Lee * 2) Adding the phone number query to a contact
19e142481570d7fbda5d035555fe217314e396ae90Yorke Lee *
20e142481570d7fbda5d035555fe217314e396ae90Yorke Lee * These shortcuts can be enabled or disabled to toggle whether or not they show up in the
21e142481570d7fbda5d035555fe217314e396ae90Yorke Lee * list.
22e142481570d7fbda5d035555fe217314e396ae90Yorke Lee */
23e142481570d7fbda5d035555fe217314e396ae90Yorke Leepublic class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter {
24e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
25e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    private String mFormattedQueryString;
26e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    private String mCountryIso;
27e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
28e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    public final static int SHORTCUT_INVALID = -1;
29e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    public final static int SHORTCUT_DIRECT_CALL = 0;
30e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    public final static int SHORTCUT_ADD_NUMBER_TO_CONTACTS = 1;
31e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
32604d48099cd8e0bcf2f992237082600837630038Yorke Lee    public final static int SHORTCUT_COUNT = 2;
33e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
34e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    private final boolean[] mShortcutEnabled = new boolean[SHORTCUT_COUNT];
35e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
36e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    public DialerPhoneNumberListAdapter(Context context) {
37e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        super(context);
38e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
39e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        mCountryIso = GeoUtil.getCurrentCountryIso(context);
40e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
41e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        // Enable all shortcuts by default
42e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        for (int i = 0; i < mShortcutEnabled.length; i++) {
43e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            mShortcutEnabled[i] = true;
44e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        }
45e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    }
46e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
47e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    @Override
48e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    public int getCount() {
49e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        return super.getCount() + getShortcutCount();
50e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    }
51e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
52e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    /**
53e142481570d7fbda5d035555fe217314e396ae90Yorke Lee     * @return The number of enabled shortcuts. Ranges from 0 to a maximum of SHORTCUT_COUNT
54e142481570d7fbda5d035555fe217314e396ae90Yorke Lee     */
55e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    public int getShortcutCount() {
56e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        int count = 0;
57e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        for (int i = 0; i < mShortcutEnabled.length; i++) {
58e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            if (mShortcutEnabled[i]) count++;
59e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        }
60e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        return count;
61e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    }
62e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
63e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    @Override
64e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    public int getItemViewType(int position) {
65e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        final int shortcut = getShortcutTypeFromPosition(position);
66e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        if (shortcut >= 0) {
67e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            // shortcutPos should always range from 1 to SHORTCUT_COUNT
68e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            return super.getViewTypeCount() + shortcut;
69e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        } else {
70e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            return super.getItemViewType(position);
71e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        }
72e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    }
73e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
74e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    @Override
75e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    public int getViewTypeCount() {
76e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        // Number of item view types in the super implementation + 2 for the 2 new shortcuts
77e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        return super.getViewTypeCount() + SHORTCUT_COUNT;
78e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    }
79e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
80e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    @Override
81e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    public View getView(int position, View convertView, ViewGroup parent) {
82e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        final int shortcutType = getShortcutTypeFromPosition(position);
83e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        if (shortcutType >= 0) {
84e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            if (convertView != null) {
85e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                assignShortcutToView((ContactListItemView) convertView, shortcutType);
86e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                return convertView;
87e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            } else {
88e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                final ContactListItemView v = new ContactListItemView(getContext(), null);
89e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                assignShortcutToView(v, shortcutType);
90e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                return v;
91e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            }
92e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        } else {
93e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            return super.getView(position, convertView, parent);
94e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        }
95e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    }
96e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
97e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    /**
98e142481570d7fbda5d035555fe217314e396ae90Yorke Lee     * @param position The position of the item
99e142481570d7fbda5d035555fe217314e396ae90Yorke Lee     * @return The enabled shortcut type matching the given position if the item is a
100e142481570d7fbda5d035555fe217314e396ae90Yorke Lee     * shortcut, -1 otherwise
101e142481570d7fbda5d035555fe217314e396ae90Yorke Lee     */
102e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    public int getShortcutTypeFromPosition(int position) {
103e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        int shortcutCount = position - super.getCount();
104e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        if (shortcutCount >= 0) {
105e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            // Iterate through the array of shortcuts, looking only for shortcuts where
106e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            // mShortcutEnabled[i] is true
107e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            for (int i = 0; shortcutCount >= 0 && i < mShortcutEnabled.length; i++) {
108e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                if (mShortcutEnabled[i]) {
109e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                    shortcutCount--;
110e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                    if (shortcutCount < 0) return i;
111e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                }
112e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            }
113e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            throw new IllegalArgumentException("Invalid position - greater than cursor count "
114e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                    + " but not a shortcut.");
115e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        }
116e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        return SHORTCUT_INVALID;
117e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    }
118e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
119e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    @Override
120e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    public boolean isEmpty() {
121e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        return getShortcutCount() == 0 && super.isEmpty();
122e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    }
123e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
124e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    @Override
125e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    public boolean isEnabled(int position) {
126e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        final int shortcutType = getShortcutTypeFromPosition(position);
127e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        if (shortcutType >= 0) {
128e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            return true;
129e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        } else {
130e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            return super.isEnabled(position);
131e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        }
132e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    }
133e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
134e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    private void assignShortcutToView(ContactListItemView v, int shortcutType) {
135e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        final CharSequence text;
136e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        final int drawableId;
137e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        final Resources resources = getContext().getResources();
138e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        final String number = getFormattedQueryString();
139e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        switch (shortcutType) {
140e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            case SHORTCUT_DIRECT_CALL:
141e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                text = resources.getString(R.string.search_shortcut_call_number, number);
142e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                drawableId = R.drawable.ic_phone_dk;
143e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                break;
144e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            case SHORTCUT_ADD_NUMBER_TO_CONTACTS:
145e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                text = resources.getString(R.string.search_shortcut_add_to_contacts);
146e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                drawableId = R.drawable.ic_add_person_dk;
147e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                break;
148e142481570d7fbda5d035555fe217314e396ae90Yorke Lee            default:
149e142481570d7fbda5d035555fe217314e396ae90Yorke Lee                throw new IllegalArgumentException("Invalid shortcut type");
150e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        }
151e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        v.setDrawableResource(R.drawable.list_item_avatar_bg, drawableId);
152e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        v.setDisplayName(text);
153e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        v.setPhotoPosition(super.getPhotoPosition());
154e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    }
155e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
156e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    public void setShortcutEnabled(int shortcutType, boolean visible) {
157e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        mShortcutEnabled[shortcutType] = visible;
158e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    }
159e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
160e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    public String getFormattedQueryString() {
161e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        return mFormattedQueryString;
162e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    }
163e142481570d7fbda5d035555fe217314e396ae90Yorke Lee
164e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    @Override
165e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    public void setQueryString(String queryString) {
166604d48099cd8e0bcf2f992237082600837630038Yorke Lee        mFormattedQueryString = PhoneNumberUtils.formatNumber(
167604d48099cd8e0bcf2f992237082600837630038Yorke Lee                PhoneNumberUtils.convertAndStrip(queryString), mCountryIso);
168e142481570d7fbda5d035555fe217314e396ae90Yorke Lee        super.setQueryString(queryString);
169e142481570d7fbda5d035555fe217314e396ae90Yorke Lee    }
170e142481570d7fbda5d035555fe217314e396ae90Yorke Lee}
171