package org.wordpress.android.ui.reader.views;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.LinearLayout;
import android.widget.TextView;
import org.wordpress.android.R;
import org.wordpress.android.ui.reader.actions.ReaderActions;
import org.wordpress.android.ui.reader.actions.ReaderBlogActions;
import org.wordpress.android.ui.reader.models.ReaderSimplePost;
import org.wordpress.android.util.DisplayUtils;
import org.wordpress.android.util.GravatarUtils;
import org.wordpress.android.util.NetworkUtils;
import org.wordpress.android.util.PhotonUtils;
import org.wordpress.android.util.ToastUtils;
import org.wordpress.android.widgets.WPNetworkImageView;
/**
* single simple post view
*/
public class ReaderSimplePostView extends LinearLayout {
public interface OnSimplePostClickListener {
void onSimplePostClick(View v, long siteId, long postId);
}
private ReaderSimplePost mSimplePost;
public ReaderSimplePostView(Context context) {
super(context);
initView(context);
}
public ReaderSimplePostView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public ReaderSimplePostView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public ReaderSimplePostView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initView(context);
}
private void initView(Context context) {
inflate(context, R.layout.reader_simple_post_view, this);
}
public void showPost(ReaderSimplePost simplePost,
ViewGroup parent,
boolean isGlobal,
final OnSimplePostClickListener listener) {
mSimplePost = simplePost;
int avatarSize = DisplayUtils.dpToPx(getContext(), getResources().getDimensionPixelSize(R.dimen.avatar_sz_extra_small));
LayoutInflater inflater = LayoutInflater.from(getContext());
View postView = inflater.inflate(R.layout.reader_simple_post_view, parent, false);
TextView txtTitle = (TextView) postView.findViewById(R.id.text_simple_post_title);
TextView txtExcerpt = (TextView) postView.findViewById(R.id.text_simple_post_excerpt);
View siteHeader = postView.findViewById(R.id.layout_simple_post_site_header);
txtTitle.setText(mSimplePost.getTitle());
if (mSimplePost.hasExcerpt()) {
txtExcerpt.setText(mSimplePost.getExcerpt());
txtExcerpt.setVisibility(View.VISIBLE);
} else {
txtExcerpt.setVisibility(View.GONE);
}
// site header only appears for global related posts
if (isGlobal) {
WPNetworkImageView imgAvatar = (WPNetworkImageView) siteHeader.findViewById(R.id.image_avatar);
TextView txtSiteName = (TextView) siteHeader.findViewById(R.id.text_site_name);
TextView txtAuthorName = (TextView) siteHeader.findViewById(R.id.text_author_name);
txtSiteName.setText(mSimplePost.getSiteName());
txtAuthorName.setText(mSimplePost.getAuthorName());
if (mSimplePost.hasAuthorAvatarUrl()) {
imgAvatar.setVisibility(View.VISIBLE);
String avatarUrl = GravatarUtils.fixGravatarUrl(mSimplePost.getAuthorAvatarUrl(), avatarSize);
imgAvatar.setImageUrl(avatarUrl, WPNetworkImageView.ImageType.AVATAR);
} else {
imgAvatar.setVisibility(View.GONE);
}
ReaderFollowButton btnFollow = (ReaderFollowButton) siteHeader.findViewById(R.id.simple_post_follow_button);
btnFollow.setIsFollowed(mSimplePost.isFollowing());
btnFollow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
toggleFollowStatus((ReaderFollowButton) v);
}
});
siteHeader.setVisibility(View.VISIBLE);
} else {
siteHeader.setVisibility(View.GONE);
}
showFeaturedImage(postView);
postView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
listener.onSimplePostClick(view,
mSimplePost.getSiteId(),
mSimplePost.getPostId());
}
}
});
parent.addView(postView);
}
private void toggleFollowStatus(final ReaderFollowButton btnFollow) {
if (!NetworkUtils.checkConnection(getContext())) return;
final boolean isAskingToFollow = !mSimplePost.isFollowing();
ReaderActions.ActionListener listener = new ReaderActions.ActionListener() {
@Override
public void onActionResult(boolean succeeded) {
if (getContext() == null) return;
btnFollow.setEnabled(true);
if (succeeded) {
mSimplePost.setIsFollowing(isAskingToFollow);
} else {
int errResId = isAskingToFollow ? R.string.reader_toast_err_follow_blog : R.string.reader_toast_err_unfollow_blog;
ToastUtils.showToast(getContext(), errResId);
btnFollow.setIsFollowed(!isAskingToFollow);
}
}
};
// disable follow button until call completes
btnFollow.setEnabled(false);
ReaderBlogActions.followBlogById(mSimplePost.getSiteId(), isAskingToFollow, listener);
btnFollow.setIsFollowedAnimated(isAskingToFollow);
}
private void showFeaturedImage(final View postView) {
final WPNetworkImageView imgFeatured = (WPNetworkImageView) postView.findViewById(R.id.image_featured);
// post must have an excerpt in order to show featured image (not enough space otherwise)
if (!mSimplePost.hasFeaturedImageUrl() || !mSimplePost.hasExcerpt()) {
imgFeatured.setVisibility(View.GONE);
return;
}
// featured image has height set to MATCH_PARENT so wait for parent view's layout to complete
// before loading image so we can set the image height correctly, then tell the imageView
// to crop the downloaded image to fit the exact width/height of the view
postView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
postView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
int featuredImageWidth = DisplayUtils.dpToPx(
getContext(),
getContext().getResources().getDimensionPixelSize(R.dimen.reader_simple_post_image_width));
int cropWidth = featuredImageWidth;
int cropHeight = postView.getHeight();
String photonUrl = PhotonUtils.getPhotonImageUrl(
mSimplePost.getFeaturedImageUrl(), cropWidth, cropHeight);
imgFeatured.setImageUrl(
photonUrl,
WPNetworkImageView.ImageType.PHOTO,
null,
cropWidth,
cropHeight);
}
});
imgFeatured.setVisibility(View.VISIBLE);
}
}