forked from github/szkolny
you've been waiting for this moment for so long
This commit is contained in:
parent
e2c92c3db5
commit
31588731da
116
.idea/codeStyles/Project.xml
generated
Normal file
116
.idea/codeStyles/Project.xml
generated
Normal file
@ -0,0 +1,116 @@
|
||||
<component name="ProjectCodeStyleConfiguration">
|
||||
<code_scheme name="Project" version="173">
|
||||
<codeStyleSettings language="XML">
|
||||
<indentOptions>
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||
</indentOptions>
|
||||
<arrangement>
|
||||
<rules>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>xmlns:android</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>xmlns:.*</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
<order>BY_NAME</order>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*:id</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*:name</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>name</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>style</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>^$</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
<order>BY_NAME</order>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
<order>ANDROID_ATTRIBUTE_ORDER</order>
|
||||
</rule>
|
||||
</section>
|
||||
<section>
|
||||
<rule>
|
||||
<match>
|
||||
<AND>
|
||||
<NAME>.*</NAME>
|
||||
<XML_ATTRIBUTE />
|
||||
<XML_NAMESPACE>.*</XML_NAMESPACE>
|
||||
</AND>
|
||||
</match>
|
||||
<order>BY_NAME</order>
|
||||
</rule>
|
||||
</section>
|
||||
</rules>
|
||||
</arrangement>
|
||||
</codeStyleSettings>
|
||||
</code_scheme>
|
||||
</component>
|
9
.idea/discord.xml
generated
Normal file
9
.idea/discord.xml
generated
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="DiscordProjectSettings">
|
||||
<option name="show" value="true" />
|
||||
</component>
|
||||
<component name="ProjectNotificationSettings">
|
||||
<option name="askShowProject" value="false" />
|
||||
</component>
|
||||
</project>
|
4
.idea/encodings.xml
generated
Normal file
4
.idea/encodings.xml
generated
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
|
||||
</project>
|
6
.idea/kotlinc.xml
generated
Normal file
6
.idea/kotlinc.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Kotlin2JvmCompilerArguments">
|
||||
<option name="jvmTarget" value="1.8" />
|
||||
</component>
|
||||
</project>
|
49
.idea/misc.xml
generated
Normal file
49
.idea/misc.xml
generated
Normal file
@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CMakeSettings">
|
||||
<configurations>
|
||||
<configuration PROFILE_NAME="Debug" CONFIG_NAME="Debug" />
|
||||
</configurations>
|
||||
</component>
|
||||
<component name="NullableNotNullManager">
|
||||
<option name="myDefaultNullable" value="org.jetbrains.annotations.Nullable" />
|
||||
<option name="myDefaultNotNull" value="androidx.annotation.RecentlyNonNull" />
|
||||
<option name="myNullables">
|
||||
<value>
|
||||
<list size="10">
|
||||
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
|
||||
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
|
||||
<item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
|
||||
<item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
|
||||
<item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
|
||||
<item index="5" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
|
||||
<item index="6" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
|
||||
<item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
|
||||
<item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
|
||||
<item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
<option name="myNotNulls">
|
||||
<value>
|
||||
<list size="9">
|
||||
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
|
||||
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
|
||||
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
|
||||
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
|
||||
<item index="4" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
|
||||
<item index="5" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
|
||||
<item index="6" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
|
||||
<item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
|
||||
<item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="JDK" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||
</component>
|
||||
<component name="ProjectType">
|
||||
<option name="id" value="Android" />
|
||||
</component>
|
||||
</project>
|
12
.idea/runConfigurations.xml
generated
Normal file
12
.idea/runConfigurations.xml
generated
Normal file
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="RunConfigurationProducerService">
|
||||
<option name="ignoredProducers">
|
||||
<set>
|
||||
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
|
||||
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
|
||||
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
|
||||
</set>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
59
MaterialDrawer/build.gradle
Normal file
59
MaterialDrawer/build.gradle
Normal file
@ -0,0 +1,59 @@
|
||||
apply plugin: 'com.android.library'
|
||||
|
||||
android {
|
||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
||||
buildToolsVersion "28.0.3"
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 14
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 6102
|
||||
versionName "6.1.2"
|
||||
|
||||
resValue "string", "materialdrawer_lib_version", "6.1.2"
|
||||
}
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
|
||||
}
|
||||
debugMinify {
|
||||
debuggable = true
|
||||
minifyEnabled = true
|
||||
proguardFiles 'proguard-android.txt'
|
||||
}
|
||||
}
|
||||
productFlavors {
|
||||
}
|
||||
lintOptions {
|
||||
abortOnError false
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation "androidx.appcompat:appcompat:${androidXAppCompat}"
|
||||
implementation "androidx.recyclerview:recyclerview:${androidXRecyclerView}"
|
||||
implementation "androidx.annotation:annotation:1.0.2"
|
||||
implementation "com.google.android.material:material:${googleMaterial}"
|
||||
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.15'
|
||||
|
||||
// add the constraintLayout used to create the items and headers
|
||||
implementation "androidx.constraintlayout:constraintlayout:1.1.3"
|
||||
|
||||
// used to base on some backwards compatible themes
|
||||
// contains util classes to support various android versions, and clean up code
|
||||
// comes with the awesome "Holder"-Pattern
|
||||
// https://github.com/mikepenz/Materialize
|
||||
api 'com.mikepenz:materialize:1.2.0'
|
||||
|
||||
// used to provide out of the box icon font support. simplifies development,
|
||||
// and provides scalable icons. the core is very very light
|
||||
// https://github.com/mikepenz/Android-Iconics
|
||||
api "com.mikepenz:iconics-core:${iconics}"
|
||||
|
||||
// used to fill the RecyclerView with the DrawerItems
|
||||
// and provides single and multi selection, expandable items
|
||||
// https://github.com/mikepenz/FastAdapter
|
||||
api 'com.mikepenz:fastadapter:3.3.0'
|
||||
api 'com.mikepenz:fastadapter-extensions-expandable:3.3.0'
|
||||
}
|
4
MaterialDrawer/gradle.properties
Normal file
4
MaterialDrawer/gradle.properties
Normal file
@ -0,0 +1,4 @@
|
||||
POM_NAME=MaterialDrawer Library
|
||||
POM_DESCRIPTION=The flexible, easy to use, all in one drawer library for your Android project.
|
||||
POM_ARTIFACT_ID=materialdrawer
|
||||
POM_PACKAGING=aar
|
2
MaterialDrawer/src/main/AndroidManifest.xml
Normal file
2
MaterialDrawer/src/main/AndroidManifest.xml
Normal file
@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest package="com.mikepenz.materialdrawer" />
|
Binary file not shown.
@ -0,0 +1,455 @@
|
||||
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);
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
1174
MaterialDrawer/src/main/java/com/mikepenz/materialdrawer/Drawer.java
Normal file
1174
MaterialDrawer/src/main/java/com/mikepenz/materialdrawer/Drawer.java
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,447 @@
|
||||
package com.mikepenz.materialdrawer;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.RelativeLayout;
|
||||
|
||||
import com.mikepenz.materialdrawer.model.AbstractDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.ContainerDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.Selectable;
|
||||
import com.mikepenz.materialdrawer.util.DrawerUIUtils;
|
||||
import com.mikepenz.materialize.util.UIUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import androidx.drawerlayout.widget.DrawerLayout;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 23.05.15.
|
||||
*/
|
||||
class DrawerUtils {
|
||||
/**
|
||||
* helper method to handle the onClick of the footer
|
||||
*
|
||||
* @param drawer
|
||||
* @param drawerItem
|
||||
* @param v
|
||||
* @param fireOnClick true if we should call the listener, false if not, null to not call the listener and not close the drawer
|
||||
*/
|
||||
public static void onFooterDrawerItemClick(DrawerBuilder drawer, IDrawerItem drawerItem, View v, Boolean fireOnClick) {
|
||||
boolean checkable = !(drawerItem != null && drawerItem instanceof Selectable && !drawerItem.isSelectable());
|
||||
if (checkable) {
|
||||
drawer.resetStickyFooterSelection();
|
||||
|
||||
v.setActivated(true);
|
||||
v.setSelected(true);
|
||||
|
||||
//remove the selection in the list
|
||||
drawer.getAdapter().deselect();
|
||||
|
||||
//find the position of the clicked footer item
|
||||
if (drawer.mStickyFooterView != null && drawer.mStickyFooterView instanceof LinearLayout) {
|
||||
LinearLayout footer = (LinearLayout) drawer.mStickyFooterView;
|
||||
for (int i = 0; i < footer.getChildCount(); i++) {
|
||||
if (footer.getChildAt(i) == v) {
|
||||
drawer.mCurrentStickyFooterSelection = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (fireOnClick != null) {
|
||||
boolean consumed = false;
|
||||
|
||||
if (fireOnClick) {
|
||||
if (drawerItem instanceof AbstractDrawerItem && ((AbstractDrawerItem) drawerItem).getOnDrawerItemClickListener() != null) {
|
||||
consumed = ((AbstractDrawerItem) drawerItem).getOnDrawerItemClickListener().onItemClick(v, -1, drawerItem);
|
||||
}
|
||||
|
||||
if (drawer.mOnDrawerItemClickListener != null) {
|
||||
consumed = drawer.mOnDrawerItemClickListener.onItemClick(v, -1, drawerItem);
|
||||
}
|
||||
}
|
||||
|
||||
if (!consumed) {
|
||||
//close the drawer after click
|
||||
drawer.closeDrawerDelayed();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* helper method to set the selection of the footer
|
||||
*
|
||||
* @param drawer
|
||||
* @param position
|
||||
* @param fireOnClick
|
||||
*/
|
||||
public static void setStickyFooterSelection(DrawerBuilder drawer, int position, Boolean fireOnClick) {
|
||||
if (position > -1) {
|
||||
if (drawer.mStickyFooterView != null && drawer.mStickyFooterView instanceof LinearLayout) {
|
||||
LinearLayout footer = (LinearLayout) drawer.mStickyFooterView;
|
||||
if (drawer.mStickyFooterDivider) {
|
||||
position = position + 1;
|
||||
}
|
||||
if (footer.getChildCount() > position && position >= 0) {
|
||||
IDrawerItem drawerItem = (IDrawerItem) footer.getChildAt(position).getTag(R.id.material_drawer_item);
|
||||
onFooterDrawerItemClick(drawer, drawerItem, footer.getChildAt(position), fireOnClick);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* calculates the position of an drawerItem. searching by it's identifier
|
||||
*
|
||||
* @param identifier
|
||||
* @return
|
||||
*/
|
||||
public static int getPositionByIdentifier(DrawerBuilder drawer, long identifier) {
|
||||
if (identifier != -1) {
|
||||
for (int i = 0; i < drawer.getAdapter().getItemCount(); i++) {
|
||||
if (drawer.getAdapter().getItem(i).getIdentifier() == identifier) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* gets the drawerItem with the specific identifier from a drawerItem list
|
||||
*
|
||||
* @param drawerItems
|
||||
* @param identifier
|
||||
* @return
|
||||
*/
|
||||
public static IDrawerItem getDrawerItem(List<IDrawerItem> drawerItems, long identifier) {
|
||||
if (identifier != -1) {
|
||||
for (IDrawerItem drawerItem : drawerItems) {
|
||||
if (drawerItem.getIdentifier() == identifier) {
|
||||
return drawerItem;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* gets the drawerItem by a defined tag from a drawerItem list
|
||||
*
|
||||
* @param drawerItems
|
||||
* @param tag
|
||||
* @return
|
||||
*/
|
||||
public static IDrawerItem getDrawerItem(List<IDrawerItem> drawerItems, Object tag) {
|
||||
if (tag != null) {
|
||||
for (IDrawerItem drawerItem : drawerItems) {
|
||||
if (tag.equals(drawerItem.getTag())) {
|
||||
return drawerItem;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* calculates the position of an drawerItem inside the footer. searching by it's identifier
|
||||
*
|
||||
* @param identifier
|
||||
* @return
|
||||
*/
|
||||
public static int getStickyFooterPositionByIdentifier(DrawerBuilder drawer, long identifier) {
|
||||
if (identifier != -1) {
|
||||
if (drawer.mStickyFooterView != null && drawer.mStickyFooterView instanceof LinearLayout) {
|
||||
LinearLayout footer = (LinearLayout) drawer.mStickyFooterView;
|
||||
|
||||
int shadowOffset = 0;
|
||||
for (int i = 0; i < footer.getChildCount(); i++) {
|
||||
Object o = footer.getChildAt(i).getTag(R.id.material_drawer_item);
|
||||
|
||||
//count up the shadowOffset to return the correct position of the given item
|
||||
if (o == null && drawer.mStickyFooterDivider) {
|
||||
shadowOffset = shadowOffset + 1;
|
||||
}
|
||||
|
||||
if (o != null && o instanceof IDrawerItem && ((IDrawerItem) o).getIdentifier() == identifier) {
|
||||
return i - shadowOffset;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* helper method to handle the headerView
|
||||
*
|
||||
* @param drawer
|
||||
*/
|
||||
public static void handleHeaderView(DrawerBuilder drawer) {
|
||||
//use the AccountHeader if set
|
||||
if (drawer.mAccountHeader != null) {
|
||||
if (drawer.mAccountHeaderSticky) {
|
||||
drawer.mStickyHeaderView = drawer.mAccountHeader.getView();
|
||||
} else {
|
||||
drawer.mHeaderView = drawer.mAccountHeader.getView();
|
||||
drawer.mHeaderDivider = drawer.mAccountHeader.mAccountHeaderBuilder.mDividerBelowHeader;
|
||||
drawer.mHeaderPadding = drawer.mAccountHeader.mAccountHeaderBuilder.mPaddingBelowHeader;
|
||||
}
|
||||
}
|
||||
|
||||
//sticky header view
|
||||
if (drawer.mStickyHeaderView != null) {
|
||||
//add the sticky footer view and align it to the bottom
|
||||
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
|
||||
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 1);
|
||||
drawer.mStickyHeaderView.setId(R.id.material_drawer_sticky_header);
|
||||
drawer.mSliderLayout.addView(drawer.mStickyHeaderView, 0, layoutParams);
|
||||
|
||||
//now align the recyclerView below the stickyFooterView ;)
|
||||
RelativeLayout.LayoutParams layoutParamsListView = (RelativeLayout.LayoutParams) drawer.mRecyclerView.getLayoutParams();
|
||||
layoutParamsListView.addRule(RelativeLayout.BELOW, R.id.material_drawer_sticky_header);
|
||||
drawer.mRecyclerView.setLayoutParams(layoutParamsListView);
|
||||
|
||||
//set a background color or the elevation will not work
|
||||
drawer.mStickyHeaderView.setBackgroundColor(UIUtils.getThemeColorFromAttrOrRes(drawer.mActivity, R.attr.material_drawer_background, R.color.material_drawer_background));
|
||||
|
||||
if (drawer.mStickyHeaderShadow) {
|
||||
//add a shadow
|
||||
if (Build.VERSION.SDK_INT >= 21) {
|
||||
drawer.mStickyHeaderView.setElevation(UIUtils.convertDpToPixel(4, drawer.mActivity));
|
||||
} else {
|
||||
View view = new View(drawer.mActivity);
|
||||
view.setBackgroundResource(R.drawable.material_drawer_shadow_bottom);
|
||||
drawer.mSliderLayout.addView(view, RelativeLayout.LayoutParams.MATCH_PARENT, (int) UIUtils.convertDpToPixel(4, drawer.mActivity));
|
||||
//now align the shadow below the stickyHeader ;)
|
||||
RelativeLayout.LayoutParams lps = (RelativeLayout.LayoutParams) view.getLayoutParams();
|
||||
lps.addRule(RelativeLayout.BELOW, R.id.material_drawer_sticky_header);
|
||||
view.setLayoutParams(lps);
|
||||
}
|
||||
}
|
||||
|
||||
//remove the padding of the recyclerView again we have the header on top of it
|
||||
drawer.mRecyclerView.setPadding(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
// set the header (do this before the setAdapter because some devices will crash else
|
||||
if (drawer.mHeaderView != null) {
|
||||
if (drawer.mRecyclerView == null) {
|
||||
throw new RuntimeException("can't use a headerView without a recyclerView");
|
||||
}
|
||||
|
||||
if (drawer.mHeaderPadding) {
|
||||
drawer.getHeaderAdapter().add(new ContainerDrawerItem().withView(drawer.mHeaderView).withHeight(drawer.mHeiderHeight).withDivider(drawer.mHeaderDivider).withViewPosition(ContainerDrawerItem.Position.TOP));
|
||||
} else {
|
||||
drawer.getHeaderAdapter().add(new ContainerDrawerItem().withView(drawer.mHeaderView).withHeight(drawer.mHeiderHeight).withDivider(drawer.mHeaderDivider).withViewPosition(ContainerDrawerItem.Position.NONE));
|
||||
}
|
||||
//set the padding on the top to 0
|
||||
drawer.mRecyclerView.setPadding(drawer.mRecyclerView.getPaddingLeft(), 0, drawer.mRecyclerView.getPaddingRight(), drawer.mRecyclerView.getPaddingBottom());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* small helper to rebuild the FooterView
|
||||
*
|
||||
* @param drawer
|
||||
*/
|
||||
public static void rebuildStickyFooterView(final DrawerBuilder drawer) {
|
||||
if (drawer.mSliderLayout != null) {
|
||||
if (drawer.mStickyFooterView != null) {
|
||||
drawer.mStickyFooterView.removeAllViews();
|
||||
|
||||
//create the divider
|
||||
if (drawer.mStickyFooterDivider) {
|
||||
addStickyFooterDivider(drawer.mStickyFooterView.getContext(), drawer.mStickyFooterView);
|
||||
}
|
||||
|
||||
//fill the footer with items
|
||||
DrawerUtils.fillStickyDrawerItemFooter(drawer, drawer.mStickyFooterView, new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
IDrawerItem drawerItem = (IDrawerItem) v.getTag(R.id.material_drawer_item);
|
||||
com.mikepenz.materialdrawer.DrawerUtils.onFooterDrawerItemClick(drawer, drawerItem, v, true);
|
||||
}
|
||||
});
|
||||
|
||||
drawer.mStickyFooterView.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
//there was no footer yet. now just create one
|
||||
DrawerUtils.handleFooterView(drawer, new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
IDrawerItem drawerItem = (IDrawerItem) v.getTag(R.id.material_drawer_item);
|
||||
DrawerUtils.onFooterDrawerItemClick(drawer, drawerItem, v, true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
setStickyFooterSelection(drawer, drawer.mCurrentStickyFooterSelection, false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* helper method to handle the footerView
|
||||
*
|
||||
* @param drawer
|
||||
*/
|
||||
public static void handleFooterView(DrawerBuilder drawer, View.OnClickListener onClickListener) {
|
||||
Context ctx = drawer.mSliderLayout.getContext();
|
||||
|
||||
//use the StickyDrawerItems if set
|
||||
if (drawer.mStickyDrawerItems != null && drawer.mStickyDrawerItems.size() > 0) {
|
||||
drawer.mStickyFooterView = DrawerUtils.buildStickyDrawerItemFooter(ctx, drawer, onClickListener);
|
||||
}
|
||||
|
||||
//sticky footer view
|
||||
if (drawer.mStickyFooterView != null) {
|
||||
//add the sticky footer view and align it to the bottom
|
||||
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
|
||||
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 1);
|
||||
drawer.mStickyFooterView.setId(R.id.material_drawer_sticky_footer);
|
||||
drawer.mSliderLayout.addView(drawer.mStickyFooterView, layoutParams);
|
||||
|
||||
if ((drawer.mTranslucentNavigationBar || drawer.mFullscreen) && Build.VERSION.SDK_INT >= 19) {
|
||||
drawer.mStickyFooterView.setPadding(0, 0, 0, UIUtils.getNavigationBarHeight(ctx));
|
||||
}
|
||||
|
||||
//now align the recyclerView above the stickyFooterView ;)
|
||||
RelativeLayout.LayoutParams layoutParamsListView = (RelativeLayout.LayoutParams) drawer.mRecyclerView.getLayoutParams();
|
||||
layoutParamsListView.addRule(RelativeLayout.ABOVE, R.id.material_drawer_sticky_footer);
|
||||
drawer.mRecyclerView.setLayoutParams(layoutParamsListView);
|
||||
|
||||
//handle shadow on top of the sticky footer
|
||||
if (drawer.mStickyFooterShadow) {
|
||||
drawer.mStickyFooterShadowView = new View(ctx);
|
||||
drawer.mStickyFooterShadowView.setBackgroundResource(R.drawable.material_drawer_shadow_top);
|
||||
drawer.mSliderLayout.addView(drawer.mStickyFooterShadowView, RelativeLayout.LayoutParams.MATCH_PARENT, ctx.getResources().getDimensionPixelSize(R.dimen.material_drawer_sticky_footer_elevation));
|
||||
//now align the shadow below the stickyHeader ;)
|
||||
RelativeLayout.LayoutParams lps = (RelativeLayout.LayoutParams) drawer.mStickyFooterShadowView.getLayoutParams();
|
||||
lps.addRule(RelativeLayout.ABOVE, R.id.material_drawer_sticky_footer);
|
||||
drawer.mStickyFooterShadowView.setLayoutParams(lps);
|
||||
}
|
||||
|
||||
//remove the padding of the recyclerView again we have the footer below it
|
||||
drawer.mRecyclerView.setPadding(drawer.mRecyclerView.getPaddingLeft(), drawer.mRecyclerView.getPaddingTop(), drawer.mRecyclerView.getPaddingRight(), ctx.getResources().getDimensionPixelSize(R.dimen.material_drawer_padding));
|
||||
}
|
||||
|
||||
// set the footer (do this before the setAdapter because some devices will crash else
|
||||
if (drawer.mFooterView != null) {
|
||||
if (drawer.mRecyclerView == null) {
|
||||
throw new RuntimeException("can't use a footerView without a recyclerView");
|
||||
}
|
||||
|
||||
if (drawer.mFooterDivider) {
|
||||
drawer.getFooterAdapter().add(new ContainerDrawerItem().withView(drawer.mFooterView).withViewPosition(ContainerDrawerItem.Position.BOTTOM));
|
||||
} else {
|
||||
drawer.getFooterAdapter().add(new ContainerDrawerItem().withView(drawer.mFooterView).withViewPosition(ContainerDrawerItem.Position.NONE));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* build the sticky footer item view
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static ViewGroup buildStickyDrawerItemFooter(Context ctx, DrawerBuilder drawer, View.OnClickListener onClickListener) {
|
||||
//create the container view
|
||||
final LinearLayout linearLayout = new LinearLayout(ctx);
|
||||
linearLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||
linearLayout.setOrientation(LinearLayout.VERTICAL);
|
||||
//set the background color to the drawer background color (if it has alpha the shadow won't be visible)
|
||||
linearLayout.setBackgroundColor(UIUtils.getThemeColorFromAttrOrRes(ctx, R.attr.material_drawer_background, R.color.material_drawer_background));
|
||||
|
||||
//create the divider
|
||||
if (drawer.mStickyFooterDivider) {
|
||||
addStickyFooterDivider(ctx, linearLayout);
|
||||
}
|
||||
|
||||
fillStickyDrawerItemFooter(drawer, linearLayout, onClickListener);
|
||||
|
||||
return linearLayout;
|
||||
}
|
||||
|
||||
/**
|
||||
* adds the shadow to the stickyFooter
|
||||
*
|
||||
* @param ctx
|
||||
* @param footerView
|
||||
*/
|
||||
private static void addStickyFooterDivider(Context ctx, ViewGroup footerView) {
|
||||
LinearLayout divider = new LinearLayout(ctx);
|
||||
LinearLayout.LayoutParams dividerParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||
divider.setMinimumHeight((int) UIUtils.convertDpToPixel(1, ctx));
|
||||
divider.setOrientation(LinearLayout.VERTICAL);
|
||||
divider.setBackgroundColor(UIUtils.getThemeColorFromAttrOrRes(ctx, R.attr.material_drawer_divider, R.color.material_drawer_divider));
|
||||
footerView.addView(divider, dividerParams);
|
||||
}
|
||||
|
||||
/**
|
||||
* helper method to fill the sticky footer with it's elements
|
||||
*
|
||||
* @param drawer
|
||||
* @param container
|
||||
* @param onClickListener
|
||||
*/
|
||||
public static void fillStickyDrawerItemFooter(DrawerBuilder drawer, ViewGroup container, View.OnClickListener onClickListener) {
|
||||
//add all drawer items
|
||||
for (IDrawerItem drawerItem : drawer.mStickyDrawerItems) {
|
||||
View view = drawerItem.generateView(container.getContext(), container);
|
||||
view.setTag(drawerItem);
|
||||
|
||||
if (drawerItem.isEnabled()) {
|
||||
//UIUtils.setBackground(view, UIUtils.getSelectableBackground(container.getContext(), selected_color, drawerItem.isSelectedBackgroundAnimated()));
|
||||
view.setOnClickListener(onClickListener);
|
||||
}
|
||||
|
||||
container.addView(view);
|
||||
|
||||
//for android API 17 --> Padding not applied via xml
|
||||
DrawerUIUtils.setDrawerVerticalPadding(view);
|
||||
}
|
||||
//and really. don't ask about this. it won't set the padding if i don't set the padding for the container
|
||||
container.setPadding(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* helper to extend the layoutParams of the drawer
|
||||
*
|
||||
* @param params
|
||||
* @return
|
||||
*/
|
||||
public static DrawerLayout.LayoutParams processDrawerLayoutParams(DrawerBuilder drawer, DrawerLayout.LayoutParams params) {
|
||||
if (params != null) {
|
||||
if (drawer.mDrawerGravity != null && (drawer.mDrawerGravity == Gravity.RIGHT || drawer.mDrawerGravity == Gravity.END)) {
|
||||
params.rightMargin = 0;
|
||||
if (Build.VERSION.SDK_INT >= 17) {
|
||||
params.setMarginEnd(0);
|
||||
}
|
||||
|
||||
params.leftMargin = drawer.mActivity.getResources().getDimensionPixelSize(R.dimen.material_drawer_margin);
|
||||
if (Build.VERSION.SDK_INT >= 17) {
|
||||
params.setMarginEnd(drawer.mActivity.getResources().getDimensionPixelSize(R.dimen.material_drawer_margin));
|
||||
}
|
||||
}
|
||||
|
||||
if (drawer.mDrawerWidth > -1) {
|
||||
params.width = drawer.mDrawerWidth;
|
||||
} else {
|
||||
params.width = DrawerUIUtils.getOptimalDrawerWidth(drawer.mActivity);
|
||||
}
|
||||
}
|
||||
|
||||
return params;
|
||||
}
|
||||
}
|
@ -0,0 +1,544 @@
|
||||
package com.mikepenz.materialdrawer;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.DefaultItemAnimator;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import com.mikepenz.fastadapter.FastAdapter;
|
||||
import com.mikepenz.fastadapter.IAdapter;
|
||||
import com.mikepenz.fastadapter.adapters.ItemAdapter;
|
||||
import com.mikepenz.fastadapter.listeners.OnClickListener;
|
||||
import com.mikepenz.fastadapter.listeners.OnLongClickListener;
|
||||
import com.mikepenz.materialdrawer.interfaces.ICrossfader;
|
||||
import com.mikepenz.materialdrawer.model.MiniDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.MiniProfileDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.ProfileDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.SecondaryDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.IProfile;
|
||||
import com.mikepenz.materialize.util.UIUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 15.07.15.
|
||||
* Don't count this for real yet. it's just a quick try on creating a Gmail like panel
|
||||
*/
|
||||
public class MiniDrawer {
|
||||
public static final int PROFILE = 1;
|
||||
public static final int ITEM = 2;
|
||||
|
||||
private LinearLayout mContainer;
|
||||
private RecyclerView mRecyclerView;
|
||||
protected FastAdapter<IDrawerItem> mAdapter;
|
||||
protected ItemAdapter<IDrawerItem> mItemAdapter;
|
||||
|
||||
private Drawer mDrawer;
|
||||
|
||||
/**
|
||||
* Provide the Drawer which will be used as dataSource for the drawerItems
|
||||
*
|
||||
* @param drawer
|
||||
* @return
|
||||
*/
|
||||
public MiniDrawer withDrawer(@NonNull Drawer drawer) {
|
||||
this.mDrawer = drawer;
|
||||
return this;
|
||||
}
|
||||
|
||||
private AccountHeader mAccountHeader;
|
||||
|
||||
/**
|
||||
* Provide the AccountHeader which will be used as the dataSource for the profiles
|
||||
*
|
||||
* @param accountHeader
|
||||
* @return
|
||||
*/
|
||||
public MiniDrawer withAccountHeader(@NonNull AccountHeader accountHeader) {
|
||||
this.mAccountHeader = accountHeader;
|
||||
return this;
|
||||
}
|
||||
|
||||
private ICrossfader mCrossFader;
|
||||
|
||||
/**
|
||||
* Provide the Crossfader implementation which is used with this MiniDrawer
|
||||
*
|
||||
* @param crossFader
|
||||
* @return
|
||||
*/
|
||||
public MiniDrawer withCrossFader(@NonNull ICrossfader crossFader) {
|
||||
this.mCrossFader = crossFader;
|
||||
return this;
|
||||
}
|
||||
|
||||
private boolean mInnerShadow = false;
|
||||
|
||||
/**
|
||||
* set to true if you want to show the innerShadow on the MiniDrawer
|
||||
*
|
||||
* @param innerShadow
|
||||
* @return
|
||||
*/
|
||||
public MiniDrawer withInnerShadow(boolean innerShadow) {
|
||||
this.mInnerShadow = innerShadow;
|
||||
return this;
|
||||
}
|
||||
|
||||
private boolean mInRTL = false;
|
||||
|
||||
/**
|
||||
* set to true if you want the MiniDrawer in RTL mode
|
||||
*
|
||||
* @param inRTL
|
||||
* @return
|
||||
*/
|
||||
public MiniDrawer withInRTL(boolean inRTL) {
|
||||
this.mInRTL = inRTL;
|
||||
return this;
|
||||
}
|
||||
|
||||
private boolean mIncludeSecondaryDrawerItems = false;
|
||||
|
||||
/**
|
||||
* set to true if you also want to display secondaryDrawerItems
|
||||
*
|
||||
* @param includeSecondaryDrawerItems
|
||||
* @return
|
||||
*/
|
||||
public MiniDrawer withIncludeSecondaryDrawerItems(boolean includeSecondaryDrawerItems) {
|
||||
this.mIncludeSecondaryDrawerItems = includeSecondaryDrawerItems;
|
||||
return this;
|
||||
}
|
||||
|
||||
private boolean mEnableSelectedMiniDrawerItemBackground = false;
|
||||
|
||||
/**
|
||||
* set to true if you want to display the background for the miniDrawerItem
|
||||
*
|
||||
* @param enableSelectedMiniDrawerItemBackground
|
||||
* @return
|
||||
*/
|
||||
public MiniDrawer withEnableSelectedMiniDrawerItemBackground(boolean enableSelectedMiniDrawerItemBackground) {
|
||||
this.mEnableSelectedMiniDrawerItemBackground = enableSelectedMiniDrawerItemBackground;
|
||||
return this;
|
||||
}
|
||||
|
||||
private boolean mEnableProfileClick = true;
|
||||
|
||||
/**
|
||||
* set to false if you do not want the profile image to toggle to the normal drawers profile selection
|
||||
*
|
||||
* @param enableProfileClick
|
||||
* @return this
|
||||
*/
|
||||
public MiniDrawer withEnableProfileClick(boolean enableProfileClick) {
|
||||
this.mEnableProfileClick = enableProfileClick;
|
||||
return this;
|
||||
}
|
||||
|
||||
private OnMiniDrawerItemClickListener mOnMiniDrawerItemClickListener;
|
||||
|
||||
/**
|
||||
* Define the onMiniDrawerItemClickListener called before any logic in the MiniDrawer is run, allows you to intercept the default behavior
|
||||
*
|
||||
* @param onMiniDrawerItemClickListener
|
||||
* @return this
|
||||
*/
|
||||
public MiniDrawer withOnMiniDrawerItemClickListener(OnMiniDrawerItemClickListener onMiniDrawerItemClickListener) {
|
||||
this.mOnMiniDrawerItemClickListener = onMiniDrawerItemClickListener;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
private OnClickListener<IDrawerItem> mOnMiniDrawerItemOnClickListener;
|
||||
|
||||
/**
|
||||
* Define an onClickListener for the MiniDrawer item adapter. WARNING: this will completely overwrite the default behavior
|
||||
* You may want to check the `OnMiniDrawerItemClickListener` (withOnMiniDrawerItemClickListener) which just hooks into the default behavior
|
||||
*
|
||||
* @param onMiniDrawerItemOnClickListener
|
||||
* @return this
|
||||
*/
|
||||
public MiniDrawer withOnMiniDrawerItemOnClickListener(OnClickListener<IDrawerItem> onMiniDrawerItemOnClickListener) {
|
||||
this.mOnMiniDrawerItemOnClickListener = onMiniDrawerItemOnClickListener;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
private OnLongClickListener<IDrawerItem> mOnMiniDrawerItemLongClickListener;
|
||||
|
||||
/**
|
||||
* Define an onLongClickListener for the MiniDrawer item adapter
|
||||
*
|
||||
* @param onMiniDrawerItemLongClickListener
|
||||
* @return
|
||||
*/
|
||||
public MiniDrawer withOnMiniDrawerItemLongClickListener(OnLongClickListener<IDrawerItem> onMiniDrawerItemLongClickListener) {
|
||||
this.mOnMiniDrawerItemLongClickListener = onMiniDrawerItemLongClickListener;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* get the RecyclerView of this MiniDrawer
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public RecyclerView getRecyclerView() {
|
||||
return mRecyclerView;
|
||||
}
|
||||
|
||||
/**
|
||||
* get the FastAdapter of this MiniDrawer
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public FastAdapter<IDrawerItem> getAdapter() {
|
||||
return mAdapter;
|
||||
}
|
||||
|
||||
/**
|
||||
* get the ItemAdapter of this MiniDrawer
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public ItemAdapter<IDrawerItem> getItemAdapter() {
|
||||
return mItemAdapter;
|
||||
}
|
||||
|
||||
/**
|
||||
* get the Drawer used to fill this MiniDrawer
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public Drawer getDrawer() {
|
||||
return mDrawer;
|
||||
}
|
||||
|
||||
/**
|
||||
* get the AccountHeader used to fill the this MiniDrawer
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public AccountHeader getAccountHeader() {
|
||||
return mAccountHeader;
|
||||
}
|
||||
|
||||
/**
|
||||
* get the Crossfader used for this MiniDrawer
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public ICrossfader getCrossFader() {
|
||||
return mCrossFader;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* the defined FastAdapter.OnClickListener which completely replaces the original behavior
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public OnClickListener getOnMiniDrawerItemOnClickListener() {
|
||||
return mOnMiniDrawerItemOnClickListener;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
public OnLongClickListener getOnMiniDrawerItemLongClickListener() {
|
||||
return mOnMiniDrawerItemLongClickListener;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* generates a MiniDrawerItem from a IDrawerItem
|
||||
*
|
||||
* @param drawerItem
|
||||
* @return
|
||||
*/
|
||||
public IDrawerItem generateMiniDrawerItem(IDrawerItem drawerItem) {
|
||||
if (drawerItem instanceof SecondaryDrawerItem) {
|
||||
if (drawerItem.isExcludeFromMiniDrawer()) {
|
||||
return null;
|
||||
}
|
||||
return mIncludeSecondaryDrawerItems ? new MiniDrawerItem((SecondaryDrawerItem) drawerItem).withEnableSelectedBackground(mEnableSelectedMiniDrawerItemBackground).withSelectedBackgroundAnimated(false) : null;
|
||||
} else if (drawerItem instanceof PrimaryDrawerItem) {
|
||||
if (drawerItem.isExcludeFromMiniDrawer()) {
|
||||
return null;
|
||||
}
|
||||
return new MiniDrawerItem((PrimaryDrawerItem) drawerItem).withEnableSelectedBackground(mEnableSelectedMiniDrawerItemBackground).withSelectedBackgroundAnimated(false);
|
||||
} else if (drawerItem instanceof ProfileDrawerItem) {
|
||||
if (drawerItem.isExcludeFromMiniDrawer()) {
|
||||
return null;
|
||||
}
|
||||
MiniProfileDrawerItem mpdi = new MiniProfileDrawerItem((ProfileDrawerItem) drawerItem);
|
||||
mpdi.withEnabled(mEnableProfileClick);
|
||||
return mpdi;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* gets the type of a IDrawerItem
|
||||
*
|
||||
* @param drawerItem
|
||||
* @return
|
||||
*/
|
||||
public int getMiniDrawerType(IDrawerItem drawerItem) {
|
||||
if (drawerItem instanceof MiniProfileDrawerItem) {
|
||||
return PROFILE;
|
||||
} else if (drawerItem instanceof MiniDrawerItem) {
|
||||
return ITEM;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* build the MiniDrawer
|
||||
*
|
||||
* @param ctx
|
||||
* @return
|
||||
*/
|
||||
public View build(Context ctx) {
|
||||
mContainer = new LinearLayout(ctx);
|
||||
if (mInnerShadow) {
|
||||
if (!mInRTL) {
|
||||
mContainer.setBackgroundResource(R.drawable.material_drawer_shadow_left);
|
||||
} else {
|
||||
mContainer.setBackgroundResource(R.drawable.material_drawer_shadow_right);
|
||||
}
|
||||
}
|
||||
|
||||
//create and append recyclerView
|
||||
mRecyclerView = new RecyclerView(ctx);
|
||||
mContainer.addView(mRecyclerView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
|
||||
|
||||
//set the itemAnimator
|
||||
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
|
||||
//some style improvements on older devices
|
||||
mRecyclerView.setFadingEdgeLength(0);
|
||||
//set the drawing cache background to the same color as the slider to improve performance
|
||||
//mRecyclerView.setDrawingCacheBackgroundColor(UIUtils.getThemeColorFromAttrOrRes(mActivity, R.attr.material_drawer_background, R.color.material_drawer_background));
|
||||
mRecyclerView.setClipToPadding(false);
|
||||
//additional stuff
|
||||
mRecyclerView.setLayoutManager(new LinearLayoutManager(ctx));
|
||||
//adapter
|
||||
mItemAdapter = new ItemAdapter<>();
|
||||
mAdapter = FastAdapter.with(mItemAdapter);
|
||||
mAdapter.withSelectable(true);
|
||||
mAdapter.withAllowDeselection(false);
|
||||
mRecyclerView.setAdapter(mAdapter);
|
||||
|
||||
//if the activity with the drawer should be fullscreen add the padding for the statusbar
|
||||
if (mDrawer != null && mDrawer.mDrawerBuilder != null && (mDrawer.mDrawerBuilder.mFullscreen || mDrawer.mDrawerBuilder.mTranslucentStatusBar)) {
|
||||
mRecyclerView.setPadding(mRecyclerView.getPaddingLeft(), UIUtils.getStatusBarHeight(ctx), mRecyclerView.getPaddingRight(), mRecyclerView.getPaddingBottom());
|
||||
}
|
||||
|
||||
//if the activity with the drawer should be fullscreen add the padding for the navigationBar
|
||||
if (mDrawer != null && mDrawer.mDrawerBuilder != null && (mDrawer.mDrawerBuilder.mFullscreen || mDrawer.mDrawerBuilder.mTranslucentNavigationBar) && ctx.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
|
||||
mRecyclerView.setPadding(mRecyclerView.getPaddingLeft(), mRecyclerView.getPaddingTop(), mRecyclerView.getPaddingRight(), UIUtils.getNavigationBarHeight(ctx));
|
||||
}
|
||||
|
||||
//set the adapter with the items
|
||||
createItems();
|
||||
|
||||
return mContainer;
|
||||
}
|
||||
|
||||
/**
|
||||
* call this method to trigger the onProfileClick on the MiniDrawer
|
||||
*/
|
||||
public void onProfileClick() {
|
||||
//crossfade if we are cross faded
|
||||
if (mCrossFader != null) {
|
||||
if (mCrossFader.isCrossfaded()) {
|
||||
mCrossFader.crossfade();
|
||||
}
|
||||
}
|
||||
|
||||
//update the current profile
|
||||
if (mAccountHeader != null) {
|
||||
IProfile profile = mAccountHeader.getActiveProfile();
|
||||
if (profile instanceof IDrawerItem) {
|
||||
mItemAdapter.set(0, generateMiniDrawerItem((IDrawerItem) profile));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* call this method to trigger the onItemClick on the MiniDrawer
|
||||
*
|
||||
* @param selectedDrawerItem
|
||||
* @return
|
||||
*/
|
||||
public boolean onItemClick(IDrawerItem selectedDrawerItem) {
|
||||
//We only need to clear if the new item is selectable
|
||||
if (selectedDrawerItem.isSelectable()) {
|
||||
//crossfade if we are cross faded
|
||||
if (mCrossFader != null) {
|
||||
if (mCrossFader.isCrossfaded()) {
|
||||
mCrossFader.crossfade();
|
||||
}
|
||||
}
|
||||
//update everything
|
||||
setSelection(selectedDrawerItem.getIdentifier());
|
||||
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* set the selection of the MiniDrawer
|
||||
*
|
||||
* @param identifier the identifier of the item which should be selected (-1 for none)
|
||||
*/
|
||||
public void setSelection(long identifier) {
|
||||
if (identifier == -1) {
|
||||
mAdapter.deselect();
|
||||
}
|
||||
int count = mAdapter.getItemCount();
|
||||
for (int i = 0; i < count; i++) {
|
||||
IDrawerItem item = mAdapter.getItem(i);
|
||||
if (item.getIdentifier() == identifier && !item.isSelected()) {
|
||||
mAdapter.deselect();
|
||||
mAdapter.select(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* update a MiniDrawerItem (after updating the main Drawer) via its identifier
|
||||
*
|
||||
* @param identifier the identifier of the item which was updated
|
||||
*/
|
||||
public void updateItem(long identifier) {
|
||||
if (mDrawer != null && mAdapter != null && mItemAdapter.getAdapterItems() != null && identifier != -1) {
|
||||
IDrawerItem drawerItem = DrawerUtils.getDrawerItem(getDrawerItems(), identifier);
|
||||
for (int i = 0; i < mItemAdapter.getAdapterItems().size(); i++) {
|
||||
if (mItemAdapter.getAdapterItems().get(i).getIdentifier() == drawerItem.getIdentifier()) {
|
||||
IDrawerItem miniDrawerItem = generateMiniDrawerItem(drawerItem);
|
||||
if (miniDrawerItem != null) {
|
||||
mItemAdapter.set(i, miniDrawerItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* creates the items for the MiniDrawer
|
||||
*/
|
||||
public void createItems() {
|
||||
mItemAdapter.clear();
|
||||
|
||||
int profileOffset = 0;
|
||||
if (mAccountHeader != null && mAccountHeader.getAccountHeaderBuilder().mProfileImagesVisible) {
|
||||
IProfile profile = mAccountHeader.getActiveProfile();
|
||||
if (profile instanceof IDrawerItem) {
|
||||
mItemAdapter.add(generateMiniDrawerItem((IDrawerItem) profile));
|
||||
profileOffset = 1;
|
||||
}
|
||||
}
|
||||
|
||||
int select = -1;
|
||||
if (mDrawer != null) {
|
||||
if (getDrawerItems() != null) {
|
||||
//migrate to miniDrawerItems
|
||||
int length = getDrawerItems().size();
|
||||
|
||||
int position = 0;
|
||||
for (int i = 0; i < length; i++) {
|
||||
IDrawerItem miniDrawerItem = generateMiniDrawerItem(getDrawerItems().get(i));
|
||||
if (miniDrawerItem != null) {
|
||||
if (miniDrawerItem.isSelected()) {
|
||||
select = position;
|
||||
}
|
||||
mItemAdapter.add(miniDrawerItem);
|
||||
position = position + 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (select >= 0) {
|
||||
//+1 because of the profile
|
||||
mAdapter.select(select + profileOffset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//listener
|
||||
if (mOnMiniDrawerItemOnClickListener != null) {
|
||||
mAdapter.withOnClickListener(mOnMiniDrawerItemOnClickListener);
|
||||
} else {
|
||||
mAdapter.withOnClickListener(new OnClickListener<IDrawerItem>() {
|
||||
@Override
|
||||
public boolean onClick(View v, IAdapter<IDrawerItem> adapter, final IDrawerItem item, final int position) {
|
||||
int type = getMiniDrawerType(item);
|
||||
|
||||
//if a listener is defined and we consume the event return
|
||||
if (mOnMiniDrawerItemClickListener != null && mOnMiniDrawerItemClickListener.onItemClick(v, position, item, type)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (type == ITEM) {
|
||||
//fire the onClickListener also if the specific drawerItem is not Selectable
|
||||
if (item.isSelectable()) {
|
||||
//make sure we are on the original drawerItemList
|
||||
if (mAccountHeader != null && mAccountHeader.isSelectionListShown()) {
|
||||
mAccountHeader.toggleSelectionList(v.getContext());
|
||||
}
|
||||
IDrawerItem drawerItem = mDrawer.getDrawerItem(item.getIdentifier());
|
||||
if (drawerItem != null && !drawerItem.isSelected()) {
|
||||
//set the selection
|
||||
mDrawer.setSelection(item, true);
|
||||
}
|
||||
} else if (mDrawer.getOnDrawerItemClickListener() != null) {
|
||||
//get the original `DrawerItem` from the Drawer as this one will contain all information
|
||||
mDrawer.getOnDrawerItemClickListener().onItemClick(v, position, DrawerUtils.getDrawerItem(getDrawerItems(), item.getIdentifier()));
|
||||
}
|
||||
} else if (type == PROFILE) {
|
||||
if (mAccountHeader != null && !mAccountHeader.isSelectionListShown()) {
|
||||
mAccountHeader.toggleSelectionList(v.getContext());
|
||||
}
|
||||
if (mCrossFader != null) {
|
||||
mCrossFader.crossfade();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
mAdapter.withOnLongClickListener(mOnMiniDrawerItemLongClickListener);
|
||||
mRecyclerView.scrollToPosition(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* returns always the original drawerItems and not the switched content
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
private List<IDrawerItem> getDrawerItems() {
|
||||
return mDrawer.getOriginalDrawerItems() != null ? mDrawer.getOriginalDrawerItems() : mDrawer.getDrawerItems();
|
||||
}
|
||||
|
||||
|
||||
public interface OnMiniDrawerItemClickListener {
|
||||
/**
|
||||
* @param view
|
||||
* @param position
|
||||
* @param drawerItem
|
||||
* @param type either MiniDrawer.PROFILE or MiniDrawer.ITEM
|
||||
* @return true if the event was consumed
|
||||
*/
|
||||
boolean onItemClick(View view, int position, IDrawerItem drawerItem, int type);
|
||||
}
|
||||
}
|
@ -0,0 +1,232 @@
|
||||
package com.mikepenz.materialdrawer.holder;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialdrawer.model.utils.BadgeDrawableBuilder;
|
||||
|
||||
import androidx.annotation.ColorInt;
|
||||
import androidx.annotation.ColorRes;
|
||||
import androidx.annotation.DimenRes;
|
||||
import androidx.annotation.Dimension;
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.core.view.ViewCompat;
|
||||
|
||||
import static androidx.annotation.Dimension.DP;
|
||||
import static androidx.annotation.Dimension.PX;
|
||||
|
||||
/**
|
||||
* Class to allow defining a BadgeStyle for the `BadgeDrawerItem`
|
||||
*/
|
||||
public class BadgeStyle {
|
||||
private int mGradientDrawable = R.drawable.material_drawer_badge;
|
||||
private Drawable mBadgeBackground;
|
||||
private ColorHolder mColor;
|
||||
private ColorHolder mColorPressed;
|
||||
private ColorHolder mTextColor;
|
||||
private ColorStateList mTextColorStateList;
|
||||
private DimenHolder mCorners;
|
||||
private DimenHolder mPaddingTopBottom = DimenHolder.fromDp(2); //2 looks best
|
||||
private DimenHolder mPaddingLeftRight = DimenHolder.fromDp(3); //3 looks best
|
||||
private DimenHolder mMinWidth = DimenHolder.fromDp(20); //20 looks nice
|
||||
|
||||
public int getGradientDrawable() {
|
||||
return mGradientDrawable;
|
||||
}
|
||||
|
||||
public BadgeStyle withGradientDrawable(@DrawableRes int gradientDrawable) {
|
||||
this.mGradientDrawable = gradientDrawable;
|
||||
this.mBadgeBackground = null;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Drawable getBadgeBackground() {
|
||||
return mBadgeBackground;
|
||||
}
|
||||
|
||||
public BadgeStyle withBadgeBackground(Drawable badgeBackground) {
|
||||
this.mBadgeBackground = badgeBackground;
|
||||
this.mGradientDrawable = -1;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ColorHolder getColor() {
|
||||
return mColor;
|
||||
}
|
||||
|
||||
public BadgeStyle withColor(@ColorInt int color) {
|
||||
this.mColor = ColorHolder.fromColor(color);
|
||||
return this;
|
||||
}
|
||||
|
||||
public BadgeStyle withColorRes(@ColorRes int color) {
|
||||
this.mColor = ColorHolder.fromColorRes(color);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ColorHolder getColorPressed() {
|
||||
return mColorPressed;
|
||||
}
|
||||
|
||||
public BadgeStyle withColorPressed(@ColorInt int colorPressed) {
|
||||
this.mColorPressed = ColorHolder.fromColor(colorPressed);
|
||||
return this;
|
||||
}
|
||||
|
||||
public BadgeStyle withColorPressedRes(@ColorRes int colorPressed) {
|
||||
this.mColorPressed = ColorHolder.fromColorRes(colorPressed);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ColorHolder getTextColor() {
|
||||
return mTextColor;
|
||||
}
|
||||
|
||||
public BadgeStyle withTextColor(@ColorInt int textColor) {
|
||||
this.mTextColor = ColorHolder.fromColor(textColor);
|
||||
return this;
|
||||
}
|
||||
|
||||
public BadgeStyle withTextColorRes(@ColorRes int textColor) {
|
||||
this.mTextColor = ColorHolder.fromColorRes(textColor);
|
||||
return this;
|
||||
}
|
||||
|
||||
public BadgeStyle withTextColorStateList(ColorStateList textColorStateList) {
|
||||
this.mTextColor = null;
|
||||
this.mTextColorStateList = textColorStateList;
|
||||
return this;
|
||||
}
|
||||
|
||||
public DimenHolder getCorners() {
|
||||
return mCorners;
|
||||
}
|
||||
|
||||
public BadgeStyle withCorners(@Dimension(unit = PX) int cornersPx) {
|
||||
this.mCorners = DimenHolder.fromPixel(cornersPx);
|
||||
return this;
|
||||
}
|
||||
|
||||
public BadgeStyle withCornersDp(@Dimension(unit = DP) int corners) {
|
||||
this.mCorners = DimenHolder.fromDp(corners);
|
||||
return this;
|
||||
}
|
||||
|
||||
public BadgeStyle withCorners(DimenHolder corners) {
|
||||
this.mCorners = corners;
|
||||
return this;
|
||||
}
|
||||
|
||||
public DimenHolder getPaddingLeftRight() {
|
||||
return mPaddingLeftRight;
|
||||
}
|
||||
|
||||
public BadgeStyle withPaddingLeftRightPx(@Dimension(unit = PX) int paddingLeftRight) {
|
||||
this.mPaddingLeftRight = DimenHolder.fromPixel(paddingLeftRight);
|
||||
return this;
|
||||
}
|
||||
|
||||
public BadgeStyle withPaddingLeftRightDp(@Dimension(unit = DP) int paddingLeftRight) {
|
||||
this.mPaddingLeftRight = DimenHolder.fromDp(paddingLeftRight);
|
||||
return this;
|
||||
}
|
||||
|
||||
public BadgeStyle withPaddingLeftRightRes(@DimenRes int paddingLeftRight) {
|
||||
this.mPaddingLeftRight = DimenHolder.fromResource(paddingLeftRight);
|
||||
return this;
|
||||
}
|
||||
|
||||
public DimenHolder getPaddingTopBottom() {
|
||||
return mPaddingTopBottom;
|
||||
}
|
||||
|
||||
public BadgeStyle withPaddingTopBottomPx(@Dimension(unit = PX) int paddingTopBottom) {
|
||||
this.mPaddingTopBottom = DimenHolder.fromPixel(paddingTopBottom);
|
||||
return this;
|
||||
}
|
||||
|
||||
public BadgeStyle withPaddingTopBottomDp(@Dimension(unit = DP) int paddingTopBottom) {
|
||||
this.mPaddingTopBottom = DimenHolder.fromDp(paddingTopBottom);
|
||||
return this;
|
||||
}
|
||||
|
||||
public BadgeStyle withPaddingTopBottomRes(@DimenRes int paddingTopBottom) {
|
||||
this.mPaddingTopBottom = DimenHolder.fromResource(paddingTopBottom);
|
||||
return this;
|
||||
}
|
||||
|
||||
public BadgeStyle withPadding(@Dimension(unit = PX) int padding) {
|
||||
this.mPaddingLeftRight = DimenHolder.fromPixel(padding);
|
||||
this.mPaddingTopBottom = DimenHolder.fromPixel(padding);
|
||||
return this;
|
||||
}
|
||||
|
||||
public BadgeStyle withPadding(DimenHolder padding) {
|
||||
this.mPaddingLeftRight = padding;
|
||||
this.mPaddingTopBottom = padding;
|
||||
return this;
|
||||
}
|
||||
|
||||
public DimenHolder getMinWidth() {
|
||||
return mMinWidth;
|
||||
}
|
||||
|
||||
public BadgeStyle withMinWidth(@Dimension(unit = PX) int minWidth) {
|
||||
this.mMinWidth = DimenHolder.fromPixel(minWidth);
|
||||
return this;
|
||||
}
|
||||
|
||||
public BadgeStyle withMinWidth(DimenHolder minWidth) {
|
||||
this.mMinWidth = minWidth;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BadgeStyle() {
|
||||
}
|
||||
|
||||
public BadgeStyle(@ColorInt int color, @ColorInt int colorPressed) {
|
||||
this.mColor = ColorHolder.fromColor(color);
|
||||
this.mColorPressed = ColorHolder.fromColor(colorPressed);
|
||||
}
|
||||
|
||||
public BadgeStyle(@DrawableRes int gradientDrawable, @ColorInt int color, @ColorInt int colorPressed, @ColorInt int textColor) {
|
||||
this.mGradientDrawable = gradientDrawable;
|
||||
this.mColor = ColorHolder.fromColor(color);
|
||||
this.mColorPressed = ColorHolder.fromColor(colorPressed);
|
||||
this.mTextColor = ColorHolder.fromColor(textColor);
|
||||
}
|
||||
|
||||
public void style(TextView badgeTextView) {
|
||||
style(badgeTextView, null);
|
||||
}
|
||||
|
||||
public void style(TextView badgeTextView, ColorStateList colorStateList) {
|
||||
Context ctx = badgeTextView.getContext();
|
||||
//set background for badge
|
||||
if (mBadgeBackground == null) {
|
||||
ViewCompat.setBackground(badgeTextView, new BadgeDrawableBuilder(this).build(ctx));
|
||||
} else {
|
||||
ViewCompat.setBackground(badgeTextView, mBadgeBackground);
|
||||
}
|
||||
|
||||
//set the badge text color
|
||||
if (mTextColor != null) {
|
||||
ColorHolder.applyToOr(mTextColor, badgeTextView, null);
|
||||
} else if (mTextColorStateList != null) {
|
||||
badgeTextView.setTextColor(mTextColorStateList);
|
||||
} else if (colorStateList != null) {
|
||||
badgeTextView.setTextColor(colorStateList);
|
||||
}
|
||||
|
||||
//set the padding
|
||||
int paddingLeftRight = mPaddingLeftRight.asPixel(ctx);
|
||||
int paddingTopBottom = mPaddingTopBottom.asPixel(ctx);
|
||||
badgeTextView.setPadding(paddingLeftRight, paddingTopBottom, paddingLeftRight, paddingTopBottom);
|
||||
|
||||
//set the min width
|
||||
badgeTextView.setMinWidth(mMinWidth.asPixel(ctx));
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.mikepenz.materialdrawer.holder;
|
||||
|
||||
import androidx.annotation.ColorInt;
|
||||
import androidx.annotation.ColorRes;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 13.07.15.
|
||||
*/
|
||||
public class ColorHolder extends com.mikepenz.materialize.holder.ColorHolder {
|
||||
public ColorHolder() {
|
||||
}
|
||||
|
||||
public static ColorHolder fromColorRes(@ColorRes int colorRes) {
|
||||
ColorHolder colorHolder = new ColorHolder();
|
||||
colorHolder.setColorRes(colorRes);
|
||||
return colorHolder;
|
||||
}
|
||||
|
||||
public static ColorHolder fromColor(@ColorInt int colorInt) {
|
||||
ColorHolder colorHolder = new ColorHolder();
|
||||
colorHolder.setColorInt(colorInt);
|
||||
return colorHolder;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
package com.mikepenz.materialdrawer.holder;
|
||||
|
||||
import androidx.annotation.DimenRes;
|
||||
import androidx.annotation.Dimension;
|
||||
|
||||
import static androidx.annotation.Dimension.DP;
|
||||
import static androidx.annotation.Dimension.PX;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 13.07.15.
|
||||
*/
|
||||
public class DimenHolder extends com.mikepenz.materialize.holder.DimenHolder {
|
||||
public DimenHolder() {
|
||||
|
||||
}
|
||||
|
||||
public static DimenHolder fromPixel(@Dimension(unit = PX) int pixel) {
|
||||
DimenHolder dimenHolder = new DimenHolder();
|
||||
dimenHolder.setPixel(pixel);
|
||||
return dimenHolder;
|
||||
}
|
||||
|
||||
public static DimenHolder fromDp(@Dimension(unit = DP) int dp) {
|
||||
DimenHolder dimenHolder = new DimenHolder();
|
||||
dimenHolder.setDp(dp);
|
||||
return dimenHolder;
|
||||
}
|
||||
|
||||
public static DimenHolder fromResource(@DimenRes int resource) {
|
||||
DimenHolder dimenHolder = new DimenHolder();
|
||||
dimenHolder.setResource(resource);
|
||||
return dimenHolder;
|
||||
}
|
||||
}
|
@ -0,0 +1,165 @@
|
||||
package com.mikepenz.materialdrawer.holder;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.appcompat.content.res.AppCompatResources;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.mikepenz.iconics.IconicsDrawable;
|
||||
import com.mikepenz.iconics.typeface.IIcon;
|
||||
import com.mikepenz.materialdrawer.util.DrawerImageLoader;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.InputStream;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 13.07.15.
|
||||
*/
|
||||
|
||||
public class ImageHolder extends com.mikepenz.materialize.holder.ImageHolder {
|
||||
private IIcon mIIcon;
|
||||
|
||||
public ImageHolder(String url) {
|
||||
super(url);
|
||||
}
|
||||
|
||||
public ImageHolder(Uri uri) {
|
||||
super(uri);
|
||||
}
|
||||
|
||||
public ImageHolder(Drawable icon) {
|
||||
super(icon);
|
||||
}
|
||||
|
||||
public ImageHolder(Bitmap bitmap) {
|
||||
super(bitmap);
|
||||
}
|
||||
|
||||
public ImageHolder(@DrawableRes int iconRes) {
|
||||
super(iconRes);
|
||||
}
|
||||
|
||||
public ImageHolder(IIcon iicon) {
|
||||
super((Bitmap) null);
|
||||
this.mIIcon = iicon;
|
||||
}
|
||||
|
||||
public IIcon getIIcon() {
|
||||
return mIIcon;
|
||||
}
|
||||
|
||||
public void setIIcon(IIcon mIIcon) {
|
||||
this.mIIcon = mIIcon;
|
||||
}
|
||||
|
||||
/**
|
||||
* sets an existing image to the imageView
|
||||
*
|
||||
* @param imageView
|
||||
* @param tag used to identify imageViews and define different placeholders
|
||||
* @return true if an image was set
|
||||
*/
|
||||
@Override
|
||||
public boolean applyTo(ImageView imageView, String tag) {
|
||||
if (getUri() != null) {
|
||||
boolean consumed = DrawerImageLoader.getInstance().setImage(imageView, getUri(), tag);
|
||||
if (!consumed) {
|
||||
imageView.setImageURI(getUri());
|
||||
}
|
||||
} else if (getIcon() != null) {
|
||||
imageView.setImageDrawable(getIcon());
|
||||
} else if (getBitmap() != null) {
|
||||
imageView.setImageBitmap(getBitmap());
|
||||
} else if (getIconRes() != -1) {
|
||||
imageView.setImageResource(getIconRes());
|
||||
} else if (mIIcon != null) {
|
||||
imageView.setImageDrawable(new IconicsDrawable(imageView.getContext(), mIIcon).actionBar());
|
||||
} else {
|
||||
imageView.setImageBitmap(null);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* this only handles Drawables
|
||||
*
|
||||
* @param ctx
|
||||
* @param iconColor
|
||||
* @param tint
|
||||
* @return
|
||||
*/
|
||||
public Drawable decideIcon(Context ctx, int iconColor, boolean tint, int paddingDp) {
|
||||
Drawable icon = getIcon();
|
||||
|
||||
if (mIIcon != null) {
|
||||
icon = new IconicsDrawable(ctx, mIIcon).color(iconColor).sizeDp(24).paddingDp(paddingDp);
|
||||
} else if (getIconRes() != -1) {
|
||||
icon = AppCompatResources.getDrawable(ctx, getIconRes());
|
||||
} else if (getUri() != null) {
|
||||
try {
|
||||
InputStream inputStream = ctx.getContentResolver().openInputStream(getUri());
|
||||
icon = Drawable.createFromStream(inputStream, getUri().toString());
|
||||
} catch (FileNotFoundException e) {
|
||||
//no need to handle this
|
||||
}
|
||||
}
|
||||
|
||||
//if we got an icon AND we have auto tinting enabled AND it is no IIcon, tint it ;)
|
||||
if (icon != null && tint && mIIcon == null) {
|
||||
icon = icon.mutate();
|
||||
icon.setColorFilter(iconColor, PorterDuff.Mode.SRC_IN);
|
||||
}
|
||||
|
||||
return icon;
|
||||
}
|
||||
|
||||
/**
|
||||
* a small static helper which catches nulls for us
|
||||
*
|
||||
* @param imageHolder
|
||||
* @param ctx
|
||||
* @param iconColor
|
||||
* @param tint
|
||||
* @return
|
||||
*/
|
||||
public static Drawable decideIcon(ImageHolder imageHolder, Context ctx, int iconColor, boolean tint, int paddingDp) {
|
||||
if (imageHolder == null) {
|
||||
return null;
|
||||
} else {
|
||||
return imageHolder.decideIcon(ctx, iconColor, tint, paddingDp);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* decides which icon to apply or hide this view
|
||||
*
|
||||
* @param imageHolder
|
||||
* @param imageView
|
||||
* @param iconColor
|
||||
* @param tint
|
||||
* @param paddingDp
|
||||
*/
|
||||
public static void applyDecidedIconOrSetGone(ImageHolder imageHolder, ImageView imageView, int iconColor, boolean tint, int paddingDp) {
|
||||
if (imageHolder != null && imageView != null) {
|
||||
Drawable drawable = ImageHolder.decideIcon(imageHolder, imageView.getContext(), iconColor, tint, paddingDp);
|
||||
if (drawable != null) {
|
||||
imageView.setImageDrawable(drawable);
|
||||
imageView.setVisibility(View.VISIBLE);
|
||||
} else if (imageHolder.getBitmap() != null) {
|
||||
imageView.setImageBitmap(imageHolder.getBitmap());
|
||||
imageView.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
imageView.setVisibility(View.GONE);
|
||||
}
|
||||
} else if (imageView != null) {
|
||||
imageView.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package com.mikepenz.materialdrawer.holder;
|
||||
|
||||
import androidx.annotation.StringRes;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 13.07.15.
|
||||
*/
|
||||
public class StringHolder extends com.mikepenz.materialize.holder.StringHolder {
|
||||
public StringHolder(CharSequence text) {
|
||||
super(text);
|
||||
}
|
||||
|
||||
public StringHolder(@StringRes int textRes) {
|
||||
super(textRes);
|
||||
}
|
||||
}
|
@ -0,0 +1,145 @@
|
||||
package com.mikepenz.materialdrawer.icons;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Typeface;
|
||||
|
||||
import com.mikepenz.iconics.typeface.IIcon;
|
||||
import com.mikepenz.iconics.typeface.ITypeface;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 01.11.14.
|
||||
*/
|
||||
public class MaterialDrawerFont implements ITypeface {
|
||||
private static final String TTF_FILE = "materialdrawerfont-font-v5.0.0.ttf";
|
||||
|
||||
private static Typeface typeface = null;
|
||||
|
||||
private static HashMap<String, Character> mChars;
|
||||
|
||||
@Override
|
||||
public IIcon getIcon(String key) {
|
||||
return Icon.valueOf(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HashMap<String, Character> getCharacters() {
|
||||
if (mChars == null) {
|
||||
HashMap<String, Character> aChars = new HashMap<String, Character>();
|
||||
for (Icon v : Icon.values()) {
|
||||
aChars.put(v.name(), v.character);
|
||||
}
|
||||
mChars = aChars;
|
||||
}
|
||||
|
||||
return mChars;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMappingPrefix() {
|
||||
return "mdf";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFontName() {
|
||||
return "MaterialDrawerFont";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getVersion() {
|
||||
return "5.0.0";
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIconCount() {
|
||||
return mChars.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<String> getIcons() {
|
||||
Collection<String> icons = new LinkedList<String>();
|
||||
|
||||
for (Icon value : Icon.values()) {
|
||||
icons.add(value.name());
|
||||
}
|
||||
|
||||
return icons;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getAuthor() {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUrl() {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLicense() {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLicenseUrl() {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Typeface getTypeface(Context context) {
|
||||
if (typeface == null) {
|
||||
try {
|
||||
typeface = Typeface.createFromAsset(context.getAssets(), "fonts/" + TTF_FILE);
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return typeface;
|
||||
}
|
||||
|
||||
public enum Icon implements IIcon {
|
||||
mdf_arrow_drop_down('\ue5c5'),
|
||||
mdf_arrow_drop_up('\ue5c7'),
|
||||
mdf_expand_less('\ue5ce'),
|
||||
mdf_expand_more('\ue5cf'),
|
||||
mdf_person('\ue7fd');
|
||||
|
||||
char character;
|
||||
|
||||
Icon(char character) {
|
||||
this.character = character;
|
||||
}
|
||||
|
||||
public String getFormattedName() {
|
||||
return "{" + name() + "}";
|
||||
}
|
||||
|
||||
public char getCharacter() {
|
||||
return character;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name();
|
||||
}
|
||||
|
||||
// remember the typeface so we can use it later
|
||||
private static ITypeface typeface;
|
||||
|
||||
public ITypeface getTypeface() {
|
||||
if (typeface == null) {
|
||||
typeface = new MaterialDrawerFont();
|
||||
}
|
||||
return typeface;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package com.mikepenz.materialdrawer.interfaces;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 18.07.15.
|
||||
*/
|
||||
public interface ICrossfader {
|
||||
void crossfade();
|
||||
|
||||
boolean isCrossfaded();
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package com.mikepenz.materialdrawer.interfaces;
|
||||
|
||||
import android.widget.CompoundButton;
|
||||
|
||||
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
|
||||
|
||||
/**
|
||||
* Interface definition for a callback to be invoked when the checked state
|
||||
* of a compound button changed.
|
||||
*/
|
||||
public interface OnCheckedChangeListener {
|
||||
/**
|
||||
* Called when the checked state of a compound button has changed.
|
||||
*
|
||||
* @param buttonView The compound button view whose state has changed.
|
||||
* @param isChecked The new checked state of buttonView.
|
||||
*/
|
||||
void onCheckedChanged(IDrawerItem drawerItem, CompoundButton buttonView, boolean isChecked);
|
||||
}
|
@ -0,0 +1,107 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.annotation.LayoutRes;
|
||||
import androidx.annotation.StringRes;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialdrawer.holder.BadgeStyle;
|
||||
import com.mikepenz.materialdrawer.holder.StringHolder;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.ColorfulBadgeable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public abstract class AbstractBadgeableDrawerItem<Item extends AbstractBadgeableDrawerItem> extends BaseDescribeableDrawerItem<Item, AbstractBadgeableDrawerItem.ViewHolder> implements ColorfulBadgeable<Item> {
|
||||
protected StringHolder mBadge;
|
||||
protected BadgeStyle mBadgeStyle = new BadgeStyle();
|
||||
|
||||
@Override
|
||||
public Item withBadge(StringHolder badge) {
|
||||
this.mBadge = badge;
|
||||
return (Item) this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Item withBadge(String badge) {
|
||||
this.mBadge = new StringHolder(badge);
|
||||
return (Item) this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Item withBadge(@StringRes int badgeRes) {
|
||||
this.mBadge = new StringHolder(badgeRes);
|
||||
return (Item) this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Item withBadgeStyle(BadgeStyle badgeStyle) {
|
||||
this.mBadgeStyle = badgeStyle;
|
||||
return (Item) this;
|
||||
}
|
||||
|
||||
public StringHolder getBadge() {
|
||||
return mBadge;
|
||||
}
|
||||
|
||||
public BadgeStyle getBadgeStyle() {
|
||||
return mBadgeStyle;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return R.id.material_drawer_item_primary;/*"PRIMARY_ITEM"*/
|
||||
}
|
||||
|
||||
@Override
|
||||
@LayoutRes
|
||||
public int getLayoutRes() {
|
||||
return R.layout.material_drawer_item_primary;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindView(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 (badgeVisible) {
|
||||
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());
|
||||
}
|
||||
|
||||
//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 BaseViewHolder {
|
||||
private View badgeContainer;
|
||||
private TextView badge;
|
||||
|
||||
public ViewHolder(View view) {
|
||||
super(view);
|
||||
this.badgeContainer = view.findViewById(R.id.material_drawer_badge_container);
|
||||
this.badge = (TextView) view.findViewById(R.id.material_drawer_badge);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,449 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.mikepenz.materialdrawer.Drawer;
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.OnPostBindViewListener;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.Selectable;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.Tagable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import androidx.annotation.CallSuper;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 14.07.15.
|
||||
*/
|
||||
public abstract class AbstractDrawerItem<T, VH extends RecyclerView.ViewHolder> implements IDrawerItem<T, VH>, Selectable<T>, Tagable<T> {
|
||||
|
||||
protected boolean mExcludeFromMiniDrawer = false;
|
||||
|
||||
@Override
|
||||
public boolean isExcludeFromMiniDrawer() {
|
||||
return mExcludeFromMiniDrawer;
|
||||
}
|
||||
|
||||
// the identifier for this item
|
||||
protected long mIdentifier = -1;
|
||||
|
||||
/**
|
||||
* set the identifier of this item
|
||||
*
|
||||
* @param identifier
|
||||
* @return
|
||||
*/
|
||||
public T withIdentifier(long identifier) {
|
||||
this.mIdentifier = identifier;
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns the identifier of this item
|
||||
* -1 is the default not set state
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public long getIdentifier() {
|
||||
return mIdentifier;
|
||||
}
|
||||
|
||||
// the tag for this item
|
||||
protected Object mTag;
|
||||
|
||||
/**
|
||||
* set the tag of this item
|
||||
*
|
||||
* @param object
|
||||
* @return
|
||||
*/
|
||||
public T withTag(Object object) {
|
||||
this.mTag = object;
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the tag of this item
|
||||
*/
|
||||
@Override
|
||||
public Object getTag() {
|
||||
return mTag;
|
||||
}
|
||||
|
||||
// defines if this item is enabled
|
||||
protected boolean mEnabled = true;
|
||||
|
||||
/**
|
||||
* set if this item is enabled
|
||||
*
|
||||
* @param enabled true if this item is enabled
|
||||
* @return
|
||||
*/
|
||||
public T withEnabled(boolean enabled) {
|
||||
this.mEnabled = enabled;
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return if this item is enabled
|
||||
*/
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return mEnabled;
|
||||
}
|
||||
|
||||
// defines if the item is selected
|
||||
protected boolean mSelected = false;
|
||||
|
||||
/**
|
||||
* set if this item is selected
|
||||
*
|
||||
* @param selected true if this item is selected
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public T withSetSelected(boolean selected) {
|
||||
this.mSelected = selected;
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return if this item is selected
|
||||
*/
|
||||
@Override
|
||||
public boolean isSelected() {
|
||||
return mSelected;
|
||||
}
|
||||
|
||||
// defines if this item is selectable
|
||||
protected boolean mSelectable = true;
|
||||
|
||||
/**
|
||||
* set if this item is selectable
|
||||
*
|
||||
* @param selectable true if this item is selectable
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public T withSelectable(boolean selectable) {
|
||||
this.mSelectable = selectable;
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return if this item is selectable
|
||||
*/
|
||||
@Override
|
||||
public boolean isSelectable() {
|
||||
return mSelectable;
|
||||
}
|
||||
|
||||
// defines if the item's background' change should be animated when it is (de)selected
|
||||
protected boolean mSelectedBackgroundAnimated = true;
|
||||
|
||||
/**
|
||||
* set if this item is selectable
|
||||
*
|
||||
* @param selectedBackgroundAnimated true if this item's background should fade when it is (de) selected
|
||||
* @return
|
||||
*/
|
||||
public T withSelectedBackgroundAnimated(boolean selectedBackgroundAnimated) {
|
||||
this.mSelectedBackgroundAnimated = selectedBackgroundAnimated;
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return if this item is selectable
|
||||
*/
|
||||
public boolean isSelectedBackgroundAnimated() {
|
||||
return mSelectedBackgroundAnimated;
|
||||
}
|
||||
|
||||
public Drawer.OnDrawerItemClickListener mOnDrawerItemClickListener = null;
|
||||
|
||||
public Drawer.OnDrawerItemClickListener getOnDrawerItemClickListener() {
|
||||
return mOnDrawerItemClickListener;
|
||||
}
|
||||
|
||||
/**
|
||||
* this listener is called when an item is clicked in the drawer.
|
||||
* WARNING: don't overwrite this in the Switch / Toggle drawerItems if you want the toggle / switch to be selected
|
||||
* if the item is clicked and the item is not selectable.
|
||||
*
|
||||
* @param onDrawerItemClickListener
|
||||
* @return
|
||||
*/
|
||||
public T withOnDrawerItemClickListener(Drawer.OnDrawerItemClickListener onDrawerItemClickListener) {
|
||||
this.mOnDrawerItemClickListener = onDrawerItemClickListener;
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
protected OnPostBindViewListener mOnPostBindViewListener = null;
|
||||
|
||||
public OnPostBindViewListener getOnPostBindViewListener() {
|
||||
return mOnPostBindViewListener;
|
||||
}
|
||||
|
||||
/**
|
||||
* add this listener and hook in if you want to modify a drawerItems view without creating a custom drawer item
|
||||
*
|
||||
* @param onPostBindViewListener
|
||||
* @return
|
||||
*/
|
||||
public T withPostOnBindViewListener(OnPostBindViewListener onPostBindViewListener) {
|
||||
this.mOnPostBindViewListener = onPostBindViewListener;
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
/**
|
||||
* is called after bindView to allow some post creation setps
|
||||
*
|
||||
* @param drawerItem the drawerItem which is bound to the view
|
||||
* @param view the currently view which will be bound
|
||||
*/
|
||||
public void onPostBindView(IDrawerItem drawerItem, View view) {
|
||||
if (mOnPostBindViewListener != null) {
|
||||
mOnPostBindViewListener.onBindView(drawerItem, view);
|
||||
}
|
||||
}
|
||||
|
||||
// the parent of this item
|
||||
private IDrawerItem mParent;
|
||||
|
||||
/**
|
||||
* @return the parent of this item
|
||||
*/
|
||||
@Override
|
||||
public IDrawerItem getParent() {
|
||||
return mParent;
|
||||
}
|
||||
|
||||
/**
|
||||
* the parent for this item
|
||||
*
|
||||
* @param parent it's parent
|
||||
* @return this
|
||||
*/
|
||||
@Override
|
||||
public IDrawerItem withParent(IDrawerItem parent) {
|
||||
this.mParent = parent;
|
||||
return this;
|
||||
}
|
||||
|
||||
// the subItems to expand for this item
|
||||
protected List<IDrawerItem> mSubItems;
|
||||
|
||||
/**
|
||||
* a list of subItems
|
||||
* **WARNING** Make sure the subItems provided already have identifiers
|
||||
*
|
||||
* @param subItems
|
||||
* @return
|
||||
*/
|
||||
public T withSubItems(List<IDrawerItem> subItems) {
|
||||
this.mSubItems = subItems;
|
||||
for (IDrawerItem subItem : subItems) {
|
||||
subItem.withParent(this);
|
||||
}
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
/**
|
||||
* an array of subItems
|
||||
* **WARNING** Make sure the subItems provided already have identifiers
|
||||
*
|
||||
* @param subItems
|
||||
* @return
|
||||
*/
|
||||
public T withSubItems(IDrawerItem... subItems) {
|
||||
if (mSubItems == null) {
|
||||
mSubItems = new ArrayList<>();
|
||||
}
|
||||
for (IDrawerItem subItem : subItems) {
|
||||
subItem.withParent(this);
|
||||
}
|
||||
Collections.addAll(mSubItems, subItems);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the subItems for this item
|
||||
*/
|
||||
@Override
|
||||
public List<IDrawerItem> getSubItems() {
|
||||
return mSubItems;
|
||||
}
|
||||
|
||||
//if the this item is currently expanded
|
||||
private boolean mExpanded = false;
|
||||
|
||||
/**
|
||||
* @param expanded defines if this item is now expanded or not
|
||||
* @return this
|
||||
*/
|
||||
@Override
|
||||
public T withIsExpanded(boolean expanded) {
|
||||
mExpanded = expanded;
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return if this item is currently expaneded
|
||||
*/
|
||||
@Override
|
||||
public boolean isExpanded() {
|
||||
return mExpanded;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* overwrite this method and return true if the item should auto expand on click, false if you want to disable this
|
||||
*
|
||||
* @return true if this item should auto expand in the adapter
|
||||
*/
|
||||
@Override
|
||||
public boolean isAutoExpanding() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* generates a view by the defined LayoutRes
|
||||
*
|
||||
* @param ctx
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public View generateView(Context ctx) {
|
||||
VH viewHolder = getViewHolder(LayoutInflater.from(ctx).inflate(getLayoutRes(), null, false));
|
||||
bindView(viewHolder, Collections.emptyList());
|
||||
return viewHolder.itemView;
|
||||
}
|
||||
|
||||
/**
|
||||
* generates a view by the defined LayoutRes and pass the LayoutParams from the parent
|
||||
*
|
||||
* @param ctx
|
||||
* @param parent
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public View generateView(Context ctx, ViewGroup parent) {
|
||||
VH viewHolder = getViewHolder(LayoutInflater.from(ctx).inflate(getLayoutRes(), parent, false));
|
||||
bindView(viewHolder, Collections.emptyList());
|
||||
return viewHolder.itemView;
|
||||
}
|
||||
|
||||
@CallSuper
|
||||
@Override
|
||||
public void bindView(VH holder, List<Object> payloads) {
|
||||
holder.itemView.setTag(R.id.material_drawer_item, this);
|
||||
}
|
||||
|
||||
/**
|
||||
* called when the view is unbound
|
||||
*
|
||||
* @param holder
|
||||
*/
|
||||
@Override
|
||||
public void unbindView(VH holder) {
|
||||
holder.itemView.clearAnimation();
|
||||
}
|
||||
|
||||
/**
|
||||
* View got attached to the window
|
||||
*
|
||||
* @param holder
|
||||
*/
|
||||
@Override
|
||||
public void attachToWindow(VH holder) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* View got detached from the window
|
||||
*
|
||||
* @param holder
|
||||
*/
|
||||
@Override
|
||||
public void detachFromWindow(VH holder) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* is called when the ViewHolder is in a transient state. return true if you want to reuse
|
||||
* that view anyways
|
||||
*
|
||||
* @param holder the viewHolder for the view which failed to recycle
|
||||
* @return true if we want to recycle anyways (false - it get's destroyed)
|
||||
*/
|
||||
@Override
|
||||
public boolean failedToRecycle(VH holder) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the ViewHolder for our item, using the provided View.
|
||||
*
|
||||
* @param parent
|
||||
* @return the ViewHolder for this Item
|
||||
*/
|
||||
@Override
|
||||
public VH getViewHolder(ViewGroup parent) {
|
||||
return getViewHolder(LayoutInflater.from(parent.getContext()).inflate(getLayoutRes(), parent, false));
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the ViewHolder for our item, using the provided View.
|
||||
*
|
||||
* @param v
|
||||
* @return the ViewHolder for this Item
|
||||
*/
|
||||
public abstract VH getViewHolder(View v);
|
||||
|
||||
/**
|
||||
* If this item equals to the given identifier
|
||||
*
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(long id) {
|
||||
return id == mIdentifier;
|
||||
}
|
||||
|
||||
public boolean equals(int id) {
|
||||
return id == mIdentifier;
|
||||
}
|
||||
|
||||
/**
|
||||
* If this item equals to the given object
|
||||
*
|
||||
* @param o
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
AbstractDrawerItem<?, ?> that = (AbstractDrawerItem<?, ?>) o;
|
||||
return mIdentifier == that.mIdentifier;
|
||||
}
|
||||
|
||||
/**
|
||||
* the hashCode implementation
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Long.valueOf(mIdentifier).hashCode();
|
||||
}
|
||||
}
|
@ -0,0 +1,126 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import androidx.annotation.LayoutRes;
|
||||
import androidx.appcompat.widget.SwitchCompat;
|
||||
import android.view.View;
|
||||
import android.widget.CompoundButton;
|
||||
|
||||
import com.mikepenz.materialdrawer.Drawer;
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialdrawer.interfaces.OnCheckedChangeListener;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public abstract class AbstractSwitchableDrawerItem<Item extends AbstractSwitchableDrawerItem> extends BaseDescribeableDrawerItem<Item, AbstractSwitchableDrawerItem.ViewHolder> {
|
||||
|
||||
private boolean switchEnabled = true;
|
||||
|
||||
private boolean checked = false;
|
||||
private OnCheckedChangeListener onCheckedChangeListener = null;
|
||||
|
||||
public Item withChecked(boolean checked) {
|
||||
this.checked = checked;
|
||||
return (Item) this;
|
||||
}
|
||||
|
||||
public Item withSwitchEnabled(boolean switchEnabled) {
|
||||
this.switchEnabled = switchEnabled;
|
||||
return (Item) this;
|
||||
}
|
||||
|
||||
public Item withOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) {
|
||||
this.onCheckedChangeListener = onCheckedChangeListener;
|
||||
return (Item) this;
|
||||
}
|
||||
|
||||
public Item withCheckable(boolean checkable) {
|
||||
return withSelectable(checkable);
|
||||
}
|
||||
|
||||
public boolean isChecked() {
|
||||
return checked;
|
||||
}
|
||||
|
||||
public boolean isSwitchEnabled() {
|
||||
return switchEnabled;
|
||||
}
|
||||
|
||||
public OnCheckedChangeListener getOnCheckedChangeListener() {
|
||||
return onCheckedChangeListener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return R.id.material_drawer_item_primary_switch;
|
||||
}
|
||||
|
||||
@Override
|
||||
@LayoutRes
|
||||
public int getLayoutRes() {
|
||||
return R.layout.material_drawer_item_switch;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindView(final ViewHolder viewHolder, List payloads) {
|
||||
super.bindView(viewHolder, payloads);
|
||||
|
||||
//bind the basic view parts
|
||||
bindViewHelper(viewHolder);
|
||||
|
||||
//handle the switch
|
||||
viewHolder.switchView.setOnCheckedChangeListener(null);
|
||||
viewHolder.switchView.setChecked(checked);
|
||||
viewHolder.switchView.setOnCheckedChangeListener(checkedChangeListener);
|
||||
viewHolder.switchView.setEnabled(switchEnabled);
|
||||
|
||||
//add a onDrawerItemClickListener here to be able to check / uncheck if the drawerItem can't be selected
|
||||
withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
|
||||
@Override
|
||||
public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
|
||||
if (!isSelectable()) {
|
||||
checked = !checked;
|
||||
viewHolder.switchView.setChecked(checked);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
//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 BaseViewHolder {
|
||||
private SwitchCompat switchView;
|
||||
|
||||
private ViewHolder(View view) {
|
||||
super(view);
|
||||
this.switchView = (SwitchCompat) view.findViewById(R.id.material_drawer_switch);
|
||||
}
|
||||
}
|
||||
|
||||
private CompoundButton.OnCheckedChangeListener checkedChangeListener = new CompoundButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
if (isEnabled()) {
|
||||
checked = isChecked;
|
||||
if (getOnCheckedChangeListener() != null) {
|
||||
getOnCheckedChangeListener().onCheckedChanged(AbstractSwitchableDrawerItem.this, buttonView, isChecked);
|
||||
}
|
||||
} else {
|
||||
buttonView.setOnCheckedChangeListener(null);
|
||||
buttonView.setChecked(!isChecked);
|
||||
buttonView.setOnCheckedChangeListener(checkedChangeListener);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
@ -0,0 +1,133 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import androidx.annotation.LayoutRes;
|
||||
import android.view.View;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.ToggleButton;
|
||||
|
||||
import com.mikepenz.materialdrawer.Drawer;
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialdrawer.interfaces.OnCheckedChangeListener;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public class AbstractToggleableDrawerItem<Item extends AbstractToggleableDrawerItem> extends BaseDescribeableDrawerItem<Item, AbstractToggleableDrawerItem.ViewHolder> {
|
||||
private boolean toggleEnabled = true;
|
||||
|
||||
private boolean checked = false;
|
||||
private OnCheckedChangeListener onCheckedChangeListener = null;
|
||||
|
||||
public Item withChecked(boolean checked) {
|
||||
this.checked = checked;
|
||||
return (Item) this;
|
||||
}
|
||||
|
||||
public Item withToggleEnabled(boolean toggleEnabled) {
|
||||
this.toggleEnabled = toggleEnabled;
|
||||
return (Item) this;
|
||||
}
|
||||
|
||||
public Item withOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) {
|
||||
this.onCheckedChangeListener = onCheckedChangeListener;
|
||||
return (Item) this;
|
||||
}
|
||||
|
||||
public boolean isChecked() {
|
||||
return checked;
|
||||
}
|
||||
|
||||
public void setChecked(boolean checked) {
|
||||
this.checked = checked;
|
||||
}
|
||||
|
||||
public boolean isToggleEnabled() {
|
||||
return toggleEnabled;
|
||||
}
|
||||
|
||||
public void setToggleEnabled(boolean toggleEnabled) {
|
||||
this.toggleEnabled = toggleEnabled;
|
||||
}
|
||||
|
||||
public OnCheckedChangeListener getOnCheckedChangeListener() {
|
||||
return onCheckedChangeListener;
|
||||
}
|
||||
|
||||
public void setOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) {
|
||||
this.onCheckedChangeListener = onCheckedChangeListener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return R.id.material_drawer_item_primary_toggle;
|
||||
}
|
||||
|
||||
@Override
|
||||
@LayoutRes
|
||||
public int getLayoutRes() {
|
||||
return R.layout.material_drawer_item_toggle;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindView(final ViewHolder viewHolder, List payloads) {
|
||||
super.bindView(viewHolder, payloads);
|
||||
|
||||
//bind the basic view parts
|
||||
bindViewHelper(viewHolder);
|
||||
|
||||
//handle the toggle
|
||||
viewHolder.toggle.setOnCheckedChangeListener(null);
|
||||
viewHolder.toggle.setChecked(checked);
|
||||
viewHolder.toggle.setOnCheckedChangeListener(checkedChangeListener);
|
||||
viewHolder.toggle.setEnabled(toggleEnabled);
|
||||
|
||||
//add a onDrawerItemClickListener here to be able to check / uncheck if the drawerItem can't be selected
|
||||
withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
|
||||
@Override
|
||||
public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
|
||||
if (!isSelectable()) {
|
||||
checked = !checked;
|
||||
viewHolder.toggle.setChecked(checked);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
//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 BaseViewHolder {
|
||||
private ToggleButton toggle;
|
||||
|
||||
private ViewHolder(View view) {
|
||||
super(view);
|
||||
this.toggle = (ToggleButton) view.findViewById(R.id.material_drawer_toggle);
|
||||
}
|
||||
}
|
||||
|
||||
private CompoundButton.OnCheckedChangeListener checkedChangeListener = new CompoundButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
if (isEnabled()) {
|
||||
checked = isChecked;
|
||||
if (getOnCheckedChangeListener() != null) {
|
||||
getOnCheckedChangeListener().onCheckedChanged(AbstractToggleableDrawerItem.this, buttonView, isChecked);
|
||||
}
|
||||
} else {
|
||||
buttonView.setOnCheckedChangeListener(null);
|
||||
buttonView.setChecked(!isChecked);
|
||||
buttonView.setOnCheckedChangeListener(checkedChangeListener);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
@ -0,0 +1,114 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.graphics.drawable.Drawable;
|
||||
|
||||
import com.mikepenz.materialdrawer.holder.ColorHolder;
|
||||
import com.mikepenz.materialdrawer.holder.ImageHolder;
|
||||
import com.mikepenz.materialdrawer.holder.StringHolder;
|
||||
import com.mikepenz.materialdrawer.util.DrawerUIUtils;
|
||||
|
||||
import androidx.annotation.ColorInt;
|
||||
import androidx.annotation.ColorRes;
|
||||
import androidx.annotation.StringRes;
|
||||
|
||||
import static com.mikepenz.materialdrawer.util.DrawerUIUtils.themeDrawerItem;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public abstract class BaseDescribeableDrawerItem<T, VH extends BaseViewHolder> extends BaseDrawerItem<T, VH> {
|
||||
private StringHolder description;
|
||||
private ColorHolder descriptionTextColor;
|
||||
|
||||
@Override
|
||||
public boolean isExcludeFromMiniDrawer() {
|
||||
return this.excludeFromMiniDrawer;
|
||||
}
|
||||
|
||||
public T withDescription(String description) {
|
||||
this.description = new StringHolder(description);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withDescription(@StringRes int descriptionRes) {
|
||||
this.description = new StringHolder(descriptionRes);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withDescriptionTextColor(@ColorInt int color) {
|
||||
this.descriptionTextColor = ColorHolder.fromColor(color);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withDescriptionTextColorRes(@ColorRes int colorRes) {
|
||||
this.descriptionTextColor = ColorHolder.fromColorRes(colorRes);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public StringHolder getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public ColorHolder getDescriptionTextColor() {
|
||||
return descriptionTextColor;
|
||||
}
|
||||
|
||||
/**
|
||||
* a helper method to have the logic for all secondaryDrawerItems only once
|
||||
*
|
||||
* @param viewHolder
|
||||
*/
|
||||
protected void bindViewHelper(BaseViewHolder viewHolder) {
|
||||
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 selected if it is
|
||||
viewHolder.itemView.setSelected(isSelected());
|
||||
|
||||
//set the item enabled if it is
|
||||
viewHolder.itemView.setEnabled(isEnabled());
|
||||
|
||||
//get the correct color for the background
|
||||
int selectedColor = getSelectedColor(ctx);
|
||||
//get the correct color for the text
|
||||
int color = getColor(ctx);
|
||||
ColorStateList selectedTextColor = getTextColorStateList(color, getSelectedTextColor(ctx));
|
||||
//get the correct color for the icon
|
||||
int iconColor = getIconColor(ctx);
|
||||
int selectedIconColor = getSelectedIconColor(ctx);
|
||||
|
||||
//set the background for the item
|
||||
themeDrawerItem(ctx, viewHolder.view, selectedColor, isSelectedBackgroundAnimated());
|
||||
//set the text for the name
|
||||
StringHolder.applyTo(this.getName(), viewHolder.name);
|
||||
//set the text for the description or hide
|
||||
StringHolder.applyToOrHide(this.getDescription(), viewHolder.description);
|
||||
|
||||
//set the colors for textViews
|
||||
viewHolder.name.setTextColor(selectedTextColor);
|
||||
//set the description text color
|
||||
ColorHolder.applyToOr(getDescriptionTextColor(), viewHolder.description, selectedTextColor);
|
||||
|
||||
//define the typeface for our textViews
|
||||
if (getTypeface() != null) {
|
||||
viewHolder.name.setTypeface(getTypeface());
|
||||
viewHolder.description.setTypeface(getTypeface());
|
||||
}
|
||||
|
||||
//get the drawables for our icon and set it
|
||||
Drawable icon = ImageHolder.decideIcon(getIcon(), ctx, iconColor, isIconTinted(), 1);
|
||||
if (icon != null) {
|
||||
Drawable selectedIcon = ImageHolder.decideIcon(getSelectedIcon(), ctx, selectedIconColor, isIconTinted(), 1);
|
||||
ImageHolder.applyMultiIconTo(icon, iconColor, selectedIcon, selectedIconColor, isIconTinted(), viewHolder.icon);
|
||||
} else {
|
||||
ImageHolder.applyDecidedIconOrSetGone(getIcon(), viewHolder.icon, iconColor, isIconTinted(), 1);
|
||||
}
|
||||
|
||||
//for android API 17 --> Padding not applied via xml
|
||||
DrawerUIUtils.setDrawerVerticalPadding(viewHolder.view, level);
|
||||
}
|
||||
}
|
@ -0,0 +1,356 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.graphics.Typeface;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
import android.util.Pair;
|
||||
|
||||
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.Iconable;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.Nameable;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.Tagable;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.Typefaceable;
|
||||
import com.mikepenz.materialdrawer.util.DrawerUIUtils;
|
||||
|
||||
import androidx.annotation.ColorInt;
|
||||
import androidx.annotation.ColorRes;
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import static com.mikepenz.materialdrawer.util.DrawerUIUtils.getBooleanStyleable;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public abstract class BaseDrawerItem<T, VH extends RecyclerView.ViewHolder> extends AbstractDrawerItem<T, VH> implements Nameable<T>, Iconable<T>, Tagable<T>, Typefaceable<T> {
|
||||
protected ImageHolder icon;
|
||||
protected ImageHolder selectedIcon;
|
||||
protected StringHolder name;
|
||||
|
||||
protected boolean iconTinted = false;
|
||||
|
||||
protected ColorHolder selectedColor;
|
||||
protected ColorHolder textColor;
|
||||
protected ColorHolder selectedTextColor;
|
||||
protected ColorHolder disabledTextColor;
|
||||
|
||||
protected ColorHolder iconColor;
|
||||
protected ColorHolder selectedIconColor;
|
||||
protected ColorHolder disabledIconColor;
|
||||
|
||||
protected Typeface typeface = null;
|
||||
|
||||
protected Pair<Integer, ColorStateList> colorStateList;
|
||||
|
||||
protected int level = 1;
|
||||
|
||||
protected boolean excludeFromMiniDrawer = false;
|
||||
|
||||
public T withIcon(ImageHolder icon) {
|
||||
this.icon = icon;
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withIcon(Drawable icon) {
|
||||
this.icon = new ImageHolder(icon);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withIcon(@DrawableRes int iconRes) {
|
||||
this.icon = new ImageHolder(iconRes);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withSelectedIcon(Drawable selectedIcon) {
|
||||
this.selectedIcon = new ImageHolder(selectedIcon);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withSelectedIcon(@DrawableRes int selectedIconRes) {
|
||||
this.selectedIcon = new ImageHolder(selectedIconRes);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withIcon(IIcon iicon) {
|
||||
this.icon = new ImageHolder(iicon);
|
||||
//if we are on api 21 or higher we use the IconicsDrawable for selection too and color it with the correct color
|
||||
//else we use just the one drawable and enable tinting on press
|
||||
if (Build.VERSION.SDK_INT >= 21) {
|
||||
this.selectedIcon = new ImageHolder(iicon);
|
||||
} else {
|
||||
this.withIconTintingEnabled(true);
|
||||
}
|
||||
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withName(StringHolder name) {
|
||||
this.name = name;
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withName(String name) {
|
||||
this.name = new StringHolder(name);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withName(@StringRes int nameRes) {
|
||||
this.name = new StringHolder(nameRes);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withSelectedColor(@ColorInt int selectedColor) {
|
||||
this.selectedColor = ColorHolder.fromColor(selectedColor);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withSelectedColorRes(@ColorRes int selectedColorRes) {
|
||||
this.selectedColor = ColorHolder.fromColorRes(selectedColorRes);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withTextColor(@ColorInt int textColor) {
|
||||
this.textColor = ColorHolder.fromColor(textColor);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withTextColorRes(@ColorRes int textColorRes) {
|
||||
this.textColor = ColorHolder.fromColorRes(textColorRes);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withSelectedTextColor(@ColorInt int selectedTextColor) {
|
||||
this.selectedTextColor = ColorHolder.fromColor(selectedTextColor);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withSelectedTextColorRes(@ColorRes int selectedColorRes) {
|
||||
this.selectedTextColor = ColorHolder.fromColorRes(selectedColorRes);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withDisabledTextColor(@ColorInt int disabledTextColor) {
|
||||
this.disabledTextColor = ColorHolder.fromColor(disabledTextColor);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withDisabledTextColorRes(@ColorRes int disabledTextColorRes) {
|
||||
this.disabledTextColor = ColorHolder.fromColorRes(disabledTextColorRes);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withIconColor(@ColorInt int iconColor) {
|
||||
this.iconColor = ColorHolder.fromColor(iconColor);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withIconColorRes(@ColorRes int iconColorRes) {
|
||||
this.iconColor = ColorHolder.fromColorRes(iconColorRes);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withSelectedIconColor(@ColorInt int selectedIconColor) {
|
||||
this.selectedIconColor = ColorHolder.fromColor(selectedIconColor);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withSelectedIconColorRes(@ColorRes int selectedColorRes) {
|
||||
this.selectedIconColor = ColorHolder.fromColorRes(selectedColorRes);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withDisabledIconColor(@ColorInt int disabledIconColor) {
|
||||
this.disabledIconColor = ColorHolder.fromColor(disabledIconColor);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withDisabledIconColorRes(@ColorRes int disabledIconColorRes) {
|
||||
this.disabledIconColor = ColorHolder.fromColorRes(disabledIconColorRes);
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
/**
|
||||
* will tint the icon with the default (or set) colors
|
||||
* (default and selected state)
|
||||
*
|
||||
* @param iconTintingEnabled
|
||||
* @return
|
||||
*/
|
||||
public T withIconTintingEnabled(boolean iconTintingEnabled) {
|
||||
this.iconTinted = iconTintingEnabled;
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public T withIconTinted(boolean iconTinted) {
|
||||
this.iconTinted = iconTinted;
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
/**
|
||||
* for backwards compatibility - withIconTinted..
|
||||
*
|
||||
* @param iconTinted
|
||||
* @return
|
||||
*/
|
||||
@Deprecated
|
||||
public T withTintSelectedIcon(boolean iconTinted) {
|
||||
return withIconTintingEnabled(iconTinted);
|
||||
}
|
||||
|
||||
public T withTypeface(Typeface typeface) {
|
||||
this.typeface = typeface;
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withLevel(int level) {
|
||||
this.level = level;
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public T withExcludeFromMiniDrawer(boolean excludeFromMiniDrawer) {
|
||||
this.excludeFromMiniDrawer = excludeFromMiniDrawer;
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
|
||||
public ColorHolder getSelectedColor() {
|
||||
return selectedColor;
|
||||
}
|
||||
|
||||
public ColorHolder getTextColor() {
|
||||
return textColor;
|
||||
}
|
||||
|
||||
public ColorHolder getSelectedTextColor() {
|
||||
return selectedTextColor;
|
||||
}
|
||||
|
||||
public ColorHolder getDisabledTextColor() {
|
||||
return disabledTextColor;
|
||||
}
|
||||
|
||||
public boolean isIconTinted() {
|
||||
return iconTinted;
|
||||
}
|
||||
|
||||
public ImageHolder getIcon() {
|
||||
return icon;
|
||||
}
|
||||
|
||||
public ImageHolder getSelectedIcon() {
|
||||
return selectedIcon;
|
||||
}
|
||||
|
||||
public StringHolder getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public ColorHolder getDisabledIconColor() {
|
||||
return disabledIconColor;
|
||||
}
|
||||
|
||||
public ColorHolder getSelectedIconColor() {
|
||||
return selectedIconColor;
|
||||
}
|
||||
|
||||
public ColorHolder getIconColor() {
|
||||
return iconColor;
|
||||
}
|
||||
|
||||
public Typeface getTypeface() {
|
||||
return typeface;
|
||||
}
|
||||
|
||||
public int getLevel() {
|
||||
return level;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* helper method to decide for the correct color
|
||||
*
|
||||
* @param ctx
|
||||
* @return
|
||||
*/
|
||||
public int getIconColor(Context ctx) {
|
||||
int iconColor;
|
||||
if (this.isEnabled()) {
|
||||
iconColor = ColorHolder.color(getIconColor(), ctx, R.attr.material_drawer_primary_icon, R.color.material_drawer_primary_icon);
|
||||
} else {
|
||||
iconColor = ColorHolder.color(getDisabledIconColor(), ctx, R.attr.material_drawer_hint_icon, R.color.material_drawer_hint_icon);
|
||||
}
|
||||
return iconColor;
|
||||
}
|
||||
|
||||
/**
|
||||
* helper method to decide for the correct color
|
||||
*
|
||||
* @param ctx
|
||||
* @return
|
||||
*/
|
||||
protected int getSelectedIconColor(Context ctx) {
|
||||
return ColorHolder.color(getSelectedIconColor(), ctx, R.attr.material_drawer_selected_text, R.color.material_drawer_selected_text);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
public class BaseViewHolder extends RecyclerView.ViewHolder {
|
||||
protected View view;
|
||||
protected ImageView icon;
|
||||
protected TextView name;
|
||||
protected TextView description;
|
||||
|
||||
public BaseViewHolder(View view) {
|
||||
super(view);
|
||||
|
||||
this.view = view;
|
||||
this.icon = view.findViewById(R.id.material_drawer_icon);
|
||||
this.name = view.findViewById(R.id.material_drawer_name);
|
||||
this.description = view.findViewById(R.id.material_drawer_description);
|
||||
}
|
||||
}
|
@ -0,0 +1,149 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.annotation.LayoutRes;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialdrawer.holder.DimenHolder;
|
||||
import com.mikepenz.materialize.util.UIUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public class ContainerDrawerItem extends AbstractDrawerItem<ContainerDrawerItem, ContainerDrawerItem.ViewHolder> {
|
||||
|
||||
private DimenHolder mHeight;
|
||||
|
||||
public ContainerDrawerItem withHeight(DimenHolder height) {
|
||||
mHeight = height;
|
||||
return this;
|
||||
}
|
||||
|
||||
public DimenHolder getHeight() {
|
||||
return mHeight;
|
||||
}
|
||||
|
||||
private View mView;
|
||||
|
||||
public ContainerDrawerItem withView(View view) {
|
||||
this.mView = view;
|
||||
return this;
|
||||
}
|
||||
|
||||
public View getView() {
|
||||
return mView;
|
||||
}
|
||||
|
||||
public enum Position {
|
||||
TOP,
|
||||
BOTTOM,
|
||||
NONE;
|
||||
}
|
||||
|
||||
private Position mViewPosition = Position.TOP;
|
||||
|
||||
public ContainerDrawerItem withViewPosition(Position position) {
|
||||
this.mViewPosition = position;
|
||||
return this;
|
||||
}
|
||||
|
||||
private boolean mDivider = true;
|
||||
|
||||
public ContainerDrawerItem withDivider(boolean divider) {
|
||||
this.mDivider = divider;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Position getViewPosition() {
|
||||
return mViewPosition;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return R.id.material_drawer_item_container;
|
||||
}
|
||||
|
||||
@Override
|
||||
@LayoutRes
|
||||
public int getLayoutRes() {
|
||||
return R.layout.material_drawer_item_container;
|
||||
}
|
||||
|
||||
@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());
|
||||
|
||||
//define how the divider should look like
|
||||
viewHolder.view.setEnabled(false);
|
||||
|
||||
//make sure our view is not used in another parent
|
||||
if (mView.getParent() != null) {
|
||||
((ViewGroup) mView.getParent()).removeView(mView);
|
||||
}
|
||||
|
||||
//set the height
|
||||
int height = ViewGroup.LayoutParams.WRAP_CONTENT;
|
||||
if (mHeight != null) {
|
||||
RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) viewHolder.view.getLayoutParams();
|
||||
height = mHeight.asPixel(ctx);
|
||||
lp.height = height;
|
||||
viewHolder.view.setLayoutParams(lp);
|
||||
}
|
||||
|
||||
//make sure the header view is empty
|
||||
((ViewGroup) viewHolder.view).removeAllViews();
|
||||
|
||||
int dividerHeight = 0;
|
||||
if (mDivider) {
|
||||
dividerHeight = 1;
|
||||
}
|
||||
|
||||
View divider = new View(ctx);
|
||||
divider.setMinimumHeight(dividerHeight);
|
||||
divider.setBackgroundColor(UIUtils.getThemeColorFromAttrOrRes(ctx, R.attr.material_drawer_divider, R.color.material_drawer_divider));
|
||||
|
||||
LinearLayout.LayoutParams dividerParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int) UIUtils.convertDpToPixel(dividerHeight, ctx));
|
||||
LinearLayout.LayoutParams viewParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, mHeight != null ? height - (int) UIUtils.convertDpToPixel(dividerHeight, ctx) : height);
|
||||
|
||||
//depending on the position we add the view
|
||||
if (mViewPosition == Position.TOP) {
|
||||
((ViewGroup) viewHolder.view).addView(mView, viewParams);
|
||||
dividerParams.bottomMargin = ctx.getResources().getDimensionPixelSize(R.dimen.material_drawer_padding);
|
||||
((ViewGroup) viewHolder.view).addView(divider, dividerParams);
|
||||
} else if (mViewPosition == Position.BOTTOM) {
|
||||
dividerParams.topMargin = ctx.getResources().getDimensionPixelSize(R.dimen.material_drawer_padding);
|
||||
((ViewGroup) viewHolder.view).addView(divider, dividerParams);
|
||||
((ViewGroup) viewHolder.view).addView(mView, viewParams);
|
||||
} else {
|
||||
((ViewGroup) viewHolder.view).addView(mView, viewParams);
|
||||
}
|
||||
|
||||
//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 ViewHolder(View view) {
|
||||
super(view);
|
||||
this.view = view;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,67 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.annotation.LayoutRes;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialize.util.UIUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public class DividerDrawerItem extends AbstractDrawerItem<DividerDrawerItem, DividerDrawerItem.ViewHolder> {
|
||||
@Override
|
||||
public int getType() {
|
||||
return R.id.material_drawer_item_divider;
|
||||
}
|
||||
|
||||
@Override
|
||||
@LayoutRes
|
||||
public int getLayoutRes() {
|
||||
return R.layout.material_drawer_item_divider;
|
||||
}
|
||||
|
||||
@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());
|
||||
|
||||
//define how the divider should look like
|
||||
viewHolder.view.setClickable(false);
|
||||
viewHolder.view.setEnabled(false);
|
||||
viewHolder.view.setMinimumHeight(1);
|
||||
ViewCompat.setImportantForAccessibility(viewHolder.view,
|
||||
ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
|
||||
|
||||
//set the color for the divider
|
||||
viewHolder.divider.setBackgroundColor(UIUtils.getThemeColorFromAttrOrRes(ctx, R.attr.material_drawer_divider, R.color.material_drawer_divider));
|
||||
|
||||
//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 View divider;
|
||||
|
||||
private ViewHolder(View view) {
|
||||
super(view);
|
||||
this.view = view;
|
||||
this.divider = view.findViewById(R.id.material_drawer_divider);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,174 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Color;
|
||||
import androidx.annotation.LayoutRes;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.mikepenz.iconics.IconicsDrawable;
|
||||
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
|
||||
if (viewHolder.arrow.getDrawable() instanceof IconicsDrawable) {
|
||||
((IconicsDrawable) viewHolder.arrow.getDrawable()).color(this.arrowColor != null ? this.arrowColor.color(ctx) : getIconColor(ctx));
|
||||
}
|
||||
viewHolder.arrow.clearAnimation();
|
||||
if (!isExpanded()) {
|
||||
viewHolder.arrow.setRotation(this.arrowRotationAngleStart);
|
||||
} else {
|
||||
viewHolder.arrow.setRotation(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 ImageView arrow;
|
||||
public View badgeContainer;
|
||||
public TextView badge;
|
||||
|
||||
public ViewHolder(View view) {
|
||||
super(view);
|
||||
badgeContainer = view.findViewById(R.id.material_drawer_badge_container);
|
||||
badge = view.findViewById(R.id.material_drawer_badge);
|
||||
arrow = view.findViewById(R.id.material_drawer_arrow);
|
||||
arrow.setImageDrawable(new IconicsDrawable(view.getContext(), MaterialDrawerFont.Icon.mdf_expand_more).sizeDp(16).paddingDp(2).color(Color.BLACK));
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,134 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Color;
|
||||
import androidx.annotation.ColorInt;
|
||||
import androidx.annotation.ColorRes;
|
||||
import androidx.annotation.LayoutRes;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.mikepenz.iconics.IconicsDrawable;
|
||||
import com.mikepenz.materialdrawer.Drawer;
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialdrawer.holder.ColorHolder;
|
||||
import com.mikepenz.materialdrawer.icons.MaterialDrawerFont;
|
||||
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 ExpandableDrawerItem extends BaseDescribeableDrawerItem<ExpandableDrawerItem, ExpandableDrawerItem.ViewHolder> {
|
||||
|
||||
private Drawer.OnDrawerItemClickListener mOnDrawerItemClickListener;
|
||||
|
||||
protected ColorHolder arrowColor;
|
||||
|
||||
protected int arrowRotationAngleStart = 0;
|
||||
|
||||
protected int arrowRotationAngleEnd = 180;
|
||||
|
||||
public ExpandableDrawerItem withArrowColor(@ColorInt int arrowColor) {
|
||||
this.arrowColor = ColorHolder.fromColor(arrowColor);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ExpandableDrawerItem withArrowColorRes(@ColorRes int arrowColorRes) {
|
||||
this.arrowColor = ColorHolder.fromColorRes(arrowColorRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ExpandableDrawerItem withArrowRotationAngleStart(int angle) {
|
||||
this.arrowRotationAngleStart = angle;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ExpandableDrawerItem withArrowRotationAngleEnd(int angle) {
|
||||
this.arrowRotationAngleEnd = angle;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return R.id.material_drawer_item_expandable;
|
||||
}
|
||||
|
||||
@Override
|
||||
@LayoutRes
|
||||
public int getLayoutRes() {
|
||||
return R.layout.material_drawer_item_expandable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ExpandableDrawerItem 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(ExpandableDrawerItem.this.arrowRotationAngleEnd).start();
|
||||
} else {
|
||||
ViewCompat.animate(view.findViewById(R.id.material_drawer_arrow)).rotation(ExpandableDrawerItem.this.arrowRotationAngleStart).start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return mOnDrawerItemClickListener != null && mOnDrawerItemClickListener.onItemClick(view, position, drawerItem);
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public void bindView(ViewHolder viewHolder, List payloads) {
|
||||
super.bindView(viewHolder, payloads);
|
||||
|
||||
Context ctx = viewHolder.itemView.getContext();
|
||||
//bind the basic view parts
|
||||
bindViewHelper(viewHolder);
|
||||
|
||||
//make sure all animations are stopped
|
||||
if (viewHolder.arrow.getDrawable() instanceof IconicsDrawable) {
|
||||
((IconicsDrawable) viewHolder.arrow.getDrawable()).color(this.arrowColor != null ? this.arrowColor.color(ctx) : getIconColor(ctx));
|
||||
}
|
||||
viewHolder.arrow.clearAnimation();
|
||||
if (!isExpanded()) {
|
||||
viewHolder.arrow.setRotation(this.arrowRotationAngleStart);
|
||||
} else {
|
||||
viewHolder.arrow.setRotation(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 ViewHolder getViewHolder(View v) {
|
||||
return new ViewHolder(v);
|
||||
}
|
||||
|
||||
public static class ViewHolder extends BaseViewHolder {
|
||||
public ImageView arrow;
|
||||
|
||||
public ViewHolder(View view) {
|
||||
super(view);
|
||||
arrow = view.findViewById(R.id.material_drawer_arrow);
|
||||
arrow.setImageDrawable(new IconicsDrawable(view.getContext(), MaterialDrawerFont.Icon.mdf_expand_more).sizeDp(16).paddingDp(2).color(Color.BLACK));
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,193 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialdrawer.holder.BadgeStyle;
|
||||
import com.mikepenz.materialdrawer.holder.DimenHolder;
|
||||
import com.mikepenz.materialdrawer.holder.ImageHolder;
|
||||
import com.mikepenz.materialdrawer.holder.StringHolder;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import androidx.annotation.DimenRes;
|
||||
import androidx.annotation.LayoutRes;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import static com.mikepenz.materialdrawer.util.DrawerUIUtils.themeDrawerItem;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public class MiniDrawerItem extends BaseDrawerItem<MiniDrawerItem, MiniDrawerItem.ViewHolder> {
|
||||
private StringHolder mBadge;
|
||||
private BadgeStyle mBadgeStyle = new BadgeStyle();
|
||||
|
||||
private boolean mEnableSelectedBackground = false;
|
||||
protected DimenHolder mCustomHeight;
|
||||
|
||||
public MiniDrawerItem() {
|
||||
|
||||
}
|
||||
|
||||
public MiniDrawerItem(PrimaryDrawerItem primaryDrawerItem) {
|
||||
this.mIdentifier = primaryDrawerItem.mIdentifier;
|
||||
this.mTag = primaryDrawerItem.mTag;
|
||||
|
||||
this.mBadge = primaryDrawerItem.mBadge;
|
||||
this.mBadgeStyle = primaryDrawerItem.mBadgeStyle;
|
||||
|
||||
this.mEnabled = primaryDrawerItem.mEnabled;
|
||||
this.mSelectable = primaryDrawerItem.mSelectable;
|
||||
this.mSelected = primaryDrawerItem.mSelected;
|
||||
|
||||
this.icon = primaryDrawerItem.icon;
|
||||
this.selectedIcon = primaryDrawerItem.selectedIcon;
|
||||
|
||||
this.iconTinted = primaryDrawerItem.iconTinted;
|
||||
this.selectedColor = primaryDrawerItem.selectedColor;
|
||||
|
||||
this.iconColor = primaryDrawerItem.iconColor;
|
||||
this.selectedIconColor = primaryDrawerItem.selectedIconColor;
|
||||
this.disabledIconColor = primaryDrawerItem.disabledIconColor;
|
||||
}
|
||||
|
||||
public MiniDrawerItem(SecondaryDrawerItem secondaryDrawerItem) {
|
||||
this.mIdentifier = secondaryDrawerItem.mIdentifier;
|
||||
this.mTag = secondaryDrawerItem.mTag;
|
||||
|
||||
this.mBadge = secondaryDrawerItem.mBadge;
|
||||
this.mBadgeStyle = secondaryDrawerItem.mBadgeStyle;
|
||||
|
||||
this.mEnabled = secondaryDrawerItem.mEnabled;
|
||||
this.mSelectable = secondaryDrawerItem.mSelectable;
|
||||
this.mSelected = secondaryDrawerItem.mSelected;
|
||||
|
||||
this.icon = secondaryDrawerItem.icon;
|
||||
this.selectedIcon = secondaryDrawerItem.selectedIcon;
|
||||
|
||||
this.iconTinted = secondaryDrawerItem.iconTinted;
|
||||
this.selectedColor = secondaryDrawerItem.selectedColor;
|
||||
|
||||
this.iconColor = secondaryDrawerItem.iconColor;
|
||||
this.selectedIconColor = secondaryDrawerItem.selectedIconColor;
|
||||
this.disabledIconColor = secondaryDrawerItem.disabledIconColor;
|
||||
}
|
||||
|
||||
|
||||
public MiniDrawerItem withCustomHeightRes(@DimenRes int customHeightRes) {
|
||||
this.mCustomHeight = DimenHolder.fromResource(customHeightRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MiniDrawerItem withCustomHeightDp(int customHeightDp) {
|
||||
this.mCustomHeight = DimenHolder.fromDp(customHeightDp);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MiniDrawerItem withCustomHeightPx(int customHeightPx) {
|
||||
this.mCustomHeight = DimenHolder.fromPixel(customHeightPx);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MiniDrawerItem withCustomHeight(DimenHolder customHeight) {
|
||||
this.mCustomHeight = customHeight;
|
||||
return this;
|
||||
}
|
||||
|
||||
public MiniDrawerItem withEnableSelectedBackground(boolean enableSelectedBackground) {
|
||||
this.mEnableSelectedBackground = enableSelectedBackground;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return R.id.material_drawer_item_mini;
|
||||
}
|
||||
|
||||
@Override
|
||||
@LayoutRes
|
||||
public int getLayoutRes() {
|
||||
return R.layout.material_drawer_item_mini;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindView(ViewHolder viewHolder, List payloads) {
|
||||
super.bindView(viewHolder, payloads);
|
||||
|
||||
Context ctx = viewHolder.itemView.getContext();
|
||||
|
||||
//set a different height for this item
|
||||
if (mCustomHeight != null) {
|
||||
RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) viewHolder.itemView.getLayoutParams();
|
||||
lp.height = mCustomHeight.asPixel(ctx);
|
||||
viewHolder.itemView.setLayoutParams(lp);
|
||||
}
|
||||
|
||||
//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());
|
||||
|
||||
//
|
||||
viewHolder.itemView.setTag(this);
|
||||
|
||||
//get the correct color for the icon
|
||||
int iconColor = getIconColor(ctx);
|
||||
int selectedIconColor = getSelectedIconColor(ctx);
|
||||
|
||||
if (mEnableSelectedBackground) {
|
||||
//get the correct color for the background
|
||||
int selectedColor = getSelectedColor(ctx);
|
||||
//set the background for the item
|
||||
themeDrawerItem(ctx, viewHolder.view, selectedColor, isSelectedBackgroundAnimated());
|
||||
}
|
||||
|
||||
//set the text for the badge or hide
|
||||
boolean badgeVisible = StringHolder.applyToOrHide(mBadge, viewHolder.badge);
|
||||
//style the badge if it is visible
|
||||
if (badgeVisible) {
|
||||
mBadgeStyle.style(viewHolder.badge);
|
||||
}
|
||||
|
||||
//get the drawables for our icon and set it
|
||||
Drawable icon = ImageHolder.decideIcon(getIcon(), ctx, iconColor, isIconTinted(), 1);
|
||||
Drawable selectedIcon = ImageHolder.decideIcon(getSelectedIcon(), ctx, selectedIconColor, isIconTinted(), 1);
|
||||
ImageHolder.applyMultiIconTo(icon, iconColor, selectedIcon, selectedIconColor, isIconTinted(), viewHolder.icon);
|
||||
|
||||
//for android API 17 --> Padding not applied via xml
|
||||
int verticalPadding = ctx.getResources().getDimensionPixelSize(R.dimen.material_drawer_padding);
|
||||
int topBottomPadding = ctx.getResources().getDimensionPixelSize(R.dimen.material_mini_drawer_item_padding);
|
||||
viewHolder.itemView.setPadding(verticalPadding, topBottomPadding, verticalPadding, topBottomPadding);
|
||||
|
||||
//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 icon;
|
||||
private TextView badge;
|
||||
|
||||
public ViewHolder(View view) {
|
||||
super(view);
|
||||
|
||||
this.view = view;
|
||||
this.icon = (ImageView) view.findViewById(R.id.material_drawer_icon);
|
||||
this.badge = (TextView) view.findViewById(R.id.material_drawer_badge);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,168 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import androidx.annotation.DimenRes;
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.LayoutRes;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.mikepenz.iconics.typeface.IIcon;
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialdrawer.holder.DimenHolder;
|
||||
import com.mikepenz.materialdrawer.holder.ImageHolder;
|
||||
import com.mikepenz.materialdrawer.holder.StringHolder;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.IProfile;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public class MiniProfileDrawerItem extends AbstractDrawerItem<MiniProfileDrawerItem, MiniProfileDrawerItem.ViewHolder> implements IProfile<MiniProfileDrawerItem> {
|
||||
protected ImageHolder icon;
|
||||
|
||||
protected DimenHolder customHeight;
|
||||
|
||||
public MiniProfileDrawerItem() {
|
||||
withSelectable(false);
|
||||
}
|
||||
|
||||
public MiniProfileDrawerItem(ProfileDrawerItem profile) {
|
||||
this.icon = profile.icon;
|
||||
this.mEnabled = profile.mEnabled;
|
||||
withSelectable(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MiniProfileDrawerItem withName(CharSequence name) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StringHolder getName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MiniProfileDrawerItem withEmail(String email) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StringHolder getEmail() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MiniProfileDrawerItem withIcon(Drawable icon) {
|
||||
this.icon = new ImageHolder(icon);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MiniProfileDrawerItem withIcon(@DrawableRes int iconRes) {
|
||||
this.icon = new ImageHolder(iconRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MiniProfileDrawerItem withIcon(Bitmap iconBitmap) {
|
||||
this.icon = new ImageHolder(iconBitmap);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MiniProfileDrawerItem withIcon(String url) {
|
||||
this.icon = new ImageHolder(url);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MiniProfileDrawerItem withIcon(Uri uri) {
|
||||
this.icon = new ImageHolder(uri);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MiniProfileDrawerItem withIcon(IIcon icon) {
|
||||
this.icon = new ImageHolder(icon);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MiniProfileDrawerItem withCustomHeightRes(@DimenRes int customHeightRes) {
|
||||
this.customHeight = DimenHolder.fromResource(customHeightRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MiniProfileDrawerItem withCustomHeightDp(int customHeightDp) {
|
||||
this.customHeight = DimenHolder.fromDp(customHeightDp);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MiniProfileDrawerItem withCustomHeightPx(int customHeightPx) {
|
||||
this.customHeight = DimenHolder.fromPixel(customHeightPx);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MiniProfileDrawerItem withCustomHeight(DimenHolder customHeight) {
|
||||
this.customHeight = customHeight;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImageHolder getIcon() {
|
||||
return icon;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return R.id.material_drawer_item_mini_profile;
|
||||
}
|
||||
|
||||
@Override
|
||||
@LayoutRes
|
||||
public int getLayoutRes() {
|
||||
return R.layout.material_drawer_item_mini_profile;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindView(ViewHolder viewHolder, List payloads) {
|
||||
super.bindView(viewHolder, payloads);
|
||||
|
||||
if (customHeight != null) {
|
||||
RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) viewHolder.itemView.getLayoutParams();
|
||||
lp.height = customHeight.asPixel(viewHolder.itemView.getContext());
|
||||
viewHolder.itemView.setLayoutParams(lp);
|
||||
}
|
||||
|
||||
//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 icon
|
||||
ImageHolder.applyToOrSetInvisible(getIcon(), viewHolder.icon);
|
||||
|
||||
//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 ImageView icon;
|
||||
|
||||
public ViewHolder(View view) {
|
||||
super(view);
|
||||
this.icon = (ImageView) view.findViewById(R.id.material_drawer_icon);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public class PrimaryDrawerItem extends AbstractBadgeableDrawerItem<PrimaryDrawerItem> {
|
||||
|
||||
}
|
@ -0,0 +1,365 @@
|
||||
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;
|
||||
}
|
||||
}
|
@ -0,0 +1,318 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Typeface;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
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.DrawerUIUtils;
|
||||
import com.mikepenz.materialize.util.UIUtils;
|
||||
|
||||
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.core.view.ViewCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import static com.mikepenz.materialdrawer.util.DrawerUIUtils.getBooleanStyleable;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public class ProfileSettingDrawerItem extends AbstractDrawerItem<ProfileSettingDrawerItem, ProfileSettingDrawerItem.ViewHolder> implements IProfile<ProfileSettingDrawerItem>, Tagable<ProfileSettingDrawerItem>, Typefaceable<ProfileSettingDrawerItem> {
|
||||
private ImageHolder icon;
|
||||
|
||||
private StringHolder name;
|
||||
private StringHolder description;
|
||||
|
||||
private boolean iconTinted = false;
|
||||
|
||||
private ColorHolder selectedColor;
|
||||
private ColorHolder textColor;
|
||||
private ColorHolder iconColor;
|
||||
private ColorHolder descriptionTextColor;
|
||||
|
||||
private Typeface typeface = null;
|
||||
|
||||
private boolean selectable = false;
|
||||
|
||||
@Override
|
||||
public ProfileSettingDrawerItem withIcon(Drawable icon) {
|
||||
this.icon = new ImageHolder(icon);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProfileSettingDrawerItem withIcon(@DrawableRes int iconRes) {
|
||||
this.icon = new ImageHolder(iconRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProfileSettingDrawerItem withIcon(Bitmap icon) {
|
||||
this.icon = new ImageHolder(icon);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProfileSettingDrawerItem withIcon(IIcon iicon) {
|
||||
this.icon = new ImageHolder(iicon);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProfileSettingDrawerItem withIcon(String url) {
|
||||
this.icon = new ImageHolder(url);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProfileSettingDrawerItem withIcon(Uri uri) {
|
||||
this.icon = new ImageHolder(uri);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ProfileSettingDrawerItem withName(CharSequence name) {
|
||||
this.name = new StringHolder(name);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ProfileSettingDrawerItem withName(@StringRes int nameRes) {
|
||||
this.name = new StringHolder(nameRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ProfileSettingDrawerItem withDescription(String description) {
|
||||
this.description = new StringHolder(description);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ProfileSettingDrawerItem withDescription(@StringRes int descriptionRes) {
|
||||
this.description = new StringHolder(descriptionRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
//NOTE we reuse the IProfile here to allow custom items within the AccountSwitcher. There is an alias method withDescription for this
|
||||
public ProfileSettingDrawerItem withEmail(String email) {
|
||||
this.description = new StringHolder(email);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ProfileSettingDrawerItem withSelectedColor(@ColorInt int selectedColor) {
|
||||
this.selectedColor = ColorHolder.fromColor(selectedColor);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ProfileSettingDrawerItem withSelectedColorRes(@ColorRes int selectedColorRes) {
|
||||
this.selectedColor = ColorHolder.fromColorRes(selectedColorRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ProfileSettingDrawerItem withTextColor(@ColorInt int textColor) {
|
||||
this.textColor = ColorHolder.fromColor(textColor);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ProfileSettingDrawerItem withTextColorRes(@ColorRes int textColorRes) {
|
||||
this.textColor = ColorHolder.fromColorRes(textColorRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ProfileSettingDrawerItem withDescriptionTextColor(@ColorInt int descriptionColor) {
|
||||
this.descriptionTextColor = ColorHolder.fromColor(descriptionColor);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ProfileSettingDrawerItem withDescriptionTextColorRes(@ColorRes int descriptionColorRes) {
|
||||
this.descriptionTextColor = ColorHolder.fromColorRes(descriptionColorRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ProfileSettingDrawerItem withIconColor(@ColorInt int iconColor) {
|
||||
this.iconColor = ColorHolder.fromColor(iconColor);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ProfileSettingDrawerItem withIconColorRes(@ColorRes int iconColorRes) {
|
||||
this.iconColor = ColorHolder.fromColorRes(iconColorRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ProfileSettingDrawerItem withTypeface(Typeface typeface) {
|
||||
this.typeface = typeface;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ProfileSettingDrawerItem withIconTinted(boolean iconTinted) {
|
||||
this.iconTinted = iconTinted;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ColorHolder getSelectedColor() {
|
||||
return selectedColor;
|
||||
}
|
||||
|
||||
public ColorHolder getTextColor() {
|
||||
return textColor;
|
||||
}
|
||||
|
||||
public ColorHolder getDescriptionTextColor() {
|
||||
return descriptionTextColor;
|
||||
}
|
||||
|
||||
public ColorHolder getIconColor() {
|
||||
return iconColor;
|
||||
}
|
||||
|
||||
|
||||
public ImageHolder getIcon() {
|
||||
return icon;
|
||||
}
|
||||
|
||||
public boolean isIconTinted() {
|
||||
return iconTinted;
|
||||
}
|
||||
|
||||
public void setIconTinted(boolean iconTinted) {
|
||||
this.iconTinted = iconTinted;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Typeface getTypeface() {
|
||||
return typeface;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StringHolder getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public StringHolder getEmail() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public StringHolder getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = new StringHolder(description);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSelectable() {
|
||||
return selectable;
|
||||
}
|
||||
|
||||
public ProfileSettingDrawerItem withSelectable(boolean selectable) {
|
||||
this.selectable = selectable;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return R.id.material_drawer_item_profile_setting;
|
||||
}
|
||||
|
||||
@Override
|
||||
@LayoutRes
|
||||
public int getLayoutRes() {
|
||||
return R.layout.material_drawer_item_profile_setting;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindView(ViewHolder viewHolder, List payloads) {
|
||||
super.bindView(viewHolder, payloads);
|
||||
|
||||
//get the context
|
||||
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 = ColorHolder.color(getTextColor(), ctx, R.attr.material_drawer_primary_text, R.color.material_drawer_primary_text);
|
||||
int iconColor = ColorHolder.color(getIconColor(), ctx, R.attr.material_drawer_primary_icon, R.color.material_drawer_primary_icon);
|
||||
int descriptionColor = ColorHolder.color(getDescriptionTextColor(), ctx, R.attr.material_drawer_primary_text, R.color.material_drawer_primary_text);
|
||||
|
||||
ViewCompat.setBackground(viewHolder.view, UIUtils.getSelectableBackground(ctx, selectedColor, isSelectedBackgroundAnimated()));
|
||||
|
||||
StringHolder.applyTo(this.getName(), viewHolder.name);
|
||||
viewHolder.name.setTextColor(color);
|
||||
|
||||
StringHolder.applyToOrHide(this.getDescription(), viewHolder.description);
|
||||
viewHolder.description.setTextColor(descriptionColor);
|
||||
|
||||
if (getTypeface() != null) {
|
||||
viewHolder.name.setTypeface(getTypeface());
|
||||
viewHolder.description.setTypeface(getTypeface());
|
||||
}
|
||||
|
||||
//set the correct icon
|
||||
ImageHolder.applyDecidedIconOrSetGone(icon, viewHolder.icon, iconColor, isIconTinted(), 2);
|
||||
|
||||
//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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ViewHolder getViewHolder(View v) {
|
||||
return new ViewHolder(v);
|
||||
}
|
||||
|
||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||
private View view;
|
||||
private ImageView icon;
|
||||
private TextView name;
|
||||
private TextView description;
|
||||
|
||||
private ViewHolder(View view) {
|
||||
super(view);
|
||||
this.view = view;
|
||||
this.icon = (ImageView) view.findViewById(R.id.material_drawer_icon);
|
||||
this.name = (TextView) view.findViewById(R.id.material_drawer_name);
|
||||
this.description = (TextView) view.findViewById(R.id.material_drawer_description);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.annotation.LayoutRes;
|
||||
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialdrawer.holder.ColorHolder;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public class SecondaryDrawerItem extends AbstractBadgeableDrawerItem<SecondaryDrawerItem> {
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return R.id.material_drawer_item_secondary;
|
||||
}
|
||||
|
||||
@Override
|
||||
@LayoutRes
|
||||
public int getLayoutRes() {
|
||||
return R.layout.material_drawer_item_secondary;
|
||||
}
|
||||
|
||||
/**
|
||||
* helper method to decide for the correct color
|
||||
* OVERWRITE to get the correct secondary color
|
||||
*
|
||||
* @param ctx
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
protected int getColor(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;
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.annotation.LayoutRes;
|
||||
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialdrawer.holder.ColorHolder;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public class SecondarySwitchDrawerItem extends AbstractSwitchableDrawerItem<SecondarySwitchDrawerItem> {
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return R.id.material_drawer_item_secondary_switch;
|
||||
}
|
||||
|
||||
@Override
|
||||
@LayoutRes
|
||||
public int getLayoutRes() {
|
||||
return R.layout.material_drawer_item_secondary_switch;
|
||||
}
|
||||
|
||||
/**
|
||||
* helper method to decide for the correct color
|
||||
* OVERWRITE to get the correct secondary color
|
||||
*
|
||||
* @param ctx
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
protected int getColor(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;
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.annotation.LayoutRes;
|
||||
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialdrawer.holder.ColorHolder;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public class SecondaryToggleDrawerItem extends AbstractToggleableDrawerItem<SecondaryToggleDrawerItem> {
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return R.id.material_drawer_item_secondary_toggle;
|
||||
}
|
||||
|
||||
@Override
|
||||
@LayoutRes
|
||||
public int getLayoutRes() {
|
||||
return R.layout.material_drawer_item_secondary_toggle;
|
||||
}
|
||||
|
||||
/**
|
||||
* helper method to decide for the correct color
|
||||
* OVERWRITE to get the correct secondary color
|
||||
*
|
||||
* @param ctx
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
protected int getColor(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;
|
||||
}
|
||||
}
|
@ -0,0 +1,160 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Typeface;
|
||||
import androidx.annotation.LayoutRes;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialdrawer.holder.ColorHolder;
|
||||
import com.mikepenz.materialdrawer.holder.StringHolder;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.Nameable;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.Typefaceable;
|
||||
import com.mikepenz.materialize.util.UIUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public class SectionDrawerItem extends AbstractDrawerItem<SectionDrawerItem, SectionDrawerItem.ViewHolder> implements Nameable<SectionDrawerItem>, Typefaceable<SectionDrawerItem> {
|
||||
|
||||
private StringHolder name;
|
||||
private boolean divider = true;
|
||||
|
||||
private ColorHolder textColor;
|
||||
|
||||
private Typeface typeface = null;
|
||||
|
||||
public SectionDrawerItem withName(StringHolder name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SectionDrawerItem withName(String name) {
|
||||
this.name = new StringHolder(name);
|
||||
return this;
|
||||
}
|
||||
|
||||
public SectionDrawerItem withName(@StringRes int nameRes) {
|
||||
this.name = new StringHolder(nameRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
public SectionDrawerItem withDivider(boolean divider) {
|
||||
this.divider = divider;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SectionDrawerItem withTextColor(int textColor) {
|
||||
this.textColor = ColorHolder.fromColor(textColor);
|
||||
return this;
|
||||
}
|
||||
|
||||
public SectionDrawerItem withTextColorRes(int textColorRes) {
|
||||
this.textColor = ColorHolder.fromColorRes(textColorRes);
|
||||
return this;
|
||||
}
|
||||
|
||||
public SectionDrawerItem withTypeface(Typeface typeface) {
|
||||
this.typeface = typeface;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean hasDivider() {
|
||||
return divider;
|
||||
}
|
||||
|
||||
public ColorHolder getTextColor() {
|
||||
return textColor;
|
||||
}
|
||||
|
||||
public StringHolder getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSelected() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getType() {
|
||||
return R.id.material_drawer_item_section;
|
||||
}
|
||||
|
||||
@Override
|
||||
@LayoutRes
|
||||
public int getLayoutRes() {
|
||||
return R.layout.material_drawer_item_section;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Typeface getTypeface() {
|
||||
return typeface;
|
||||
}
|
||||
|
||||
@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());
|
||||
|
||||
//define this item to be not clickable nor enabled
|
||||
viewHolder.view.setClickable(false);
|
||||
viewHolder.view.setEnabled(false);
|
||||
|
||||
//define the text color
|
||||
viewHolder.name.setTextColor(ColorHolder.color(getTextColor(), ctx, R.attr.material_drawer_secondary_text, R.color.material_drawer_secondary_text));
|
||||
|
||||
//set the text for the name
|
||||
StringHolder.applyTo(this.getName(), viewHolder.name);
|
||||
|
||||
//define the typeface for our textViews
|
||||
if (getTypeface() != null) {
|
||||
viewHolder.name.setTypeface(getTypeface());
|
||||
}
|
||||
|
||||
//hide the divider if we do not need one
|
||||
if (this.hasDivider()) {
|
||||
viewHolder.divider.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
viewHolder.divider.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
//set the color for the divider
|
||||
viewHolder.divider.setBackgroundColor(UIUtils.getThemeColorFromAttrOrRes(ctx, R.attr.material_drawer_divider, R.color.material_drawer_divider));
|
||||
|
||||
//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 View divider;
|
||||
private TextView name;
|
||||
|
||||
private ViewHolder(View view) {
|
||||
super(view);
|
||||
this.view = view;
|
||||
this.divider = view.findViewById(R.id.material_drawer_divider);
|
||||
this.name = (TextView) view.findViewById(R.id.material_drawer_name);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public class SwitchDrawerItem extends AbstractSwitchableDrawerItem<SwitchDrawerItem> {
|
||||
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package com.mikepenz.materialdrawer.model;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public class ToggleDrawerItem extends AbstractToggleableDrawerItem<ToggleDrawerItem> {
|
||||
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package com.mikepenz.materialdrawer.model.interfaces;
|
||||
|
||||
import com.mikepenz.materialdrawer.holder.StringHolder;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public interface Badgeable<T> {
|
||||
T withBadge(String badge);
|
||||
|
||||
T withBadge(int badgeRes);
|
||||
|
||||
T withBadge(StringHolder badgeRes);
|
||||
|
||||
StringHolder getBadge();
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package com.mikepenz.materialdrawer.model.interfaces;
|
||||
|
||||
import com.mikepenz.materialdrawer.holder.BadgeStyle;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public interface ColorfulBadgeable<T> extends Badgeable<T> {
|
||||
T withBadgeStyle(BadgeStyle badgeStyle);
|
||||
|
||||
BadgeStyle getBadgeStyle();
|
||||
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
package com.mikepenz.materialdrawer.model.interfaces;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.mikepenz.fastadapter.IExpandable;
|
||||
import com.mikepenz.fastadapter.IItem;
|
||||
import com.mikepenz.fastadapter.ISubItem;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public interface IDrawerItem<T, VH extends RecyclerView.ViewHolder> extends IItem<T, VH>, IExpandable<T, IDrawerItem>, ISubItem<IDrawerItem, IDrawerItem> {
|
||||
|
||||
Object getTag();
|
||||
|
||||
boolean isEnabled();
|
||||
|
||||
boolean isSelected();
|
||||
|
||||
T withSetSelected(boolean selected);
|
||||
|
||||
boolean isSelectable();
|
||||
|
||||
boolean isExcludeFromMiniDrawer();
|
||||
|
||||
T withSelectable(boolean selectable);
|
||||
|
||||
int getType();
|
||||
|
||||
int getLayoutRes();
|
||||
|
||||
View generateView(Context ctx);
|
||||
|
||||
View generateView(Context ctx, ViewGroup parent);
|
||||
|
||||
VH getViewHolder(ViewGroup parent);
|
||||
|
||||
void unbindView(VH holder);
|
||||
|
||||
void bindView(VH holder, List<Object> payloads);
|
||||
|
||||
boolean equals(long id);
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package com.mikepenz.materialdrawer.model.interfaces;
|
||||
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import androidx.annotation.DrawableRes;
|
||||
|
||||
import com.mikepenz.fastadapter.IIdentifyable;
|
||||
import com.mikepenz.iconics.typeface.IIcon;
|
||||
import com.mikepenz.materialdrawer.holder.ImageHolder;
|
||||
import com.mikepenz.materialdrawer.holder.StringHolder;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public interface IProfile<T> extends IIdentifyable<T> {
|
||||
T withName(CharSequence name);
|
||||
|
||||
StringHolder getName();
|
||||
|
||||
T withEmail(String email);
|
||||
|
||||
StringHolder getEmail();
|
||||
|
||||
T withIcon(Drawable icon);
|
||||
|
||||
T withIcon(Bitmap bitmap);
|
||||
|
||||
T withIcon(@DrawableRes int iconRes);
|
||||
|
||||
T withIcon(String url);
|
||||
|
||||
T withIcon(Uri uri);
|
||||
|
||||
T withIcon(IIcon icon);
|
||||
|
||||
ImageHolder getIcon();
|
||||
|
||||
T withSelectable(boolean selectable);
|
||||
|
||||
boolean isSelectable();
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package com.mikepenz.materialdrawer.model.interfaces;
|
||||
|
||||
import android.graphics.drawable.Drawable;
|
||||
|
||||
import com.mikepenz.iconics.typeface.IIcon;
|
||||
import com.mikepenz.materialdrawer.holder.ImageHolder;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public interface Iconable<T> {
|
||||
T withIcon(Drawable icon);
|
||||
|
||||
T withIcon(IIcon iicon);
|
||||
|
||||
T withIcon(ImageHolder icon);
|
||||
|
||||
ImageHolder getIcon();
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package com.mikepenz.materialdrawer.model.interfaces;
|
||||
|
||||
import com.mikepenz.materialdrawer.holder.StringHolder;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public interface Nameable<T> {
|
||||
T withName(String name);
|
||||
|
||||
T withName(int nameRes);
|
||||
|
||||
T withName(StringHolder name);
|
||||
|
||||
StringHolder getName();
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package com.mikepenz.materialdrawer.model.interfaces;
|
||||
|
||||
import android.view.View;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 21.08.15.
|
||||
*/
|
||||
public interface OnPostBindViewListener {
|
||||
/**
|
||||
* allows you to hook in the BindView method and modify the view after binding
|
||||
*
|
||||
* @param drawerItem the drawerItem used for this view
|
||||
* @param view the view which will be set
|
||||
*/
|
||||
void onBindView(IDrawerItem drawerItem, View view);
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package com.mikepenz.materialdrawer.model.interfaces;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public interface Selectable<T> {
|
||||
T withSelectable(boolean selectable);
|
||||
|
||||
boolean isSelectable();
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package com.mikepenz.materialdrawer.model.interfaces;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public interface Tagable<T> {
|
||||
T withTag(Object tag);
|
||||
|
||||
Object getTag();
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package com.mikepenz.materialdrawer.model.interfaces;
|
||||
|
||||
import android.graphics.Typeface;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 03.02.15.
|
||||
*/
|
||||
public interface Typefaceable<T> {
|
||||
T withTypeface(Typeface typeface);
|
||||
|
||||
Typeface getTypeface();
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
package com.mikepenz.materialdrawer.model.utils;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.drawable.GradientDrawable;
|
||||
import android.graphics.drawable.StateListDrawable;
|
||||
import androidx.appcompat.content.res.AppCompatResources;
|
||||
import android.util.StateSet;
|
||||
|
||||
import com.mikepenz.materialdrawer.holder.BadgeStyle;
|
||||
import com.mikepenz.materialdrawer.holder.ColorHolder;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 02.07.15.
|
||||
*/
|
||||
public class BadgeDrawableBuilder {
|
||||
private BadgeStyle mStyle;
|
||||
|
||||
public BadgeDrawableBuilder(BadgeStyle style) {
|
||||
this.mStyle = style;
|
||||
}
|
||||
|
||||
public StateListDrawable build(Context ctx) {
|
||||
StateListDrawable stateListDrawable = new StateListDrawable();
|
||||
GradientDrawable normal = (GradientDrawable) AppCompatResources.getDrawable(ctx, mStyle.getGradientDrawable());
|
||||
GradientDrawable selected = (GradientDrawable) normal.getConstantState().newDrawable().mutate();
|
||||
|
||||
ColorHolder.applyToOrTransparent(mStyle.getColor(), ctx, normal);
|
||||
if (mStyle.getColorPressed() == null) {
|
||||
ColorHolder.applyToOrTransparent(mStyle.getColor(), ctx, selected);
|
||||
} else {
|
||||
ColorHolder.applyToOrTransparent(mStyle.getColorPressed(), ctx, selected);
|
||||
}
|
||||
|
||||
if (mStyle.getCorners() != null) {
|
||||
normal.setCornerRadius(mStyle.getCorners().asPixel(ctx));
|
||||
selected.setCornerRadius(mStyle.getCorners().asPixel(ctx));
|
||||
}
|
||||
|
||||
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, selected);
|
||||
stateListDrawable.addState(StateSet.WILD_CARD, normal);
|
||||
|
||||
return stateListDrawable;
|
||||
}
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
package com.mikepenz.materialdrawer.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.util.Log;
|
||||
import android.widget.ImageView;
|
||||
|
||||
public abstract class AbstractDrawerImageLoader implements DrawerImageLoader.IDrawerImageLoader {
|
||||
@Override
|
||||
public void set(ImageView imageView, Uri uri, Drawable placeholder) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(ImageView imageView, Uri uri, Drawable placeholder, String tag) {
|
||||
//for backwards compatibility call the method without tag too
|
||||
set(imageView, uri, placeholder);
|
||||
//this won't do anything
|
||||
Log.i("MaterialDrawer", "You have not specified a ImageLoader implementation through the DrawerImageLoader.init() method, or you are still overriding the deprecated method set(ImageView iv, Uri u, Drawable d) instead of set(ImageView iv, Uri u, Drawable d, String tag)");
|
||||
}
|
||||
@Override
|
||||
public void cancel(ImageView imageView) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Drawable placeholder(Context ctx) {
|
||||
return DrawerUIUtils.getPlaceHolder(ctx);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Drawable placeholder(Context ctx, String tag) {
|
||||
return placeholder(ctx);
|
||||
}
|
||||
}
|
@ -0,0 +1,94 @@
|
||||
package com.mikepenz.materialdrawer.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.widget.ImageView;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 24.03.15.
|
||||
*/
|
||||
public class DrawerImageLoader {
|
||||
public enum Tags {
|
||||
PROFILE,
|
||||
PROFILE_DRAWER_ITEM,
|
||||
ACCOUNT_HEADER
|
||||
}
|
||||
|
||||
private static DrawerImageLoader SINGLETON = null;
|
||||
|
||||
private IDrawerImageLoader imageLoader;
|
||||
private boolean mHandleAllUris = false;
|
||||
|
||||
private DrawerImageLoader(IDrawerImageLoader loaderImpl) {
|
||||
imageLoader = loaderImpl;
|
||||
}
|
||||
|
||||
public static DrawerImageLoader init(IDrawerImageLoader loaderImpl) {
|
||||
SINGLETON = new DrawerImageLoader(loaderImpl);
|
||||
return SINGLETON;
|
||||
}
|
||||
|
||||
public static DrawerImageLoader getInstance() {
|
||||
if (SINGLETON == null) {
|
||||
SINGLETON = new DrawerImageLoader(new AbstractDrawerImageLoader() {
|
||||
});
|
||||
}
|
||||
return SINGLETON;
|
||||
}
|
||||
|
||||
public DrawerImageLoader withHandleAllUris(boolean handleAllUris) {
|
||||
this.mHandleAllUris = handleAllUris;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param imageView
|
||||
* @param uri
|
||||
* @param tag
|
||||
* @return false if not consumed
|
||||
*/
|
||||
public boolean setImage(ImageView imageView, Uri uri, String tag) {
|
||||
//if we do not handle all uris and are not http or https we keep the original behavior
|
||||
if (mHandleAllUris || "http".equals(uri.getScheme()) || "https".equals(uri.getScheme())) {
|
||||
if (imageLoader != null) {
|
||||
Drawable placeHolder = imageLoader.placeholder(imageView.getContext(), tag);
|
||||
imageLoader.set(imageView, uri, placeHolder, tag);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void cancelImage(ImageView imageView) {
|
||||
if (imageLoader != null) {
|
||||
imageLoader.cancel(imageView);
|
||||
}
|
||||
}
|
||||
|
||||
public IDrawerImageLoader getImageLoader() {
|
||||
return imageLoader;
|
||||
}
|
||||
|
||||
public void setImageLoader(IDrawerImageLoader imageLoader) {
|
||||
this.imageLoader = imageLoader;
|
||||
}
|
||||
|
||||
public interface IDrawerImageLoader {
|
||||
@Deprecated
|
||||
void set(ImageView imageView, Uri uri, Drawable placeholder);
|
||||
|
||||
void set(ImageView imageView, Uri uri, Drawable placeholder, String tag);
|
||||
|
||||
void cancel(ImageView imageView);
|
||||
|
||||
Drawable placeholder(Context ctx);
|
||||
|
||||
/**
|
||||
* @param ctx
|
||||
* @param tag current possible tags: "profile", "profileDrawerItem", "accountHeader"
|
||||
* @return
|
||||
*/
|
||||
Drawable placeholder(Context ctx, String tag);
|
||||
}
|
||||
}
|
@ -0,0 +1,95 @@
|
||||
package com.mikepenz.materialdrawer.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
|
||||
import com.mikepenz.materialize.util.UIUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 27.03.15.
|
||||
*/
|
||||
public class DrawerItemViewHelper {
|
||||
|
||||
private Context mContext;
|
||||
|
||||
public DrawerItemViewHelper(Context context) {
|
||||
this.mContext = context;
|
||||
}
|
||||
|
||||
private ArrayList<IDrawerItem> mDrawerItems = new ArrayList<>();
|
||||
|
||||
public DrawerItemViewHelper withDrawerItems(ArrayList<IDrawerItem> drawerItems) {
|
||||
this.mDrawerItems = drawerItems;
|
||||
return this;
|
||||
}
|
||||
|
||||
public DrawerItemViewHelper withDrawerItems(IDrawerItem... drawerItems) {
|
||||
Collections.addAll(this.mDrawerItems, drawerItems);
|
||||
return this;
|
||||
}
|
||||
|
||||
private boolean mDivider = true;
|
||||
|
||||
public DrawerItemViewHelper withDivider(boolean divider) {
|
||||
this.mDivider = divider;
|
||||
return this;
|
||||
}
|
||||
|
||||
private OnDrawerItemClickListener mOnDrawerItemClickListener = null;
|
||||
|
||||
public DrawerItemViewHelper withOnDrawerItemClickListener(OnDrawerItemClickListener onDrawerItemClickListener) {
|
||||
mOnDrawerItemClickListener = onDrawerItemClickListener;
|
||||
return this;
|
||||
}
|
||||
|
||||
public View build() {
|
||||
//create the container view
|
||||
LinearLayout linearLayout = new LinearLayout(mContext);
|
||||
linearLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||
linearLayout.setOrientation(LinearLayout.VERTICAL);
|
||||
|
||||
//create the divider
|
||||
if (mDivider) {
|
||||
LinearLayout divider = new LinearLayout(mContext);
|
||||
divider.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||
divider.setMinimumHeight((int) UIUtils.convertDpToPixel(1, mContext));
|
||||
divider.setOrientation(LinearLayout.VERTICAL);
|
||||
divider.setBackgroundColor(UIUtils.getThemeColorFromAttrOrRes(mContext, R.attr.material_drawer_divider, R.color.material_drawer_divider));
|
||||
linearLayout.addView(divider);
|
||||
}
|
||||
|
||||
//add all drawer items
|
||||
for (IDrawerItem drawerItem : mDrawerItems) {
|
||||
View view = drawerItem.generateView(mContext);
|
||||
view.setTag(drawerItem);
|
||||
|
||||
if (drawerItem.isEnabled()) {
|
||||
view.setBackgroundResource(UIUtils.getSelectableBackgroundRes(mContext));
|
||||
view.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (mOnDrawerItemClickListener != null) {
|
||||
mOnDrawerItemClickListener.onItemClick(v, (IDrawerItem) v.getTag(R.id.material_drawer_item));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
linearLayout.addView(view);
|
||||
}
|
||||
|
||||
return linearLayout;
|
||||
}
|
||||
|
||||
|
||||
public interface OnDrawerItemClickListener {
|
||||
public void onItemClick(View view, IDrawerItem drawerItem);
|
||||
}
|
||||
}
|
@ -0,0 +1,242 @@
|
||||
package com.mikepenz.materialdrawer.util;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.GradientDrawable;
|
||||
import android.graphics.drawable.InsetDrawable;
|
||||
import android.graphics.drawable.RippleDrawable;
|
||||
import android.graphics.drawable.StateListDrawable;
|
||||
import android.os.Build;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import androidx.annotation.StyleableRes;
|
||||
import androidx.core.view.ViewCompat;
|
||||
|
||||
import com.mikepenz.iconics.IconicsDrawable;
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialdrawer.icons.MaterialDrawerFont;
|
||||
import com.mikepenz.materialize.util.UIUtils;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 15.03.14.
|
||||
*/
|
||||
@SuppressLint("InlinedApi")
|
||||
public class DrawerUIUtils {
|
||||
|
||||
/**
|
||||
* Get the boolean value of a given styleable.
|
||||
*
|
||||
* @param ctx
|
||||
* @param styleable
|
||||
* @param def
|
||||
* @return
|
||||
*/
|
||||
public static boolean getBooleanStyleable(Context ctx, @StyleableRes int styleable, boolean def) {
|
||||
TypedArray ta = ctx.getTheme().obtainStyledAttributes(R.styleable.MaterialDrawer);
|
||||
return ta.getBoolean(styleable, def);
|
||||
}
|
||||
|
||||
/**
|
||||
* Util method to theme the drawer item view's background (and foreground if possible)
|
||||
*
|
||||
* @param ctx the context to use
|
||||
* @param view the view to theme
|
||||
* @param selected_color the selected color to use
|
||||
* @param animate true if we want to animate the StateListDrawable
|
||||
*/
|
||||
public static void themeDrawerItem(Context ctx, View view, int selected_color, boolean animate) {
|
||||
boolean legacyStyle = getBooleanStyleable(ctx, R.styleable.MaterialDrawer_material_drawer_legacy_style, false);
|
||||
|
||||
Drawable selected;
|
||||
Drawable unselected;
|
||||
|
||||
if (legacyStyle) {
|
||||
// Material 1.0 styling
|
||||
selected = new ColorDrawable(selected_color);
|
||||
unselected = UIUtils.getSelectableBackground(ctx);
|
||||
} else {
|
||||
// Material 2.0 styling
|
||||
int cornerRadius = ctx.getResources().getDimensionPixelSize(R.dimen.material_drawer_item_corner_radius);
|
||||
int paddingTopBottom = ctx.getResources().getDimensionPixelSize(R.dimen.material_drawer_item_background_padding_top_bottom);
|
||||
int paddingStartEnd = ctx.getResources().getDimensionPixelSize(R.dimen.material_drawer_item_background_padding_start_end);
|
||||
|
||||
// define normal selected background
|
||||
GradientDrawable gradientDrawable = new GradientDrawable();
|
||||
gradientDrawable.setColor(selected_color);
|
||||
gradientDrawable.setCornerRadius(cornerRadius);
|
||||
selected = new InsetDrawable(gradientDrawable, paddingStartEnd, paddingTopBottom, paddingStartEnd, paddingTopBottom);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
// define mask for ripple
|
||||
GradientDrawable gradientMask = new GradientDrawable();
|
||||
gradientMask.setColor(Color.BLACK);
|
||||
gradientMask.setCornerRadius(cornerRadius);
|
||||
Drawable mask = new InsetDrawable(gradientMask, paddingStartEnd, paddingTopBottom, paddingStartEnd, paddingTopBottom);
|
||||
|
||||
unselected = new RippleDrawable(new ColorStateList(new int[][]{new int[]{}}, new int[]{UIUtils.getThemeColor(ctx, R.attr.colorControlHighlight)}), null, mask);
|
||||
} else {
|
||||
// define touch drawable
|
||||
GradientDrawable touchDrawable = new GradientDrawable();
|
||||
touchDrawable.setColor(UIUtils.getThemeColor(ctx, R.attr.colorControlHighlight));
|
||||
touchDrawable.setCornerRadius(cornerRadius);
|
||||
Drawable touchInsetDrawable = new InsetDrawable(touchDrawable, paddingStartEnd, paddingTopBottom, paddingStartEnd, paddingTopBottom);
|
||||
|
||||
StateListDrawable unselectedStates = new StateListDrawable();
|
||||
//if possible and wanted we enable animating across states
|
||||
if (animate) {
|
||||
int duration = ctx.getResources().getInteger(android.R.integer.config_shortAnimTime);
|
||||
unselectedStates.setEnterFadeDuration(duration);
|
||||
unselectedStates.setExitFadeDuration(duration);
|
||||
}
|
||||
unselectedStates.addState(new int[]{android.R.attr.state_pressed}, touchInsetDrawable);
|
||||
unselectedStates.addState(new int[]{}, new ColorDrawable(Color.TRANSPARENT));
|
||||
unselected = unselectedStates;
|
||||
}
|
||||
}
|
||||
|
||||
StateListDrawable states = new StateListDrawable();
|
||||
|
||||
//if possible and wanted we enable animating across states
|
||||
if (animate) {
|
||||
int duration = ctx.getResources().getInteger(android.R.integer.config_shortAnimTime);
|
||||
states.setEnterFadeDuration(duration);
|
||||
states.setExitFadeDuration(duration);
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
states.addState(new int[]{android.R.attr.state_selected}, selected);
|
||||
states.addState(new int[]{}, new ColorDrawable(Color.TRANSPARENT));
|
||||
|
||||
ViewCompat.setBackground(view, states);
|
||||
view.setForeground(unselected);
|
||||
} else {
|
||||
states.addState(new int[]{android.R.attr.state_selected}, selected);
|
||||
states.addState(new int[]{}, unselected);
|
||||
|
||||
ViewCompat.setBackground(view, states);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* helper to create a colorStateList for the text
|
||||
*
|
||||
* @param text_color
|
||||
* @param selected_text_color
|
||||
* @return
|
||||
*/
|
||||
public static ColorStateList getTextColorStateList(int text_color, int selected_text_color) {
|
||||
return new ColorStateList(
|
||||
new int[][]{
|
||||
new int[]{android.R.attr.state_selected},
|
||||
new int[]{}
|
||||
},
|
||||
new int[]{
|
||||
selected_text_color,
|
||||
text_color
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* helper to create a stateListDrawable for the icon
|
||||
*
|
||||
* @param icon
|
||||
* @param selectedIcon
|
||||
* @return
|
||||
*/
|
||||
public static StateListDrawable getIconStateList(Drawable icon, Drawable selectedIcon) {
|
||||
StateListDrawable iconStateListDrawable = new StateListDrawable();
|
||||
iconStateListDrawable.addState(new int[]{android.R.attr.state_selected}, selectedIcon);
|
||||
iconStateListDrawable.addState(new int[]{}, icon);
|
||||
return iconStateListDrawable;
|
||||
}
|
||||
|
||||
/**
|
||||
* helper to create a StateListDrawable for the drawer item background
|
||||
*
|
||||
* @param selected_color
|
||||
* @return
|
||||
*/
|
||||
public static StateListDrawable getDrawerItemBackground(int selected_color) {
|
||||
ColorDrawable clrActive = new ColorDrawable(selected_color);
|
||||
StateListDrawable states = new StateListDrawable();
|
||||
states.addState(new int[]{android.R.attr.state_selected}, clrActive);
|
||||
return states;
|
||||
}
|
||||
|
||||
/**
|
||||
* helper to calculate the optimal drawer width
|
||||
*
|
||||
* @param context
|
||||
* @return
|
||||
*/
|
||||
public static int getOptimalDrawerWidth(Context context) {
|
||||
int possibleMinDrawerWidth = UIUtils.getScreenWidth(context) - UIUtils.getActionBarHeight(context);
|
||||
int maxDrawerWidth = context.getResources().getDimensionPixelSize(R.dimen.material_drawer_width);
|
||||
return Math.min(possibleMinDrawerWidth, maxDrawerWidth);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* helper method to get a person placeHolder drawable
|
||||
*
|
||||
* @param ctx
|
||||
* @return
|
||||
*/
|
||||
public static Drawable getPlaceHolder(Context ctx) {
|
||||
return new IconicsDrawable(ctx, MaterialDrawerFont.Icon.mdf_person).colorRes(R.color.accent).backgroundColorRes(R.color.primary).sizeDp(56).paddingDp(16);
|
||||
}
|
||||
|
||||
/**
|
||||
* helper to set the vertical padding to the DrawerItems
|
||||
* this is required because on API Level 17 the padding is ignored which is set via the XML
|
||||
*
|
||||
* @param v
|
||||
*/
|
||||
public static void setDrawerVerticalPadding(View v) {
|
||||
int verticalPadding = v.getContext().getResources().getDimensionPixelSize(R.dimen.material_drawer_vertical_padding);
|
||||
v.setPadding(verticalPadding, 0, verticalPadding, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* helper to set the vertical padding including the extra padding for deeper item hirachy level to the DrawerItems
|
||||
* this is required because on API Level 17 the padding is ignored which is set via the XML
|
||||
*
|
||||
* @param v
|
||||
* @param level
|
||||
*/
|
||||
public static void setDrawerVerticalPadding(View v, int level) {
|
||||
int verticalPadding = v.getContext().getResources().getDimensionPixelSize(R.dimen.material_drawer_vertical_padding);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
v.setPaddingRelative(verticalPadding * level, 0, verticalPadding, 0);
|
||||
} else {
|
||||
v.setPadding(verticalPadding * level, 0, verticalPadding, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* helper to check if the system bar is on the bottom of the screen
|
||||
*
|
||||
* @param ctx
|
||||
* @return
|
||||
*/
|
||||
public static boolean isSystemBarOnBottom(Context ctx) {
|
||||
WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
|
||||
DisplayMetrics metrics = new DisplayMetrics();
|
||||
wm.getDefaultDisplay().getMetrics(metrics);
|
||||
Configuration cfg = ctx.getResources().getConfiguration();
|
||||
boolean canMove = (metrics.widthPixels != metrics.heightPixels &&
|
||||
cfg.smallestScreenWidthDp < 600);
|
||||
|
||||
return (!canMove || metrics.widthPixels < metrics.heightPixels);
|
||||
}
|
||||
}
|
@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Copyright 2015 Mike Penz All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.mikepenz.materialdrawer.util;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Build;
|
||||
import android.view.View;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
|
||||
/**
|
||||
* Created by mikepenz on 14.03.15.
|
||||
* This class implements a hack to change the layout padding on bottom if the keyboard is shown
|
||||
* to allow long lists with editTextViews
|
||||
* Basic idea for this solution found here: http://stackoverflow.com/a/9108219/325479
|
||||
* @deprecated Do not use this anymore, the MaterialDrawer uses the `fitsSystemWindows` now correctly so it should not be required. (it would only be required for cases with the fullscreen flag)
|
||||
*/
|
||||
@Deprecated
|
||||
public class KeyboardUtil {
|
||||
private View decorView;
|
||||
private View contentView;
|
||||
|
||||
public KeyboardUtil(Activity act, View contentView) {
|
||||
this.decorView = act.getWindow().getDecorView();
|
||||
this.contentView = contentView;
|
||||
|
||||
//only required on newer android versions. it was working on API level 19
|
||||
if (Build.VERSION.SDK_INT >= 19) {
|
||||
decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);
|
||||
}
|
||||
}
|
||||
|
||||
public void enable() {
|
||||
if (Build.VERSION.SDK_INT >= 19) {
|
||||
decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);
|
||||
}
|
||||
}
|
||||
|
||||
public void disable() {
|
||||
if (Build.VERSION.SDK_INT >= 19) {
|
||||
decorView.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//a small helper to allow showing the editText focus
|
||||
ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
|
||||
@Override
|
||||
public void onGlobalLayout() {
|
||||
Rect r = new Rect();
|
||||
//r will be populated with the coordinates of your view that area still visible.
|
||||
decorView.getWindowVisibleDisplayFrame(r);
|
||||
|
||||
//get screen height and calculate the difference with the useable area from the r
|
||||
int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels;
|
||||
int diff = height - r.bottom;
|
||||
|
||||
//if it could be a keyboard add the padding to the view
|
||||
if (diff != 0) {
|
||||
// if the use-able screen height differs from the total screen height we assume that it shows a keyboard now
|
||||
//check if the padding is 0 (if yes set the padding for the keyboard)
|
||||
if (contentView.getPaddingBottom() != diff) {
|
||||
//set the padding of the contentView for the keyboard
|
||||
contentView.setPadding(0, 0, 0, diff);
|
||||
}
|
||||
} else {
|
||||
//check if the padding is != 0 (if yes reset the padding)
|
||||
if (contentView.getPaddingBottom() != 0) {
|
||||
//reset the padding of the contentView
|
||||
contentView.setPadding(0, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Helper to hide the keyboard
|
||||
*
|
||||
* @param act
|
||||
*/
|
||||
public static void hideKeyboard(Activity act) {
|
||||
if (act != null && act.getCurrentFocus() != null) {
|
||||
InputMethodManager inputMethodManager = (InputMethodManager) act.getSystemService(Activity.INPUT_METHOD_SERVICE);
|
||||
inputMethodManager.hideSoftInputFromWindow(act.getCurrentFocus().getWindowToken(), 0);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
package com.mikepenz.materialdrawer.util;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.StateListDrawable;
|
||||
|
||||
/**
|
||||
* http://stackoverflow.com/questions/7979440/android-cloning-a-drawable-in-order-to-make-a-statelistdrawable-with-filters
|
||||
* http://stackoverflow.com/users/2075875/malachiasz
|
||||
*/
|
||||
|
||||
@SuppressLint("InlinedApi")
|
||||
public class PressedEffectStateListDrawable extends StateListDrawable {
|
||||
|
||||
private int color;
|
||||
private int selectionColor;
|
||||
|
||||
public PressedEffectStateListDrawable(Drawable drawable, int color, int selectionColor) {
|
||||
super();
|
||||
|
||||
drawable = drawable.mutate();
|
||||
|
||||
addState(new int[]{android.R.attr.state_selected}, drawable);
|
||||
addState(new int[]{}, drawable);
|
||||
|
||||
this.color = color;
|
||||
this.selectionColor = selectionColor;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onStateChange(int[] states) {
|
||||
boolean isStatePressedInArray = false;
|
||||
for (int state : states) {
|
||||
if (state == android.R.attr.state_selected) {
|
||||
isStatePressedInArray = true;
|
||||
}
|
||||
}
|
||||
if (isStatePressedInArray) {
|
||||
super.setColorFilter(selectionColor, PorterDuff.Mode.SRC_IN);
|
||||
} else {
|
||||
super.setColorFilter(color, PorterDuff.Mode.SRC_IN);
|
||||
}
|
||||
return super.onStateChange(states);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isStateful() {
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,349 @@
|
||||
/*
|
||||
* Copyright 2014 Google Inc. All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* The original is from Google you can find here:
|
||||
* https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget/BezelImageView.java
|
||||
*
|
||||
* Modified and improved with additional functionality by Mike Penz
|
||||
*/
|
||||
|
||||
package com.mikepenz.materialdrawer.view;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.ColorFilter;
|
||||
import android.graphics.ColorMatrix;
|
||||
import android.graphics.ColorMatrixColorFilter;
|
||||
import android.graphics.Outline;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.PorterDuffColorFilter;
|
||||
import android.graphics.PorterDuffXfermode;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
|
||||
import androidx.appcompat.widget.AppCompatImageView;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewOutlineProvider;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.mikepenz.materialdrawer.R;
|
||||
import com.mikepenz.materialdrawer.util.DrawerImageLoader;
|
||||
|
||||
|
||||
/**
|
||||
* An {@link android.widget.ImageView} that draws its contents inside a mask and draws a border
|
||||
* drawable on top. This is useful for applying a beveled look to image contents, but is also
|
||||
* flexible enough for use with other desired aesthetics.
|
||||
*/
|
||||
public class BezelImageView extends AppCompatImageView {
|
||||
private Paint mBlackPaint;
|
||||
private Paint mMaskedPaint;
|
||||
|
||||
private Rect mBounds;
|
||||
private RectF mBoundsF;
|
||||
|
||||
private Drawable mMaskDrawable;
|
||||
private boolean mDrawCircularShadow = true;
|
||||
|
||||
private ColorMatrixColorFilter mDesaturateColorFilter;
|
||||
|
||||
private int mSelectorAlpha = 150;
|
||||
private int mSelectorColor;
|
||||
private ColorFilter mSelectorFilter;
|
||||
|
||||
private boolean mCacheValid = false;
|
||||
private Bitmap mCacheBitmap;
|
||||
private int mCachedWidth;
|
||||
private int mCachedHeight;
|
||||
|
||||
private boolean isPressed = false;
|
||||
private boolean isSelected;
|
||||
|
||||
public BezelImageView(Context context) {
|
||||
this(context, null);
|
||||
}
|
||||
|
||||
public BezelImageView(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public BezelImageView(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
|
||||
// Attribute initialization
|
||||
final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.BezelImageView, defStyle, R.style.BezelImageView);
|
||||
|
||||
mMaskDrawable = a.getDrawable(R.styleable.BezelImageView_biv_maskDrawable);
|
||||
if (mMaskDrawable != null) {
|
||||
mMaskDrawable.setCallback(this);
|
||||
}
|
||||
|
||||
mDrawCircularShadow = a.getBoolean(R.styleable.BezelImageView_biv_drawCircularShadow, true);
|
||||
|
||||
mSelectorColor = a.getColor(R.styleable.BezelImageView_biv_selectorOnPress, 0);
|
||||
|
||||
a.recycle();
|
||||
|
||||
// Other initialization
|
||||
mBlackPaint = new Paint();
|
||||
mBlackPaint.setColor(0xff000000);
|
||||
|
||||
mMaskedPaint = new Paint();
|
||||
mMaskedPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
|
||||
|
||||
// Always want a cache allocated.
|
||||
mCacheBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
|
||||
|
||||
// Create a desaturate color filter for pressed state.
|
||||
ColorMatrix cm = new ColorMatrix();
|
||||
cm.setSaturation(0);
|
||||
mDesaturateColorFilter = new ColorMatrixColorFilter(cm);
|
||||
|
||||
//create a selectorFilter if we already have a color
|
||||
if (mSelectorColor != 0) {
|
||||
this.mSelectorFilter = new PorterDuffColorFilter(Color.argb(mSelectorAlpha, Color.red(mSelectorColor), Color.green(mSelectorColor), Color.blue(mSelectorColor)), PorterDuff.Mode.SRC_ATOP);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSizeChanged(int w, int h, int old_w, int old_h) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
if (mDrawCircularShadow) {
|
||||
setOutlineProvider(new CustomOutline(w, h));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@TargetApi(21)
|
||||
private class CustomOutline extends ViewOutlineProvider {
|
||||
|
||||
int width;
|
||||
int height;
|
||||
|
||||
CustomOutline(int width, int height) {
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getOutline(View view, Outline outline) {
|
||||
outline.setOval(0, 0, width, height);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean setFrame(int l, int t, int r, int b) {
|
||||
final boolean changed = super.setFrame(l, t, r, b);
|
||||
mBounds = new Rect(0, 0, r - l, b - t);
|
||||
mBoundsF = new RectF(mBounds);
|
||||
|
||||
if (mMaskDrawable != null) {
|
||||
mMaskDrawable.setBounds(mBounds);
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
mCacheValid = false;
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas) {
|
||||
if (mBounds == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
int width = mBounds.width();
|
||||
int height = mBounds.height();
|
||||
|
||||
if (width == 0 || height == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mCacheValid || width != mCachedWidth || height != mCachedHeight || isSelected != isPressed) {
|
||||
// Need to redraw the cache
|
||||
if (width == mCachedWidth && height == mCachedHeight) {
|
||||
// Have a correct-sized bitmap cache already allocated. Just erase it.
|
||||
mCacheBitmap.eraseColor(0);
|
||||
} else {
|
||||
// Allocate a new bitmap with the correct dimensions.
|
||||
mCacheBitmap.recycle();
|
||||
//noinspection AndroidLintDrawAllocation
|
||||
mCacheBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
||||
mCachedWidth = width;
|
||||
mCachedHeight = height;
|
||||
}
|
||||
|
||||
Canvas cacheCanvas = new Canvas(mCacheBitmap);
|
||||
if (mMaskDrawable != null) {
|
||||
int sc = cacheCanvas.save();
|
||||
mMaskDrawable.draw(cacheCanvas);
|
||||
if (isSelected) {
|
||||
if (mSelectorFilter != null) {
|
||||
mMaskedPaint.setColorFilter(mSelectorFilter);
|
||||
} else {
|
||||
mMaskedPaint.setColorFilter(mDesaturateColorFilter);
|
||||
|
||||
}
|
||||
} else {
|
||||
mMaskedPaint.setColorFilter(null);
|
||||
}
|
||||
cacheCanvas.saveLayer(mBoundsF, mMaskedPaint, Canvas.ALL_SAVE_FLAG);
|
||||
super.onDraw(cacheCanvas);
|
||||
cacheCanvas.restoreToCount(sc);
|
||||
} else if (isSelected) {
|
||||
int sc = cacheCanvas.save();
|
||||
cacheCanvas.drawRect(0, 0, mCachedWidth, mCachedHeight, mBlackPaint);
|
||||
if (mSelectorFilter != null) {
|
||||
mMaskedPaint.setColorFilter(mSelectorFilter);
|
||||
} else {
|
||||
mMaskedPaint.setColorFilter(mDesaturateColorFilter);
|
||||
}
|
||||
cacheCanvas.saveLayer(mBoundsF, mMaskedPaint, Canvas.ALL_SAVE_FLAG);
|
||||
super.onDraw(cacheCanvas);
|
||||
cacheCanvas.restoreToCount(sc);
|
||||
} else {
|
||||
super.onDraw(cacheCanvas);
|
||||
}
|
||||
}
|
||||
|
||||
// Draw from cache
|
||||
canvas.drawBitmap(mCacheBitmap, mBounds.left, mBounds.top, null);
|
||||
|
||||
//remember the previous press state
|
||||
isPressed = isPressed();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean dispatchTouchEvent(MotionEvent event) {
|
||||
// Check for clickable state and do nothing if disabled
|
||||
if (!this.isClickable()) {
|
||||
this.isSelected = false;
|
||||
return super.onTouchEvent(event);
|
||||
}
|
||||
|
||||
// Set selected state based on Motion Event
|
||||
switch (event.getAction()) {
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
this.isSelected = true;
|
||||
break;
|
||||
case MotionEvent.ACTION_UP:
|
||||
case MotionEvent.ACTION_SCROLL:
|
||||
case MotionEvent.ACTION_OUTSIDE:
|
||||
case MotionEvent.ACTION_CANCEL:
|
||||
this.isSelected = false;
|
||||
break;
|
||||
}
|
||||
|
||||
// Redraw image and return super type
|
||||
this.invalidate();
|
||||
return super.dispatchTouchEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void drawableStateChanged() {
|
||||
super.drawableStateChanged();
|
||||
if (mMaskDrawable != null && mMaskDrawable.isStateful()) {
|
||||
mMaskDrawable.setState(getDrawableState());
|
||||
}
|
||||
if (isDuplicateParentStateEnabled()) {
|
||||
ViewCompat.postInvalidateOnAnimation(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invalidateDrawable(Drawable who) {
|
||||
if (who == mMaskDrawable) {
|
||||
invalidate();
|
||||
} else {
|
||||
super.invalidateDrawable(who);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean verifyDrawable(Drawable who) {
|
||||
return who == mMaskDrawable || super.verifyDrawable(who);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets the color of the selector to be draw over the
|
||||
* CircularImageView. Be sure to provide some opacity.
|
||||
*
|
||||
* @param selectorColor The color (including alpha) to set for the selector overlay.
|
||||
*/
|
||||
public void setSelectorColor(int selectorColor) {
|
||||
this.mSelectorColor = selectorColor;
|
||||
this.mSelectorFilter = new PorterDuffColorFilter(Color.argb(mSelectorAlpha, Color.red(mSelectorColor), Color.green(mSelectorColor), Color.blue(mSelectorColor)), PorterDuff.Mode.SRC_ATOP);
|
||||
this.invalidate();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void setImageDrawable(Drawable drawable) {
|
||||
super.setImageDrawable(drawable);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setImageResource(int resId) {
|
||||
super.setImageResource(resId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setImageBitmap(Bitmap bm) {
|
||||
super.setImageBitmap(bm);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setImageURI(Uri uri) {
|
||||
if ("http".equals(uri.getScheme()) || "https".equals(uri.getScheme())) {
|
||||
DrawerImageLoader.getInstance().setImage(this, uri, null);
|
||||
} else {
|
||||
super.setImageURI(uri);
|
||||
}
|
||||
}
|
||||
|
||||
private ColorMatrixColorFilter mTempDesaturateColorFilter;
|
||||
private ColorFilter mTempSelectorFilter;
|
||||
|
||||
public void disableTouchFeedback(boolean disable) {
|
||||
if (disable) {
|
||||
mTempDesaturateColorFilter = this.mDesaturateColorFilter;
|
||||
mTempSelectorFilter = this.mSelectorFilter;
|
||||
this.mSelectorFilter = null;
|
||||
this.mDesaturateColorFilter = null;
|
||||
} else {
|
||||
if (mTempDesaturateColorFilter != null) {
|
||||
this.mDesaturateColorFilter = mTempDesaturateColorFilter;
|
||||
}
|
||||
if (mTempSelectorFilter != null) {
|
||||
this.mSelectorFilter = mTempSelectorFilter;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<corners android:radius="5dp" />
|
||||
<solid android:color="@android:color/black" />
|
||||
</shape>
|
@ -0,0 +1,20 @@
|
||||
<!--
|
||||
Copyright 2014 Google Inc. All rights reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval">
|
||||
<solid android:color="#000" />
|
||||
</shape>
|
@ -0,0 +1,7 @@
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<gradient
|
||||
android:angle="90"
|
||||
android:endColor="#40000000"
|
||||
android:startColor="@android:color/transparent" />
|
||||
</shape>
|
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
Binary file not shown.
After Width: | Height: | Size: 171 B |
@ -0,0 +1,7 @@
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<gradient
|
||||
android:angle="270"
|
||||
android:endColor="#40000000"
|
||||
android:startColor="@android:color/transparent" />
|
||||
</shape>
|
5
MaterialDrawer/src/main/res/layout/material_drawer.xml
Normal file
5
MaterialDrawer/src/main/res/layout/material_drawer.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true" />
|
@ -0,0 +1,114 @@
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/material_drawer_account_header"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/material_drawer_account_header_height_compact"
|
||||
android:clickable="true"
|
||||
android:fitsSystemWindows="false"
|
||||
android:focusable="true"
|
||||
app:layout_dodgeInsetEdges="top">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/material_drawer_account_header_background"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/material_drawer_account_header_height_compact"
|
||||
android:scaleType="fitXY"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/material_drawer_statusbar_guideline"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintGuide_begin="0dp" />
|
||||
|
||||
<com.mikepenz.materialdrawer.view.BezelImageView
|
||||
android:id="@+id/material_drawer_account_header_small_first"
|
||||
android:layout_width="1dp"
|
||||
android:layout_height="1dp"
|
||||
android:visibility="gone"
|
||||
tools:ignore="MissingConstraints" />
|
||||
|
||||
<com.mikepenz.materialdrawer.view.BezelImageView
|
||||
android:id="@+id/material_drawer_account_header_small_second"
|
||||
android:layout_width="1dp"
|
||||
android:layout_height="1dp"
|
||||
android:visibility="gone"
|
||||
tools:ignore="MissingConstraints" />
|
||||
|
||||
<com.mikepenz.materialdrawer.view.BezelImageView
|
||||
android:id="@+id/material_drawer_account_header_small_third"
|
||||
android:layout_width="1dp"
|
||||
android:layout_height="1dp"
|
||||
android:visibility="gone"
|
||||
tools:ignore="MissingConstraints" />
|
||||
|
||||
<com.mikepenz.materialdrawer.view.BezelImageView
|
||||
android:id="@+id/material_drawer_account_header_current"
|
||||
android:layout_width="@dimen/material_drawer_account_header_compact"
|
||||
android:layout_height="@dimen/material_drawer_account_header_compact"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginStart="@dimen/material_drawer_vertical_padding"
|
||||
android:layout_marginLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:clickable="true"
|
||||
android:elevation="2dp"
|
||||
android:focusable="true"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/material_drawer_statusbar_guideline" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_account_header_name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:lines="1"
|
||||
android:maxLines="1"
|
||||
android:paddingStart="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingRight="@dimen/material_drawer_vertical_padding"
|
||||
android:textSize="@dimen/material_drawer_account_header_title"
|
||||
app:layout_constraintBottom_toTopOf="@id/material_drawer_account_header_email"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_account_header_text_switcher"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_account_header_current"
|
||||
app:layout_constraintTop_toBottomOf="@+id/material_drawer_statusbar_guideline"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
app:layout_goneMarginStart="0dp" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_account_header_email"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:fontFamily="sans-serif"
|
||||
android:lines="1"
|
||||
android:maxLines="1"
|
||||
android:paddingStart="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingRight="@dimen/material_drawer_vertical_padding"
|
||||
android:textSize="@dimen/material_drawer_account_header_subtext"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_account_header_text_switcher"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_account_header_current"
|
||||
app:layout_constraintTop_toBottomOf="@id/material_drawer_account_header_name"
|
||||
app:layout_goneMarginStart="0dp" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/material_drawer_account_header_text_switcher"
|
||||
android:layout_width="@dimen/material_drawer_account_header_dropdown"
|
||||
android:layout_height="@dimen/material_drawer_account_header_dropdown"
|
||||
android:layout_gravity="bottom"
|
||||
android:layout_marginEnd="@dimen/material_drawer_vertical_padding"
|
||||
android:layout_marginRight="@dimen/material_drawer_vertical_padding"
|
||||
android:layout_marginBottom="@dimen/material_drawer_padding"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clickable="true"
|
||||
android:focusable="true" />
|
128
MaterialDrawer/src/main/res/layout/material_drawer_header.xml
Normal file
128
MaterialDrawer/src/main/res/layout/material_drawer_header.xml
Normal file
@ -0,0 +1,128 @@
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/material_drawer_account_header"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/material_drawer_account_header_height"
|
||||
android:clickable="true">
|
||||
|
||||
<pl.droidsonroids.gif.GifImageView
|
||||
android:id="@+id/material_drawer_account_header_background"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/material_drawer_account_header_height"
|
||||
android:scaleType="centerCrop"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/material_drawer_statusbar_guideline"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintGuide_begin="0dp" />
|
||||
|
||||
<com.mikepenz.materialdrawer.view.BezelImageView
|
||||
android:id="@+id/material_drawer_account_header_current"
|
||||
android:layout_width="@dimen/material_drawer_account_header_selected"
|
||||
android:layout_height="@dimen/material_drawer_account_header_selected"
|
||||
android:layout_marginStart="@dimen/material_drawer_vertical_padding"
|
||||
android:layout_marginLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:layout_marginTop="@dimen/material_drawer_account_header_horizontal_top"
|
||||
android:clickable="true"
|
||||
android:elevation="2dp"
|
||||
android:focusable="true"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/material_drawer_statusbar_guideline" />
|
||||
|
||||
<com.mikepenz.materialdrawer.view.BezelImageView
|
||||
android:id="@+id/material_drawer_account_header_small_first"
|
||||
android:layout_width="@dimen/material_drawer_account_header_secondary"
|
||||
android:layout_height="@dimen/material_drawer_account_header_secondary"
|
||||
android:layout_marginTop="@dimen/material_drawer_account_header_horizontal_top"
|
||||
android:layout_marginEnd="@dimen/material_drawer_vertical_padding"
|
||||
android:layout_marginRight="@dimen/material_drawer_vertical_padding"
|
||||
android:clickable="true"
|
||||
android:elevation="2dp"
|
||||
android:focusable="true"
|
||||
android:visibility="visible"
|
||||
app:layout_constraintEnd_toStartOf="@id/material_drawer_account_header_small_second"
|
||||
app:layout_constraintTop_toBottomOf="@+id/material_drawer_statusbar_guideline" />
|
||||
|
||||
<com.mikepenz.materialdrawer.view.BezelImageView
|
||||
android:id="@+id/material_drawer_account_header_small_second"
|
||||
android:layout_width="@dimen/material_drawer_account_header_secondary"
|
||||
android:layout_height="@dimen/material_drawer_account_header_secondary"
|
||||
android:layout_marginTop="@dimen/material_drawer_account_header_horizontal_top"
|
||||
android:layout_marginEnd="@dimen/material_drawer_vertical_padding"
|
||||
android:layout_marginRight="@dimen/material_drawer_vertical_padding"
|
||||
android:clickable="true"
|
||||
android:elevation="2dp"
|
||||
android:focusable="true"
|
||||
android:visibility="visible"
|
||||
app:layout_constraintEnd_toStartOf="@id/material_drawer_account_header_small_third"
|
||||
app:layout_constraintTop_toBottomOf="@+id/material_drawer_statusbar_guideline" />
|
||||
|
||||
<com.mikepenz.materialdrawer.view.BezelImageView
|
||||
android:id="@+id/material_drawer_account_header_small_third"
|
||||
android:layout_width="@dimen/material_drawer_account_header_secondary"
|
||||
android:layout_height="@dimen/material_drawer_account_header_secondary"
|
||||
android:layout_marginTop="@dimen/material_drawer_account_header_horizontal_top"
|
||||
android:layout_marginEnd="@dimen/material_drawer_vertical_padding"
|
||||
android:layout_marginRight="@dimen/material_drawer_vertical_padding"
|
||||
android:clickable="true"
|
||||
android:elevation="2dp"
|
||||
android:focusable="true"
|
||||
android:visibility="visible"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/material_drawer_statusbar_guideline" />
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/material_drawer_text_guideline"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintGuide_end="@dimen/material_drawer_account_header_dropdown_guideline" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_account_header_name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/material_drawer_vertical_padding"
|
||||
android:layout_marginLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:lines="1"
|
||||
android:maxLines="1"
|
||||
android:textSize="@dimen/material_drawer_account_header_title"
|
||||
app:layout_constraintBottom_toTopOf="@id/material_drawer_account_header_email"
|
||||
app:layout_constraintEnd_toStartOf="@id/material_drawer_account_header_text_switcher"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/material_drawer_text_guideline"
|
||||
app:layout_constraintVertical_chainStyle="packed" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_account_header_email"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/material_drawer_vertical_padding"
|
||||
android:layout_marginLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:layout_marginBottom="@dimen/material_drawer_padding"
|
||||
android:fontFamily="sans-serif"
|
||||
android:lines="1"
|
||||
android:maxLines="1"
|
||||
android:textSize="@dimen/material_drawer_account_header_subtext"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/material_drawer_account_header_text_switcher"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/material_drawer_account_header_name" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/material_drawer_account_header_text_switcher"
|
||||
android:layout_width="@dimen/material_drawer_account_header_dropdown"
|
||||
android:layout_height="@dimen/material_drawer_account_header_dropdown"
|
||||
android:layout_marginEnd="@dimen/material_drawer_vertical_padding"
|
||||
android:layout_marginRight="@dimen/material_drawer_vertical_padding"
|
||||
android:layout_marginBottom="@dimen/material_drawer_account_header_dropdown_margin_bottom"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
</LinearLayout>
|
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="@dimen/material_drawer_padding"
|
||||
android:paddingBottom="@dimen/material_drawer_padding">
|
||||
|
||||
<View
|
||||
android:id="@+id/material_drawer_divider"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp" />
|
||||
</RelativeLayout>
|
@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/material_drawer_item_primary"
|
||||
android:orientation="horizontal"
|
||||
android:paddingStart="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingRight="@dimen/material_drawer_vertical_padding">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/material_drawer_icon"
|
||||
android:layout_width="@dimen/material_drawer_item_primary_icon"
|
||||
android:layout_height="@dimen/material_drawer_item_primary"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingLeft="0dp"
|
||||
android:paddingTop="@dimen/material_drawer_item_primary_icon_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_item_primary_icon_padding_right"
|
||||
android:paddingRight="@dimen/material_drawer_item_primary_icon_padding_right"
|
||||
android:paddingBottom="@dimen/material_drawer_item_primary_icon_padding"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_primary_text"
|
||||
app:layout_constraintBottom_toTopOf="@id/material_drawer_description"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_arrow_container"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
tools:text="Some drawer text" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_description"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_primary_description"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_arrow_container"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toBottomOf="@id/material_drawer_name"
|
||||
tools:text="Some drawer text" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/material_drawer_arrow_container"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:paddingStart="@dimen/material_drawer_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_padding"
|
||||
android:paddingEnd="0dp"
|
||||
android:paddingRight="0dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/material_drawer_arrow"
|
||||
android:layout_width="16dp"
|
||||
android:layout_height="16dp" />
|
||||
</LinearLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -0,0 +1,108 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/material_drawer_item_primary"
|
||||
android:clickable="true"
|
||||
android:orientation="horizontal"
|
||||
android:paddingStart="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingRight="@dimen/material_drawer_vertical_padding">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/material_drawer_icon"
|
||||
android:layout_width="@dimen/material_drawer_item_primary_icon"
|
||||
android:layout_height="@dimen/material_drawer_item_primary"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingLeft="0dp"
|
||||
android:paddingTop="@dimen/material_drawer_item_primary_icon_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_item_primary_icon_padding_right"
|
||||
android:paddingRight="@dimen/material_drawer_item_primary_icon_padding_right"
|
||||
android:paddingBottom="@dimen/material_drawer_item_primary_icon_padding"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_primary_text"
|
||||
app:layout_constraintBottom_toTopOf="@id/material_drawer_description"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_badge_container"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
tools:text="Some drawer text" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_description"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_primary_description"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_badge_container"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toBottomOf="@id/material_drawer_name"
|
||||
tools:text="Some drawer text" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/material_drawer_badge_container"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:paddingStart="@dimen/material_drawer_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_padding"
|
||||
android:paddingEnd="0dp"
|
||||
android:paddingRight="0dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/material_drawer_arrow_container"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_badge"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif"
|
||||
android:gravity="center"
|
||||
android:lines="1"
|
||||
android:minWidth="20dp"
|
||||
android:paddingLeft="1dp"
|
||||
android:paddingRight="1dp"
|
||||
android:singleLine="true"
|
||||
android:textSize="@dimen/material_drawer_item_primary_text"
|
||||
tools:text="99" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/material_drawer_arrow_container"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:paddingStart="@dimen/material_drawer_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_padding"
|
||||
android:paddingEnd="0dp"
|
||||
android:paddingRight="0dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/material_drawer_arrow"
|
||||
android:layout_width="16dp"
|
||||
android:layout_height="16dp" />
|
||||
</LinearLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="@dimen/material_mini_drawer_item"
|
||||
android:layout_height="@dimen/material_mini_drawer_item"
|
||||
android:paddingBottom="@dimen/material_mini_drawer_item_padding"
|
||||
android:paddingEnd="@dimen/material_mini_drawer_item_padding_sides"
|
||||
android:paddingLeft="@dimen/material_mini_drawer_item_padding_sides"
|
||||
android:paddingRight="@dimen/material_mini_drawer_item_padding_sides"
|
||||
android:paddingStart="@dimen/material_mini_drawer_item_padding_sides"
|
||||
android:paddingTop="@dimen/material_mini_drawer_item_padding">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/material_drawer_icon"
|
||||
android:layout_width="@dimen/material_mini_drawer_item_icon"
|
||||
android:layout_height="@dimen/material_mini_drawer_item_icon"
|
||||
android:layout_gravity="center"
|
||||
android:padding="@dimen/material_mini_drawer_item_icon_padding"
|
||||
android:scaleType="fitXY" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_badge"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="top|end"
|
||||
android:fontFamily="sans-serif"
|
||||
android:gravity="center"
|
||||
android:lines="1"
|
||||
android:maxLines="1"
|
||||
android:padding="1dp"
|
||||
android:paddingLeft="1dp"
|
||||
android:paddingRight="1dp"
|
||||
android:textSize="@dimen/material_mini_drawer_item_badge_text"
|
||||
tools:text="99" />
|
||||
</FrameLayout>
|
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="@dimen/material_mini_drawer_item"
|
||||
android:layout_height="@dimen/material_mini_drawer_item">
|
||||
|
||||
<com.mikepenz.materialdrawer.view.BezelImageView
|
||||
android:id="@+id/material_drawer_icon"
|
||||
android:layout_width="@dimen/material_mini_drawer_item_profile_icon"
|
||||
android:layout_height="@dimen/material_mini_drawer_item_profile_icon"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginBottom="@dimen/material_mini_drawer_item_profile_icon_padding"
|
||||
android:layout_marginEnd="@dimen/material_mini_drawer_item_profile_icon_padding"
|
||||
android:layout_marginLeft="@dimen/material_mini_drawer_item_profile_icon_padding"
|
||||
android:layout_marginRight="@dimen/material_mini_drawer_item_profile_icon_padding"
|
||||
android:layout_marginStart="@dimen/material_mini_drawer_item_profile_icon_padding"
|
||||
android:layout_marginTop="@dimen/material_mini_drawer_item_profile_icon_padding"
|
||||
android:clickable="false"
|
||||
android:elevation="1dp" />
|
||||
</LinearLayout>
|
@ -0,0 +1,91 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/material_drawer_item_primary"
|
||||
android:paddingStart="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingRight="@dimen/material_drawer_vertical_padding">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/material_drawer_icon"
|
||||
android:layout_width="@dimen/material_drawer_item_primary_icon"
|
||||
android:layout_height="@dimen/material_drawer_item_primary"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingLeft="0dp"
|
||||
android:paddingTop="@dimen/material_drawer_item_primary_icon_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_item_primary_icon_padding_right"
|
||||
android:paddingRight="@dimen/material_drawer_item_primary_icon_padding_right"
|
||||
android:paddingBottom="@dimen/material_drawer_item_primary_icon_padding"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_marginRight="8dp"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_primary_text"
|
||||
app:layout_constraintBottom_toTopOf="@id/material_drawer_description"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_badge_container"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
tools:text="Some drawer text" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_description"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_marginRight="8dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_primary_description"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_badge_container"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toBottomOf="@id/material_drawer_name"
|
||||
tools:text="Some drawer text" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/material_drawer_badge_container"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:paddingStart="@dimen/material_drawer_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_padding"
|
||||
android:paddingEnd="0dp"
|
||||
android:paddingRight="0dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_badge"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif"
|
||||
android:gravity="center"
|
||||
android:lines="1"
|
||||
android:minWidth="20dp"
|
||||
android:paddingLeft="1dp"
|
||||
android:paddingRight="1dp"
|
||||
android:singleLine="true"
|
||||
android:textSize="@dimen/material_drawer_item_primary_text"
|
||||
tools:text="99" />
|
||||
</LinearLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -0,0 +1,75 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/material_drawer_item_profile"
|
||||
android:orientation="horizontal"
|
||||
android:paddingStart="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingRight="@dimen/material_drawer_vertical_padding">
|
||||
|
||||
<com.mikepenz.materialdrawer.view.BezelImageView
|
||||
android:id="@+id/material_drawer_profileIcon"
|
||||
android:layout_width="@dimen/material_drawer_item_profile_icon"
|
||||
android:layout_height="@dimen/material_drawer_item_profile_icon"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginStart="0dp"
|
||||
android:layout_marginLeft="0dp"
|
||||
android:layout_marginEnd="@dimen/material_drawer_item_profile_icon_padding_right"
|
||||
android:layout_marginRight="@dimen/material_drawer_item_profile_icon_padding_right"
|
||||
android:clickable="false"
|
||||
android:elevation="1dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/material_drawer_padding"
|
||||
android:layout_marginLeft="@dimen/material_drawer_padding"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingLeft="0dp"
|
||||
android:paddingEnd="@dimen/material_drawer_item_primary_icon_padding_right"
|
||||
android:paddingRight="@dimen/material_drawer_item_primary_icon_padding_right"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_profile_text"
|
||||
app:layout_constraintBottom_toTopOf="@id/material_drawer_email"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_profileIcon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
tools:text="Some drawer text" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_email"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/material_drawer_padding"
|
||||
android:layout_marginLeft="@dimen/material_drawer_padding"
|
||||
android:layout_marginEnd="0dp"
|
||||
android:layout_marginRight="0dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingLeft="0dp"
|
||||
android:paddingEnd="@dimen/material_drawer_item_primary_icon_padding_right"
|
||||
android:paddingRight="@dimen/material_drawer_item_primary_icon_padding_right"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_profile_description"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_profileIcon"
|
||||
app:layout_constraintTop_toBottomOf="@id/material_drawer_name"
|
||||
tools:text="Some drawer text" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -0,0 +1,60 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/material_drawer_item_profile"
|
||||
android:orientation="horizontal"
|
||||
android:paddingStart="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingRight="@dimen/material_drawer_vertical_padding">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/material_drawer_icon"
|
||||
android:layout_width="@dimen/material_drawer_item_primary"
|
||||
android:layout_height="@dimen/material_drawer_item_profile"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingLeft="0dp"
|
||||
android:paddingTop="@dimen/material_drawer_item_profile_setting_icon_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_item_profile_setting_icon_padding"
|
||||
android:paddingRight="@dimen/material_drawer_item_profile_setting_icon_padding"
|
||||
android:paddingBottom="@dimen/material_drawer_item_profile_setting_icon_padding"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/material_drawer_name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:maxLines="1"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_primary_text"
|
||||
app:layout_constraintBottom_toTopOf="@id/material_drawer_description"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
tools:text="Some drawer text" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/material_drawer_description"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:maxLines="1"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_primary_description"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toBottomOf="@id/material_drawer_name"
|
||||
tools:text="Some drawer text" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -0,0 +1,87 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/material_drawer_item_secondary"
|
||||
android:paddingStart="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingRight="@dimen/material_drawer_vertical_padding">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/material_drawer_icon"
|
||||
android:layout_width="@dimen/material_drawer_item_secondary_icon"
|
||||
android:layout_height="@dimen/material_drawer_item_secondary"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingLeft="0dp"
|
||||
android:paddingTop="@dimen/material_drawer_item_secondary_icon_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_item_secondary_icon_padding_right"
|
||||
android:paddingRight="@dimen/material_drawer_item_secondary_icon_padding_right"
|
||||
android:paddingBottom="@dimen/material_drawer_item_secondary_icon_padding"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_secondary_text"
|
||||
app:layout_constraintBottom_toTopOf="@id/material_drawer_description"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_badge_container"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
tools:text="Some secondary text" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_description"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_secondary_description"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_badge_container"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toBottomOf="@id/material_drawer_name"
|
||||
tools:text="Some drawer text" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/material_drawer_badge_container"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:paddingStart="@dimen/material_drawer_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_padding"
|
||||
android:paddingEnd="0dp"
|
||||
android:paddingRight="0dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_badge"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif"
|
||||
android:gravity="center"
|
||||
android:lines="1"
|
||||
android:minWidth="20dp"
|
||||
android:paddingLeft="1dp"
|
||||
android:paddingRight="1dp"
|
||||
android:singleLine="true"
|
||||
android:textSize="@dimen/material_drawer_item_secondary_text"
|
||||
tools:text="99" />
|
||||
</LinearLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -0,0 +1,77 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/material_drawer_item_secondary"
|
||||
android:descendantFocusability="blocksDescendants"
|
||||
android:orientation="horizontal"
|
||||
android:paddingStart="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingRight="@dimen/material_drawer_vertical_padding">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/material_drawer_icon"
|
||||
android:layout_width="@dimen/material_drawer_item_secondary_icon"
|
||||
android:layout_height="@dimen/material_drawer_item_secondary"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingLeft="0dp"
|
||||
android:paddingTop="@dimen/material_drawer_item_secondary_icon_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_item_secondary_icon_padding_right"
|
||||
android:paddingRight="@dimen/material_drawer_item_secondary_icon_padding_right"
|
||||
android:paddingBottom="@dimen/material_drawer_item_secondary_icon_padding"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_secondary_text"
|
||||
app:layout_constraintBottom_toTopOf="@id/material_drawer_description"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_switch"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
tools:text="Some secondary text" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_description"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_secondary_description"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_switch"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toBottomOf="@id/material_drawer_name"
|
||||
tools:text="Some drawer text" />
|
||||
|
||||
<androidx.appcompat.widget.SwitchCompat
|
||||
android:id="@+id/material_drawer_switch"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center_vertical|end"
|
||||
android:paddingLeft="@dimen/material_drawer_padding"
|
||||
android:paddingEnd="0dp"
|
||||
android:paddingRight="0dp"
|
||||
android:textOff=""
|
||||
android:textOn=""
|
||||
android:textSize="@dimen/material_drawer_item_secondary_extra_text"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:showText="false" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/material_drawer_item_secondary"
|
||||
android:descendantFocusability="blocksDescendants"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/material_drawer_icon"
|
||||
android:layout_width="@dimen/material_drawer_item_secondary_icon"
|
||||
android:layout_height="@dimen/material_drawer_item_secondary"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingLeft="0dp"
|
||||
android:paddingTop="@dimen/material_drawer_item_secondary_icon_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_item_secondary_icon_padding_right"
|
||||
android:paddingRight="@dimen/material_drawer_item_secondary_icon_padding_right"
|
||||
android:paddingBottom="@dimen/material_drawer_item_secondary_icon_padding"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/material_drawer_name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_secondary_text"
|
||||
app:layout_constraintBottom_toTopOf="@id/material_drawer_description"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_badge_container"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
tools:text="Some secondary text" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/material_drawer_description"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_secondary_description"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_badge_container"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toBottomOf="@id/material_drawer_name"
|
||||
tools:text="Some drawer text" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/material_drawer_badge_container"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:paddingStart="@dimen/material_drawer_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_padding"
|
||||
android:paddingEnd="0dp"
|
||||
android:paddingRight="0dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<ToggleButton
|
||||
android:id="@+id/material_drawer_toggle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center_vertical|end"
|
||||
android:textSize="@dimen/material_drawer_item_secondary_extra_text" />
|
||||
</LinearLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<View
|
||||
android:id="@+id/material_drawer_divider"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:layout_marginTop="@dimen/material_drawer_padding" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/material_drawer_item_primary"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:paddingLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingRight="@dimen/material_drawer_vertical_padding"
|
||||
android:singleLine="true"
|
||||
android:textSize="@dimen/material_drawer_item_section_text" />
|
||||
</LinearLayout>
|
@ -0,0 +1,77 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/material_drawer_item_primary"
|
||||
android:descendantFocusability="blocksDescendants"
|
||||
android:orientation="horizontal"
|
||||
android:paddingStart="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_vertical_padding"
|
||||
android:paddingRight="@dimen/material_drawer_vertical_padding">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/material_drawer_icon"
|
||||
android:layout_width="@dimen/material_drawer_item_primary_icon"
|
||||
android:layout_height="@dimen/material_drawer_item_primary"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingLeft="0dp"
|
||||
android:paddingTop="@dimen/material_drawer_item_primary_icon_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_item_primary_icon_padding_right"
|
||||
android:paddingRight="@dimen/material_drawer_item_primary_icon_padding_right"
|
||||
android:paddingBottom="@dimen/material_drawer_item_primary_icon_padding"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_primary_text"
|
||||
app:layout_constraintBottom_toTopOf="@id/material_drawer_description"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_switch"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
tools:text="Some drawer text" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_description"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_primary_description"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_switch"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toBottomOf="@id/material_drawer_name"
|
||||
tools:text="Some drawer text" />
|
||||
|
||||
<androidx.appcompat.widget.SwitchCompat
|
||||
android:id="@+id/material_drawer_switch"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center_vertical|end"
|
||||
android:paddingLeft="@dimen/material_drawer_padding"
|
||||
android:paddingEnd="0dp"
|
||||
android:paddingRight="0dp"
|
||||
android:textOff=""
|
||||
android:textOn=""
|
||||
android:textSize="@dimen/material_drawer_item_primary_text"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:showText="false" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/material_drawer_item_primary"
|
||||
android:descendantFocusability="blocksDescendants"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageView
|
||||
android:id="@+id/material_drawer_icon"
|
||||
android:layout_width="@dimen/material_drawer_item_primary_icon"
|
||||
android:layout_height="@dimen/material_drawer_item_primary"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingStart="0dp"
|
||||
android:paddingLeft="0dp"
|
||||
android:paddingTop="@dimen/material_drawer_item_primary_icon_padding"
|
||||
android:paddingEnd="@dimen/material_drawer_item_primary_icon_padding_right"
|
||||
android:paddingRight="@dimen/material_drawer_item_primary_icon_padding_right"
|
||||
android:paddingBottom="@dimen/material_drawer_item_primary_icon_padding"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_name"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_primary_text"
|
||||
app:layout_constraintBottom_toTopOf="@id/material_drawer_description"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_badge_container"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
tools:text="Some drawer text" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/material_drawer_description"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="sans-serif"
|
||||
android:gravity="center_vertical|start"
|
||||
android:lines="1"
|
||||
android:singleLine="true"
|
||||
android:textDirection="anyRtl"
|
||||
android:textSize="@dimen/material_drawer_item_primary_description"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/material_drawer_badge_container"
|
||||
app:layout_constraintStart_toEndOf="@id/material_drawer_icon"
|
||||
app:layout_constraintTop_toBottomOf="@id/material_drawer_name"
|
||||
tools:text="Some drawer text" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/material_drawer_badge_container"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:paddingStart="@dimen/material_drawer_padding"
|
||||
android:paddingLeft="@dimen/material_drawer_padding"
|
||||
android:paddingEnd="0dp"
|
||||
android:paddingRight="0dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<ToggleButton
|
||||
android:id="@+id/material_drawer_toggle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center_vertical|end"
|
||||
android:textSize="@dimen/material_drawer_item_primary_text" />
|
||||
</LinearLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/material_drawer_recycler_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
android:scrollbars="vertical" />
|
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<com.mikepenz.materialize.view.ScrimInsetsRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/material_drawer_slider_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="start"
|
||||
android:layout_marginEnd="@dimen/material_drawer_margin"
|
||||
android:layout_marginRight="@dimen/material_drawer_margin"
|
||||
android:clickable="true"
|
||||
android:elevation="8dp"
|
||||
android:fitsSystemWindows="true"
|
||||
android:focusable="true"
|
||||
android:orientation="vertical">
|
||||
|
||||
<View
|
||||
android:id="@+id/material_drawer_inner_shadow"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_alignParentStart="false"
|
||||
android:layout_alignParentLeft="false"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:background="@drawable/material_drawer_shadow_left"
|
||||
android:visibility="gone" />
|
||||
</com.mikepenz.materialize.view.ScrimInsetsRelativeLayout>
|
4
MaterialDrawer/src/main/res/values-sw600dp/dimens.xml
Normal file
4
MaterialDrawer/src/main/res/values-sw600dp/dimens.xml
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<dimen name="material_drawer_vertical_padding">24dp</dimen>
|
||||
</resources>
|
31
MaterialDrawer/src/main/res/values/attrs.xml
Normal file
31
MaterialDrawer/src/main/res/values/attrs.xml
Normal file
@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<declare-styleable name="MaterialDrawer">
|
||||
<attr name="material_drawer_window_background" format="color|reference" />
|
||||
<attr name="material_drawer_background" format="color|reference" />
|
||||
|
||||
<attr name="material_drawer_primary_text" format="color|reference" />
|
||||
<attr name="material_drawer_primary_icon" format="color|reference" />
|
||||
<attr name="material_drawer_secondary_text" format="color|reference" />
|
||||
<attr name="material_drawer_hint_text" format="color|reference" />
|
||||
<attr name="material_drawer_hint_icon" format="color|reference" />
|
||||
<attr name="material_drawer_divider" format="color|reference" />
|
||||
|
||||
<attr name="material_drawer_selected" format="color|reference" />
|
||||
<attr name="material_drawer_selected_legacy" format="color|reference" /> <!-- defines material design 1.0 color -->
|
||||
<attr name="material_drawer_selected_text" format="color|reference" />
|
||||
<!-- material drawer header attrs-->
|
||||
<attr name="material_drawer_header_selection_text" format="color|reference" />
|
||||
<attr name="material_drawer_header_selection_subtext" format="color|reference" />
|
||||
|
||||
<!-- allows to enable / disable legacy style e.g. material 1 -->
|
||||
<attr name="material_drawer_legacy_style" format="boolean|reference" />
|
||||
</declare-styleable>
|
||||
|
||||
<declare-styleable name="BezelImageView">
|
||||
<attr name="biv_maskDrawable" format="reference" />
|
||||
<attr name="biv_drawCircularShadow" format="boolean" />
|
||||
<attr name="biv_selectorOnPress" format="color|reference" />
|
||||
</declare-styleable>
|
||||
</resources>
|
46
MaterialDrawer/src/main/res/values/colors.xml
Normal file
46
MaterialDrawer/src/main/res/values/colors.xml
Normal file
@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- Material DEFAULT colors -->
|
||||
<color name="material_drawer_primary">@color/materialize_primary</color>
|
||||
<color name="material_drawer_primary_dark">@color/materialize_primary_dark</color>
|
||||
<color name="material_drawer_primary_light">@color/materialize_primary_light</color>
|
||||
<color name="material_drawer_accent">@color/materialize_accent</color>
|
||||
|
||||
<!-- MaterialDrawer DEFAULT colors -->
|
||||
<color name="material_drawer_background">@color/md_white_1000</color>
|
||||
<!-- MaterialDrawer DEFAULT text / items colors -->
|
||||
<color name="material_drawer_primary_text">@color/md_light_primary_text</color>
|
||||
<!-- is overwritten for all devices > 21 (fix that transparent colors are not possible for tinting on < 21) -->
|
||||
<color name="material_drawer_primary_icon">@color/md_light_secondary</color>
|
||||
<color name="material_drawer_secondary_text">@color/md_light_secondary</color>
|
||||
<color name="material_drawer_hint_text">@color/md_light_disabled</color>
|
||||
<color name="material_drawer_hint_icon">@color/md_light_disabled</color>
|
||||
<color name="material_drawer_divider">@color/md_light_dividers</color>
|
||||
<!-- MaterialDrawer DEFAULT drawer colors -->
|
||||
<color name="material_drawer_selected">#1F2196F3</color>
|
||||
<color name="material_drawer_selected_legacy">#E8E8E8</color>
|
||||
<color name="material_drawer_selected_text">@color/material_drawer_primary</color>
|
||||
|
||||
<color name="material_drawer_header_selection_text">@color/material_drawer_primary_text</color>
|
||||
<color name="material_drawer_header_selection_subtext">@color/material_drawer_secondary_text</color>
|
||||
|
||||
<!-- MaterialDrawer DEFAULT DARK colors -->
|
||||
<color name="material_drawer_dark_background">@color/md_dark_background</color>
|
||||
<!-- MaterialDrawer DEFAULT DARK text / items colors -->
|
||||
<color name="material_drawer_dark_primary_text">@color/md_dark_primary_text</color>
|
||||
<!-- is overwritten for all devices > 21 (fix that transparent colors are not possible for tinting on < 21) -->
|
||||
<color name="material_drawer_dark_primary_icon">@color/md_dark_primary_icon</color>
|
||||
<color name="material_drawer_dark_secondary_text">@color/md_dark_secondary</color>
|
||||
<color name="material_drawer_dark_hint_text">@color/md_dark_disabled</color>
|
||||
<color name="material_drawer_dark_hint_icon">@color/md_dark_disabled</color>
|
||||
<color name="material_drawer_dark_divider">@color/md_dark_dividers</color>
|
||||
<!-- MaterialDrawer DEFAULT DARK drawer colors -->
|
||||
<color name="material_drawer_dark_selected">#1F2196F3</color>
|
||||
<color name="material_drawer_dark_selected_legacy">#202020</color>
|
||||
<color name="material_drawer_dark_selected_text">@color/material_drawer_primary</color>
|
||||
|
||||
<color name="material_drawer_dark_header_selection_text">
|
||||
@color/material_drawer_dark_primary_text
|
||||
</color>
|
||||
<color name="material_drawer_dark_header_selection_subtext">@color/material_drawer_dark_secondary_text</color>
|
||||
</resources>
|
76
MaterialDrawer/src/main/res/values/dimens.xml
Normal file
76
MaterialDrawer/src/main/res/values/dimens.xml
Normal file
@ -0,0 +1,76 @@
|
||||
<resources>
|
||||
<!-- ********************** -->
|
||||
<!-- Material Drawer Dimens -->
|
||||
<!-- ********************** -->
|
||||
<!-- General drawer width https://medium.com/sebs-top-tips/material-navigation-drawer-sizing-558aea1ad266 -->
|
||||
<dimen name="material_drawer_width">320dp</dimen>
|
||||
<!-- Definition for the Drawer Slider margin right -->
|
||||
<dimen name="material_drawer_margin">0dp</dimen>
|
||||
<!-- General padding value -->
|
||||
<dimen name="material_drawer_padding">8dp</dimen>
|
||||
<!-- General vertical padding values / 24dp for tablets -->
|
||||
<dimen name="material_drawer_vertical_padding">16dp</dimen>
|
||||
|
||||
<!-- Sticky footer elevation -->
|
||||
<dimen name="material_drawer_sticky_footer_elevation">4dp</dimen>
|
||||
|
||||
<!-- General margins for the drawer account header -->
|
||||
<dimen name="material_drawer_account_header_height">160dp</dimen>
|
||||
<dimen name="material_drawer_account_header_height_compact">72dp</dimen>
|
||||
<dimen name="material_drawer_account_header_horizontal_top">16dp</dimen>
|
||||
<dimen name="material_drawer_account_header_horizontal_bottom">4dp</dimen>
|
||||
<dimen name="material_drawer_account_header_selected">56dp</dimen>
|
||||
<dimen name="material_drawer_account_header_secondary">40dp</dimen>
|
||||
<dimen name="material_drawer_account_header_compact">56dp</dimen>
|
||||
<dimen name="material_drawer_account_header_title">20sp</dimen>
|
||||
<dimen name="material_drawer_account_header_subtext">13sp</dimen>
|
||||
<dimen name="material_drawer_account_header_dropdown_guideline">80dp</dimen>
|
||||
<dimen name="material_drawer_account_header_dropdown">22dp</dimen>
|
||||
<dimen name="material_drawer_account_header_dropdown_padding">5dp</dimen>
|
||||
<dimen name="material_drawer_account_header_dropdown_margin_bottom">18dp</dimen>
|
||||
<dimen name="material_drawer_account_header_non_compact_padding">56dp</dimen>
|
||||
|
||||
<!-- General profileIcon margins for the drawer item -->
|
||||
<dimen name="material_drawer_item_padding">8dp</dimen>
|
||||
<dimen name="material_drawer_item_corner_radius">4dp</dimen>
|
||||
<dimen name="material_drawer_item_background_padding_start_end">8dp</dimen>
|
||||
<dimen name="material_drawer_item_background_padding_top_bottom">4dp</dimen>
|
||||
|
||||
<!-- Definition for the primary item -->
|
||||
<dimen name="material_drawer_item_primary">48dp</dimen>
|
||||
<dimen name="material_drawer_item_primary_icon">56dp</dimen>
|
||||
<dimen name="material_drawer_item_primary_icon_padding">12dp</dimen>
|
||||
<dimen name="material_drawer_item_primary_icon_padding_right">32dp</dimen>
|
||||
<dimen name="material_drawer_item_primary_text">14sp</dimen>
|
||||
<dimen name="material_drawer_item_primary_description">14sp</dimen>
|
||||
<dimen name="material_drawer_item_secondary_description">12sp</dimen>
|
||||
<!-- Definition for the secondary item -->
|
||||
<dimen name="material_drawer_item_secondary">42dp</dimen>
|
||||
<dimen name="material_drawer_item_secondary_icon">56dp</dimen>
|
||||
<dimen name="material_drawer_item_secondary_icon_padding">12dp</dimen>
|
||||
<dimen name="material_drawer_item_secondary_icon_padding_right">36dp</dimen>
|
||||
<dimen name="material_drawer_item_secondary_text">14sp</dimen>
|
||||
<dimen name="material_drawer_item_secondary_extra_text">12sp</dimen>
|
||||
<!-- Definition for the profile item -->
|
||||
<dimen name="material_drawer_item_profile">72dp</dimen>
|
||||
<dimen name="material_drawer_item_profile_icon">40dp</dimen>
|
||||
<dimen name="material_drawer_item_profile_icon_width">48dp</dimen>
|
||||
<dimen name="material_drawer_item_profile_icon_padding">16dp</dimen>
|
||||
<dimen name="material_drawer_item_profile_icon_padding_right">8dp</dimen>
|
||||
<dimen name="material_drawer_item_profile_text">14sp</dimen>
|
||||
<dimen name="material_drawer_item_profile_description">14sp</dimen>
|
||||
<!-- Definition for the profile setting item -->
|
||||
<dimen name="material_drawer_item_profile_setting_icon_padding">24dp</dimen>
|
||||
<!-- Definition for the MiniDrawer item -->
|
||||
<dimen name="material_mini_drawer_item">72dp</dimen>
|
||||
<dimen name="material_mini_drawer_item_padding">4dp</dimen>
|
||||
<dimen name="material_mini_drawer_item_padding_sides">8dp</dimen>
|
||||
<dimen name="material_mini_drawer_item_icon">56dp</dimen>
|
||||
<dimen name="material_mini_drawer_item_icon_padding">16dp</dimen>
|
||||
<dimen name="material_mini_drawer_item_badge_text">12sp</dimen>
|
||||
<dimen name="material_mini_drawer_item_profile_icon">40dp</dimen>
|
||||
<dimen name="material_mini_drawer_item_profile_icon_padding">16dp</dimen>
|
||||
|
||||
<!-- Definition for the section item -->
|
||||
<dimen name="material_drawer_item_section_text">14sp</dimen>
|
||||
</resources>
|
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<!-- Custom variables section -->
|
||||
</resources>
|
27
MaterialDrawer/src/main/res/values/ids.xml
Normal file
27
MaterialDrawer/src/main/res/values/ids.xml
Normal file
@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<resources>
|
||||
<item name="material_drawer_item" type="id" />
|
||||
<item name="material_drawer_menu_default_group" type="id" />
|
||||
<item name="material_drawer_sticky_footer" type="id" />
|
||||
<item name="material_drawer_sticky_header" type="id" />
|
||||
<item name="material_drawer_animation" type="id" />
|
||||
<item name="material_drawer_profile_header" type="id" />
|
||||
<item name="material_drawer_slider_layout" type="id" />
|
||||
|
||||
<item name="material_drawer_item_primary" type="id" />
|
||||
<item name="material_drawer_item_primary_switch" type="id" />
|
||||
<item name="material_drawer_item_primary_toggle" type="id" />
|
||||
<item name="material_drawer_item_secondary" type="id" />
|
||||
<item name="material_drawer_item_secondary_switch" type="id" />
|
||||
<item name="material_drawer_item_secondary_toggle" type="id" />
|
||||
<item name="material_drawer_item_container" type="id" />
|
||||
<item name="material_drawer_item_divider" type="id" />
|
||||
<item name="material_drawer_item_mini" type="id" />
|
||||
<item name="material_drawer_item_mini_profile" type="id" />
|
||||
<item name="material_drawer_item_profile" type="id" />
|
||||
<item name="material_drawer_item_profile_setting" type="id" />
|
||||
<item name="material_drawer_item_section" type="id" />
|
||||
<item name="material_drawer_item_expandable" type="id" />
|
||||
<item name="material_drawer_item_expandable_badge" type="id" />
|
||||
</resources>
|
5
MaterialDrawer/src/main/res/values/strings.xml
Normal file
5
MaterialDrawer/src/main/res/values/strings.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="material_drawer_open">Open</string>
|
||||
<string name="material_drawer_close">Close</string>
|
||||
</resources>
|
399
MaterialDrawer/src/main/res/values/styles.xml
Normal file
399
MaterialDrawer/src/main/res/values/styles.xml
Normal file
@ -0,0 +1,399 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!-- File created by the Android Action Bar Style Generator
|
||||
|
||||
Copyright (C) 2011 The Android Open Source Project
|
||||
Copyright (C) 2012 readyState Software Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<resources>
|
||||
<!-- NORMAL -->
|
||||
<style name="MaterialDrawerTheme" parent="MaterialTheme">
|
||||
<!-- Here we setting appcompat’s actionBarStyle -->
|
||||
<item name="drawerArrowStyle">@style/MaterialDrawer.DrawerArrowStyle</item>
|
||||
|
||||
<!-- ...and here we setting appcompat’s color theming attrs -->
|
||||
<item name="colorPrimary">@color/material_drawer_primary</item>
|
||||
<item name="colorPrimaryDark">@color/material_drawer_primary_dark</item>
|
||||
<item name="colorAccent">@color/material_drawer_accent</item>
|
||||
|
||||
<!-- MaterialDrawer specific values -->
|
||||
<item name="material_drawer_background">@color/material_drawer_dark_background</item>
|
||||
<item name="material_drawer_primary_text">@color/material_drawer_dark_primary_text</item>
|
||||
<item name="material_drawer_primary_icon">@color/material_drawer_dark_primary_icon</item>
|
||||
<item name="material_drawer_secondary_text">@color/material_drawer_dark_secondary_text
|
||||
</item>
|
||||
<item name="material_drawer_hint_text">@color/material_drawer_dark_hint_text</item>
|
||||
<item name="material_drawer_hint_icon">@color/material_drawer_dark_hint_icon</item>
|
||||
<item name="material_drawer_divider">@color/material_drawer_dark_divider</item>
|
||||
<item name="material_drawer_selected">@color/material_drawer_dark_selected</item>
|
||||
<item name="material_drawer_selected_legacy">@color/material_drawer_dark_selected_legacy
|
||||
</item>
|
||||
<item name="material_drawer_selected_text">@color/material_drawer_dark_selected_text</item>
|
||||
<item name="material_drawer_header_selection_text">
|
||||
@color/material_drawer_dark_header_selection_text
|
||||
</item>
|
||||
<item name="material_drawer_header_selection_subtext">
|
||||
@color/material_drawer_dark_header_selection_subtext
|
||||
</item>
|
||||
<item name="material_drawer_legacy_style">false</item>
|
||||
</style>
|
||||
|
||||
<style name="MaterialDrawerTheme.TranslucentStatus" parent="MaterialTheme.TranslucentStatus">
|
||||
<!-- Here we setting appcompat’s actionBarStyle -->
|
||||
<item name="drawerArrowStyle">@style/MaterialDrawer.DrawerArrowStyle</item>
|
||||
|
||||
<!-- ...and here we setting appcompat’s color theming attrs -->
|
||||
<item name="colorPrimary">@color/material_drawer_primary</item>
|
||||
<item name="colorPrimaryDark">@color/material_drawer_primary_dark</item>
|
||||
<item name="colorAccent">@color/material_drawer_accent</item>
|
||||
|
||||
<!-- MaterialDrawer specific values -->
|
||||
<item name="material_drawer_background">@color/material_drawer_dark_background</item>
|
||||
<item name="material_drawer_primary_text">@color/material_drawer_dark_primary_text</item>
|
||||
<item name="material_drawer_primary_icon">@color/material_drawer_dark_primary_icon</item>
|
||||
<item name="material_drawer_secondary_text">@color/material_drawer_dark_secondary_text
|
||||
</item>
|
||||
<item name="material_drawer_hint_text">@color/material_drawer_dark_hint_text</item>
|
||||
<item name="material_drawer_hint_icon">@color/material_drawer_dark_hint_icon</item>
|
||||
<item name="material_drawer_divider">@color/material_drawer_dark_divider</item>
|
||||
<item name="material_drawer_selected">@color/material_drawer_dark_selected</item>
|
||||
<item name="material_drawer_selected_legacy">@color/material_drawer_dark_selected_legacy
|
||||
</item>
|
||||
<item name="material_drawer_selected_text">@color/material_drawer_dark_selected_text</item>
|
||||
<item name="material_drawer_header_selection_text">
|
||||
@color/material_drawer_dark_header_selection_text
|
||||
</item>
|
||||
<item name="material_drawer_header_selection_subtext">
|
||||
@color/material_drawer_dark_header_selection_subtext
|
||||
</item>
|
||||
<item name="material_drawer_legacy_style">false</item>
|
||||
</style>
|
||||
|
||||
<style name="MaterialDrawerTheme.ActionBar" parent="MaterialTheme.ActionBar">
|
||||
<!-- Here we setting appcompat’s actionBarStyle -->
|
||||
<item name="drawerArrowStyle">@style/MaterialDrawer.DrawerArrowStyle</item>
|
||||
|
||||
<!-- ...and here we setting appcompat’s color theming attrs -->
|
||||
<item name="colorPrimary">@color/material_drawer_primary</item>
|
||||
<item name="colorPrimaryDark">@color/material_drawer_primary_dark</item>
|
||||
<item name="colorAccent">@color/material_drawer_accent</item>
|
||||
|
||||
<!-- MaterialDrawer specific values -->
|
||||
<item name="material_drawer_background">@color/material_drawer_dark_background</item>
|
||||
<item name="material_drawer_primary_text">@color/material_drawer_dark_primary_text</item>
|
||||
<item name="material_drawer_primary_icon">@color/material_drawer_dark_primary_icon</item>
|
||||
<item name="material_drawer_secondary_text">@color/material_drawer_dark_secondary_text
|
||||
</item>
|
||||
<item name="material_drawer_hint_text">@color/material_drawer_dark_hint_text</item>
|
||||
<item name="material_drawer_hint_icon">@color/material_drawer_dark_hint_icon</item>
|
||||
<item name="material_drawer_divider">@color/material_drawer_dark_divider</item>
|
||||
<item name="material_drawer_selected">@color/material_drawer_dark_selected</item>
|
||||
<item name="material_drawer_selected_legacy">@color/material_drawer_dark_selected_legacy
|
||||
</item>
|
||||
<item name="material_drawer_selected_text">@color/material_drawer_dark_selected_text</item>
|
||||
<item name="material_drawer_header_selection_text">
|
||||
@color/material_drawer_dark_header_selection_text
|
||||
</item>
|
||||
<item name="material_drawer_header_selection_subtext">
|
||||
@color/material_drawer_dark_header_selection_subtext
|
||||
</item>
|
||||
<item name="material_drawer_legacy_style">false</item>
|
||||
</style>
|
||||
|
||||
<style name="MaterialDrawerTheme.ActionBar.TranslucentStatus" parent="MaterialTheme.ActionBar.TranslucentStatus">
|
||||
<!-- Here we setting appcompat’s actionBarStyle -->
|
||||
<item name="drawerArrowStyle">@style/MaterialDrawer.DrawerArrowStyle</item>
|
||||
|
||||
<!-- ...and here we setting appcompat’s color theming attrs -->
|
||||
<item name="colorPrimary">@color/material_drawer_primary</item>
|
||||
<item name="colorPrimaryDark">@color/material_drawer_primary_dark</item>
|
||||
<item name="colorAccent">@color/material_drawer_accent</item>
|
||||
|
||||
<!-- MaterialDrawer specific values -->
|
||||
<item name="material_drawer_background">@color/material_drawer_dark_background</item>
|
||||
<item name="material_drawer_primary_text">@color/material_drawer_dark_primary_text</item>
|
||||
<item name="material_drawer_primary_icon">@color/material_drawer_dark_primary_icon</item>
|
||||
<item name="material_drawer_secondary_text">@color/material_drawer_dark_secondary_text
|
||||
</item>
|
||||
<item name="material_drawer_hint_text">@color/material_drawer_dark_hint_text</item>
|
||||
<item name="material_drawer_hint_icon">@color/material_drawer_dark_hint_icon</item>
|
||||
<item name="material_drawer_divider">@color/material_drawer_dark_divider</item>
|
||||
<item name="material_drawer_selected">@color/material_drawer_dark_selected</item>
|
||||
<item name="material_drawer_selected_legacy">@color/material_drawer_dark_selected_legacy
|
||||
</item>
|
||||
<item name="material_drawer_selected_text">@color/material_drawer_dark_selected_text</item>
|
||||
<item name="material_drawer_header_selection_text">
|
||||
@color/material_drawer_dark_header_selection_text
|
||||
</item>
|
||||
<item name="material_drawer_header_selection_subtext">
|
||||
@color/material_drawer_dark_header_selection_subtext
|
||||
</item>
|
||||
<item name="material_drawer_legacy_style">false</item>
|
||||
</style>
|
||||
|
||||
<!-- LIGHT -->
|
||||
<style name="MaterialDrawerTheme.Light" parent="MaterialTheme.Light">
|
||||
<!-- Here we setting appcompat’s actionBarStyle -->
|
||||
<item name="drawerArrowStyle">@style/MaterialDrawer.Light.DrawerArrowStyle</item>
|
||||
|
||||
<!-- ...and here we setting appcompat’s color theming attrs -->
|
||||
<item name="colorPrimary">@color/material_drawer_primary</item>
|
||||
<item name="colorPrimaryDark">@color/material_drawer_primary_dark</item>
|
||||
<item name="colorAccent">@color/material_drawer_accent</item>
|
||||
|
||||
<!-- MaterialDrawer specific values -->
|
||||
<item name="material_drawer_background">@color/material_drawer_background</item>
|
||||
<item name="material_drawer_primary_text">@color/material_drawer_primary_text</item>
|
||||
<item name="material_drawer_primary_icon">@color/material_drawer_primary_icon</item>
|
||||
<item name="material_drawer_secondary_text">@color/material_drawer_secondary_text</item>
|
||||
<item name="material_drawer_hint_text">@color/material_drawer_hint_text</item>
|
||||
<item name="material_drawer_hint_icon">@color/material_drawer_hint_icon</item>
|
||||
<item name="material_drawer_divider">@color/material_drawer_divider</item>
|
||||
<item name="material_drawer_selected">@color/material_drawer_selected</item>
|
||||
<item name="material_drawer_selected_legacy">@color/material_drawer_selected_legacy</item>
|
||||
<item name="material_drawer_selected_text">@color/material_drawer_selected_text</item>
|
||||
<item name="material_drawer_header_selection_text">
|
||||
@color/material_drawer_header_selection_text
|
||||
</item>
|
||||
<item name="material_drawer_header_selection_subtext">
|
||||
@color/material_drawer_header_selection_subtext
|
||||
</item>
|
||||
<item name="material_drawer_legacy_style">false</item>
|
||||
</style>
|
||||
|
||||
<style name="MaterialDrawerTheme.Light.TranslucentStatus" parent="MaterialTheme.Light.TranslucentStatus">
|
||||
<!-- Here we setting appcompat’s actionBarStyle -->
|
||||
<item name="drawerArrowStyle">@style/MaterialDrawer.Light.DrawerArrowStyle</item>
|
||||
|
||||
<!-- ...and here we setting appcompat’s color theming attrs -->
|
||||
<item name="colorPrimary">@color/material_drawer_primary</item>
|
||||
<item name="colorPrimaryDark">@color/material_drawer_primary_dark</item>
|
||||
<item name="colorAccent">@color/material_drawer_accent</item>
|
||||
|
||||
<!-- MaterialDrawer specific values -->
|
||||
<item name="material_drawer_background">@color/material_drawer_background</item>
|
||||
<item name="material_drawer_primary_text">@color/material_drawer_primary_text</item>
|
||||
<item name="material_drawer_primary_icon">@color/material_drawer_primary_icon</item>
|
||||
<item name="material_drawer_secondary_text">@color/material_drawer_secondary_text</item>
|
||||
<item name="material_drawer_hint_text">@color/material_drawer_hint_text</item>
|
||||
<item name="material_drawer_hint_icon">@color/material_drawer_hint_icon</item>
|
||||
<item name="material_drawer_divider">@color/material_drawer_divider</item>
|
||||
<item name="material_drawer_selected">@color/material_drawer_selected</item>
|
||||
<item name="material_drawer_selected_legacy">@color/material_drawer_selected_legacy</item>
|
||||
<item name="material_drawer_selected_text">@color/material_drawer_selected_text</item>
|
||||
<item name="material_drawer_header_selection_text">
|
||||
@color/material_drawer_header_selection_text
|
||||
</item>
|
||||
<item name="material_drawer_header_selection_subtext">
|
||||
@color/material_drawer_header_selection_subtext
|
||||
</item>
|
||||
<item name="material_drawer_legacy_style">false</item>
|
||||
</style>
|
||||
|
||||
<style name="MaterialDrawerTheme.Light.ActionBar" parent="MaterialTheme.Light.ActionBar">
|
||||
<!-- Here we setting appcompat’s actionBarStyle -->
|
||||
<item name="drawerArrowStyle">@style/MaterialDrawer.Light.DrawerArrowStyle</item>
|
||||
|
||||
<!-- ...and here we setting appcompat’s color theming attrs -->
|
||||
<item name="colorPrimary">@color/material_drawer_primary</item>
|
||||
<item name="colorPrimaryDark">@color/material_drawer_primary_dark</item>
|
||||
<item name="colorAccent">@color/material_drawer_accent</item>
|
||||
|
||||
<!-- MaterialDrawer specific values -->
|
||||
<item name="material_drawer_background">@color/material_drawer_background</item>
|
||||
<item name="material_drawer_primary_text">@color/material_drawer_primary_text</item>
|
||||
<item name="material_drawer_primary_icon">@color/material_drawer_primary_icon</item>
|
||||
<item name="material_drawer_secondary_text">@color/material_drawer_secondary_text</item>
|
||||
<item name="material_drawer_hint_text">@color/material_drawer_hint_text</item>
|
||||
<item name="material_drawer_hint_icon">@color/material_drawer_hint_icon</item>
|
||||
<item name="material_drawer_divider">@color/material_drawer_divider</item>
|
||||
<item name="material_drawer_selected">@color/material_drawer_selected</item>
|
||||
<item name="material_drawer_selected_legacy">@color/material_drawer_selected_legacy</item>
|
||||
<item name="material_drawer_selected_text">@color/material_drawer_selected_text</item>
|
||||
<item name="material_drawer_header_selection_text">
|
||||
@color/material_drawer_header_selection_text
|
||||
</item>
|
||||
<item name="material_drawer_header_selection_subtext">
|
||||
@color/material_drawer_header_selection_subtext
|
||||
</item>
|
||||
<item name="material_drawer_legacy_style">false</item>
|
||||
</style>
|
||||
|
||||
<style name="MaterialDrawerTheme.Light.ActionBar.TranslucentStatus" parent="MaterialTheme.Light.ActionBar.TranslucentStatus">
|
||||
<!-- Here we setting appcompat’s actionBarStyle -->
|
||||
<item name="drawerArrowStyle">@style/MaterialDrawer.Light.DrawerArrowStyle</item>
|
||||
|
||||
<!-- ...and here we setting appcompat’s color theming attrs -->
|
||||
<item name="colorPrimary">@color/material_drawer_primary</item>
|
||||
<item name="colorPrimaryDark">@color/material_drawer_primary_dark</item>
|
||||
<item name="colorAccent">@color/material_drawer_accent</item>
|
||||
|
||||
<!-- MaterialDrawer specific values -->
|
||||
<item name="material_drawer_background">@color/material_drawer_background</item>
|
||||
<item name="material_drawer_primary_text">@color/material_drawer_primary_text</item>
|
||||
<item name="material_drawer_primary_icon">@color/material_drawer_primary_icon</item>
|
||||
<item name="material_drawer_secondary_text">@color/material_drawer_secondary_text</item>
|
||||
<item name="material_drawer_hint_text">@color/material_drawer_hint_text</item>
|
||||
<item name="material_drawer_hint_icon">@color/material_drawer_hint_icon</item>
|
||||
<item name="material_drawer_divider">@color/material_drawer_divider</item>
|
||||
<item name="material_drawer_selected">@color/material_drawer_selected</item>
|
||||
<item name="material_drawer_selected_legacy">@color/material_drawer_selected_legacy</item>
|
||||
<item name="material_drawer_selected_text">@color/material_drawer_selected_text</item>
|
||||
<item name="material_drawer_header_selection_text">
|
||||
@color/material_drawer_header_selection_text
|
||||
</item>
|
||||
<item name="material_drawer_header_selection_subtext">
|
||||
@color/material_drawer_header_selection_subtext
|
||||
</item>
|
||||
<item name="material_drawer_legacy_style">false</item>
|
||||
</style>
|
||||
|
||||
|
||||
<!-- LIGHT DARK ACTIONBAR -->
|
||||
<style name="MaterialDrawerTheme.Light.DarkToolbar" parent="MaterialTheme.Light.DarkToolbar">
|
||||
<!-- Here we setting appcompat’s actionBarStyle -->
|
||||
<item name="drawerArrowStyle">@style/MaterialDrawer.DrawerArrowStyle</item>
|
||||
|
||||
<!-- ...and here we setting appcompat’s color theming attrs -->
|
||||
<item name="colorPrimary">@color/material_drawer_primary</item>
|
||||
<item name="colorPrimaryDark">@color/material_drawer_primary_dark</item>
|
||||
<item name="colorAccent">@color/material_drawer_accent</item>
|
||||
|
||||
<!-- MaterialDrawer specific values -->
|
||||
<item name="material_drawer_background">@color/material_drawer_background</item>
|
||||
<item name="material_drawer_primary_text">@color/material_drawer_primary_text</item>
|
||||
<item name="material_drawer_primary_icon">@color/material_drawer_primary_icon</item>
|
||||
<item name="material_drawer_secondary_text">@color/material_drawer_secondary_text</item>
|
||||
<item name="material_drawer_hint_text">@color/material_drawer_hint_text</item>
|
||||
<item name="material_drawer_hint_icon">@color/material_drawer_hint_icon</item>
|
||||
<item name="material_drawer_divider">@color/material_drawer_divider</item>
|
||||
<item name="material_drawer_selected">@color/material_drawer_selected</item>
|
||||
<item name="material_drawer_selected_legacy">@color/material_drawer_selected_legacy</item>
|
||||
<item name="material_drawer_selected_text">@color/material_drawer_selected_text</item>
|
||||
<item name="material_drawer_header_selection_text">
|
||||
@color/material_drawer_header_selection_text
|
||||
</item>
|
||||
<item name="material_drawer_header_selection_subtext">
|
||||
@color/material_drawer_header_selection_subtext
|
||||
</item>
|
||||
<item name="material_drawer_legacy_style">false</item>
|
||||
</style>
|
||||
|
||||
<style name="MaterialDrawerTheme.Light.DarkToolbar.TranslucentStatus" parent="MaterialTheme.Light.DarkToolbar.TranslucentStatus">
|
||||
<!-- Here we setting appcompat’s actionBarStyle -->
|
||||
<item name="drawerArrowStyle">@style/MaterialDrawer.DrawerArrowStyle</item>
|
||||
|
||||
<!-- ...and here we setting appcompat’s color theming attrs -->
|
||||
<item name="colorPrimary">@color/material_drawer_primary</item>
|
||||
<item name="colorPrimaryDark">@color/material_drawer_primary_dark</item>
|
||||
<item name="colorAccent">@color/material_drawer_accent</item>
|
||||
|
||||
<!-- MaterialDrawer specific values -->
|
||||
<item name="material_drawer_background">@color/material_drawer_background</item>
|
||||
<item name="material_drawer_primary_text">@color/material_drawer_primary_text</item>
|
||||
<item name="material_drawer_primary_icon">@color/material_drawer_primary_icon</item>
|
||||
<item name="material_drawer_secondary_text">@color/material_drawer_secondary_text</item>
|
||||
<item name="material_drawer_hint_text">@color/material_drawer_hint_text</item>
|
||||
<item name="material_drawer_hint_icon">@color/material_drawer_hint_icon</item>
|
||||
<item name="material_drawer_divider">@color/material_drawer_divider</item>
|
||||
<item name="material_drawer_selected">@color/material_drawer_selected</item>
|
||||
<item name="material_drawer_selected_legacy">@color/material_drawer_selected_legacy</item>
|
||||
<item name="material_drawer_selected_text">@color/material_drawer_selected_text</item>
|
||||
<item name="material_drawer_header_selection_text">
|
||||
@color/material_drawer_header_selection_text
|
||||
</item>
|
||||
<item name="material_drawer_header_selection_subtext">
|
||||
@color/material_drawer_header_selection_subtext
|
||||
</item>
|
||||
<item name="material_drawer_legacy_style">false</item>
|
||||
</style>
|
||||
|
||||
<style name="MaterialDrawerTheme.Light.DarkToolbar.ActionBar" parent="MaterialTheme.Light.DarkToolbar.ActionBar">
|
||||
<!-- Here we setting appcompat’s actionBarStyle -->
|
||||
<item name="drawerArrowStyle">@style/MaterialDrawer.DrawerArrowStyle</item>
|
||||
|
||||
<!-- ...and here we setting appcompat’s color theming attrs -->
|
||||
<item name="colorPrimary">@color/material_drawer_primary</item>
|
||||
<item name="colorPrimaryDark">@color/material_drawer_primary_dark</item>
|
||||
<item name="colorAccent">@color/material_drawer_accent</item>
|
||||
|
||||
<!-- MaterialDrawer specific values -->
|
||||
<item name="material_drawer_background">@color/material_drawer_background</item>
|
||||
<item name="material_drawer_primary_text">@color/material_drawer_primary_text</item>
|
||||
<item name="material_drawer_primary_icon">@color/material_drawer_primary_icon</item>
|
||||
<item name="material_drawer_secondary_text">@color/material_drawer_secondary_text</item>
|
||||
<item name="material_drawer_hint_text">@color/material_drawer_hint_text</item>
|
||||
<item name="material_drawer_hint_icon">@color/material_drawer_hint_icon</item>
|
||||
<item name="material_drawer_divider">@color/material_drawer_divider</item>
|
||||
<item name="material_drawer_selected">@color/material_drawer_selected</item>
|
||||
<item name="material_drawer_selected_legacy">@color/material_drawer_selected_legacy</item>
|
||||
<item name="material_drawer_selected_text">@color/material_drawer_selected_text</item>
|
||||
<item name="material_drawer_header_selection_text">
|
||||
@color/material_drawer_header_selection_text
|
||||
</item>
|
||||
<item name="material_drawer_header_selection_subtext">
|
||||
@color/material_drawer_header_selection_subtext
|
||||
</item>
|
||||
<item name="material_drawer_legacy_style">false</item>
|
||||
</style>
|
||||
|
||||
<style name="MaterialDrawerTheme.Light.DarkToolbar.ActionBar.TranslucentStatus" parent="MaterialTheme.Light.DarkToolbar.ActionBar.TranslucentStatus">
|
||||
<!-- Here we setting appcompat’s actionBarStyle -->
|
||||
<item name="drawerArrowStyle">@style/MaterialDrawer.DrawerArrowStyle</item>
|
||||
|
||||
<!-- ...and here we setting appcompat’s color theming attrs -->
|
||||
<item name="colorPrimary">@color/material_drawer_primary</item>
|
||||
<item name="colorPrimaryDark">@color/material_drawer_primary_dark</item>
|
||||
<item name="colorAccent">@color/material_drawer_accent</item>
|
||||
|
||||
<!-- MaterialDrawer specific values -->
|
||||
<item name="material_drawer_background">@color/material_drawer_background</item>
|
||||
<item name="material_drawer_primary_text">@color/material_drawer_primary_text</item>
|
||||
<item name="material_drawer_primary_icon">@color/material_drawer_primary_icon</item>
|
||||
<item name="material_drawer_secondary_text">@color/material_drawer_secondary_text</item>
|
||||
<item name="material_drawer_hint_text">@color/material_drawer_hint_text</item>
|
||||
<item name="material_drawer_hint_icon">@color/material_drawer_hint_icon</item>
|
||||
<item name="material_drawer_divider">@color/material_drawer_divider</item>
|
||||
<item name="material_drawer_selected">@color/material_drawer_selected</item>
|
||||
<item name="material_drawer_selected_legacy">@color/material_drawer_selected_legacy</item>
|
||||
<item name="material_drawer_selected_text">@color/material_drawer_selected_text</item>
|
||||
<item name="material_drawer_header_selection_text">
|
||||
@color/material_drawer_header_selection_text
|
||||
</item>
|
||||
<item name="material_drawer_header_selection_subtext">
|
||||
@color/material_drawer_header_selection_subtext
|
||||
</item>
|
||||
<item name="material_drawer_legacy_style">false</item>
|
||||
</style>
|
||||
|
||||
|
||||
<!-- DrawerArrowStyles -->
|
||||
<style name="MaterialDrawer.DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
|
||||
<item name="spinBars">false</item>
|
||||
<item name="color">@android:color/white</item>
|
||||
</style>
|
||||
|
||||
<style name="MaterialDrawer.Light.DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
|
||||
<item name="spinBars">false</item>
|
||||
<item name="color">@android:color/black</item>
|
||||
</style>
|
||||
|
||||
|
||||
<!-- BezelImageView -->
|
||||
<style name="BezelImageView">
|
||||
<item name="biv_maskDrawable">@drawable/material_drawer_circle_mask</item>
|
||||
<item name="biv_drawCircularShadow">true</item>
|
||||
<item name="biv_selectorOnPress">@color/material_drawer_primary</item>
|
||||
</style>
|
||||
</resources>
|
1
agendacalendarview/.gitignore
vendored
Normal file
1
agendacalendarview/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/build
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user