package com.abewy.android.apps.klyph.adapter.fql;
import java.util.Arrays;
import java.util.List;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.abewy.android.apps.klyph.Klyph;
import com.abewy.android.apps.klyph.KlyphBundleExtras;
import com.abewy.android.apps.klyph.R;
import com.abewy.android.apps.klyph.adapter.KlyphAdapter;
import com.abewy.android.apps.klyph.adapter.MultiObjectAdapter;
import com.abewy.android.apps.klyph.adapter.holder.PhotoHolder;
import com.abewy.android.apps.klyph.app.PostActivity;
import com.abewy.android.apps.klyph.core.fql.Photo;
import com.abewy.android.apps.klyph.core.graph.GraphObject;
import com.abewy.android.apps.klyph.core.request.Response;
import com.abewy.android.apps.klyph.core.util.AttrUtil;
import com.abewy.android.apps.klyph.facebook.IFbPermissionCallback;
import com.abewy.android.apps.klyph.facebook.IFbPermissionWorker;
import com.abewy.android.apps.klyph.request.AsyncRequest;
import com.abewy.android.apps.klyph.request.AsyncRequest.Query;
import com.abewy.android.apps.klyph.util.DateUtil;
import com.abewy.android.apps.klyph.util.KlyphUtil;
import com.abewy.android.apps.klyph.util.TextViewUtil;
import com.facebook.Session;
public class PhotoAdapter extends KlyphAdapter implements IFbPermissionCallback
{
private MultiObjectAdapter parentAdapter;
private PhotoHolder pendingHolder;
private Photo pendingPhoto;
private boolean pendingLike;
private final List<String> PERMISSIONS = Arrays.asList("publish_actions", "status_update");
public PhotoAdapter(MultiObjectAdapter parentAdapter)
{
super();
this.parentAdapter = parentAdapter;
}
@Override
protected int getLayout()
{
return R.layout.item_photo;
}
@Override
public boolean isEnabled(GraphObject object)
{
return false;
}
@Override
protected void attachHolder(View view)
{
ImageView authorProfileImage = (ImageView) view.findViewById(R.id.author_profile_image);
TextView story = (TextView) view.findViewById(R.id.story);
TextView postTime = (TextView) view.findViewById(R.id.post_time);
TextView message = (TextView) view.findViewById(R.id.message);
Button likeButton = (Button) view.findViewById(R.id.like_button);
Button commentButton = (Button) view.findViewById(R.id.comment_button);
ImageButton shareButton = (ImageButton) view.findViewById(R.id.share_button);
ViewGroup buttonBar = (ViewGroup) view.findViewById(R.id.button_bar);
PhotoHolder holder = new PhotoHolder(authorProfileImage, story, postTime, message, likeButton, commentButton, shareButton, buttonBar);
setHolder(view, holder);
}
@Override
protected void mergeViewWithData(View view, GraphObject data)
{
super.mergeViewWithData(view, data);
final PhotoHolder holder = (PhotoHolder) getHolder(view);
setData(view, data);
setData(view, holder, (Photo) data);
}
public void setData(View view, PhotoHolder holder, final Photo photo)
{
final ImageView imageView = holder.getAuthorProfileImage();
loadImage(imageView, photo.getOwner_pic(), KlyphUtil.getProfilePlaceHolder(imageView.getContext()));
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
Intent intent = Klyph.getIntentForParams(getContext(imageView), photo.getOwner(), photo.getOwner_name(), photo.getOwner_type());
imageView.getContext().startActivity(intent);
}
});
holder.getStory().setText(photo.getOwner_name());
TextViewUtil.setElementClickable(holder.getStory().getContext(), holder.getStory(), photo.getOwner_name(), photo.getOwner(),
photo.getOwner_type(), false);
if (photo.getTarget_id() != null && photo.getTarget_id().length() > 0 && photo.getTarget_name().length() > 0
&& !photo.getTarget_id().equals(photo.getOwner()))
{
holder.getStory().append(" > " + photo.getTarget_name());
TextViewUtil.setElementClickable(holder.getStory().getContext(), holder.getStory(), photo.getTarget_name(), photo.getTarget_id(),
photo.getTarget_type(), false);
}
holder.getPostTime().setText(DateUtil.timeAgoInWords(holder.getPostTime().getContext(), photo.getCreated()));
if (photo.getCaption().length() > 0)
{
holder.getMessage().setText(photo.getCaption());
holder.getMessage().setVisibility(View.VISIBLE);
}
else
{
holder.getMessage().setVisibility(View.GONE);
}
manageLikeButton(holder, photo);
manageCommentButton(holder, photo);
manageListeners(holder, photo);
holder.getLikeButton().setEnabled(true);
}
private int padding8 = -1;
private int padding12 = -1;
private void manageLikeButton(PhotoHolder holder, Photo photo)
{
if (photo.getLike_info().getCan_like())
{
int iconId = R.attr.cardLikeIcon;
if (photo.getLike_info().getUser_likes())
{
iconId = R.attr.userLikeBaselineIcon2;
}
iconId = AttrUtil.getResourceId(getContext(holder.getAuthorProfileImage()), iconId);
holder.getLikeButton().setCompoundDrawablesWithIntrinsicBounds(iconId, 0, 0, 0);
Resources res = holder.getLikeButton().getContext().getResources();
if (padding8 == -1)
padding8 = res.getDimensionPixelSize(R.dimen.dip_8);
if (padding12 == -1)
padding12 = res.getDimensionPixelSize(R.dimen.dip_12);
int likeCount = photo.getLike_info().getLike_count();
if (likeCount > 0)
{
holder.getLikeButton().setPadding(padding8, 0, padding8, 0);
holder.getLikeButton().setCompoundDrawablePadding(4);
holder.getLikeButton().setText(String.valueOf(likeCount));
}
else
{
holder.getLikeButton().setPadding(padding12, 0, padding8, 0);
holder.getLikeButton().setText("");
}
holder.getLikeButton().setVisibility(View.VISIBLE);
}
else
{
holder.getLikeButton().setVisibility(View.GONE);
}
}
private void manageCommentButton(PhotoHolder holder, Photo photo)
{
if (photo.getComment_info().getCan_comment())
{
int commentCount = photo.getComment_info().getComment_count();
if (commentCount > 0)
{
int icon = AttrUtil.getResourceId(holder.getCommentButton().getContext(), R.attr.cardCommentIcon);
holder.getCommentButton().setCompoundDrawablesWithIntrinsicBounds(icon, 0, 0, 0);
holder.getCommentButton().setCompoundDrawablePadding(4);
holder.getCommentButton().setText(String.valueOf(commentCount));
}
else
{
holder.getCommentButton().setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
holder.getCommentButton().setText(holder.getCommentButton().getContext().getString(R.string.comment));
}
holder.getCommentButton().setVisibility(View.VISIBLE);
}
else
{
holder.getCommentButton().setVisibility(View.GONE);
}
}
private void manageListeners(final PhotoHolder holder, final Photo photo)
{
final Context context = getContext(holder.getAuthorProfileImage());
holder.getLikeButton().setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
handleLikeAction(holder, photo);
}
});
holder.getCommentButton().setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
// context.startActivity(Klyph.getIntentForGraphObject((Activity) context, photo));
}
});
holder.getShareButton().setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
handleShareAction(holder, photo);
}
});
}
private void handleLikeAction(final PhotoHolder holder, final Photo photo)
{
pendingLike = false;
pendingPhoto = null;
Session session = Session.getActiveSession();
List<String> permissions = session.getPermissions();
if (!permissions.containsAll(PERMISSIONS))
{
pendingLike = true;
requestPermissions(holder, photo);
return;
}
doLikeAction(holder, photo);
}
private void doLikeAction(final PhotoHolder holder, final Photo photo)
{
// manageLikeButton(holder, stream, subStream, false);
final Context context = getContext(holder.getAuthorProfileImage());
if (!photo.getLike_info().getUser_likes())
{
photo.getLike_info().setUser_likes(true);
photo.getLike_info().setLike_count(photo.getLike_info().getLike_count() + 1);
manageLikeButton(holder, photo);
holder.getLikeButton().setEnabled(false);
new AsyncRequest(Query.POST_LIKE, photo.getObject_id(), "", new AsyncRequest.Callback() {
@Override
public void onComplete(Response response)
{
Log.d("onComplete", "" + response.getError());
if (response.getError() != null)
{
Toast.makeText(context, R.string.like_error, Toast.LENGTH_SHORT).show();
photo.getLike_info().setUser_likes(false);
photo.getLike_info().setLike_count(photo.getLike_info().getLike_count() - 1);
}
holder.getLikeButton().setEnabled(true);
manageLikeButton(holder, photo);
parentAdapter.notifyDataSetChanged();
}
}).execute();
parentAdapter.notifyDataSetChanged();
}
else
{
photo.getLike_info().setUser_likes(false);
photo.getLike_info().setLike_count(photo.getLike_info().getLike_count() - 1);
manageLikeButton(holder, photo);
holder.getLikeButton().setEnabled(false);
new AsyncRequest(Query.POST_UNLIKE, photo.getObject_id(), "", new AsyncRequest.Callback() {
@Override
public void onComplete(Response response)
{
Log.d("onComplete", "" + response.getError());
if (response.getError() != null)
{
Toast.makeText(context, R.string.unlike_error, Toast.LENGTH_SHORT).show();
photo.getLike_info().setUser_likes(true);
photo.getLike_info().setLike_count(photo.getLike_info().getLike_count() + 1);
}
holder.getLikeButton().setEnabled(true);
manageLikeButton(holder, photo);
parentAdapter.notifyDataSetChanged();
}
}).execute();
parentAdapter.notifyDataSetChanged();
}
}
private void handleShareAction(final PhotoHolder holder, final Photo photo)
{
Intent intent = new Intent(getContext(holder.getShareButton()), PostActivity.class);
intent.putExtra(KlyphBundleExtras.SHARE, true);
intent.putExtra(KlyphBundleExtras.SHARE_PHOTO_ID, photo.getObject_id());
getContext(holder.getShareButton()).startActivity(intent);
}
private void requestPermissions(final PhotoHolder holder, final Photo photo)
{
pendingHolder = holder;
pendingPhoto = photo;
((IFbPermissionWorker) getContext(holder.getAuthorProfileImage())).requestPublishPermissions(this, PERMISSIONS);
}
@Override
public void onPermissionsChange()
{
if (pendingLike == true)
{
handleLikeAction(pendingHolder, pendingPhoto);
}
}
@Override
public void onCancelPermissions()
{
pendingLike = false;
}
}