1package eu.siacs.conversations.ui.adapter;
2
3import android.content.SharedPreferences;
4import android.content.res.Resources;
5import android.databinding.DataBindingUtil;
6import android.graphics.Bitmap;
7import android.graphics.drawable.BitmapDrawable;
8import android.graphics.drawable.Drawable;
9import android.os.AsyncTask;
10import android.preference.PreferenceManager;
11import android.view.LayoutInflater;
12import android.view.View;
13import android.view.ViewGroup;
14import android.widget.ArrayAdapter;
15import android.widget.ImageView;
16import android.widget.TextView;
17
18import com.wefika.flowlayout.FlowLayout;
19
20import java.lang.ref.WeakReference;
21import java.util.List;
22import java.util.concurrent.RejectedExecutionException;
23
24import eu.siacs.conversations.R;
25import eu.siacs.conversations.databinding.ContactBinding;
26import eu.siacs.conversations.entities.ListItem;
27import eu.siacs.conversations.ui.SettingsActivity;
28import eu.siacs.conversations.ui.XmppActivity;
29import eu.siacs.conversations.ui.util.AvatarWorkerTask;
30import eu.siacs.conversations.ui.util.StyledAttributes;
31import eu.siacs.conversations.utils.EmojiWrapper;
32import eu.siacs.conversations.utils.IrregularUnicodeDetector;
33import eu.siacs.conversations.utils.ThemeHelper;
34import eu.siacs.conversations.utils.UIHelper;
35import rocks.xmpp.addr.Jid;
36
37public class ListItemAdapter extends ArrayAdapter<ListItem> {
38
39 protected XmppActivity activity;
40 private boolean showDynamicTags = false;
41 private OnTagClickedListener mOnTagClickedListener = null;
42 private View.OnClickListener onTagTvClick = view -> {
43 if (view instanceof TextView && mOnTagClickedListener != null) {
44 TextView tv = (TextView) view;
45 final String tag = tv.getText().toString();
46 mOnTagClickedListener.onTagClicked(tag);
47 }
48 };
49
50 public ListItemAdapter(XmppActivity activity, List<ListItem> objects) {
51 super(activity, 0, objects);
52 this.activity = activity;
53 }
54
55
56 public void refreshSettings() {
57 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
58 this.showDynamicTags = preferences.getBoolean(SettingsActivity.SHOW_DYNAMIC_TAGS, false);
59 }
60
61 @Override
62 public View getView(int position, View view, ViewGroup parent) {
63 LayoutInflater inflater = activity.getLayoutInflater();
64 ListItem item = getItem(position);
65 ViewHolder viewHolder;
66 if (view == null) {
67 ContactBinding binding = DataBindingUtil.inflate(inflater,R.layout.contact,parent,false);
68 viewHolder = ViewHolder.get(binding);
69 view = binding.getRoot();
70 } else {
71 viewHolder = (ViewHolder) view.getTag();
72 }
73 view.setBackground(StyledAttributes.getDrawable(view.getContext(),R.attr.list_item_background));
74
75 List<ListItem.Tag> tags = item.getTags(activity);
76 if (tags.size() == 0 || !this.showDynamicTags) {
77 viewHolder.tags.setVisibility(View.GONE);
78 } else {
79 viewHolder.tags.setVisibility(View.VISIBLE);
80 viewHolder.tags.removeAllViewsInLayout();
81 for (ListItem.Tag tag : tags) {
82 TextView tv = (TextView) inflater.inflate(R.layout.list_item_tag, viewHolder.tags, false);
83 tv.setText(tag.getName());
84 tv.setBackgroundColor(tag.getColor());
85 tv.setOnClickListener(this.onTagTvClick);
86 viewHolder.tags.addView(tv);
87 }
88 }
89 final Jid jid = item.getJid();
90 if (jid != null) {
91 viewHolder.jid.setVisibility(View.VISIBLE);
92 viewHolder.jid.setText(IrregularUnicodeDetector.style(activity, jid));
93 } else {
94 viewHolder.jid.setVisibility(View.GONE);
95 }
96 viewHolder.name.setText(EmojiWrapper.transform(item.getDisplayName()));
97 AvatarWorkerTask.loadAvatar(item, viewHolder.avatar, R.dimen.avatar);
98 return view;
99 }
100
101 public void setOnTagClickedListener(OnTagClickedListener listener) {
102 this.mOnTagClickedListener = listener;
103 }
104
105
106 public interface OnTagClickedListener {
107 void onTagClicked(String tag);
108 }
109
110 private static class ViewHolder {
111 private TextView name;
112 private TextView jid;
113 private ImageView avatar;
114 private FlowLayout tags;
115
116 private ViewHolder() {
117
118 }
119
120 public static ViewHolder get(ContactBinding binding) {
121 ViewHolder viewHolder = new ViewHolder();
122 viewHolder.name = binding.contactDisplayName;
123 viewHolder.jid = binding.contactJid;
124 viewHolder.avatar = binding.contactPhoto;
125 viewHolder.tags = binding.tags;
126 binding.getRoot().setTag(viewHolder);
127 return viewHolder;
128 }
129 }
130
131}