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