package com.buddycloud.card;
import java.text.ParseException;
import java.util.Date;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.text.Html;
import android.text.Spanned;
import android.text.format.DateUtils;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.buddycloud.FullScreenImageActivity;
import com.buddycloud.MainActivity;
import com.buddycloud.R;
import com.buddycloud.customviews.MeasuredMediaView;
import com.buddycloud.customviews.MeasuredMediaView.MeasureListener;
import com.buddycloud.model.MediaModel;
import com.buddycloud.model.PostsModel;
import com.buddycloud.preferences.Preferences;
import com.buddycloud.utils.AvatarUtils;
import com.buddycloud.utils.ImageHelper;
import com.buddycloud.utils.TextUtils;
import com.buddycloud.utils.TimeUtils;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;
public class CommentCard extends AbstractCard {
private static final String MEDIA_URL_SUFIX = "?maxwidth=600";
private static final String MEDIA_URL_SUFIX_FULL = "?maxwidth=1024";
private Spanned anchoredContent;
private MainActivity activity;
private JSONObject comment;
private String channelJid;
private String role;
public CommentCard(String channelJid, JSONObject comment,
MainActivity activity, String role) {
this.channelJid = channelJid;
this.comment = comment;
this.activity = activity;
this.role = role;
this.anchoredContent = TextUtils.anchor(comment.optString("content"));
}
@Override
public JSONObject getPost() {
return comment;
}
@Override
public View getContentView(int position, View convertView,
final ViewGroup viewGroup) {
final String replyAuthor = comment.optString("author");
String published = comment.optString("published");
String mediaStr = comment.optString("media");
final String replyId = comment.optString("id");
JSONArray mediaArray = null;
if (mediaStr != null && mediaStr.length() > 0) {
try {
mediaArray = new JSONArray(mediaStr);
} catch (JSONException e) {}
}
boolean reuse = convertView != null && convertView.getTag() != null;
CardViewHolder holder = null;
if (!reuse) {
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
convertView = inflater.inflate(R.layout.comment_entry, viewGroup, false);
holder = fillHolder(convertView);
convertView.setTag(holder);
} else {
holder = (CardViewHolder) convertView.getTag();
}
final Context context = viewGroup.getContext();
String avatarURL = AvatarUtils.avatarURL(viewGroup.getContext(), replyAuthor);
DisplayImageOptions dio = new DisplayImageOptions.Builder()
.cloneFrom(ImageHelper.defaultImageOptions())
.showImageOnFail(R.drawable.ic_avatar)
.showImageOnLoading(R.drawable.ic_avatar)
.preProcessor(ImageHelper.createRoundProcessor(16, false, -1))
.build();
ImageView avatarView = holder.getView(R.id.bcProfilePic);
ImageLoader.getInstance().displayImage(avatarURL, avatarView, dio);
avatarView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (!channelJid.equals(replyAuthor)) {
activity.showChannelFragment(replyAuthor);
}
}
});
TextView replyAuthorView = holder.getView(R.id.bcPostAuthor);
if (!TextUtils.isEmpty(replyAuthor)) {
replyAuthorView.setText(TextUtils.capitalize(replyAuthor.trim()));
}
final TextView contentTextView = holder.getView(R.id.bcCommentContent);
final TextView contentTextViewAlt = holder.getView(R.id.bcCommentPending);
final MeasuredMediaView mediaView = holder.getView(R.id.bcImageContent);
mediaView.setImageBitmap(null);
drawNoMediaLayout(contentTextView, contentTextViewAlt, mediaView);
if (mediaArray != null) {
drawMediaLayout(mediaArray, context, contentTextView,
contentTextViewAlt, mediaView);
}
View contextArrowDown = holder.getView(R.id.bcArrowDown);
contextArrowDown.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
PostContextUtils.showPostContextActions(viewGroup.getContext(),
channelJid, replyId, role, PostContextUtils.COMMENT_POST);
}
});
TextView publishedView = holder.getView(R.id.bcPostDate);
TextView publishedPendingView = holder.getView(R.id.bcCommentPending);
boolean pending = PostsModel.isPending(comment);
if (!pending) {
try {
long publishedTime = TimeUtils.fromISOToDate(published).getTime();
publishedView.setText(DateUtils.getRelativeTimeSpanString(
publishedTime, new Date().getTime(),
DateUtils.MINUTE_IN_MILLIS));
publishedPendingView.setVisibility(View.GONE);
contextArrowDown.setVisibility(View.VISIBLE);
} catch (ParseException e) {
e.printStackTrace();
}
} else {
publishedView.setText(Html.fromHtml("⌚"));
publishedPendingView.setVisibility(View.VISIBLE);
contextArrowDown.setVisibility(View.GONE);
}
return convertView;
}
private static CardViewHolder fillHolder(View view) {
return CardViewHolder.create(view, R.id.bcProfilePic,
R.id.postContainer, R.id.commentTitleWrapper,
R.id.bcPostAuthor, R.id.bcPostDate, R.id.bcTopRightView,
R.id.bcArrowDown, R.id.bcCommentPending, R.id.bcImageContent,
R.id.bcCommentContent);
}
private void drawNoMediaLayout(TextView contentTextView,
TextView contentTextViewAlt, final MeasuredMediaView mediaView) {
mediaView.setVisibility(View.GONE);
contentTextViewAlt.setVisibility(View.GONE);
contentTextView.setVisibility(View.VISIBLE);
contentTextView.setText(anchoredContent);
contentTextView.setMovementMethod(LinkMovementMethod.getInstance());
}
private void drawMediaLayout(final JSONArray mediaArray, final Context context,
final TextView contentTextView, final TextView contentTextViewAlt,
final MeasuredMediaView mediaView) {
contentTextView.setText(TextUtils.anchor(getMediaURL(mediaArray, context)));
mediaView.setMeasureListener(new MeasureListener() {
@Override
public void measure(int widthMeasureSpec, int heightMeasureSpec) {
drawMediaLayout(mediaArray, context, contentTextView,
contentTextViewAlt, mediaView, widthMeasureSpec);
}
});
mediaView.setVisibility(View.VISIBLE);
}
private void drawMediaLayout(final JSONArray mediaArray,
final Context context, final TextView contentTextView,
final TextView contentTextViewAlt,
final MeasuredMediaView mediaView, int widthMeasureSpec) {
final String imageURLLo = getMediaLoURL(mediaArray, context);
DisplayImageOptions dio = new DisplayImageOptions.Builder()
.cloneFrom(ImageHelper.defaultImageOptions())
.preProcessor(ImageHelper.createRoundProcessor(8, true, widthMeasureSpec))
.build();
ImageLoader.getInstance().displayImage(imageURLLo, mediaView, dio, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String arg0, View arg1) {
contentTextViewAlt.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {
}
@Override
public void onLoadingComplete(String arg0, View arg1, Bitmap arg2) {
contentTextViewAlt.setVisibility(View.GONE);
contentTextView.setVisibility(View.VISIBLE);
contentTextView.setText(anchoredContent);
contentTextView.setMovementMethod(LinkMovementMethod.getInstance());
final String imageURLHi = getMediaHiURL(mediaArray, context);
mediaView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(context, FullScreenImageActivity.class);
intent.putExtra(FullScreenImageActivity.IMAGE_URL, imageURLLo);
intent.putExtra(FullScreenImageActivity.IMAGE_URL_HIGH_RES, imageURLHi);
activity.startActivityForResult(intent, FullScreenImageActivity.REQUEST_CODE);
}
});
}
@Override
public void onLoadingCancelled(String arg0, View arg1) {
// TODO Auto-generated method stub
}
});
}
private String getMediaLoURL(JSONArray mediaArray, final Context context) {
String userMediaURL = getMediaURL(mediaArray, context);
return userMediaURL + MEDIA_URL_SUFIX;
}
private String getMediaHiURL(JSONArray mediaArray, final Context context) {
String userMediaURL = getMediaURL(mediaArray, context);
return userMediaURL + MEDIA_URL_SUFIX_FULL;
}
private String getMediaURL(JSONArray mediaArray, final Context context) {
String apiAddress = Preferences.getPreference(context, Preferences.API_ADDRESS);
JSONObject mediaJson = mediaArray.optJSONObject(0);
String userMediaURL = apiAddress + "/" + mediaJson.optString("channel") +
MediaModel.ENDPOINT + "/" + mediaJson.optString("id");
return userMediaURL;
}
@Override
public void setPost(JSONObject post) {
this.comment = post;
}
@Override
public int compareTo(Card anotherCard) {
try {
Date otherUpdated = TimeUtils.updated(anotherCard.getPost());
Date thisUpdated = TimeUtils.updated(this.getPost());
return thisUpdated.compareTo(otherUpdated);
} catch (ParseException e) {
return 0;
}
}
}