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