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