package com.aptoide.amethyst.adapter.timeline;
import android.content.Context;
import android.content.Intent;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.animation.AnimationUtils;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Toast;
import com.aptoide.amethyst.Aptoide;
import com.aptoide.amethyst.R;
import com.aptoide.amethyst.analytics.Analytics;
import com.aptoide.amethyst.utils.AptoideUtils;
import com.aptoide.amethyst.utils.IconSizeUtils;
import com.aptoide.amethyst.webservices.json.TimelineListAPKsJson;
import com.aptoide.dataprovider.webservices.models.Constants;
import com.bumptech.glide.Glide;
import com.facebook.ads.NativeAd;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import com.aptoide.amethyst.Ads.FaceBookAdButton;
import com.aptoide.amethyst.AppViewActivity;
import com.aptoide.amethyst.webservices.timeline.TimeLineManager;
/**
* Created by fabio on 15-10-2015.
*/
public class TimelineAdapter extends ArrayAdapter<TimelineListAPKsJson.UserApk> {
private static final int ACTIVE = 0;
private static final int HIDDEN = 1;
private static final int ADTYPE = 2;
// private NativeAd ad;
private static final int AD_INDEX = 3;
private View adView;
private TimeLineManager mTimeLineManager;
private final LayoutInflater mInflater;
private NativeAd ad;
public TimelineAdapter(TimeLineManager callback, Context context, ArrayList<TimelineListAPKsJson.UserApk> apks) {
super(context,0,apks);
mInflater = LayoutInflater.from(context);
mTimeLineManager = callback;
}
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public int getItemViewType(int position) {
int type;
if(getItem(position).info==null)
type = ADTYPE;
else type = getItem(position).info.isStatusActive()?ACTIVE:HIDDEN;
TimelineListAPKsJson.UserApk apk = getItem(position);
return type;
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
switch (getItemViewType(position)) {
case ADTYPE:
return adView;
case ACTIVE:
return getViewActive(position, convertView, parent);
case HIDDEN:
return getViewHidden(position, convertView, parent);
default:
return null;
}
}
public View getViewHidden(final int position, View convertView, final ViewGroup parent) {
final View v;
final ViewHolderHidden holder;
if(convertView == null) {
convertView = mInflater.inflate(R.layout.row_timeline_post_hidden, parent, false);
holder = new ViewHolderHidden();
holder.text = (TextView) convertView.findViewById(R.id.timeline_post_text);
holder.popUpMenu = (Button) convertView.findViewById(R.id.timeline_post_options);
convertView.setTag(holder);
}else {
holder = (ViewHolderHidden)convertView.getTag();
}
v = convertView;
final TimelineListAPKsJson.UserApk entry = getItem(position);
final long id = entry.info.id.longValue();
SpannableString unhidePost = new SpannableString(getContext().getString(R.string.unhide_post));
unhidePost.setSpan(new UnderlineSpan(), 0, unhidePost.length(), 0);
holder.popUpMenu.setText(unhidePost);
if(entry.animate){
v.startAnimation(AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_in));
entry.animate = false;
}
holder.text.setText(entry.apk.name);
holder.popUpMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTimeLineManager.unHidePost(id);
entry.info.status = "active";
entry.animate = true;
notifyDataSetChanged();
}
});
return v;
}
//FIXME adicionar ao aptoideconfig a class
Class appViewActivityClass = AppViewActivity.class;//Aptoide.getConfiguration().getAppViewActivityClass();
public View getViewActive(final int position, View convertView, final ViewGroup parent) {
final View v;
final ViewHolder holder;
if(convertView == null){
convertView = mInflater.inflate(R.layout.row_timeline_post, parent, false);
holder = new ViewHolder();
holder.userPhoto = (ImageView) convertView.findViewById(R.id.timeline_post_user_photo);
holder.userName = (TextView) convertView.findViewById(R.id.timeline_post_user_name);
// holder.action = (TextView) convertView.findViewById(R.id.timeline_post_user_action);
holder.time = (TextView) convertView.findViewById(R.id.timeline_post_timestamp);
holder.popUpMenu = (Button) convertView.findViewById(R.id.timeline_post_options);
holder.appIcon = (ImageView) convertView.findViewById(R.id.timeline_post_app_icon);
holder.appName = (TextView) convertView.findViewById(R.id.timeline_post_app_name);
holder.appVersion = (TextView) convertView.findViewById(R.id.timeline_post_app_version);
holder.appRepo = (TextView) convertView.findViewById(R.id.timeline_post_app_store);
// holder.bottomLayout = (LinearLayout) convertView.findViewById(R.id.timeline_post_bottom);
holder.likesandcomments = (TextView) convertView.findViewById(R.id.timeline_post_likes_and_comments);
holder.likeButton = (FrameLayout) convertView.findViewById(R.id.timeline_post_like_button) ;
holder.likeButtonText = (TextView) convertView.findViewById(R.id.timeline_post_like_text);
holder.commentButton = (FrameLayout) convertView.findViewById(R.id.timeline_post_comment) ;
holder.openAppViewLayout = (FrameLayout) convertView.findViewById(R.id.timeline_post_open) ;
convertView.setTag(holder);
}else{
holder = (ViewHolder)convertView.getTag();
}
v = convertView;
final TimelineListAPKsJson.UserApk entry = getItem(position);
final long id = entry.info.id.longValue();
// addAppListener(holder.centerLayout, entry.getApk_id().longValue());
// addLikeListener(holder.likeButton, entry.getPostID().longValue());
// addCommentListener(holder.commentButton, entry.getPostID().longValue());
// addOptionsListener(holder.popUpMenu, entry.getPostID().longValue());
holder.appName.setText(entry.apk.name);
String icon;
if (entry.apk.icon_hd != null) {
icon = entry.apk.icon_hd;
String sizeString = IconSizeUtils.generateSizeString(getContext());
String[] splittedUrl = icon.split("\\.(?=[^\\.]+$)");
icon = splittedUrl[0] + "_" + sizeString + "." + splittedUrl[1];
} else {
icon = entry.apk.icon;
}
final Context context = parent.getContext();
Glide.with(context).load(icon).into(holder.appIcon);
holder.userName.setText(entry.info.username);
Glide.with(context).load(entry.info.avatar).into(holder.userPhoto);
if(entry.info.owned){
holder.popUpMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mTimeLineManager.hidePost(id);
entry.info.status = "hidden";
Toast.makeText(getContext(), getContext().getString(R.string.hide_post_info), Toast.LENGTH_SHORT).show();
entry.animate = true;
notifyDataSetChanged();
}
});
holder.popUpMenu.setVisibility(View.VISIBLE);
} else {
holder.popUpMenu.setVisibility(View.GONE);
}
if(entry.animate){
v.startAnimation(AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_in));
entry.animate = false;
}
holder.openAppViewLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(getContext(), appViewActivityClass);
TimelineListAPKsJson.UserApk.APK apk = entry.apk;
i.putExtra(Constants.FROM_TIMELINE_KEY, true);
i.putExtra(Constants.STORENAME_KEY, apk.repo);
i.putExtra(Constants.APPNAME_KEY, apk.name);
i.putExtra(Constants.MD5SUM_KEY, apk.md5sum);
i.putExtra(Constants.DOWNLOAD_FROM_KEY, "timeline");
(getContext()).startActivity(i);
}
});
// holder.action.setText("installed:");
// if (AccountManager.get(ctx).getAccountsByType(
// Aptoide.getConfiguration().getAccountType())[0].name.equals(entry.getUserMail())) {
// holder.popUpMenu.setVisibility( View.VISIBLE );
// } else {
// holder.popUpMenu.setVisibility( View.GONE );
// }
// holder.likes.setText(NumberFormat.getIntegerInstance().format(entry.getLikes())
// +((entry.getLikes().longValue()==1)?" Like" :" Likes"));
// holder.comments.setText(NumberFormat.getIntegerInstance().format(entry.getFriends())
// +((entry.getFriends().longValue()==1)?" Comment" :" Comments"));
//
// boolean hasLikes = !(entry.getLikes().longValue()==0);
// boolean hasComments = !(entry.getFriends().longValue() == 0);
// if (hasLikes || hasComments) {
// holder.bottomLayout.setVisibility(View.VISIBLE);
//
// holder.likes.setVisibility( hasLikes ? View.VISIBLE : View.GONE);
// holder.comments.setVisibility( hasComments? View.VISIBLE : View.GONE);
//
// if (hasLikes && hasComments) holder.and.setVisibility(View.VISIBLE);
// else holder.and.setVisibility(View.GONE);
// } else {
// holder.bottomLayout.setVisibility(View.GONE);
// }
StringBuilder sb= new StringBuilder();
final int likes = entry.info.likes.intValue();
int comments = entry.info.comments.intValue();
if(likes > 0 || comments > 0) {
if (likes > 0) {
if (likes == 1) {
sb.append(String.valueOf(likes) + " " + getContext().getString(R.string.timeline_like));
}else{
sb.append(String.valueOf(likes) + " " + getContext().getString(R.string.likes));
}
}
if (likes > 0 && comments > 0) {
sb.append(" ");
}
if (comments > 0) {
if(comments == 1) {
sb.append(String.valueOf(comments) + " " + getContext().getString(R.string.comment));
}else{
sb.append(String.valueOf(comments) + " " + getContext().getString(R.string.comments));
}
}
holder.likesandcomments.setText(sb.toString());
holder.likesandcomments.setVisibility(View.VISIBLE);
holder.likesandcomments.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTimeLineManager.openCommentsDialog(id, position);
}
});
}else{
holder.likesandcomments.setVisibility(View.GONE);
}
holder.time.setText(getTime(Aptoide.getContext(), entry.info.timestamp));
holder.appVersion.setText(entry.apk.vername);
holder.appRepo.setText(getContext().getString(R.string.store)+": " + entry.apk.repo);
final boolean isLiked = entry.info.userliked.equals("like");
if(isLiked){
holder.likeButtonText.setCompoundDrawablesWithIntrinsicBounds(getContext().getResources().getDrawable(R.drawable.ic_action_facebook_like), null, null, null);
holder.likeButtonText.setTextColor(getContext().getResources().getColor(R.color.facebook));
}else{
TypedValue typedV = new TypedValue();
getContext().getTheme().resolveAttribute( R.attr.icRatingGoodDrawable, typedV, true);
holder.likeButtonText.setCompoundDrawablesWithIntrinsicBounds(typedV.resourceId, 0, 0, 0);
getContext().getTheme().resolveAttribute(android.R.attr.textColorSecondary, typedV, true);
int textColor = getContext().getResources().getColor(typedV.resourceId);
holder.likeButtonText.setTextColor(textColor);
}
changeLikeButtonText(isLiked, holder.likeButtonText);
final View myCv = convertView;
holder.likeButton.setOnClickListener(new View.OnClickListener() {
boolean selfIsLiked = isLiked;
int selfLikes = likes;
@Override
public void onClick(View v) {
if(selfIsLiked) {
mTimeLineManager.unlikePost(id);
selfIsLiked =false;
entry.info.userliked = "nolike";
entry.info.likes = --selfLikes;
Analytics.SocialTimeline.dislike(entry.apk.name);
}else{
mTimeLineManager.likePost(id);
selfIsLiked =true;
entry.info.userliked = "like";
entry.info.likes = ++selfLikes;
Analytics.SocialTimeline.like(entry.apk.name);
}
getView(position,myCv,parent);
}
});
holder.commentButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTimeLineManager.openCommentsDialog(id, position);
Analytics.SocialTimeline.comment(entry.apk.name);
}
});
return v;
}
private static void changeLikeButtonText(boolean isLiked, TextView likeButtonText){
int textId = isLiked ? R.string.unlike : R.string.like;
likeButtonText.setText(likeButtonText.getContext().getString(textId));
}
private static String getTime(Context context, String time) {
String result = "";
final SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm");
try {
result = AptoideUtils.DateTimeUtils.getInstance(context).getTimeDiffString(context, dateFormater.parse(time).getTime());
} catch (ParseException e) {
e.printStackTrace();
}
return result;
}
static class ViewHolder {
// TOP
public ImageView userPhoto;
public TextView userName;
// public TextView action;
public TextView time;
public Button popUpMenu;
// CENTER
public TextView appName;
public ImageView appIcon;
public TextView appVersion;
public TextView appRepo;
// BOTTOM
public LinearLayout bottomLayout;
public TextView likesandcomments;
// Buttons
public FrameLayout likeButton;
public FrameLayout commentButton;
public TextView likeButtonText;
//Frame
public FrameLayout openAppViewLayout;
}
static class ViewHolderHidden {
public TextView text;
public Button popUpMenu;
}
@Override
public boolean isEnabled(int position) {
return false;
}
public synchronized void addNativeAd(NativeAd ad, Context context, ArrayList<TimelineListAPKsJson.UserApk> list) {
if (ad == null) {
Log.d("pois", "addNativeAd , was null");
return;
}
if (this.ad != null) {
Log.d("pois","addNativeAd , was old");
// Clean up the old ad before inserting the new one
this.ad.unregisterView();
list.remove(AD_INDEX);
this.ad = null;
this.notifyDataSetChanged();
}
Log.d("pois","addNativeAd , adding native ad");
this.ad = ad;
adView = mInflater.inflate(R.layout.row_timeline_ad_unit, null);
TimelineListAPKsJson.UserApk ret = new UserAPKAd(ad);
inflateAd(ad, adView, context);
list.add(AD_INDEX, ret);
Log.d("pois","addNativeAd , position on "+AD_INDEX);
this.notifyDataSetChanged();
}
public void inflateAd(NativeAd nativeAd, View adView, Context context) {
// Create native UI using the ad metadata.
ImageView nativeAdIcon = (ImageView) adView.findViewById(R.id.nativeAdIcon);
TextView nativeAdTitle = (TextView) adView.findViewById(R.id.nativeAdTitle);
TextView nativeAdTitleRating = (TextView) adView.findViewById(R.id.nativeAdTitleRating);
TextView nativeAdBody = (TextView) adView.findViewById(R.id.nativeAdBody);
ImageView nativeAdImage = (ImageView) adView.findViewById(R.id.nativeAdImage);
TextView nativeAdSocialContext = (TextView) adView.findViewById(R.id.nativeAdSocialContext);
FaceBookAdButton nativeAdCallToAction = (FaceBookAdButton) adView.findViewById(R.id.nativeAdCallToAction);
RatingBar nativeAdStarRating = (RatingBar) adView.findViewById(R.id.nativeAdStarRating);
// Setting the Text
nativeAdSocialContext.setText(nativeAd.getAdSocialContext());
nativeAdCallToAction.setText(nativeAd.getAdCallToAction());
nativeAdTitle.setText(nativeAd.getAdTitle());
nativeAdTitleRating.setText(nativeAd.getAdTitle());
nativeAdBody.setText(nativeAd.getAdBody());
// Downloading and setting the ad icon.
NativeAd.Image adIcon = nativeAd.getAdIcon();
NativeAd.downloadAndDisplayImage(adIcon, nativeAdIcon);
// Downloading and setting the cover image.
NativeAd.Image adCoverImage = nativeAd.getAdCoverImage();
int bannerWidth = adCoverImage.getWidth();
int bannerHeight = adCoverImage.getHeight();
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
int screenWidth = metrics.widthPixels;
int screenHeight = metrics.heightPixels;
nativeAdImage.setLayoutParams(new LinearLayout.LayoutParams(
screenWidth,
Math.min((int) (((double) screenWidth / (double) bannerWidth) * bannerHeight), screenHeight / 3)
));
NativeAd.downloadAndDisplayImage(adCoverImage, nativeAdImage);
NativeAd.Rating rating = nativeAd.getAdStarRating();
if (rating != null) {
nativeAdStarRating.setVisibility(View.VISIBLE);
nativeAdStarRating.setNumStars((int) rating.getScale());
nativeAdStarRating.setRating((float) rating.getValue());
} else {
nativeAdStarRating.setVisibility(View.GONE);
}
// Wire up the View with the native ad, the whole nativeAdContainer will be clickable
//nativeAd.registerViewForInteraction(adView);
// Or you can replace the above call with the following function to specify the clickable areas.
nativeAd.registerViewForInteraction(adView, Arrays.asList(nativeAdCallToAction));
}
public static class UserAPKAd extends TimelineListAPKsJson.UserApk{
NativeAd ad;
public UserAPKAd(NativeAd ad){
this.ad = ad;
}
}
}