ListItemAdapter.java

  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}