Home | History | Annotate | Download | only in quickcontact
      1 /*
      2  * Copyright (C) 2011 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  */
     16 
     17 package com.android.contacts.quickcontact;
     18 
     19 import com.android.contacts.R;
     20 
     21 import android.app.Fragment;
     22 import android.os.Bundle;
     23 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
     24 import android.provider.ContactsContract.CommonDataKinds.Email;
     25 import android.provider.ContactsContract.CommonDataKinds.Phone;
     26 import android.provider.ContactsContract.CommonDataKinds.Website;
     27 import android.text.TextUtils;
     28 import android.view.LayoutInflater;
     29 import android.view.View;
     30 import android.view.View.OnClickListener;
     31 import android.view.ViewGroup;
     32 import android.widget.BaseAdapter;
     33 import android.widget.ImageView;
     34 import android.widget.LinearLayout;
     35 import android.widget.ListView;
     36 import android.widget.TextView;
     37 
     38 import java.util.List;
     39 
     40 /** A fragment that shows the list of resolve items below a tab */
     41 public class QuickContactListFragment extends Fragment {
     42     private ListView mListView;
     43     private List<Action> mActions;
     44     private LinearLayout mFragmentContainer;
     45     private Listener mListener;
     46 
     47     public QuickContactListFragment() {
     48         setRetainInstance(true);
     49     }
     50 
     51     @Override
     52     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
     53         mFragmentContainer = (LinearLayout) inflater.inflate(R.layout.quickcontact_list_fragment,
     54                 container, false);
     55         mListView = (ListView) mFragmentContainer.findViewById(R.id.list);
     56         mListView.setItemsCanFocus(true);
     57 
     58         mFragmentContainer.setOnClickListener(mOutsideClickListener);
     59         configureAdapter();
     60         return mFragmentContainer;
     61     }
     62 
     63     public void setActions(List<Action> actions) {
     64         mActions = actions;
     65         configureAdapter();
     66     }
     67 
     68     public void setListener(Listener value) {
     69         mListener = value;
     70     }
     71 
     72     private void configureAdapter() {
     73         if (mActions == null || mListView == null) return;
     74 
     75         mListView.setAdapter(new BaseAdapter() {
     76             @Override
     77             public int getCount() {
     78                 return mActions.size();
     79             }
     80 
     81             @Override
     82             public Object getItem(int position) {
     83                 return mActions.get(position);
     84             }
     85 
     86             @Override
     87             public long getItemId(int position) {
     88                 return position;
     89             }
     90 
     91             @Override
     92             public View getView(int position, View convertView, ViewGroup parent) {
     93                 // Set action title based on summary value
     94                 final Action action = mActions.get(position);
     95                 String mimeType = action.getMimeType();
     96 
     97                 final View resultView = convertView != null ? convertView
     98                         : getActivity().getLayoutInflater().inflate(
     99                                 mimeType.equals(StructuredPostal.CONTENT_ITEM_TYPE) ?
    100                                         R.layout.quickcontact_list_item_address :
    101                                         R.layout.quickcontact_list_item,
    102                                         parent, false);
    103 
    104                 // TODO: Put those findViewByIds in a container
    105                 final TextView text1 = (TextView) resultView.findViewById(
    106                         android.R.id.text1);
    107                 final TextView text2 = (TextView) resultView.findViewById(
    108                         android.R.id.text2);
    109                 final View actionsContainer = resultView.findViewById(
    110                         R.id.actions_view_container);
    111                 final ImageView alternateActionButton = (ImageView) resultView.findViewById(
    112                         R.id.secondary_action_button);
    113                 final View alternateActionDivider = resultView.findViewById(R.id.vertical_divider);
    114 
    115                 actionsContainer.setOnClickListener(mPrimaryActionClickListener);
    116                 actionsContainer.setTag(action);
    117                 alternateActionButton.setOnClickListener(mSecondaryActionClickListener);
    118                 alternateActionButton.setTag(action);
    119 
    120                 final boolean hasAlternateAction = action.getAlternateIntent() != null;
    121                 alternateActionDivider.setVisibility(hasAlternateAction ? View.VISIBLE : View.GONE);
    122                 alternateActionButton.setImageDrawable(action.getAlternateIcon());
    123                 alternateActionButton.setContentDescription(action.getAlternateIconDescription());
    124                 alternateActionButton.setVisibility(hasAlternateAction ? View.VISIBLE : View.GONE);
    125 
    126                 // Special case for phone numbers in accessibility mode
    127                 if (mimeType.equals(Phone.CONTENT_ITEM_TYPE)) {
    128                     text1.setContentDescription(getActivity().getString(
    129                             R.string.description_dial_phone_number, action.getBody()));
    130                     if (hasAlternateAction) {
    131                         alternateActionButton.setContentDescription(getActivity()
    132                                 .getString(R.string.description_send_message, action.getBody()));
    133                     }
    134                 }
    135 
    136                 text1.setText(action.getBody());
    137                 if (text2 != null) {
    138                     CharSequence subtitle = action.getSubtitle();
    139                     text2.setText(subtitle);
    140                     if (TextUtils.isEmpty(subtitle)) {
    141                         text2.setVisibility(View.GONE);
    142                     } else {
    143                         text2.setVisibility(View.VISIBLE);
    144                     }
    145                 }
    146                 return resultView;
    147             }
    148         });
    149     }
    150 
    151     /** A data item (e.g. phone number) was clicked */
    152     protected final OnClickListener mPrimaryActionClickListener = new OnClickListener() {
    153         @Override
    154         public void onClick(View v) {
    155             final Action action = (Action) v.getTag();
    156             if (mListener != null) mListener.onItemClicked(action, false);
    157         }
    158     };
    159 
    160     /** A secondary action (SMS) was clicked */
    161     protected final OnClickListener mSecondaryActionClickListener = new OnClickListener() {
    162         @Override
    163         public void onClick(View v) {
    164             final Action action = (Action) v.getTag();
    165             if (mListener != null) mListener.onItemClicked(action, true);
    166         }
    167     };
    168 
    169     private final OnClickListener mOutsideClickListener = new OnClickListener() {
    170         @Override
    171         public void onClick(View v) {
    172             if (mListener != null) mListener.onOutsideClick();
    173         }
    174     };
    175 
    176     public interface Listener {
    177         void onOutsideClick();
    178         void onItemClicked(Action action, boolean alternate);
    179     }
    180 }
    181