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 implements IProfile, Tagable, Typefaceable { 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 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; } }