package it.neokree.materialnavigationdrawer.elements;
import android.animation.Animator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.balysv.materialripple.MaterialRippleLayout;
import it.neokree.materialnavigationdrawer.elements.listeners.MaterialSectionListener;
import it.neokree.materialnavigationdrawer.R;
import it.neokree.materialnavigationdrawer.util.Utils;
/**
* Navigation Drawer section with Material Design style
*
* Created by neokree on 08/11/14.
*/
@SuppressWarnings("unused")
public class MaterialSection<Fragment> implements View.OnTouchListener, View.OnClickListener {
public static final int TARGET_FRAGMENT = 0;
public static final int TARGET_ACTIVITY = 1;
public static final int TARGET_LISTENER = 2;
public static final int ICON_NO_ICON = 0;
public static final int ICON_24DP = 1;
public static final int ICON_40DP = 2;
private int accountPosition; // used only for keep tracking of account section
private int targetType;
private View view;
private TextView text;
private TextView notifications;
private ImageView icon;
private MaterialRippleLayout ripple;
private MaterialSectionListener listener;
private boolean isSelected;
private boolean hasSectionColor;
private boolean hasColorDark;
private boolean rippleSupport = false;
private boolean realColor;
private boolean touchable;
// COLORS
private int colorPressed;
private int colorUnpressed;
private int colorSelected;
private int sectionColor;
private int iconColor;
private int colorDark;
private int textColor;
private int notificationColor;
private int numberNotifications;
private String title;
// TARGETS
private Fragment targetFragment;
private Intent targetIntent;
private MaterialSectionListener targetListener;
public MaterialSection(Context ctx, int iconType, boolean hasRippleSupport, int target ) {
rippleSupport = hasRippleSupport;
if(rippleAnimationSupport()) {
// section with ripple effect
switch(iconType) {
case ICON_NO_ICON:
view = LayoutInflater.from(ctx).inflate(R.layout.layout_material_section_ripple, null);
break;
case ICON_24DP:
view = LayoutInflater.from(ctx).inflate(R.layout.layout_material_section_icon_ripple, null);
icon = (ImageView) view.findViewById(R.id.section_icon);
break;
case ICON_40DP:
view = LayoutInflater.from(ctx).inflate(R.layout.layout_material_section_icon_large_ripple, null);
icon = (ImageView) view.findViewById(R.id.section_icon);
break;
}
text = (TextView) view.findViewById(R.id.section_text);
notifications = (TextView) view.findViewById(R.id.section_notification);
ripple = (MaterialRippleLayout) view.findViewById(R.id.section_ripple);
}
else {
// section with normal background
switch (iconType) {
case ICON_NO_ICON:
view = LayoutInflater.from(ctx).inflate(R.layout.layout_material_section, null);
text = (TextView) view.findViewById(R.id.section_text);
notifications = (TextView) view.findViewById(R.id.section_notification);
break;
case ICON_24DP:
view = LayoutInflater.from(ctx).inflate(R.layout.layout_material_section_icon, null);
text = (TextView) view.findViewById(R.id.section_text);
icon = (ImageView) view.findViewById(R.id.section_icon);
notifications = (TextView) view.findViewById(R.id.section_notification);
break;
case ICON_40DP:
view = LayoutInflater.from(ctx).inflate(R.layout.layout_material_section_icon_large, null);
text = (TextView) view.findViewById(R.id.section_text);
icon = (ImageView) view.findViewById(R.id.section_icon);
notifications = (TextView) view.findViewById(R.id.section_notification);
break;
}
}
// resolve attributes from current theme
Resources.Theme theme = ctx.getTheme();
TypedValue typedValue = new TypedValue();
theme.resolveAttribute(R.attr.sectionStyle,typedValue,true);
TypedArray values = theme.obtainStyledAttributes(typedValue.resourceId,R.styleable.MaterialSection);
try {
colorPressed = values.getColor(R.styleable.MaterialSection_sectionBackgroundColorPressed,0x16000000);
colorUnpressed = values.getColor(R.styleable.MaterialSection_sectionBackgroundColor,0x00FFFFFF);
colorSelected = values.getColor(R.styleable.MaterialSection_sectionBackgroundColorSelected,0x0A000000);
iconColor = values.getColor(R.styleable.MaterialSection_sectionColorIcon,0x000);
textColor = values.getColor(R.styleable.MaterialSection_sectionColorText,0x000);
notificationColor = values.getColor(R.styleable.MaterialSection_sectionColorNotification,0x000);
// set text color into the view
if(textColor != 0x000) {
text.setTextColor(textColor);
}
if(notificationColor != 0x000) {
notifications.setTextColor(notificationColor);
}
// set background color into the view
if(!rippleAnimationSupport())
view.setBackgroundColor(colorUnpressed);
else {
ripple.setRippleBackground(colorUnpressed);
ripple.setRippleColor(colorPressed);
}
}
finally {
values.recycle();
}
if(rippleAnimationSupport()) {
ripple.setOnClickListener(this);
}
else {
view.setOnTouchListener(this);
}
isSelected = false;
hasSectionColor = false;
hasColorDark = false;
touchable = true;
realColor = false;
targetType = target;
numberNotifications = 0;
}
// methods for customizations
public MaterialSection setSectionColor(int color) {
hasSectionColor = true;
sectionColor = color;
return this;
}
public MaterialSection setSectionColor(int color,int colorDark) {
setSectionColor(color);
hasColorDark = true;
this.colorDark = colorDark;
return this;
}
/**
* Set the number of notification for this section
* @param notifications the number of notification active for this section
* @return this section
*/
public MaterialSection setNotifications(int notifications) {
String textNotification;
textNotification = String.valueOf(notifications);
if(notifications < 1) {
textNotification = "";
}
if(notifications > 99) {
textNotification = "99+";
}
this.notifications.setText(textNotification);
numberNotifications = notifications;
return this;
}
public MaterialSection setNotificationsText(String text) {
this.notifications.setText(text);
return this;
}
public MaterialSection useRealColor() {
realColor = true;
if(icon != null) {
Utils.setAlpha(icon,1f);
}
return this;
}
// internal methods
// touch event without ripple support
@Override
@SuppressLint("NewApi")
public boolean onTouch(View v, MotionEvent event) {
if(touchable) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
view.setBackgroundColor(colorPressed);
return true;
}
if (event.getAction() == MotionEvent.ACTION_CANCEL) {
if (isSelected)
view.setBackgroundColor(colorSelected);
else
view.setBackgroundColor(colorUnpressed);
return true;
}
if (event.getAction() == MotionEvent.ACTION_UP) {
view.setBackgroundColor(colorSelected);
afterClick();
return true;
}
}
return false;
}
//click event with ripple support
@Override
public void onClick(View v) {
if(touchable) {
ripple.setRippleBackground(colorSelected);
afterClick();
}
}
public void select() {
isSelected = true;
if(!rippleAnimationSupport())
view.setBackgroundColor(colorSelected);
else
ripple.setRippleBackground(colorSelected);
if(hasSectionColor) {
text.setTextColor(sectionColor);
if(icon != null && !realColor) {
icon.setColorFilter(sectionColor);
Utils.setAlpha(icon, 1f);
}
}
}
public void unSelect() {
isSelected = false;
if(!rippleAnimationSupport()) {
view.setBackgroundColor(colorUnpressed);
}
else {
ripple.setRippleBackground(colorUnpressed);
}
if (hasSectionColor) {
text.setTextColor(textColor);
if (icon != null && !realColor) {
icon.setColorFilter(iconColor);
Utils.setAlpha(icon, 0.54f);
}
}
}
public boolean isSelected() {
return isSelected;
}
// setter
public void setAccountPosition(int position) { // used only for keep tracking of account section
this.accountPosition = position;
}
public void setOnClickListener(MaterialSectionListener listener) {
this.listener = listener;
}
public void setTitle(String title) {
this.title = title;
this.text.setText(title);
}
public void setIcon(Drawable icon) {
this.icon.setImageDrawable(icon);
if(!realColor)
this.icon.setColorFilter(iconColor);
}
public void setIcon(Bitmap icon) {
this.icon.setImageBitmap(icon);
if(!realColor)
this.icon.setColorFilter(iconColor);
}
public void setTarget(Fragment target) {
this.targetFragment = target;
}
public void setTarget(Intent target) {
this.targetIntent = target;
}
public void setTarget(MaterialSectionListener target) {
this.targetListener = target;
}
public void setTypeface(Typeface typeface) {
this.text.setTypeface(typeface);
this.notifications.setTypeface(typeface);
}
public void setTouchable(boolean isTouchable) {
touchable = isTouchable;
}
public void setPressingColor(int color) {
colorPressed = color;
if(rippleAnimationSupport())
ripple.setRippleColor(colorPressed);
}
// alias of setColorUnpressed
public void setBackgroundColor(int color) {
colorUnpressed = color;
if(!isSelected()) {
if (rippleAnimationSupport()) {
ripple.setRippleBackground(colorUnpressed);
}
else {
view.setBackgroundColor(colorUnpressed);
}
}
}
public void setColorSelected(int color) {
colorSelected = color;
if(isSelected()) {
if(rippleAnimationSupport())
ripple.setRippleBackground(colorSelected);
else
view.setBackgroundColor(colorSelected);
}
}
// getter
public View getView() {
return view;
}
public String getTitle() {
return title;
}
public int getAccountPosition() { // used only for keep tracking of account section
return accountPosition;
}
public int getTarget() {
return targetType;
}
public Fragment getTargetFragment() {
return targetFragment;
}
public Intent getTargetIntent() {
return targetIntent;
}
public MaterialSectionListener getTargetListener() {
return targetListener;
}
public boolean hasSectionColor() {
return hasSectionColor;
}
public boolean hasSectionColorDark() {
return hasColorDark;
}
public int getSectionColor() {
return sectionColor;
}
public int getSectionColorDark() {
return colorDark;
}
public int getNotifications() {
return numberNotifications;
}
public String getNotificationsText() {
return this.notifications.getText().toString();
}
// private methods
private void afterClick() {
isSelected = true;
if (hasSectionColor) {
text.setTextColor(sectionColor);
if (icon != null && !realColor) {
icon.setColorFilter(sectionColor);
Utils.setAlpha(icon, 1f);
}
}
if (listener != null)
listener.onClick(this);
// se la sezione ha come target l'activity, dopo che questa viene avviata si deseleziona.
if(this.getTarget() == TARGET_ACTIVITY)
this.unSelect();
// si fa arrivare il click anche allo sviluppatore
if (this.getTarget() == TARGET_LISTENER && targetListener != null)
this.targetListener.onClick(this);
}
private boolean rippleAnimationSupport() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH && rippleSupport;
}
}