/**
* A row with and avatar, name and follow button
*
* The follow button switches between "Follow" and "Unfollow" depending on the follow status
* and provides and interface to know when the user has tried to follow or unfollow by tapping
* the button.
*
* Potentially can integrate with Gravatar using the avatar url to find profile JSON.
*/
package org.wordpress.android.ui.notifications;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.toolbox.NetworkImageView;
import com.justsystems.hpb.pad.R;
import org.json.JSONException;
import org.json.JSONObject;
public class FollowRow extends LinearLayout {
public static interface OnFollowListener {
public void onUnfollow(FollowRow row, String blogId);
public void onFollow(FollowRow row, String blogId);
}
private static final String TAG = "FollowRow";
private static String PARAMS_FIELD = "params";
private static String TYPE_FIELD = "type";
private static String ACTION_TYPE = "follow";
private static String BLOG_ID_PARAM = "blog_id";
private static String IS_FOLLOWING_PARAM = "is_following";
private static String BLOG_URL_PARAM = "blog_url";
private static String BLOG_DOMAIN_PARAM = "blog_domain";
private boolean mFollowing = false;
private String mBlogId = null;
private OnFollowListener mListener = null;
private JSONObject mParams = null;
private CharSequence mDefaultText = "";
private String mBlogURL = null;
public FollowRow(Context context) {
super(context);
}
public FollowRow(Context context, AttributeSet attributes) {
super(context, attributes);
}
public FollowRow(Context context, AttributeSet attributes, int defStyle) {
super(context, attributes, defStyle);
}
public void setAction(JSONObject actionJSON) {
ImageButton followButton = getFollowButton();
View followDivider = getFollowDivider();
getImageView().setDefaultImageResId(R.drawable.placeholder);
try {
if (actionJSON.has(TYPE_FIELD)
&& actionJSON.getString(TYPE_FIELD).equals(ACTION_TYPE)) {
// get the parms for following
mParams = actionJSON.getJSONObject(PARAMS_FIELD);
// show the button
followButton.setVisibility(VISIBLE);
followButton.setOnClickListener(new ClickListener());
followButton.setOnLongClickListener(new LongClickListener());
followDivider.setVisibility(VISIBLE);
getSiteTextView().setText(getSiteDomain());
setClickable(true);
} else {
mParams = null;
followButton.setVisibility(GONE);
followButton.setOnClickListener(null);
followDivider.setVisibility(GONE);
getSiteTextView().setText("");
setClickable(false);
}
if (hasParams())
setSiteUrl(mParams.optString(BLOG_URL_PARAM, null));
updateButton();
} catch (JSONException e) {
Log.e(TAG,
String.format("Could not set action from %s", actionJSON),
e);
getFollowButton().setVisibility(GONE);
getFollowDivider().setVisibility(GONE);
getSiteTextView().setText("");
setClickable(false);
mParams = null;
}
}
public JSONObject getParams() {
return mParams;
}
public boolean hasParams() {
return mParams != null;
}
public NetworkImageView getImageView() {
return (NetworkImageView) findViewById(R.id.avatar);
}
public ImageButton getFollowButton() {
return (ImageButton) findViewById(R.id.follow_button);
}
public TextView getTextView() {
return (TextView) findViewById(R.id.name);
}
public TextView getSiteTextView() {
return (TextView) findViewById(R.id.url);
}
private View getFollowDivider() {
return (View) findViewById(R.id.follow_divider);
}
public void setDefaultText(CharSequence text) {
setText(text);
mDefaultText = getTextView().getText();
}
public void setText(CharSequence text) {
getTextView().setText(text);
}
public void setText(int resourceId) {
getTextView().setText(resourceId);
}
public boolean isSiteId(String siteId) {
return getSiteId().equals(siteId);
}
public void setFollowing(boolean following) {
if (hasParams()) {
try {
mParams.putOpt(IS_FOLLOWING_PARAM, following);
} catch (JSONException e) {
Log.e(TAG,
String.format("Could not set following %b", following),
e);
}
}
;
updateButton();
}
public boolean isFollowing() {
if (hasParams()) {
return mParams.optBoolean(IS_FOLLOWING_PARAM, false);
} else {
return false;
}
}
public String getSiteId() {
if (hasParams()) {
return mParams.optString(BLOG_ID_PARAM, null);
} else {
return null;
}
}
public void setSiteUrl(String url) {
mBlogURL = url;
if (url != null) {
this.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mBlogURL != null) {
try {
Uri uri = Uri.parse(mBlogURL);
getContext().startActivity(
new Intent(Intent.ACTION_VIEW, uri));
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
} else {
this.setOnClickListener(null);
}
}
public String getSiteUrl() {
return mBlogURL;
}
public String getSiteDomain() {
if (hasParams()) {
return mParams.optString(BLOG_DOMAIN_PARAM, null);
} else {
return null;
}
}
public OnFollowListener getListener() {
return mListener;
}
public void setListener(OnFollowListener listener) {
mListener = listener;
}
public boolean hasListener() {
return mListener != null;
}
protected void updateButton() {
ImageButton followButton = getFollowButton();
followButton.setSelected(isFollowing());
if (isFollowing()) {
followButton.setImageResource(R.drawable.follow_minus);
} else {
followButton.setImageResource(R.drawable.follow_plus);
}
}
class ClickListener implements View.OnClickListener {
public void onClick(View v) {
if (!hasListener()) {
return;
}
ImageButton followButton = getFollowButton();
OnFollowListener listener = getListener();
if (isFollowing()) {
followButton.setImageResource(R.drawable.follow_plus);
listener.onUnfollow(FollowRow.this, getSiteId());
} else {
followButton.setImageResource(R.drawable.follow_minus);
listener.onFollow(FollowRow.this, getSiteId());
}
}
}
class LongClickListener implements View.OnLongClickListener {
@Override
public boolean onLongClick(View v) {
Toast.makeText(getContext(),
getResources().getString(R.string.tooltip_follow),
Toast.LENGTH_SHORT).show();
return true;
}
}
}