package akechi.projectl.component; import android.content.Context; import android.net.Uri; import android.util.Log; 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.api.client.util.DateTime; import com.google.common.base.Objects; import com.google.common.base.Strings; import com.google.common.collect.ComparisonChain; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import java.text.DateFormat; import java.util.Collection; import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.NoSuchElementException; import java.util.SortedSet; import akechi.projectl.AppContext; import akechi.projectl.R; import jp.michikusa.chitose.lingr.Room; public class MessageAdapter extends BaseAdapter { public MessageAdapter(Context context, List<? extends Room.Message> messages) { this.context = context; this.messages.addAll(messages); } public void insertHead(Collection<? extends Room.Message> messages) { this.messages.addAll(messages); } public void setUnreadMessageId(CharSequence messageId) { if(messageId == null) { this.unreadMessageId= null; } else { this.unreadMessageId= messageId.toString(); } } public Room.Message getLatestMessage() { try { return this.messages.last(); } catch(NoSuchElementException e) { Log.e(this.getClass().getSimpleName(), "Suppressing exception", e); return null; } } public void add(Room.Message e) { this.messages.add(e); } public void clear() { this.messages.clear(); } @Override public int getCount() { return this.messages.size(); } @Override public Room.Message getItem(int position) { return Iterables.get(this.messages, position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { final View view; if(convertView == null) { final LayoutInflater inflater= (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view= inflater.inflate(R.layout.custom_message, null); } else { view= convertView; } final Room.Message data= this.getItem(position); if(Objects.equal(view.getTag(), data.getId())) { return view; } view.setTag(data.getId()); final ImageView iconView= (ImageView)view.findViewById(R.id.iconView); iconView.setImageURI(Uri.parse(data.getIconUrl())); final TextView nicknameView= (TextView)view.findViewById(R.id.nicknameView); nicknameView.setText(data.getNickname()); final TextView timestampView= (TextView)view.findViewById(R.id.timestampView); { final Date timestamp= new Date(new DateTime(data.getTimestamp()).getValue()); timestampView.setText(DateFormat.getDateTimeInstance().format(timestamp)); } final TextView textView= (TextView)view.findViewById(R.id.textView); textView.setText(data.getText()); final AppContext appContext= (AppContext)this.context.getApplicationContext(); appContext.getInlineImageMode().doWork(textView); final TextView separatorView= (TextView)view.findViewById(R.id.separatorTextView); if(Strings.isNullOrEmpty(this.unreadMessageId)) { separatorView.setVisibility(TextView.GONE); } else if(this.unreadMessageId.equals(data.getId())) { separatorView.setText("--- UNREAD MESSAGES FROM HERE ---"); separatorView.setVisibility(TextView.VISIBLE); } else { separatorView.setVisibility(TextView.GONE); } return view; } private final Context context; private final SortedSet<Room.Message> messages= Sets.newTreeSet(new Comparator<Room.Message>(){ @Override public int compare(Room.Message lhs, Room.Message rhs) { return ComparisonChain.start() .compare(new DateTime(lhs.getTimestamp()).getValue(), new DateTime(rhs.getTimestamp()).getValue()) .compare(lhs.getId(), rhs.getId()) .result() ; } }); private String unreadMessageId; }