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

456 lines
13 KiB
Java

package com.mikepenz.materialdrawer;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import pl.droidsonroids.gif.GifDrawable;
import pl.droidsonroids.gif.GifImageView;
import android.view.View;
import android.widget.ImageView;
import com.mikepenz.materialdrawer.holder.ImageHolder;
import com.mikepenz.materialdrawer.model.interfaces.IProfile;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Created by mikepenz on 27.02.15.
*/
public class AccountHeader {
protected final static double NAVIGATION_DRAWER_ACCOUNT_ASPECT_RATIO = 9d / 16d;
protected static final String BUNDLE_SELECTION_HEADER = "bundle_selection_header";
protected final AccountHeaderBuilder mAccountHeaderBuilder;
protected AccountHeader(AccountHeaderBuilder accountHeaderBuilder) {
this.mAccountHeaderBuilder = accountHeaderBuilder;
}
/**
* the protected getter for the AccountHeaderBuilder
*
* @return the AccountHeaderBuilder
*/
protected AccountHeaderBuilder getAccountHeaderBuilder() {
return mAccountHeaderBuilder;
}
/**
* Get the Root view for the Header
*
* @return
*/
public View getView() {
return mAccountHeaderBuilder.mAccountHeaderContainer;
}
/**
* Set the drawer for the AccountHeader so we can use it for the select
*
* @param drawer
*/
public void setDrawer(Drawer drawer) {
mAccountHeaderBuilder.mDrawer = drawer;
}
/**
* Returns the header background view so the dev can set everything on it
*
* @return
*/
public GifImageView getHeaderBackgroundView() {
return mAccountHeaderBuilder.mAccountHeaderBackground;
}
/**
* set the background for the header via the ImageHolder class
*
* @param imageHolder
*/
public void setHeaderBackground(ImageHolder imageHolder) {
ImageHolder.applyTo(imageHolder, mAccountHeaderBuilder.mAccountHeaderBackground);
}
/**
* Set the background for the Header
*
* @param headerBackground
*/
public void setBackground(Drawable headerBackground) {
mAccountHeaderBuilder.mAccountHeaderBackground.setImageDrawable(headerBackground);
}
/**
* set the background for the header as file name
*
* @param headerBackgroundPath
* @return
*/
public void setBackground(String headerBackgroundPath) {
try {
if (headerBackgroundPath.endsWith(".gif")) {
setHeaderBackground(new ImageHolder(new GifDrawable(headerBackgroundPath)));
}
else {
setHeaderBackground(new ImageHolder(Uri.parse(headerBackgroundPath)));
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Set the background for the Header as resource
*
* @param headerBackgroundRes
*/
public void setBackgroundRes(@DrawableRes int headerBackgroundRes) {
mAccountHeaderBuilder.mAccountHeaderBackground.setImageResource(headerBackgroundRes);
}
/**
* Toggle the selection list (show or hide it)
*
* @param ctx
*/
public void toggleSelectionList(Context ctx) {
mAccountHeaderBuilder.toggleSelectionList(ctx);
}
/**
* returns if the selection list is currently shown
*
* @return
*/
public boolean isSelectionListShown() {
return mAccountHeaderBuilder.mSelectionListShown;
}
/**
* set this to false if you want to hide the first line of the selection box in the header (first line would be the name)
*
* @param selectionFirstLineShown
*/
public void setSelectionFirstLineShown(boolean selectionFirstLineShown) {
mAccountHeaderBuilder.mSelectionFirstLineShown = selectionFirstLineShown;
mAccountHeaderBuilder.updateHeaderAndList();
}
/**
* set this to false if you want to hide the second line of the selection box in the header (second line would be the e-mail)
*
* @param selectionSecondLineShown
*/
public void setSelectionSecondLineShown(boolean selectionSecondLineShown) {
mAccountHeaderBuilder.mSelectionSecondLineShown = selectionSecondLineShown;
mAccountHeaderBuilder.updateHeaderAndList();
}
/**
* set this to define the first line in the selection area if there is no profile
* note this will block any values from profiles!
*
* @param selectionFirstLine
*/
public void setSelectionFirstLine(String selectionFirstLine) {
mAccountHeaderBuilder.mSelectionFirstLine = selectionFirstLine;
mAccountHeaderBuilder.updateHeaderAndList();
}
/**
* set this to define the second line in the selection area if there is no profile
* note this will block any values from profiles!
*
* @param selectionSecondLine
*/
public void setSelectionSecondLine(String selectionSecondLine) {
mAccountHeaderBuilder.mSelectionSecondLine = selectionSecondLine;
mAccountHeaderBuilder.updateHeaderAndList();
}
/**
* returns the current list of profiles set for this header
*
* @return
*/
public List<IProfile> getProfiles() {
return mAccountHeaderBuilder.mProfiles;
}
/**
* Set a new list of profiles for the header
*
* @param profiles
*/
public void setProfiles(List<IProfile> profiles) {
mAccountHeaderBuilder.mProfiles = profiles;
mAccountHeaderBuilder.updateHeaderAndList();
}
/**
* Selects the given profile and sets it to the new active profile
*
* @param profile
*/
public void setActiveProfile(IProfile profile) {
setActiveProfile(profile, false);
}
/**
* Selects the given profile and sets it to the new active profile
*
* @param profile
*/
public void setActiveProfile(IProfile profile, boolean fireOnProfileChanged) {
final boolean isCurrentSelectedProfile = mAccountHeaderBuilder.switchProfiles(profile);
//if the selectionList is shown we should also update the current selected profile in the list
if (mAccountHeaderBuilder.mDrawer != null && isSelectionListShown()) {
mAccountHeaderBuilder.mDrawer.setSelection(profile.getIdentifier(), false);
}
//fire the event if enabled and a listener is set
if (fireOnProfileChanged && mAccountHeaderBuilder.mOnAccountHeaderListener != null) {
mAccountHeaderBuilder.mOnAccountHeaderListener.onProfileChanged(null, profile, isCurrentSelectedProfile);
}
}
/**
* Selects a profile by its identifier
*
* @param identifier
*/
public void setActiveProfile(long identifier) {
setActiveProfile(identifier, false);
}
/**
* Selects a profile by its identifier
*
* @param identifier
*/
public void setActiveProfile(long identifier, boolean fireOnProfileChanged) {
if (mAccountHeaderBuilder.mProfiles != null) {
for (IProfile profile : mAccountHeaderBuilder.mProfiles) {
if (profile != null) {
if (profile.getIdentifier() == identifier) {
setActiveProfile(profile, fireOnProfileChanged);
return;
}
}
}
}
}
/**
* get the current active profile
*
* @return
*/
public IProfile getActiveProfile() {
return mAccountHeaderBuilder.mCurrentProfile;
}
/**
* Helper method to update a profile using it's identifier
*
* @param newProfile
*/
public void updateProfile(@NonNull IProfile newProfile) {
updateProfileByIdentifier(newProfile);
}
/**
* Helper method to update a profile using it's identifier
*
* @param newProfile
*/
@Deprecated
public void updateProfileByIdentifier(@NonNull IProfile newProfile) {
int found = getPositionByIdentifier(newProfile.getIdentifier());
if (found > -1) {
mAccountHeaderBuilder.mProfiles.set(found, newProfile);
mAccountHeaderBuilder.updateHeaderAndList();
}
}
/**
* Add new profiles to the existing list of profiles
*
* @param profiles
*/
public void addProfiles(@NonNull IProfile... profiles) {
if (mAccountHeaderBuilder.mProfiles == null) {
mAccountHeaderBuilder.mProfiles = new ArrayList<>();
}
Collections.addAll(mAccountHeaderBuilder.mProfiles, profiles);
mAccountHeaderBuilder.updateHeaderAndList();
}
/**
* Add a new profile at a specific position to the list
*
* @param profile
* @param position
*/
public void addProfile(@NonNull IProfile profile, int position) {
if (mAccountHeaderBuilder.mProfiles == null) {
mAccountHeaderBuilder.mProfiles = new ArrayList<>();
}
mAccountHeaderBuilder.mProfiles.add(position, profile);
mAccountHeaderBuilder.updateHeaderAndList();
}
/**
* remove a profile from the given position
*
* @param position
*/
public void removeProfile(int position) {
if (mAccountHeaderBuilder.mProfiles != null && mAccountHeaderBuilder.mProfiles.size() > position) {
mAccountHeaderBuilder.mProfiles.remove(position);
}
mAccountHeaderBuilder.updateHeaderAndList();
}
/**
* remove the profile with the given identifier
*
* @param identifier
*/
public void removeProfileByIdentifier(long identifier) {
int found = getPositionByIdentifier(identifier);
if (found > -1) {
mAccountHeaderBuilder.mProfiles.remove(found);
}
mAccountHeaderBuilder.updateHeaderAndList();
}
/**
* try to remove the given profile
*
* @param profile
*/
public void removeProfile(@NonNull IProfile profile) {
removeProfileByIdentifier(profile.getIdentifier());
}
/**
* Clear the header
*/
public void clear() {
mAccountHeaderBuilder.mProfiles = null;
//calculate the profiles to set
mAccountHeaderBuilder.calculateProfiles();
//process and build the profiles
mAccountHeaderBuilder.buildProfiles();
}
/**
* gets the position of a profile by it's identifier
*
* @param identifier
* @return
*/
private int getPositionByIdentifier(long identifier) {
int found = -1;
if (mAccountHeaderBuilder.mProfiles != null && identifier != -1) {
for (int i = 0; i < mAccountHeaderBuilder.mProfiles.size(); i++) {
if (mAccountHeaderBuilder.mProfiles.get(i) != null) {
if (mAccountHeaderBuilder.mProfiles.get(i).getIdentifier() == identifier) {
found = i;
break;
}
}
}
}
return found;
}
/**
* add the values to the bundle for saveInstanceState
*
* @param savedInstanceState
* @return
*/
public Bundle saveInstanceState(Bundle savedInstanceState) {
if (savedInstanceState != null) {
savedInstanceState.putInt(BUNDLE_SELECTION_HEADER, mAccountHeaderBuilder.getCurrentSelection());
}
return savedInstanceState;
}
public interface OnAccountHeaderListener {
/**
* the event when the profile changes
*
* @param view
* @param profile
* @return if the event was consumed
*/
boolean onProfileChanged(View view, IProfile profile, boolean current);
}
public interface OnAccountHeaderItemLongClickListener {
/**
* the event when the profile item is longClicked inside the list
*
* @param view
* @param profile
* @param current
* @return if the event was consumed
*/
boolean onProfileLongClick(View view, IProfile profile, boolean current);
}
public interface OnAccountHeaderProfileImageListener {
/**
* the event when the profile image is clicked
*
* @param view
* @param profile
* @return if the event was consumed
*/
boolean onProfileImageClick(View view, IProfile profile, boolean current);
/**
* the event when the profile image is long clicked
*
* @param view
* @param profile
* @return if the event was consumed
*/
boolean onProfileImageLongClick(View view, IProfile profile, boolean current);
}
public interface OnAccountHeaderSelectionViewClickListener {
/**
* the event when the user clicks the selection list under the profile icons
*
* @param view
* @param profile
* @return if the event was consumed
*/
boolean onClick(View view, IProfile profile);
}
}