package com.seafile.seadroid2.ui.adapter; import android.content.Context; import android.graphics.Bitmap; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.google.common.collect.Lists; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import com.seafile.seadroid2.R; import com.seafile.seadroid2.account.Account; import com.seafile.seadroid2.avatar.Avatar; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; /** * Base account adapter */ public abstract class AccountAdapter extends BaseAdapter { private static final String DEBUG_TAG = "AccountAdapter"; private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener(); private DisplayImageOptions options; private ArrayList<Account> items; private ArrayList<Avatar> avatars; private Context context; public AccountAdapter(Context context) { this.context = context; items = Lists.newArrayList(); avatars = Lists.newArrayList(); } @Override public int getCount() { return items.size(); } @Override public boolean isEmpty() { return items.isEmpty(); } public void add(Account entry) { items.add(entry); } public void notifyChanged() { notifyDataSetChanged(); } @Override public Account getItem(int position) { return items.get(position); } public void setItems(List<Account> items) { this.items = (ArrayList<Account>) items; notifyDataSetChanged(); } public void setAvatars(ArrayList<Avatar> avatars) { this.avatars = avatars; } @Override public long getItemId(int position) { return position; } public void clear() { items.clear(); } private Viewholder viewHolder; protected abstract int getChildLayout(); protected abstract int getChildTitleId(); protected abstract int getChildSubTitleId(); protected abstract int getChildIconId(); @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if (convertView == null) { view = LayoutInflater.from(context).inflate(getChildLayout(), null); TextView title = (TextView) view.findViewById(getChildTitleId()); TextView subtitle = (TextView) view.findViewById(getChildSubTitleId()); ImageView icon = (ImageView) view.findViewById(getChildIconId()); viewHolder = new Viewholder(title, subtitle, icon); view.setTag(viewHolder); } else { viewHolder = (Viewholder) convertView.getTag(); } Account account = items.get(position); viewHolder.title.setText(account.getServerHost()); viewHolder.subtitle.setText(account.getEmail()); if (getAvatarUrl(account) != null) { options = new DisplayImageOptions.Builder() .extraForDownloader(account) .showStubImage(R.drawable.default_avatar) // .delayBeforeLoading(1000) .showImageOnLoading(R.drawable.default_avatar) .showImageForEmptyUri(R.drawable.default_avatar) .showImageOnFail(R.drawable.default_avatar) .resetViewBeforeLoading() .cacheInMemory(true) .cacheOnDisk(true) .considerExifParams(true) .displayer(new RoundedBitmapDisplayer(1000)) .build(); ImageLoader.getInstance().displayImage(getAvatarUrl(account), viewHolder.icon, options, animateFirstListener); } ImageLoader.getInstance().handleSlowNetwork(true); return view; } private String getAvatarUrl(Account account) { if (avatars == null) { return null; } for (Avatar avatar : avatars) { if (avatar.getSignature().equals(account.getSignature())) { return avatar.getUrl(); } } return null; } private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener { static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>()); @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { if (loadedImage != null) { ImageView imageView = (ImageView) view; boolean firstDisplay = !displayedImages.contains(imageUri); if (firstDisplay) { FadeInBitmapDisplayer.animate(imageView, 500); displayedImages.add(imageUri); } } } } private class Viewholder { TextView title, subtitle; ImageView icon; public Viewholder(TextView title, TextView subtitle, ImageView icon) { super(); this.icon = icon; this.title = title; this.subtitle = subtitle; } } }