diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderSiteHeaderView.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderSiteHeaderView.java | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderSiteHeaderView.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderSiteHeaderView.java new file mode 100644 index 000000000..2a7535a9b --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderSiteHeaderView.java @@ -0,0 +1,205 @@ +package org.wordpress.android.ui.reader.views; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.wordpress.android.R; +import org.wordpress.android.datasets.ReaderBlogTable; +import org.wordpress.android.models.ReaderBlog; +import org.wordpress.android.ui.reader.actions.ReaderActions; +import org.wordpress.android.ui.reader.actions.ReaderBlogActions; +import org.wordpress.android.ui.reader.utils.ReaderUtils; +import org.wordpress.android.util.NetworkUtils; +import org.wordpress.android.util.PhotonUtils; +import org.wordpress.android.util.ToastUtils; +import org.wordpress.android.util.UrlUtils; +import org.wordpress.android.widgets.WPNetworkImageView; +import org.wordpress.android.widgets.WPNetworkImageView.ImageType; + +/** + * topmost view in post adapter when showing blog preview - displays description, follower + * count, and follow button + */ +public class ReaderSiteHeaderView extends LinearLayout { + + public interface OnBlogInfoLoadedListener { + void onBlogInfoLoaded(ReaderBlog blogInfo); + } + + private long mBlogId; + private long mFeedId; + private ReaderFollowButton mFollowButton; + private ReaderBlog mBlogInfo; + private OnBlogInfoLoadedListener mBlogInfoListener; + + public ReaderSiteHeaderView(Context context) { + super(context); + initView(context); + } + + public ReaderSiteHeaderView(Context context, AttributeSet attrs) { + super(context, attrs); + initView(context); + } + + public ReaderSiteHeaderView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(context); + } + + private void initView(Context context) { + View view = inflate(context, R.layout.reader_site_header_view, this); + mFollowButton = (ReaderFollowButton) view.findViewById(R.id.follow_button); + } + + public void setOnBlogInfoLoadedListener(OnBlogInfoLoadedListener listener) { + mBlogInfoListener = listener; + } + + public void loadBlogInfo(long blogId, long feedId) { + mBlogId = blogId; + mFeedId = feedId; + + // first get info from local db + final ReaderBlog localBlogInfo; + if (mBlogId != 0) { + localBlogInfo = ReaderBlogTable.getBlogInfo(mBlogId); + } else if (mFeedId != 0) { + localBlogInfo = ReaderBlogTable.getFeedInfo(mFeedId); + } else { + ToastUtils.showToast(getContext(), R.string.reader_toast_err_get_blog_info); + return; + } + if (localBlogInfo != null) { + showBlogInfo(localBlogInfo); + } + + // then get from server if doesn't exist locally or is time to update it + if (localBlogInfo == null || ReaderBlogTable.isTimeToUpdateBlogInfo(localBlogInfo)) { + ReaderActions.UpdateBlogInfoListener listener = new ReaderActions.UpdateBlogInfoListener() { + @Override + public void onResult(ReaderBlog serverBlogInfo) { + showBlogInfo(serverBlogInfo); + } + }; + if (mFeedId != 0) { + ReaderBlogActions.updateFeedInfo(mFeedId, null, listener); + } else { + ReaderBlogActions.updateBlogInfo(mBlogId, null, listener); + } + } + } + + private void showBlogInfo(ReaderBlog blogInfo) { + // do nothing if unchanged + if (blogInfo == null || blogInfo.isSameAs(mBlogInfo)) { + return; + } + + mBlogInfo = blogInfo; + + ViewGroup layoutInfo = (ViewGroup) findViewById(R.id.layout_blog_info); + TextView txtBlogName = (TextView) layoutInfo.findViewById(R.id.text_blog_name); + TextView txtDomain = (TextView) layoutInfo.findViewById(R.id.text_domain); + TextView txtDescription = (TextView) layoutInfo.findViewById(R.id.text_blog_description); + TextView txtFollowCount = (TextView) layoutInfo.findViewById(R.id.text_blog_follow_count); + WPNetworkImageView imgBlavatar = (WPNetworkImageView) layoutInfo.findViewById(R.id.image_blavatar); + + if (blogInfo.hasName()) { + txtBlogName.setText(blogInfo.getName()); + } else { + txtBlogName.setText(R.string.reader_untitled_post); + } + + if (blogInfo.hasUrl()) { + txtDomain.setText(UrlUtils.getHost(blogInfo.getUrl())); + txtDomain.setVisibility(View.VISIBLE); + } else { + txtDomain.setVisibility(View.GONE); + } + + if (blogInfo.hasDescription()) { + txtDescription.setText(blogInfo.getDescription()); + txtDescription.setVisibility(View.VISIBLE); + } else { + txtDescription.setVisibility(View.GONE); + } + + txtFollowCount.setText(String.format(getContext().getString(R.string.reader_label_follow_count), blogInfo.numSubscribers)); + + if (ReaderUtils.isLoggedOutReader()) { + mFollowButton.setVisibility(View.GONE); + } else { + mFollowButton.setVisibility(View.VISIBLE); + mFollowButton.setIsFollowed(blogInfo.isFollowing); + mFollowButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + toggleFollowStatus(); + } + }); + } + + if (blogInfo.hasImageUrl()) { + int imageSize = getContext().getResources().getDimensionPixelSize(R.dimen.avatar_sz_medium); + String imageUrl = PhotonUtils.getPhotonImageUrl(blogInfo.getImageUrl(), imageSize, imageSize); + imgBlavatar.setImageUrl(imageUrl, ImageType.BLAVATAR); + } else { + imgBlavatar.showDefaultBlavatarImage(); + } + + if (layoutInfo.getVisibility() != View.VISIBLE) { + layoutInfo.setVisibility(View.VISIBLE); + } + + if (mBlogInfoListener != null) { + mBlogInfoListener.onBlogInfoLoaded(blogInfo); + } + } + + private void toggleFollowStatus() { + if (!NetworkUtils.checkConnection(getContext())) { + return; + } + + final boolean isAskingToFollow; + if (mFeedId != 0) { + isAskingToFollow = !ReaderBlogTable.isFollowedFeed(mFeedId); + } else { + isAskingToFollow = !ReaderBlogTable.isFollowedBlog(mBlogId); + } + + ReaderActions.ActionListener listener = new ReaderActions.ActionListener() { + @Override + public void onActionResult(boolean succeeded) { + if (getContext() == null) { + return; + } + mFollowButton.setEnabled(true); + if (!succeeded) { + int errResId = isAskingToFollow ? R.string.reader_toast_err_follow_blog : R.string.reader_toast_err_unfollow_blog; + ToastUtils.showToast(getContext(), errResId); + mFollowButton.setIsFollowed(!isAskingToFollow); + } + } + }; + + // disable follow button until API call returns + mFollowButton.setEnabled(false); + + boolean result; + if (mFeedId != 0) { + result = ReaderBlogActions.followFeedById(mFeedId, isAskingToFollow, listener); + } else { + result = ReaderBlogActions.followBlogById(mBlogId, isAskingToFollow, listener); + } + + if (result) { + mFollowButton.setIsFollowedAnimated(isAskingToFollow); + } + } +} |