UsersAdapter.java :  » Web » droidstack » org » droidstack » adapter » Android Open Source

Android Open Source » Web » droidstack 
droidstack » org » droidstack » adapter » UsersAdapter.java
package org.droidstack.adapter;

import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import net.sf.stackwrap4j.StackWrapper;
import net.sf.stackwrap4j.entities.User;
import net.sf.stackwrap4j.query.UserQuery;
import net.sf.stackwrap4j.utils.StackUtils;

import org.droidstack.R;
import org.droidstack.util.Const;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;

public class UsersAdapter extends BaseAdapter implements Filterable {
  
  private class UsersFilter extends Filter {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
      UserQuery query = new UserQuery();
      query.setPageSize(pageSize);
      query.setFilter(constraint.toString());
      FilterResults results = new FilterResults();
      try {
        List<User> users = api.listUsers(query);
        results.values = users;
        results.count = users.size();
      }
      catch (Exception e) {
        Log.e(Const.TAG, "Users filter exception", e);
        return null;
      }
      return results;
    }

    @Override
    protected void publishResults(CharSequence constraint,
        FilterResults results) {
      if (results == null) return;
      users.clear();
      users.addAll((List<User>) results.values);
      notifyDataSetChanged();
      new GetAvatars().execute();
    }
    
  }
  
  private class Tag {
    public ImageView avatar;
    public TextView name;
    public TextView rep;
    public Tag(View v) {
      avatar = (ImageView) v.findViewById(R.id.avatar);
      name = (TextView) v.findViewById(R.id.name);
      rep = (TextView) v.findViewById(R.id.rep);
    }
  }
  
  private class GetAvatarsProgress {
    public final String hash;
    public final Bitmap avatar;
    public GetAvatarsProgress(String hash, Bitmap avatar) {
      this.hash = hash;
      this.avatar = avatar;
    }
  }
  
  private GetAvatars getAvatarsInstance;
  
  private class GetAvatars extends AsyncTask<Void, GetAvatarsProgress, Void> {
    
    public GetAvatars() {
      if (getAvatarsInstance != null) {
        getAvatarsInstance.cancel(true);
      }
      getAvatarsInstance = this;
    }
    
    @Override
    protected Void doInBackground(Void... params) {
      if (Thread.interrupted()) return null;
      for (User user: users) {
        String hash = user.getEmailHash();
        int size = 64;
        DisplayMetrics metrics = new DisplayMetrics();
        ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metrics);
        size *= metrics.density;
        try {
          URL avatarURL = new URL("http://www.gravatar.com/avatar/" + hash + "?s=" + size + "&d=identicon&r=PG");
          Bitmap avatar = BitmapFactory.decodeStream(avatarURL.openStream());
          publishProgress(new GetAvatarsProgress(hash, avatar));
        }
        catch (Exception e) {
          Log.e(Const.TAG, "Error fetching avatar", e);
        }
      }
      return null;
    }
    
    @Override
    protected void onProgressUpdate(GetAvatarsProgress... values) {
      avatars.put(values[0].hash, values[0].avatar);
      notifyDataSetChanged();
    }
    
    @Override
    protected void onPostExecute(Void result) {
      getAvatarsInstance = null;
    }
    
  }
  
  private final Context context;
  private final LayoutInflater inflater;
  private final List<User> users = new ArrayList<User>();
  private final StackWrapper api;
  private final int pageSize;
  private final UsersFilter filter;
  private final HashMap<String, Bitmap> avatars = new HashMap<String, Bitmap>();
  
  public UsersAdapter(Context context, String endpoint) {
    this.context = context;
    inflater = LayoutInflater.from(context);
    api = new StackWrapper(endpoint, Const.APIKEY);
    pageSize = Const.getPageSize(context);
    filter = new UsersFilter();
  }
  
  @Override
  public Filter getFilter() {
    return filter;
  }
  
  @Override
  public int getCount() {
    return users.size();
  }

  @Override
  public Object getItem(int position) {
    return users.get(position).getDisplayName();
  }
  
  public User getUser(int position) {
    return users.get(position);
  }

  @Override
  public long getItemId(int position) {
    return users.get(position).getId();
  }
  
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    User user = users.get(position);
    View v = convertView;
    Tag t;
    if (v == null) {
      v = inflater.inflate(R.layout.item_user, null);
      t = new Tag(v);
      v.setTag(t);
    }
    else {
      t = (Tag) v.getTag();
    }
    
    t.name.setText(user.getDisplayName());
    t.rep.setText(StackUtils.formatRep(user.getReputation()));
    
    if (avatars.containsKey(user.getEmailHash())) {
      t.avatar.setImageBitmap(avatars.get(user.getEmailHash()));
    }
    else {
      t.avatar.setImageResource(R.drawable.noavatar);
    }
    
    return v;
  }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.