1package eu.siacs.conversations.ui.adapter;
2
3import android.content.SharedPreferences;
4import android.content.res.ColorStateList;
5import android.preference.PreferenceManager;
6import android.util.Log;
7import android.view.LayoutInflater;
8import android.view.View;
9import android.view.ViewGroup;
10import android.widget.ArrayAdapter;
11import android.widget.ImageView;
12import android.widget.TextView;
13
14import androidx.annotation.NonNull;
15import androidx.core.content.ContextCompat;
16import androidx.databinding.DataBindingUtil;
17
18import com.google.android.material.color.MaterialColors;
19import com.wefika.flowlayout.FlowLayout;
20
21import eu.siacs.conversations.AppSettings;
22import eu.siacs.conversations.Config;
23import eu.siacs.conversations.R;
24import eu.siacs.conversations.databinding.ItemContactBinding;
25import eu.siacs.conversations.entities.Contact;
26import eu.siacs.conversations.entities.ListItem;
27import eu.siacs.conversations.entities.Presence;
28import eu.siacs.conversations.ui.XmppActivity;
29import eu.siacs.conversations.ui.util.AvatarWorkerTask;
30import eu.siacs.conversations.utils.IrregularUnicodeDetector;
31import eu.siacs.conversations.utils.UIHelper;
32import eu.siacs.conversations.utils.XEP0392Helper;
33import eu.siacs.conversations.xmpp.Jid;
34
35import java.util.List;
36
37public class ListItemAdapter extends ArrayAdapter<ListItem> {
38
39 protected XmppActivity activity;
40 private boolean showDynamicTags = false;
41 private OnTagClickedListener mOnTagClickedListener = null;
42 private final View.OnClickListener onTagTvClick = view -> {
43 if (view instanceof TextView tv && mOnTagClickedListener != null) {
44 final String tag = tv.getText().toString();
45 mOnTagClickedListener.onTagClicked(tag);
46 }
47 };
48
49 public ListItemAdapter(XmppActivity activity, List<ListItem> objects) {
50 super(activity, 0, objects);
51 this.activity = activity;
52 }
53
54
55 public void refreshSettings() {
56 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
57 this.showDynamicTags = preferences.getBoolean(AppSettings.SHOW_DYNAMIC_TAGS, false);
58 }
59
60 @NonNull
61 @Override
62 public View getView(int position, View view, @NonNull ViewGroup parent) {
63 LayoutInflater inflater = activity.getLayoutInflater();
64 final ListItem item = getItem(position);
65 ViewHolder viewHolder;
66 if (view == null) {
67 final ItemContactBinding binding = DataBindingUtil.inflate(inflater,R.layout.item_contact,parent,false);
68 viewHolder = ViewHolder.get(binding);
69 view = binding.getRoot();
70 } else {
71 viewHolder = (ViewHolder) view.getTag();
72 }
73 if (view.isActivated()) {
74 Log.d(Config.LOGTAG,"item "+item.getDisplayName()+" is activated");
75 }
76 //view.setBackground(StyledAttributes.getDrawable(view.getContext(),R.attr.list_item_background));
77 final List<ListItem.Tag> tags = item.getTags(activity);
78 final boolean hasMetaTags;
79 if (item instanceof Contact contact) {
80 hasMetaTags = contact.isBlocked() || contact.getShownStatus() != Presence.Status.OFFLINE;
81 } else {
82 hasMetaTags = false;
83 }
84 if ((tags.isEmpty() && !hasMetaTags) || !this.showDynamicTags) {
85 viewHolder.tags.setVisibility(View.GONE);
86 } else {
87 viewHolder.tags.setVisibility(View.VISIBLE);
88 viewHolder.tags.removeAllViewsInLayout();
89 for (final ListItem.Tag tag : tags) {
90 final String name = tag.getName();
91 final TextView tv = (TextView) inflater.inflate(R.layout.list_item_tag, viewHolder.tags, false);
92 tv.setText(name);
93 tv.setBackgroundTintList(ColorStateList.valueOf(MaterialColors.harmonizeWithPrimary(getContext(),XEP0392Helper.rgbFromNick(name))));
94 tv.setOnClickListener(this.onTagTvClick);
95 viewHolder.tags.addView(tv);
96 }
97 if (item instanceof Contact contact) {
98 if (contact.isBlocked()) {
99 final TextView tv =
100 (TextView)
101 inflater.inflate(
102 R.layout.list_item_tag, viewHolder.tags, false);
103 tv.setText(R.string.blocked);
104 tv.setBackgroundTintList(ColorStateList.valueOf(MaterialColors.harmonizeWithPrimary(tv.getContext(),ContextCompat.getColor(tv.getContext(),R.color.gray_800))));
105 viewHolder.tags.addView(tv);
106 } else {
107 final Presence.Status status = contact.getShownStatus();
108 if (status != Presence.Status.OFFLINE) {
109 final TextView tv =
110 (TextView)
111 inflater.inflate(
112 R.layout.list_item_tag, viewHolder.tags, false);
113 UIHelper.setStatus(tv, status);
114 viewHolder.tags.addView(tv);
115 }
116 }
117 }
118 }
119 final Jid jid = item.getJid();
120 if (jid != null) {
121 viewHolder.jid.setVisibility(View.VISIBLE);
122 viewHolder.jid.setText(IrregularUnicodeDetector.style(activity, jid));
123 } else {
124 viewHolder.jid.setVisibility(View.GONE);
125 }
126 viewHolder.name.setText(item.getDisplayName());
127 AvatarWorkerTask.loadAvatar(item, viewHolder.avatar, R.dimen.avatar);
128 return view;
129 }
130
131 public void setOnTagClickedListener(OnTagClickedListener listener) {
132 this.mOnTagClickedListener = listener;
133 }
134
135
136 public interface OnTagClickedListener {
137 void onTagClicked(String tag);
138 }
139
140 private static class ViewHolder {
141 private TextView name;
142 private TextView jid;
143 private ImageView avatar;
144 private FlowLayout tags;
145
146 private ViewHolder() {
147
148 }
149
150 public static ViewHolder get(final ItemContactBinding binding) {
151 ViewHolder viewHolder = new ViewHolder();
152 viewHolder.name = binding.contactDisplayName;
153 viewHolder.jid = binding.contactJid;
154 viewHolder.avatar = binding.contactPhoto;
155 viewHolder.tags = binding.tags;
156 binding.getRoot().setTag(viewHolder);
157 return viewHolder;
158 }
159 }
160
161}