ListItemAdapter.java

  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}