package org.wordpress.android.ui.notifications.blocks; import android.content.Context; import android.text.TextUtils; import android.view.MotionEvent; import android.view.View; import android.view.animation.DecelerateInterpolator; import android.widget.TextView; import org.json.JSONObject; import org.wordpress.android.R; import org.wordpress.android.util.GravatarUtils; import org.wordpress.android.util.JSONUtils; import org.wordpress.android.widgets.WPNetworkImageView; /** * A block that displays information about a User (such as a user that liked a post) */ public class UserNoteBlock extends NoteBlock { private final OnGravatarClickedListener mGravatarClickedListener; private int mAvatarSz; public interface OnGravatarClickedListener { // userId is currently unused, but will be handy once a profile view is added to the app void onGravatarClicked(long siteId, long userId, String siteUrl); } public UserNoteBlock( Context context, JSONObject noteObject, OnNoteBlockTextClickListener onNoteBlockTextClickListener, OnGravatarClickedListener onGravatarClickedListener) { super(noteObject, onNoteBlockTextClickListener); if (context != null) { setAvatarSize(context.getResources().getDimensionPixelSize(R.dimen.notifications_avatar_sz)); } mGravatarClickedListener = onGravatarClickedListener; } void setAvatarSize(int size) { mAvatarSz = size; } int getAvatarSize() { return mAvatarSz; } @Override public BlockType getBlockType() { return BlockType.USER; } @Override public int getLayoutResourceId() { return R.layout.note_block_user; } @Override public View configureView(View view) { final UserActionNoteBlockHolder noteBlockHolder = (UserActionNoteBlockHolder)view.getTag(); noteBlockHolder.nameTextView.setText(getNoteText().toString()); String linkedText = null; if (hasUserUrlAndTitle()) { linkedText = getUserBlogTitle(); } else if (hasUserUrl()) { linkedText = getUserUrl(); } if (!TextUtils.isEmpty(linkedText)) { noteBlockHolder.urlTextView.setText(linkedText); noteBlockHolder.urlTextView.setVisibility(View.VISIBLE); } else { noteBlockHolder.urlTextView.setVisibility(View.GONE); } if (hasUserBlogTagline()) { noteBlockHolder.taglineTextView.setText(getUserBlogTagline()); noteBlockHolder.taglineTextView.setVisibility(View.VISIBLE); } else { noteBlockHolder.taglineTextView.setVisibility(View.GONE); } if (hasImageMediaItem()) { String imageUrl = GravatarUtils.fixGravatarUrl(getNoteMediaItem().optString("url", ""), getAvatarSize()); noteBlockHolder.avatarImageView.setImageUrl(imageUrl, WPNetworkImageView.ImageType.AVATAR); if (!TextUtils.isEmpty(getUserUrl())) { noteBlockHolder.avatarImageView.setOnTouchListener(mOnGravatarTouchListener); noteBlockHolder.rootView.setEnabled(true); noteBlockHolder.rootView.setOnClickListener(mOnClickListener); } else { noteBlockHolder.avatarImageView.setOnTouchListener(null); noteBlockHolder.rootView.setEnabled(false); noteBlockHolder.rootView.setOnClickListener(null); } } else { noteBlockHolder.avatarImageView.showDefaultGravatarImage(); noteBlockHolder.avatarImageView.setOnTouchListener(null); } return view; } private final View.OnClickListener mOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { showBlogPreview(); } }; @Override public Object getViewHolder(View view) { return new UserActionNoteBlockHolder(view); } private class UserActionNoteBlockHolder { private final View rootView; private final TextView nameTextView; private final TextView urlTextView; private final TextView taglineTextView; private final WPNetworkImageView avatarImageView; public UserActionNoteBlockHolder(View view) { rootView = view.findViewById(R.id.user_block_root_view); nameTextView = (TextView)view.findViewById(R.id.user_name); urlTextView = (TextView)view.findViewById(R.id.user_blog_url); taglineTextView = (TextView)view.findViewById(R.id.user_blog_tagline); avatarImageView = (WPNetworkImageView)view.findViewById(R.id.user_avatar); } } String getUserUrl() { return JSONUtils.queryJSON(getNoteData(), "meta.links.home", ""); } private String getUserBlogTitle() { return JSONUtils.queryJSON(getNoteData(), "meta.titles.home", ""); } private String getUserBlogTagline() { return JSONUtils.queryJSON(getNoteData(), "meta.titles.tagline", ""); } private boolean hasUserUrl() { return !TextUtils.isEmpty(getUserUrl()); } private boolean hasUserUrlAndTitle() { return hasUserUrl() && !TextUtils.isEmpty(getUserBlogTitle()); } private boolean hasUserBlogTagline() { return !TextUtils.isEmpty(getUserBlogTagline()); } final View.OnTouchListener mOnGravatarTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int animationDuration = 150; if (event.getAction() == MotionEvent.ACTION_DOWN) { v.animate() .scaleX(0.9f) .scaleY(0.9f) .alpha(0.5f) .setDuration(animationDuration) .setInterpolator(new DecelerateInterpolator()); } else if (event.getActionMasked() == MotionEvent.ACTION_UP || event.getActionMasked() == MotionEvent.ACTION_CANCEL) { v.animate() .scaleX(1.0f) .scaleY(1.0f) .alpha(1.0f) .setDuration(animationDuration) .setInterpolator(new DecelerateInterpolator()); if (event.getActionMasked() == MotionEvent.ACTION_UP && mGravatarClickedListener != null) { // Fire the listener, which will load the site preview for the user's site // In the future we can use this to load a 'profile view' (currently in R&D) showBlogPreview(); } } return true; } }; private void showBlogPreview() { long siteId = Long.valueOf(JSONUtils.queryJSON(getNoteData(), "meta.ids.site", 0)); long userId = Long.valueOf(JSONUtils.queryJSON(getNoteData(), "meta.ids.user", 0)); String siteUrl = getUserUrl(); if (mGravatarClickedListener != null) { mGravatarClickedListener.onGravatarClicked(siteId, userId, siteUrl); } } }