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.core.graphics.ColorUtils;
13import androidx.databinding.DataBindingUtil;
14
15import com.wefika.flowlayout.FlowLayout;
16
17import java.util.List;
18
19import eu.siacs.conversations.R;
20import eu.siacs.conversations.databinding.ContactBinding;
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.ui.util.StyledAttributes;
26import eu.siacs.conversations.utils.IrregularUnicodeDetector;
27import eu.siacs.conversations.utils.UIHelper;
28import eu.siacs.conversations.xmpp.Jid;
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 && mOnTagClickedListener != null) {
37 TextView tv = (TextView) view;
38 final String tag = tv.getText().toString();
39 mOnTagClickedListener.onTagClicked(tag);
40 }
41 };
42
43 public ListItemAdapter(XmppActivity activity, List<ListItem> objects) {
44 super(activity, 0, objects);
45 this.activity = activity;
46 }
47
48
49 public void refreshSettings() {
50 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
51 this.showDynamicTags = preferences.getBoolean(SettingsActivity.SHOW_DYNAMIC_TAGS, activity.getResources().getBoolean(R.bool.show_dynamic_tags));
52 }
53
54 @Override
55 public View getView(int position, View view, ViewGroup parent) {
56 LayoutInflater inflater = activity.getLayoutInflater();
57 ListItem item = getItem(position);
58 ViewHolder viewHolder;
59 if (view == null) {
60 ContactBinding binding = DataBindingUtil.inflate(inflater,R.layout.contact,parent,false);
61 viewHolder = ViewHolder.get(binding);
62 view = binding.getRoot();
63 } else {
64 viewHolder = (ViewHolder) view.getTag();
65 }
66
67 if (activity.xmppConnectionService != null && activity.xmppConnectionService.getAccounts().size() > 1) {
68 view.setBackgroundColor(ColorUtils.setAlphaComponent(
69 UIHelper.getColorForName(item.getAccount().getJid().asBareJid().toString()),
70 activity.isDarkTheme() ? 20 : 10
71 ));
72 } else {
73 view.setBackground(StyledAttributes.getDrawable(view.getContext(),R.attr.list_item_background));
74 }
75
76 List<ListItem.Tag> tags = item.getTags(activity);
77 if (tags.size() == 0 || !this.showDynamicTags) {
78 viewHolder.tags.setVisibility(View.GONE);
79 } else {
80 viewHolder.tags.setVisibility(View.VISIBLE);
81 viewHolder.tags.removeAllViewsInLayout();
82 for (ListItem.Tag tag : tags) {
83 TextView tv = (TextView) inflater.inflate(R.layout.list_item_tag, viewHolder.tags, false);
84 tv.setText(tag.getName());
85 tv.setBackgroundColor(tag.getColor());
86 tv.setOnClickListener(this.onTagTvClick);
87 viewHolder.tags.addView(tv);
88 }
89 }
90 final Jid jid = item.getJid();
91 if (jid != null) {
92 viewHolder.jid.setVisibility(View.VISIBLE);
93 viewHolder.jid.setText(IrregularUnicodeDetector.style(activity, jid));
94 } else {
95 viewHolder.jid.setVisibility(View.GONE);
96 }
97 viewHolder.name.setText(item.getDisplayName());
98 AvatarWorkerTask.loadAvatar(item, viewHolder.avatar, R.dimen.avatar);
99 return view;
100 }
101
102 public void setOnTagClickedListener(OnTagClickedListener listener) {
103 this.mOnTagClickedListener = listener;
104 }
105
106
107 public interface OnTagClickedListener {
108 void onTagClicked(String tag);
109 }
110
111 private static class ViewHolder {
112 private TextView name;
113 private TextView jid;
114 private ImageView avatar;
115 private FlowLayout tags;
116
117 private ViewHolder() {
118
119 }
120
121 public static ViewHolder get(ContactBinding binding) {
122 ViewHolder viewHolder = new ViewHolder();
123 viewHolder.name = binding.contactDisplayName;
124 viewHolder.jid = binding.contactJid;
125 viewHolder.avatar = binding.contactPhoto;
126 viewHolder.tags = binding.tags;
127 binding.getRoot().setTag(viewHolder);
128 return viewHolder;
129 }
130 }
131
132}