2019-09-18 22:29:09 +02:00

366 lines
12 KiB
Java

package com.mikepenz.materialdrawer.model;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Bitmap;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.Pair;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.mikepenz.iconics.typeface.IIcon;
import com.mikepenz.materialdrawer.R;
import com.mikepenz.materialdrawer.holder.ColorHolder;
import com.mikepenz.materialdrawer.holder.ImageHolder;
import com.mikepenz.materialdrawer.holder.StringHolder;
import com.mikepenz.materialdrawer.model.interfaces.IProfile;
import com.mikepenz.materialdrawer.model.interfaces.Tagable;
import com.mikepenz.materialdrawer.model.interfaces.Typefaceable;
import com.mikepenz.materialdrawer.util.DrawerImageLoader;
import com.mikepenz.materialdrawer.util.DrawerUIUtils;
import java.util.List;
import androidx.annotation.ColorInt;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.LayoutRes;
import androidx.annotation.StringRes;
import androidx.recyclerview.widget.RecyclerView;
import static com.mikepenz.materialdrawer.util.DrawerUIUtils.getBooleanStyleable;
import static com.mikepenz.materialdrawer.util.DrawerUIUtils.themeDrawerItem;
/**
* Created by mikepenz on 03.02.15.
*/
public class ProfileDrawerItem extends AbstractDrawerItem<ProfileDrawerItem, ProfileDrawerItem.ViewHolder> implements IProfile<ProfileDrawerItem>, Tagable<ProfileDrawerItem>, Typefaceable<ProfileDrawerItem> {
protected boolean nameShown = false;
protected ImageHolder icon;
protected StringHolder name;
protected StringHolder email;
protected ColorHolder selectedColor;
protected ColorHolder textColor;
protected ColorHolder selectedTextColor;
protected ColorHolder disabledTextColor;
protected Typeface typeface = null;
@Override
public ProfileDrawerItem withIcon(Drawable icon) {
this.icon = new ImageHolder(icon);
return this;
}
@Override
public ProfileDrawerItem withIcon(@DrawableRes int iconRes) {
this.icon = new ImageHolder(iconRes);
return this;
}
@Override
public ProfileDrawerItem withIcon(Bitmap iconBitmap) {
this.icon = new ImageHolder(iconBitmap);
return this;
}
@Override
public ProfileDrawerItem withIcon(IIcon icon) {
this.icon = new ImageHolder(icon);
return this;
}
@Override
public ProfileDrawerItem withIcon(String url) {
this.icon = new ImageHolder(url);
return this;
}
@Override
public ProfileDrawerItem withIcon(Uri uri) {
this.icon = new ImageHolder(uri);
return this;
}
public ProfileDrawerItem withName(CharSequence name) {
this.name = new StringHolder(name);
return this;
}
public ProfileDrawerItem withName(@StringRes int nameRes) {
this.name = new StringHolder(nameRes);
return this;
}
public ProfileDrawerItem withEmail(String email) {
this.email = new StringHolder(email);
return this;
}
public ProfileDrawerItem withEmail(@StringRes int emailRes) {
this.email = new StringHolder(emailRes);
return this;
}
/**
* Whether to show the profile name in the account switcher.
*
* @param nameShown show name in switcher
* @return the {@link ProfileDrawerItem}
*/
public ProfileDrawerItem withNameShown(boolean nameShown) {
this.nameShown = nameShown;
return this;
}
public ProfileDrawerItem withSelectedColor(@ColorInt int selectedColor) {
this.selectedColor = ColorHolder.fromColor(selectedColor);
return this;
}
public ProfileDrawerItem withSelectedColorRes(@ColorRes int selectedColorRes) {
this.selectedColor = ColorHolder.fromColorRes(selectedColorRes);
return this;
}
public ProfileDrawerItem withTextColor(@ColorInt int textColor) {
this.textColor = ColorHolder.fromColor(textColor);
return this;
}
public ProfileDrawerItem withTextColorRes(@ColorRes int textColorRes) {
this.textColor = ColorHolder.fromColorRes(textColorRes);
return this;
}
public ProfileDrawerItem withSelectedTextColor(@ColorInt int selectedTextColor) {
this.selectedTextColor = ColorHolder.fromColor(selectedTextColor);
return this;
}
public ProfileDrawerItem withSelectedTextColorRes(@ColorRes int selectedColorRes) {
this.selectedTextColor = ColorHolder.fromColorRes(selectedColorRes);
return this;
}
public ProfileDrawerItem withDisabledTextColor(@ColorInt int disabledTextColor) {
this.disabledTextColor = ColorHolder.fromColor(disabledTextColor);
return this;
}
public ProfileDrawerItem withDisabledTextColorRes(@ColorRes int disabledTextColorRes) {
this.disabledTextColor = ColorHolder.fromColorRes(disabledTextColorRes);
return this;
}
public ProfileDrawerItem withTypeface(Typeface typeface) {
this.typeface = typeface;
return this;
}
public boolean isNameShown() {
return nameShown;
}
public ColorHolder getSelectedColor() {
return selectedColor;
}
public ColorHolder getTextColor() {
return textColor;
}
public ColorHolder getSelectedTextColor() {
return selectedTextColor;
}
public ColorHolder getDisabledTextColor() {
return disabledTextColor;
}
@Override
public Typeface getTypeface() {
return typeface;
}
public ImageHolder getIcon() {
return icon;
}
@Override
public StringHolder getName() {
return name;
}
public StringHolder getEmail() {
return email;
}
@Override
public int getType() {
return R.id.material_drawer_item_profile;
}
@Override
@LayoutRes
public int getLayoutRes() {
return R.layout.material_drawer_item_profile;
}
@Override
public void bindView(ViewHolder viewHolder, List payloads) {
super.bindView(viewHolder, payloads);
Context ctx = viewHolder.itemView.getContext();
//set the identifier from the drawerItem here. It can be used to run tests
viewHolder.itemView.setId(hashCode());
//set the item enabled if it is
viewHolder.itemView.setEnabled(isEnabled());
//set the item selected if it is
viewHolder.itemView.setSelected(isSelected());
//get the correct color for the background
int selectedColor = getSelectedColor(ctx);
//get the correct color for the text
int color = getColor(ctx);
int secondaryColor = getSecondaryColor(ctx);
int selectedTextColor = getSelectedTextColor(ctx);
//set the background for the item
themeDrawerItem(ctx, viewHolder.view, selectedColor, isSelectedBackgroundAnimated());
if (nameShown) {
viewHolder.name.setVisibility(View.VISIBLE);
StringHolder.applyTo(this.getName(), viewHolder.name);
} else {
viewHolder.name.setVisibility(View.GONE);
}
//the MaterialDrawer follows the Google Apps. those only show the e-mail
//within the profile switcher. The problem this causes some confusion for
//some developers. And if you only set the name, the item would be empty
//so here's a small fallback which will prevent this issue of empty items ;)
if (!nameShown && this.getEmail() == null && this.getName() != null) {
StringHolder.applyTo(this.getName(), viewHolder.email);
} else {
StringHolder.applyTo(this.getEmail(), viewHolder.email);
}
if (getTypeface() != null) {
viewHolder.name.setTypeface(getTypeface());
viewHolder.email.setTypeface(getTypeface());
}
if (nameShown) {
viewHolder.name.setTextColor(getTextColorStateList(color, selectedTextColor));
}
viewHolder.email.setTextColor(getTextColorStateList(secondaryColor, selectedTextColor));
//cancel previous started image loading processes
DrawerImageLoader.getInstance().cancelImage(viewHolder.profileIcon);
//set the icon
ImageHolder.applyToOrSetInvisible(getIcon(), viewHolder.profileIcon, DrawerImageLoader.Tags.PROFILE_DRAWER_ITEM.name());
//for android API 17 --> Padding not applied via xml
DrawerUIUtils.setDrawerVerticalPadding(viewHolder.view);
//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 ViewHolder getViewHolder(View v) {
return new ViewHolder(v);
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private View view;
private ImageView profileIcon;
private TextView name;
private TextView email;
private ViewHolder(View view) {
super(view);
this.view = view;
this.profileIcon = view.findViewById(R.id.material_drawer_profileIcon);
this.name = view.findViewById(R.id.material_drawer_name);
this.email = view.findViewById(R.id.material_drawer_email);
}
}
/**
* helper method to decide for the correct color
*
* @param ctx
* @return
*/
protected int getSelectedColor(Context ctx) {
if (getBooleanStyleable(ctx, R.styleable.MaterialDrawer_material_drawer_legacy_style, false)) {
return ColorHolder.color(getSelectedColor(), ctx, R.attr.material_drawer_selected_legacy, R.color.material_drawer_selected_legacy);
} else {
return ColorHolder.color(getSelectedColor(), ctx, R.attr.material_drawer_selected, R.color.material_drawer_selected);
}
}
/**
* helper method to decide for the correct color
*
* @param ctx
* @return
*/
protected int getColor(Context ctx) {
int color;
if (this.isEnabled()) {
color = ColorHolder.color(getTextColor(), ctx, R.attr.material_drawer_primary_text, R.color.material_drawer_primary_text);
} else {
color = ColorHolder.color(getDisabledTextColor(), ctx, R.attr.material_drawer_hint_text, R.color.material_drawer_hint_text);
}
return color;
}
protected int getSecondaryColor(Context ctx) {
int color;
if (this.isEnabled()) {
color = ColorHolder.color(getTextColor(), ctx, R.attr.material_drawer_secondary_text, R.color.material_drawer_secondary_text);
} else {
color = ColorHolder.color(getDisabledTextColor(), ctx, R.attr.material_drawer_hint_text, R.color.material_drawer_hint_text);
}
return color;
}
/**
* helper method to decide for the correct color
*
* @param ctx
* @return
*/
protected int getSelectedTextColor(Context ctx) {
return ColorHolder.color(getSelectedTextColor(), ctx, R.attr.material_drawer_selected_text, R.color.material_drawer_selected_text);
}
protected Pair<Integer, ColorStateList> colorStateList;
/**
* helper to get the ColorStateList for the text and remembering it so we do not have to recreate it all the time
*
* @param color
* @param selectedTextColor
* @return
*/
protected ColorStateList getTextColorStateList(@ColorInt int color, @ColorInt int selectedTextColor) {
if (colorStateList == null || color + selectedTextColor != colorStateList.first) {
colorStateList = new Pair<>(color + selectedTextColor, DrawerUIUtils.getTextColorStateList(color, selectedTextColor));
}
return colorStateList.second;
}
}