package eu.siacs.conversations.ui.adapter; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import java.lang.ref.WeakReference; import java.util.List; import java.util.concurrent.RejectedExecutionException; import de.thedevstack.conversationsplus.ConversationsPlusPreferences; import de.tzur.conversations.Settings; import eu.siacs.conversations.R; import eu.siacs.conversations.entities.ListItem; import eu.siacs.conversations.services.AvatarService; import eu.siacs.conversations.ui.XmppActivity; import eu.siacs.conversations.utils.UIHelper; import eu.siacs.conversations.xmpp.jid.Jid; public class ListItemAdapter extends ArrayAdapter { protected XmppActivity activity; protected boolean showDynamicTags = false; private View.OnClickListener onTagTvClick = new View.OnClickListener() { @Override public void onClick(View view) { if (view instanceof TextView && mOnTagClickedListener != null) { TextView tv = (TextView) view; final String tag = tv.getText().toString(); mOnTagClickedListener.onTagClicked(tag); } } }; private OnTagClickedListener mOnTagClickedListener = null; public ListItemAdapter(XmppActivity activity, List objects) { super(activity, 0, objects); this.activity = activity; this.showDynamicTags = ConversationsPlusPreferences.showDynamicTags(); } @Override public View getView(int position, View view, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); ListItem item = getItem(position); if (view == null) { view = inflater.inflate(R.layout.contact, parent, false); } if (Settings.SHOW_ONLINE_STATUS) { TextView tvStatus = (TextView) view.findViewById(R.id.contact_status); tvStatus.setBackgroundColor(item.getStatusColor()); } TextView tvName = (TextView) view.findViewById(R.id.contact_display_name); TextView tvJid = (TextView) view.findViewById(R.id.contact_jid); ImageView picture = (ImageView) view.findViewById(R.id.contact_photo); LinearLayout tagLayout = (LinearLayout) view.findViewById(R.id.tags); List tags = item.getTags(); if (tags.size() == 0 || !this.showDynamicTags) { tagLayout.setVisibility(View.GONE); } else { tagLayout.setVisibility(View.VISIBLE); tagLayout.removeAllViewsInLayout(); for(ListItem.Tag tag : tags) { TextView tv = (TextView) inflater.inflate(R.layout.list_item_tag,tagLayout,false); tv.setText(tag.getName()); tv.setBackgroundColor(tag.getColor()); tv.setOnClickListener(this.onTagTvClick); tagLayout.addView(tv); } } final String jid = item.getDisplayJid(); if (jid != null) { tvJid.setVisibility(View.VISIBLE); tvJid.setText(jid); } else { tvJid.setVisibility(View.GONE); } tvName.setText(item.getDisplayName()); loadAvatar(item,picture); return view; } public void setOnTagClickedListener(OnTagClickedListener listener) { this.mOnTagClickedListener = listener; } public interface OnTagClickedListener { void onTagClicked(String tag); } class BitmapWorkerTask extends AsyncTask { private final WeakReference imageViewReference; private ListItem item = null; public BitmapWorkerTask(ImageView imageView) { imageViewReference = new WeakReference<>(imageView); } @Override protected Bitmap doInBackground(ListItem... params) { return AvatarService.getInstance().get(params[0], activity.getPixel(48)); } @Override protected void onPostExecute(Bitmap bitmap) { if (bitmap != null) { final ImageView imageView = imageViewReference.get(); if (imageView != null) { imageView.setImageBitmap(bitmap); imageView.setBackgroundColor(0x00000000); } } } } public void loadAvatar(ListItem item, ImageView imageView) { if (cancelPotentialWork(item, imageView)) { final Bitmap bm = AvatarService.getInstance().get(item,activity.getPixel(48),true); if (bm != null) { imageView.setImageBitmap(bm); imageView.setBackgroundColor(0x00000000); } else { imageView.setBackgroundColor(UIHelper.getColorForName(item.getDisplayName())); imageView.setImageDrawable(null); final BitmapWorkerTask task = new BitmapWorkerTask(imageView); final AsyncDrawable asyncDrawable = new AsyncDrawable(activity.getResources(), null, task); imageView.setImageDrawable(asyncDrawable); try { task.execute(item); } catch (final RejectedExecutionException ignored) { } } } } public static boolean cancelPotentialWork(ListItem item, ImageView imageView) { final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView); if (bitmapWorkerTask != null) { final ListItem oldItem = bitmapWorkerTask.item; if (oldItem == null || item != oldItem) { bitmapWorkerTask.cancel(true); } else { return false; } } return true; } private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) { if (imageView != null) { final Drawable drawable = imageView.getDrawable(); if (drawable instanceof AsyncDrawable) { final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable; return asyncDrawable.getBitmapWorkerTask(); } } return null; } static class AsyncDrawable extends BitmapDrawable { private final WeakReference bitmapWorkerTaskReference; public AsyncDrawable(Resources res, Bitmap bitmap, BitmapWorkerTask bitmapWorkerTask) { super(res, bitmap); bitmapWorkerTaskReference = new WeakReference<>(bitmapWorkerTask); } public BitmapWorkerTask getBitmapWorkerTask() { return bitmapWorkerTaskReference.get(); } } }