diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/HeaderNoteBlock.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/HeaderNoteBlock.java | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/HeaderNoteBlock.java b/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/HeaderNoteBlock.java new file mode 100644 index 000000000..34985a5de --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/HeaderNoteBlock.java @@ -0,0 +1,164 @@ +package org.wordpress.android.ui.notifications.blocks; + +import android.content.Context; +import android.text.Spannable; +import android.text.TextUtils; +import android.view.MotionEvent; +import android.view.View; +import android.view.animation.DecelerateInterpolator; +import android.widget.TextView; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.wordpress.android.R; +import org.wordpress.android.util.JSONUtils; +import org.wordpress.android.ui.notifications.utils.NotificationsUtils; +import org.wordpress.android.util.GravatarUtils; +import org.wordpress.android.widgets.WPNetworkImageView; + +// Note header, displayed at top of detail view +public class HeaderNoteBlock extends NoteBlock { + + private final JSONArray mHeaderArray; + + private final UserNoteBlock.OnGravatarClickedListener mGravatarClickedListener; + private Boolean mIsComment; + private int mAvatarSize; + + private WPNetworkImageView.ImageType mImageType; + + public HeaderNoteBlock(Context context, JSONArray headerArray, WPNetworkImageView.ImageType imageType, + OnNoteBlockTextClickListener onNoteBlockTextClickListener, + UserNoteBlock.OnGravatarClickedListener onGravatarClickedListener) { + super(new JSONObject(), onNoteBlockTextClickListener); + + mHeaderArray = headerArray; + mImageType = imageType; + mGravatarClickedListener = onGravatarClickedListener; + + if (context != null) { + mAvatarSize = context.getResources().getDimensionPixelSize(R.dimen.avatar_sz_small); + } + } + + @Override + public BlockType getBlockType() { + return BlockType.USER_HEADER; + } + + public int getLayoutResourceId() { + return R.layout.note_block_header; + } + + @Override + public View configureView(View view) { + final NoteHeaderBlockHolder noteBlockHolder = (NoteHeaderBlockHolder)view.getTag(); + + Spannable spannable = NotificationsUtils.getSpannableContentForRanges(mHeaderArray.optJSONObject(0)); + noteBlockHolder.nameTextView.setText(spannable); + + noteBlockHolder.avatarImageView.setImageUrl(getAvatarUrl(), mImageType); + if (!TextUtils.isEmpty(getUserUrl())) { + noteBlockHolder.avatarImageView.setOnTouchListener(mOnGravatarTouchListener); + } else { + noteBlockHolder.avatarImageView.setOnTouchListener(null); + } + + noteBlockHolder.snippetTextView.setText(getSnippet()); + + if (mIsComment) { + View footerView = view.findViewById(R.id.header_footer); + View footerCommentView = view.findViewById(R.id.header_footer_comment); + footerView.setVisibility(View.GONE); + footerCommentView.setVisibility(View.VISIBLE); + } + + return view; + } + + private final View.OnClickListener mOnClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + if (getOnNoteBlockTextClickListener() != null) { + getOnNoteBlockTextClickListener().showDetailForNoteIds(); + } + } + }; + + private String getUserName() { + return JSONUtils.queryJSON(mHeaderArray, "[0].text", ""); + } + + private String getAvatarUrl() { + return GravatarUtils.fixGravatarUrl(JSONUtils.queryJSON(mHeaderArray, "[0].media[0].url", ""), mAvatarSize); + } + + private String getUserUrl() { + return JSONUtils.queryJSON(mHeaderArray, "[0].ranges[0].url", ""); + } + + private String getSnippet() { + return JSONUtils.queryJSON(mHeaderArray, "[1].text", ""); + } + + @Override + public Object getViewHolder(View view) { + return new NoteHeaderBlockHolder(view); + } + + public void setIsComment(Boolean isComment) { + mIsComment = isComment; + } + + private class NoteHeaderBlockHolder { + private final TextView nameTextView; + private final TextView snippetTextView; + private final WPNetworkImageView avatarImageView; + + public NoteHeaderBlockHolder(View view) { + View rootView = view.findViewById(R.id.header_root_view); + rootView.setOnClickListener(mOnClickListener); + nameTextView = (TextView)view.findViewById(R.id.header_user); + snippetTextView = (TextView)view.findViewById(R.id.header_snippet); + avatarImageView = (WPNetworkImageView)view.findViewById(R.id.header_avatar); + } + } + + private 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) + long siteId = Long.valueOf(JSONUtils.queryJSON(mHeaderArray, "[0].ranges[0].site_id", 0)); + long userId = Long.valueOf(JSONUtils.queryJSON(mHeaderArray, "[0].ranges[0].id", 0)); + String siteUrl = getUserUrl(); + if (siteId > 0 && userId > 0) { + mGravatarClickedListener.onGravatarClicked(siteId, userId, siteUrl); + } + } + } + + return true; + } + }; +} |