package com.mikepenz.materialdrawer.model;
import android.content.Context;
import android.graphics.Color;
import android.support.annotation.LayoutRes;
import android.support.annotation.StringRes;
import android.support.v4.view.ViewCompat;
import android.view.View;
import android.widget.TextView;
import com.mikepenz.iconics.IconicsDrawable;
import com.mikepenz.iconics.view.IconicsImageView;
import com.mikepenz.materialdrawer.Drawer;
import com.mikepenz.materialdrawer.R;
import com.mikepenz.materialdrawer.holder.BadgeStyle;
import com.mikepenz.materialdrawer.holder.ColorHolder;
import com.mikepenz.materialdrawer.holder.StringHolder;
import com.mikepenz.materialdrawer.icons.MaterialDrawerFont;
import com.mikepenz.materialdrawer.model.interfaces.ColorfulBadgeable;
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
import java.util.List;
/**
* Created by mikepenz on 03.02.15.
* NOTE: The arrow will just animate (and rotate) on APIs higher than 11 as the ViewCompat will skip this on API 10
*/
public class ExpandableBadgeDrawerItem extends BaseDescribeableDrawerItem<ExpandableBadgeDrawerItem, ExpandableBadgeDrawerItem.ViewHolder>
implements ColorfulBadgeable<ExpandableBadgeDrawerItem> {
private Drawer.OnDrawerItemClickListener mOnDrawerItemClickListener;
protected ColorHolder arrowColor;
protected int arrowRotationAngleStart = 0;
protected int arrowRotationAngleEnd = 180;
protected StringHolder mBadge;
protected BadgeStyle mBadgeStyle = new BadgeStyle();
@Override public int getType() {
return R.id.material_drawer_item_expandable_badge;
}
@Override @LayoutRes public int getLayoutRes() {
return R.layout.material_drawer_item_expandable_badge;
}
@Override public void bindView(ExpandableBadgeDrawerItem.ViewHolder viewHolder, List payloads) {
super.bindView(viewHolder, payloads);
Context ctx = viewHolder.itemView.getContext();
//bind the basic view parts
bindViewHelper(viewHolder);
//set the text for the badge or hide
boolean badgeVisible = StringHolder.applyToOrHide(mBadge, viewHolder.badge);
//style the badge if it is visible
if (true) {
mBadgeStyle.style(viewHolder.badge, getTextColorStateList(getColor(ctx), getSelectedTextColor(ctx)));
viewHolder.badgeContainer.setVisibility(View.VISIBLE);
} else {
viewHolder.badgeContainer.setVisibility(View.GONE);
}
//define the typeface for our textViews
if (getTypeface() != null) {
viewHolder.badge.setTypeface(getTypeface());
}
//make sure all animations are stopped
viewHolder.arrow.setColor(this.arrowColor != null ? this.arrowColor.color(ctx) : getIconColor(ctx));
viewHolder.arrow.clearAnimation();
if (!isExpanded()) {
ViewCompat.setRotation(viewHolder.arrow, this.arrowRotationAngleStart);
} else {
ViewCompat.setRotation(viewHolder.arrow, this.arrowRotationAngleEnd);
}
//call the onPostBindView method to trigger post bind view actions (like the listener to modify the item if required)
onPostBindView(this, viewHolder.itemView);
}
@Override public ExpandableBadgeDrawerItem withOnDrawerItemClickListener(Drawer.OnDrawerItemClickListener onDrawerItemClickListener) {
mOnDrawerItemClickListener = onDrawerItemClickListener;
return this;
}
@Override public Drawer.OnDrawerItemClickListener getOnDrawerItemClickListener() {
return mOnArrowDrawerItemClickListener;
}
/**
* our internal onDrawerItemClickListener which will handle the arrow animation
*/
private Drawer.OnDrawerItemClickListener mOnArrowDrawerItemClickListener = new Drawer.OnDrawerItemClickListener() {
@Override public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
if (drawerItem instanceof AbstractDrawerItem && drawerItem.isEnabled()) {
if (((AbstractDrawerItem) drawerItem).getSubItems() != null) {
if (((AbstractDrawerItem) drawerItem).isExpanded()) {
ViewCompat.animate(view.findViewById(R.id.material_drawer_arrow)).rotation(ExpandableBadgeDrawerItem.this.arrowRotationAngleEnd).start();
} else {
ViewCompat.animate(view.findViewById(R.id.material_drawer_arrow))
.rotation(ExpandableBadgeDrawerItem.this.arrowRotationAngleStart)
.start();
}
}
}
return mOnDrawerItemClickListener != null && mOnDrawerItemClickListener.onItemClick(view, position, drawerItem);
}
};
@Override public ExpandableBadgeDrawerItem withBadge(StringHolder badge) {
this.mBadge = badge;
return (ExpandableBadgeDrawerItem) this;
}
@Override public ExpandableBadgeDrawerItem withBadge(String badge) {
this.mBadge = new StringHolder(badge);
return (ExpandableBadgeDrawerItem) this;
}
@Override public ExpandableBadgeDrawerItem withBadge(@StringRes int badgeRes) {
this.mBadge = new StringHolder(badgeRes);
return (ExpandableBadgeDrawerItem) this;
}
@Override public ExpandableBadgeDrawerItem withBadgeStyle(BadgeStyle badgeStyle) {
this.mBadgeStyle = badgeStyle;
return (ExpandableBadgeDrawerItem) this;
}
public StringHolder getBadge() {
return mBadge;
}
public BadgeStyle getBadgeStyle() {
return mBadgeStyle;
}
@Override
public ViewHolder getViewHolder(View v) {
return new ViewHolder(v);
}
public static class ViewHolder extends BaseViewHolder {
public IconicsImageView arrow;
public View badgeContainer;
public TextView badge;
public ViewHolder(View view) {
super(view);
badgeContainer = view.findViewById(R.id.material_drawer_badge_container);
badge = (TextView) view.findViewById(R.id.material_drawer_badge);
arrow = (IconicsImageView) view.findViewById(R.id.material_drawer_arrow);
arrow.setIcon(new IconicsDrawable(view.getContext(), MaterialDrawerFont.Icon.mdf_expand_more).sizeDp(16).paddingDp(2).color(Color.BLACK));
}
}
}