package what.whatandroid.comments;
import android.content.Context;
import android.text.Html;
import android.text.format.DateUtils;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
import api.comments.SimpleComment;
import what.whatandroid.R;
import what.whatandroid.WhatApplication;
import what.whatandroid.callbacks.AddQuoteCallback;
import what.whatandroid.callbacks.ViewUserCallbacks;
import what.whatandroid.imgloader.HtmlImageHider;
import what.whatandroid.imgloader.ImageLoadFailTracker;
import what.whatandroid.settings.SettingsActivity;
import java.util.Date;
/**
* Adapter for displaying a list of user comments
*/
public class CommentsAdapter extends ArrayAdapter<SimpleComment> implements View.OnClickListener {
private final LayoutInflater inflater;
/**
* Used to hide HTML images by simply returning transparent drawables
*/
private final HtmlImageHider imageGetter;
/**
* Tracks which images failed to load so that we can skip trying to reload
* them and just display the no-avatar icon
*/
private ImageLoadFailTracker imageFailTracker;
private boolean imagesEnabled;
/**
* Callbacks to view a user when avatar/header is clicked
*/
private ViewUserCallbacks viewUser;
/**
* Callback to notify that the user wants to quote some text
* This is optional until posting is added to the other areas we show comments
*/
private AddQuoteCallback addQuote;
/**
* Instance of the comment BBcode parser and formatter
*/
private WhatBBParser whatBBParser;
private boolean isQuoteVisible = true;
public CommentsAdapter(Context context){
super(context, R.layout.list_user_comment);
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageGetter = new HtmlImageHider(context);
imageFailTracker = new ImageLoadFailTracker();
imagesEnabled = SettingsActivity.imagesEnabled(context);
whatBBParser = new WhatBBParser();
try {
viewUser = (ViewUserCallbacks)context;
}
catch (ClassCastException e){
throw new ClassCastException(context.toString() + " must implement ViewUserCallbacks");
}
//TODO: No error for now as replying and quoting is only in the forums at the moment
try {
addQuote = (AddQuoteCallback) context;
}
catch (ClassCastException e){
//Not an error at the moment
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder;
if (convertView != null){
holder = (ViewHolder)convertView.getTag();
}
else {
convertView = inflater.inflate(R.layout.list_user_comment, parent, false);
holder = new ViewHolder();
holder.username = (TextView)convertView.findViewById(R.id.username);
holder.postDate = (TextView)convertView.findViewById(R.id.post_date);
holder.commentText = (TextView)convertView.findViewById(R.id.comment_text);
holder.artContainer = convertView.findViewById(R.id.art_container);
holder.image = (ImageView)convertView.findViewById(R.id.image);
holder.spinner = (ProgressBar)convertView.findViewById(R.id.loading_indicator);
holder.userClickListener = new UserClickListener();
holder.quote = (ImageButton) convertView.findViewById(R.id.reply_quote);
holder.quote.setImageResource(R.drawable.ic_reply_24dp);
View header = convertView.findViewById(R.id.user_header);
header.setOnClickListener(holder.userClickListener);
convertView.setTag(holder);
}
SimpleComment comment = getItem(position);
holder.userClickListener.userId = comment.getAuthorId();
holder.username.setText(comment.getAuthor());
holder.postDate.setText(DateUtils.getRelativeTimeSpanString(comment.getTimePosted().getTime(),
new Date().getTime(), 0, DateUtils.FORMAT_ABBREV_ALL));
//The RequestComments don't have the bbBody field
if (comment.getBBbody() != null){
holder.commentText.setText(whatBBParser.parsebb(comment.getBBbody()));
}
else {
holder.commentText.setText(Html.fromHtml(comment.getBody(), imageGetter, new HTMLListTagHandler()));
}
holder.commentText.setMovementMethod(LinkMovementMethod.getInstance());
holder.image.setOnClickListener(holder.userClickListener);
String imgUrl = comment.getAvatar();
if (!imagesEnabled) {
holder.artContainer.setVisibility(View.GONE);
} else {
holder.artContainer.setVisibility(View.VISIBLE);
WhatApplication.loadImage(getContext(), imgUrl, holder.image, holder.spinner, imageFailTracker, R.drawable.no_avatar);
}
if (addQuote != null){
holder.quote.setVisibility(View.VISIBLE);
holder.quote.setTag(position);
holder.quote.setOnClickListener(this);
}
if(!isQuoteVisible){
holder.quote.setVisibility(View.GONE);
}
return convertView;
}
@Override
public void onClick(View v){
if (v.getId() == R.id.reply_quote && addQuote != null){
addQuote.quote(getItem((Integer) v.getTag()).getQuote());
}
}
public boolean isQuoteVisible() {
return isQuoteVisible;
}
public void setQuoteVisible(boolean isQuoteVisible) {
this.isQuoteVisible = isQuoteVisible;
}
private static class ViewHolder {
public TextView username, postDate, commentText;
public View artContainer;
public ImageView image;
public ProgressBar spinner;
public UserClickListener userClickListener;
public ImageButton quote;
}
private class UserClickListener implements View.OnClickListener {
public int userId;
@Override
public void onClick(View v){
viewUser.viewUser(userId);
}
}
}