1package eu.siacs.conversations.ui.adapter;
2
3import java.lang.ref.WeakReference;
4import java.util.List;
5import java.util.concurrent.RejectedExecutionException;
6
7import eu.siacs.conversations.Config;
8import eu.siacs.conversations.R;
9import eu.siacs.conversations.entities.Conversation;
10import eu.siacs.conversations.entities.ListItem;
11import eu.siacs.conversations.ui.XmppActivity;
12import eu.siacs.conversations.xmpp.jid.Jid;
13
14import android.content.Context;
15import android.content.SharedPreferences;
16import android.content.res.Resources;
17import android.graphics.Bitmap;
18import android.graphics.drawable.BitmapDrawable;
19import android.graphics.drawable.Drawable;
20import android.os.AsyncTask;
21import android.preference.PreferenceManager;
22import android.util.Log;
23import android.view.LayoutInflater;
24import android.view.View;
25import android.view.ViewGroup;
26import android.widget.ArrayAdapter;
27import android.widget.ImageView;
28import android.widget.LinearLayout;
29import android.widget.TextView;
30
31public class ListItemAdapter extends ArrayAdapter<ListItem> {
32
33 protected XmppActivity activity;
34 protected boolean showDynamicTags = false;
35 private View.OnClickListener onTagTvClick = new View.OnClickListener() {
36 @Override
37 public void onClick(View view) {
38 if (view instanceof TextView && mOnTagClickedListener != null) {
39 TextView tv = (TextView) view;
40 final String tag = tv.getText().toString();
41 mOnTagClickedListener.onTagClicked(tag);
42 }
43 }
44 };
45 private OnTagClickedListener mOnTagClickedListener = null;
46
47 public ListItemAdapter(XmppActivity activity, List<ListItem> objects) {
48 super(activity, 0, objects);
49 this.activity = activity;
50 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
51 this.showDynamicTags = preferences.getBoolean("show_dynamic_tags",false);
52 }
53
54 @Override
55 public View getView(int position, View view, ViewGroup parent) {
56 LayoutInflater inflater = (LayoutInflater) getContext()
57 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
58 ListItem item = getItem(position);
59 if (view == null) {
60 view = inflater.inflate(R.layout.contact, parent, false);
61 }
62 TextView tvName = (TextView) view.findViewById(R.id.contact_display_name);
63 TextView tvJid = (TextView) view.findViewById(R.id.contact_jid);
64 ImageView picture = (ImageView) view.findViewById(R.id.contact_photo);
65 LinearLayout tagLayout = (LinearLayout) view.findViewById(R.id.tags);
66
67 List<ListItem.Tag> tags = item.getTags();
68 if (tags.size() == 0 || !this.showDynamicTags) {
69 tagLayout.setVisibility(View.GONE);
70 } else {
71 tagLayout.setVisibility(View.VISIBLE);
72 tagLayout.removeAllViewsInLayout();
73 for(ListItem.Tag tag : tags) {
74 TextView tv = (TextView) inflater.inflate(R.layout.list_item_tag,tagLayout,false);
75 tv.setText(tag.getName());
76 tv.setBackgroundColor(tag.getColor());
77 tv.setOnClickListener(this.onTagTvClick);
78 tagLayout.addView(tv);
79 }
80 }
81 final Jid jid = item.getJid();
82 if (jid != null) {
83 tvJid.setText(jid.toString());
84 } else {
85 tvJid.setText("");
86 }
87 tvName.setText(item.getDisplayName());
88 loadAvatar(item,picture);
89 return view;
90 }
91
92 public void setOnTagClickedListener(OnTagClickedListener listener) {
93 this.mOnTagClickedListener = listener;
94 }
95
96 public interface OnTagClickedListener {
97 public void onTagClicked(String tag);
98 }
99
100 class BitmapWorkerTask extends AsyncTask<ListItem, Void, Bitmap> {
101 private final WeakReference<ImageView> imageViewReference;
102 private ListItem item = null;
103
104 public BitmapWorkerTask(ImageView imageView) {
105 imageViewReference = new WeakReference<>(imageView);
106 }
107
108 @Override
109 protected Bitmap doInBackground(ListItem... params) {
110 return activity.avatarService().get(params[0], activity.getPixel(48));
111 }
112
113 @Override
114 protected void onPostExecute(Bitmap bitmap) {
115 if (bitmap != null) {
116 final ImageView imageView = imageViewReference.get();
117 if (imageView != null) {
118 imageView.setImageBitmap(bitmap);
119 imageView.setBackgroundColor(0x00000000);
120 }
121 }
122 }
123 }
124
125 public void loadAvatar(ListItem item, ImageView imageView) {
126 Bitmap bm = activity.avatarService().get(item,activity.getPixel(56),true);
127 if (bm != null) {
128 imageView.setImageBitmap(bm);
129 imageView.setBackgroundColor(0x00000000);
130 } else if (cancelPotentialWork(item, imageView)) {
131 imageView.setBackgroundColor(0xff333333);
132 final BitmapWorkerTask task = new BitmapWorkerTask(imageView);
133 final AsyncDrawable asyncDrawable = new AsyncDrawable(activity.getResources(), null, task);
134 imageView.setImageDrawable(asyncDrawable);
135 try {
136 task.execute(item);
137 } catch (final RejectedExecutionException ignored) {
138 }
139 }
140 }
141
142 public static boolean cancelPotentialWork(ListItem item, ImageView imageView) {
143 final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView);
144
145 if (bitmapWorkerTask != null) {
146 final ListItem oldItem = bitmapWorkerTask.item;
147 if (oldItem == null || item != oldItem) {
148 bitmapWorkerTask.cancel(true);
149 } else {
150 return false;
151 }
152 }
153 return true;
154 }
155
156 private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) {
157 if (imageView != null) {
158 final Drawable drawable = imageView.getDrawable();
159 if (drawable instanceof AsyncDrawable) {
160 final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable;
161 return asyncDrawable.getBitmapWorkerTask();
162 }
163 }
164 return null;
165 }
166
167 static class AsyncDrawable extends BitmapDrawable {
168 private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference;
169
170 public AsyncDrawable(Resources res, Bitmap bitmap, BitmapWorkerTask bitmapWorkerTask) {
171 super(res, bitmap);
172 bitmapWorkerTaskReference = new WeakReference<>(bitmapWorkerTask);
173 }
174
175 public BitmapWorkerTask getBitmapWorkerTask() {
176 return bitmapWorkerTaskReference.get();
177 }
178 }
179
180}