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)); } } }