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