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