1package eu.siacs.conversations.ui.adapter;
2
3import android.content.SharedPreferences;
4import android.preference.PreferenceManager;
5import android.util.Log;
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.annotation.NonNull;
14import androidx.databinding.DataBindingUtil;
15
16import com.wefika.flowlayout.FlowLayout;
17
18import eu.siacs.conversations.Config;
19import eu.siacs.conversations.R;
20import eu.siacs.conversations.databinding.ItemContactBinding;
21import eu.siacs.conversations.entities.ListItem;
22import eu.siacs.conversations.ui.SettingsActivity;
23import eu.siacs.conversations.ui.XmppActivity;
24import eu.siacs.conversations.ui.util.AvatarWorkerTask;
25import eu.siacs.conversations.utils.IrregularUnicodeDetector;
26import eu.siacs.conversations.xmpp.Jid;
27
28import java.util.List;
29
30public class ListItemAdapter extends ArrayAdapter<ListItem> {
31
32 protected XmppActivity activity;
33 private boolean showDynamicTags = false;
34 private OnTagClickedListener mOnTagClickedListener = null;
35 private final View.OnClickListener onTagTvClick = view -> {
36 if (view instanceof TextView tv && mOnTagClickedListener != null) {
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, false);
51 }
52
53 @NonNull
54 @Override
55 public View getView(int position, View view, @NonNull ViewGroup parent) {
56 LayoutInflater inflater = activity.getLayoutInflater();
57 ListItem item = getItem(position);
58 ViewHolder viewHolder;
59 if (view == null) {
60 final ItemContactBinding binding = DataBindingUtil.inflate(inflater,R.layout.item_contact,parent,false);
61 viewHolder = ViewHolder.get(binding);
62 view = binding.getRoot();
63 } else {
64 viewHolder = (ViewHolder) view.getTag();
65 }
66 if (view.isActivated()) {
67 Log.d(Config.LOGTAG,"item "+item.getDisplayName()+" is activated");
68 }
69 //view.setBackground(StyledAttributes.getDrawable(view.getContext(),R.attr.list_item_background));
70 final List<ListItem.Tag> tags = item.getTags(activity);
71 if (tags.isEmpty() || !this.showDynamicTags) {
72 viewHolder.tags.setVisibility(View.GONE);
73 } else {
74 viewHolder.tags.setVisibility(View.VISIBLE);
75 viewHolder.tags.removeAllViewsInLayout();
76 for (ListItem.Tag tag : tags) {
77 TextView tv = (TextView) inflater.inflate(R.layout.list_item_tag, viewHolder.tags, false);
78 tv.setText(tag.getName());
79 tv.setBackgroundColor(tag.getColor());
80 tv.setOnClickListener(this.onTagTvClick);
81 viewHolder.tags.addView(tv);
82 }
83 }
84 final Jid jid = item.getJid();
85 if (jid != null) {
86 viewHolder.jid.setVisibility(View.VISIBLE);
87 viewHolder.jid.setText(IrregularUnicodeDetector.style(activity, jid));
88 } else {
89 viewHolder.jid.setVisibility(View.GONE);
90 }
91 viewHolder.name.setText(item.getDisplayName());
92 AvatarWorkerTask.loadAvatar(item, viewHolder.avatar, R.dimen.avatar);
93 return view;
94 }
95
96 public void setOnTagClickedListener(OnTagClickedListener listener) {
97 this.mOnTagClickedListener = listener;
98 }
99
100
101 public interface OnTagClickedListener {
102 void onTagClicked(String tag);
103 }
104
105 private static class ViewHolder {
106 private TextView name;
107 private TextView jid;
108 private ImageView avatar;
109 private FlowLayout tags;
110
111 private ViewHolder() {
112
113 }
114
115 public static ViewHolder get(final ItemContactBinding binding) {
116 ViewHolder viewHolder = new ViewHolder();
117 viewHolder.name = binding.contactDisplayName;
118 viewHolder.jid = binding.contactJid;
119 viewHolder.avatar = binding.contactPhoto;
120 viewHolder.tags = binding.tags;
121 binding.getRoot().setTag(viewHolder);
122 return viewHolder;
123 }
124 }
125
126}