blob: 5cdefeec856d6c1e9190c2835e5b9d26799cd4fe [file] [log] [blame]
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.JSONUtils;
import org.wordpress.android.util.GravatarUtils;
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
public 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);
}
}
}