package com.vansuita.materialabout.views;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Handler;
import android.support.v7.widget.CardView;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.TextView;
import com.vansuita.library.Icon;
import com.vansuita.materialabout.R;
import com.vansuita.materialabout.builder.AboutBuilder;
import com.vansuita.materialabout.builder.Item;
import com.vansuita.materialabout.util.RippleUtil;
import com.vansuita.materialabout.util.VisibleUtil;
/**
* Created by jrvansuita on 10/02/17.
*/
public final class AboutView extends FrameLayout {
private LayoutInflater layoutInflater;
private CardView cvHolder;
private CircleImageView ivPhoto;
private ImageView ivCover;
private TextView tvName;
private TextView tvSubTitle;
private TextView tvBrief;
private TextView tvAppName;
private TextView tvAppTitle;
private ImageView ivAppIcon;
private View appHolder;
private AutoFitGridLayout vLinks;
private AutoFitGridLayout vActions;
private Boolean isDarker;
private int iconColor = 0;
private int animationDelay = 200;
public AboutView(Context context) {
this(context, null);
}
public AboutView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public AboutView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
private void init(AboutBuilder bundle) {
layoutInflater = LayoutInflater.from(getContext());
ViewGroup holder = this;
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
if (bundle.isWrapScrollView()) {
lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
ScrollView scrollView = new ScrollView(getContext());
scrollView.setLayoutParams(lp);
addView(scrollView);
holder = new FrameLayout(getContext());
holder.setLayoutParams(lp);
scrollView.addView(holder);
}
setLayoutParams(lp);
layoutInflater.inflate(R.layout.xab_about_layout_card, holder);
}
private void bind() {
cvHolder = (CardView) findViewById(R.id.card_holder);
ivPhoto = (CircleImageView) findViewById(R.id.photo);
ivCover = (ImageView) findViewById(R.id.cover);
tvName = (TextView) findViewById(R.id.name);
tvSubTitle = (TextView) findViewById(R.id.sub_title);
tvBrief = (TextView) findViewById(R.id.brief);
tvAppName = (TextView) findViewById(R.id.app_name);
tvAppTitle = (TextView) findViewById(R.id.app_title);
ivAppIcon = (ImageView) findViewById(R.id.app_icon);
vLinks = (AutoFitGridLayout) findViewById(R.id.links);
vActions = (AutoFitGridLayout) findViewById(R.id.actions);
appHolder = findViewById(R.id.app_holder);
}
public void build(AboutBuilder bundle) {
init(bundle);
bind();
setupCard(bundle);
tvName.setText(bundle.getName());
VisibleUtil.handle(tvName, bundle.getName());
tvSubTitle.setText(bundle.getSubTitle());
VisibleUtil.handle(tvSubTitle, bundle.getSubTitle());
tvBrief.setText(bundle.getBrief());
VisibleUtil.handle(tvBrief, bundle.getBrief());
tvAppName.setText(bundle.getAppName());
tvAppTitle.setText(bundle.getAppTitle());
setBitmap(ivCover, bundle.getCover());
setBitmap(ivPhoto, bundle.getPhoto());
setBitmap(ivAppIcon, bundle.getAppIcon());
setTextColor(tvName, bundle.getNameColor());
setTextColor(tvSubTitle, bundle.getSubTitleColor());
setTextColor(tvBrief, bundle.getBriefColor());
this.iconColor = bundle.getIconColor();
if (bundle.getBackgroundColor() != 0)
cvHolder.setCardBackgroundColor(bundle.getBackgroundColor());
VisibleUtil.handle(appHolder, bundle.getAppName());
if (appHolder.getVisibility() == VISIBLE)
setDivider(bundle, appHolder);
setDivider(bundle, vLinks);
if (bundle.getLinksColumnsCount() != 0)
vLinks.setColumnCount(bundle.getLinksColumnsCount());
if (bundle.getActionsColumnsCount() != 0)
vActions.setColumnCount(bundle.getActionsColumnsCount());
vLinks.setVisibility(bundle.getLinks().isEmpty() ? GONE : VISIBLE);
vActions.setVisibility(bundle.getActions().isEmpty() ? GONE : VISIBLE);
loadLinks(bundle);
loadActions(bundle);
}
private void setTextColor(TextView tv, int color) {
if (color != 0)
tv.setTextColor(color);
}
@SuppressWarnings("ResourceAsColor")
private void setDivider(AboutBuilder bundle, View holder) {
if (bundle.isShowDivider()) {
int color = bundle.getDividerColor();
if (color == 0)
color = isDarker() ? Color.GRAY : getNameColor();
GradientDrawable drawable = ((GradientDrawable) ((LayerDrawable) holder.getBackground()).findDrawableByLayerId(R.id.stroke));
if (drawable != null) {
drawable.setStroke(bundle.getDividerHeight(), color, bundle.getDividerDashWidth(), bundle.getDividerDashGap());
}
} else {
RippleUtil.background(holder, (Drawable) null);
}
}
private int getNameColor() {
return tvName.getCurrentTextColor();
}
private boolean isDarker() {
if (isDarker == null)
isDarker = RippleUtil.isDark(getCardColor());
return isDarker;
}
private int getCardColor() {
return cvHolder.getCardBackgroundColor().getDefaultColor();
}
private int getIconColor() {
if (iconColor == 0)
iconColor = isDarker() ? Color.WHITE : getNameColor();
return iconColor;
}
private void setBitmap(ImageView iv, Bitmap bitmap) {
if (bitmap == null) {
iv.setVisibility(GONE);
} else {
iv.setImageBitmap(bitmap);
}
}
private void loadLinks(AboutBuilder bundle) {
for (Item item : bundle.getLinks()) {
View v = addItem(vLinks, R.layout.xab_each_link, item);
if (bundle.isLinksAnimated())
animate(v);
}
}
private void animate(final View v) {
v.setVisibility(INVISIBLE);
animationDelay += 20;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
v.setVisibility(VISIBLE);
v.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.expand_in));
}
}, animationDelay);
}
private void loadActions(AboutBuilder bundle) {
for (Item item : bundle.getActions()) {
addItem(vActions, R.layout.xab_each_action, item);
}
}
private View addItem(ViewGroup holder, int layout, Item item) {
View view = layoutInflater.inflate(layout, null);
view.setId(item.getId());
TextView tvLabel = (TextView) view.findViewById(R.id.label);
ImageView ivIcon = (ImageView) view.findViewById(R.id.icon);
Icon.on(ivIcon).bitmap(item.getIcon()).color(getIconColor()).put();
tvLabel.setText(item.getLabel());
view.setOnClickListener(item.getOnClick());
RippleUtil.backgroundRipple(view, getCardColor());
holder.addView(view);
return view;
}
private void setupCard(AboutBuilder bundle) {
if (!bundle.isShowAsCard()) {
cvHolder.setCardElevation(0);
cvHolder.setRadius(0);
cvHolder.setUseCompatPadding(false);
cvHolder.setMaxCardElevation(0);
cvHolder.setPreventCornerOverlap(false);
}
}
public CardView getHolder() {
return cvHolder;
}
public View findItem(int id) {
return cvHolder.findViewById(id);
}
public View findItem(Item item) {
return findItem(item.getId());
}
}