From 0b22d7516efb820cee62c0b9146e6cdb9d1cf1e4 Mon Sep 17 00:00:00 2001 From: Mehdi Date: Tue, 26 Feb 2019 11:39:45 +0100 Subject: [PATCH 1/4] gradle version and android build tools updated --- build.gradle | 12 ++++++------ gradle/wrapper/gradle-wrapper.properties | 4 ++-- library/build.gradle | 3 +-- sample/build.gradle | 9 ++++----- 4 files changed, 13 insertions(+), 15 deletions(-) diff --git a/build.gradle b/build.gradle index 60ca777..50336ba 100644 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,11 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.3' - classpath 'com.novoda:bintray-release:0.4.0' + classpath 'com.android.tools.build:gradle:3.3.1' + classpath 'com.novoda:bintray-release:0.5.0' } } @@ -27,10 +28,9 @@ ext { publishVersion = '1.1.0' licences = ['Apache-2.0'] - compileSdkVersion = 26 - buildToolsVersion = '26.0.1' + compileSdkVersion = 28 minSdkVersion = 16 - targetSdkVersion = 25 + targetSdkVersion = 28 - supportLibVersion = '26.0.0' + supportLibVersion = '28.0.0' } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 15b0667..99b9a1b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Sep 03 13:36:54 WIB 2017 +#Tue Feb 26 10:53:58 CET 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip diff --git a/library/build.gradle b/library/build.gradle index f395667..da47f39 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -3,7 +3,6 @@ apply plugin: 'com.novoda.bintray-release' android { compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { minSdkVersion 16 @@ -12,7 +11,7 @@ android { } dependencies { - compile "com.android.support:appcompat-v7:$supportLibVersion" + implementation "com.android.support:appcompat-v7:$supportLibVersion" } publish { diff --git a/sample/build.gradle b/sample/build.gradle index ea0b534..8ff1a32 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -2,7 +2,6 @@ apply plugin: 'com.android.application' android { compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { applicationId "com.yarolegovich.slidingrootnav.sample" minSdkVersion 21 @@ -20,9 +19,9 @@ android { } dependencies { - compile "com.android.support:appcompat-v7:$supportLibVersion" - compile "com.android.support:design:$supportLibVersion" - compile "com.android.support:recyclerview-v7:$supportLibVersion" + implementation "com.android.support:appcompat-v7:$supportLibVersion" + implementation "com.android.support:design:$supportLibVersion" + implementation "com.android.support:recyclerview-v7:$supportLibVersion" - compile project(':library') + implementation project(':library') } From 2eb4284127546e711e14947d33b2b0ce64abf2f8 Mon Sep 17 00:00:00 2001 From: Mehdi Date: Tue, 26 Feb 2019 11:46:42 +0100 Subject: [PATCH 2/4] upgraded to androidx --- build.gradle | 3 ++- gradle.properties | 2 ++ library/build.gradle | 2 +- .../slidingrootnav/SlideGravity.java | 2 +- .../slidingrootnav/SlidingRootNavBuilder.java | 10 +++++----- .../slidingrootnav/SlidingRootNavLayout.java | 4 ++-- .../util/ActionBarToggleAdapter.java | 2 +- .../util/DrawerListenerAdapter.java | 2 +- sample/build.gradle | 10 +++++----- .../slidingrootnav/sample/SampleActivity.java | 16 ++++++++-------- .../sample/fragment/CenteredTextFragment.java | 2 +- .../sample/menu/DrawerAdapter.java | 2 +- sample/src/main/res/layout/activity_main.xml | 6 +++--- sample/src/main/res/layout/menu_left_drawer.xml | 2 +- 14 files changed, 34 insertions(+), 31 deletions(-) diff --git a/build.gradle b/build.gradle index 50336ba..f041177 100644 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,7 @@ allprojects { repositories { jcenter() maven { url "https://maven.google.com" } + google() } } @@ -32,5 +33,5 @@ ext { minSdkVersion = 16 targetSdkVersion = 28 - supportLibVersion = '28.0.0' + supportLibVersion = '1.0.0-beta01' } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index aac7c9b..9e6fce1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,6 +9,8 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. +android.enableJetifier=true +android.useAndroidX=true org.gradle.jvmargs=-Xmx1536m # When configured, Gradle will run in incubating parallel mode. diff --git a/library/build.gradle b/library/build.gradle index da47f39..7044b3a 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -11,7 +11,7 @@ android { } dependencies { - implementation "com.android.support:appcompat-v7:$supportLibVersion" + implementation "androidx.appcompat:appcompat:$supportLibVersion" } publish { diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/SlideGravity.java b/library/src/main/java/com/yarolegovich/slidingrootnav/SlideGravity.java index 419eb23..4ebff64 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/SlideGravity.java +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/SlideGravity.java @@ -1,6 +1,6 @@ package com.yarolegovich.slidingrootnav; -import android.support.v4.widget.ViewDragHelper; +import androidx.customview.widget.ViewDragHelper; /** * Created by yarolegovich on 25.03.2017. diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavBuilder.java b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavBuilder.java index a734be3..cf16691 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavBuilder.java +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavBuilder.java @@ -2,11 +2,11 @@ import android.app.Activity; import android.os.Bundle; -import android.support.annotation.FloatRange; -import android.support.annotation.IntRange; -import android.support.annotation.LayoutRes; -import android.support.v7.app.ActionBarDrawerToggle; -import android.support.v7.widget.Toolbar; +import androidx.annotation.FloatRange; +import androidx.annotation.IntRange; +import androidx.annotation.LayoutRes; +import androidx.appcompat.app.ActionBarDrawerToggle; +import androidx.appcompat.widget.Toolbar; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavLayout.java b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavLayout.java index 8bb31bd..fc9c44b 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavLayout.java +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavLayout.java @@ -4,8 +4,8 @@ import android.graphics.Rect; import android.os.Bundle; import android.os.Parcelable; -import android.support.v4.view.ViewCompat; -import android.support.v4.widget.ViewDragHelper; +import androidx.core.view.ViewCompat; +import androidx.customview.widget.ViewDragHelper; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/util/ActionBarToggleAdapter.java b/library/src/main/java/com/yarolegovich/slidingrootnav/util/ActionBarToggleAdapter.java index 3343312..11e35df 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/util/ActionBarToggleAdapter.java +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/util/ActionBarToggleAdapter.java @@ -1,7 +1,7 @@ package com.yarolegovich.slidingrootnav.util; import android.content.Context; -import android.support.v4.widget.DrawerLayout; +import androidx.drawerlayout.widget.DrawerLayout; import com.yarolegovich.slidingrootnav.SlidingRootNavLayout; diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/util/DrawerListenerAdapter.java b/library/src/main/java/com/yarolegovich/slidingrootnav/util/DrawerListenerAdapter.java index 1d73a83..de821b8 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/util/DrawerListenerAdapter.java +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/util/DrawerListenerAdapter.java @@ -1,6 +1,6 @@ package com.yarolegovich.slidingrootnav.util; -import android.support.v4.widget.DrawerLayout; +import androidx.drawerlayout.widget.DrawerLayout; import android.view.View; import com.yarolegovich.slidingrootnav.callback.DragListener; diff --git a/sample/build.gradle b/sample/build.gradle index 8ff1a32..588214a 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -6,8 +6,8 @@ android { applicationId "com.yarolegovich.slidingrootnav.sample" minSdkVersion 21 targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" + versionCode 2 + versionName "2.0" } buildTypes { @@ -19,9 +19,9 @@ android { } dependencies { - implementation "com.android.support:appcompat-v7:$supportLibVersion" - implementation "com.android.support:design:$supportLibVersion" - implementation "com.android.support:recyclerview-v7:$supportLibVersion" + implementation "androidx.appcompat:appcompat:$supportLibVersion" + implementation "com.google.android.material:material:$supportLibVersion" + implementation "androidx.recyclerview:recyclerview:$supportLibVersion" implementation project(':library') } diff --git a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/SampleActivity.java b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/SampleActivity.java index 1c88f6b..9cfceba 100644 --- a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/SampleActivity.java +++ b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/SampleActivity.java @@ -4,14 +4,14 @@ import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.support.annotation.ColorInt; -import android.support.annotation.ColorRes; -import android.support.annotation.Nullable; -import android.support.v4.content.ContextCompat; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; +import androidx.annotation.ColorInt; +import androidx.annotation.ColorRes; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.appcompat.widget.Toolbar; import com.yarolegovich.slidingrootnav.SlidingRootNav; import com.yarolegovich.slidingrootnav.SlidingRootNavBuilder; diff --git a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/fragment/CenteredTextFragment.java b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/fragment/CenteredTextFragment.java index 4869737..b2ef7d4 100644 --- a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/fragment/CenteredTextFragment.java +++ b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/fragment/CenteredTextFragment.java @@ -2,7 +2,7 @@ import android.app.Fragment; import android.os.Bundle; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerAdapter.java b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerAdapter.java index 51a1a16..93bb950 100644 --- a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerAdapter.java +++ b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerAdapter.java @@ -1,6 +1,6 @@ package com.yarolegovich.slidingrootnav.sample.menu; -import android.support.v7.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView; import android.util.SparseArray; import android.view.View; import android.view.ViewGroup; diff --git a/sample/src/main/res/layout/activity_main.xml b/sample/src/main/res/layout/activity_main.xml index 5b57331..0fe5580 100644 --- a/sample/src/main/res/layout/activity_main.xml +++ b/sample/src/main/res/layout/activity_main.xml @@ -6,16 +6,16 @@ android:background="@android:color/white" android:orientation="vertical"> - - - + - From c4434092331cf189339b7ba732f191b08c4b0b7f Mon Sep 17 00:00:00 2001 From: Mehdi Date: Tue, 26 Feb 2019 12:21:43 +0100 Subject: [PATCH 3/4] library project converted to kotlin --- build.gradle | 2 + library/build.gradle | 6 + .../slidingrootnav/SlideGravity.java | 107 ------ .../slidingrootnav/SlideGravity.kt | 93 ++++++ .../slidingrootnav/SlidingRootNav.java | 27 -- .../slidingrootnav/SlidingRootNav.kt | 25 ++ .../slidingrootnav/SlidingRootNavBuilder.java | 265 --------------- .../slidingrootnav/SlidingRootNavBuilder.kt | 264 +++++++++++++++ .../slidingrootnav/SlidingRootNavLayout.java | 314 ------------------ .../slidingrootnav/SlidingRootNavLayout.kt | 277 +++++++++++++++ .../slidingrootnav/callback/DragListener.java | 10 - .../slidingrootnav/callback/DragListener.kt | 10 + .../callback/DragStateListener.java | 12 - .../callback/DragStateListener.kt | 12 + .../transform/CompositeTransformation.java | 25 -- .../transform/CompositeTransformation.kt | 16 + .../transform/ElevationTransformation.java | 29 -- .../transform/ElevationTransformation.kt | 25 ++ .../transform/RootTransformation.java | 12 - .../transform/RootTransformation.kt | 12 + .../transform/ScaleTransformation.java | 27 -- .../transform/ScaleTransformation.kt | 23 ++ .../transform/YTranslationTransformation.java | 26 -- .../transform/YTranslationTransformation.kt | 22 ++ .../util/ActionBarToggleAdapter.java | 49 --- .../util/ActionBarToggleAdapter.kt | 41 +++ .../util/DrawerListenerAdapter.java | 42 --- .../util/DrawerListenerAdapter.kt | 31 ++ .../util/HiddenMenuClickConsumer.java | 29 -- .../util/HiddenMenuClickConsumer.kt | 24 ++ .../slidingrootnav/util/SideNavUtils.java | 12 - .../slidingrootnav/util/SideNavUtils.kt | 12 + sample/build.gradle | 6 + .../slidingrootnav/sample/SampleActivity.java | 12 +- 34 files changed, 909 insertions(+), 990 deletions(-) delete mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/SlideGravity.java create mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/SlideGravity.kt delete mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNav.java create mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNav.kt delete mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavBuilder.java create mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavBuilder.kt delete mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavLayout.java create mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavLayout.kt delete mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragListener.java create mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragListener.kt delete mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragStateListener.java create mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragStateListener.kt delete mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/transform/CompositeTransformation.java create mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/transform/CompositeTransformation.kt delete mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/transform/ElevationTransformation.java create mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/transform/ElevationTransformation.kt delete mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/transform/RootTransformation.java create mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/transform/RootTransformation.kt delete mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/transform/ScaleTransformation.java create mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/transform/ScaleTransformation.kt delete mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/transform/YTranslationTransformation.java create mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/transform/YTranslationTransformation.kt delete mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/util/ActionBarToggleAdapter.java create mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/util/ActionBarToggleAdapter.kt delete mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/util/DrawerListenerAdapter.java create mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/util/DrawerListenerAdapter.kt delete mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/util/HiddenMenuClickConsumer.java create mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/util/HiddenMenuClickConsumer.kt delete mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/util/SideNavUtils.java create mode 100644 library/src/main/java/com/yarolegovich/slidingrootnav/util/SideNavUtils.kt diff --git a/build.gradle b/build.gradle index f041177..bac3273 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,5 @@ buildscript { + ext.kotlin_version = '1.3.21' repositories { jcenter() google() @@ -6,6 +7,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.3.1' classpath 'com.novoda:bintray-release:0.5.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/library/build.gradle b/library/build.gradle index 7044b3a..8d74ba6 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -1,4 +1,6 @@ apply plugin: 'com.android.library' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-android' apply plugin: 'com.novoda.bintray-release' android { @@ -12,6 +14,7 @@ android { dependencies { implementation "androidx.appcompat:appcompat:$supportLibVersion" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } publish { @@ -22,4 +25,7 @@ publish { publishVersion = rootProject.publishVersion description = rootProject.description licences = rootProject.licences +} +repositories { + mavenCentral() } \ No newline at end of file diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/SlideGravity.java b/library/src/main/java/com/yarolegovich/slidingrootnav/SlideGravity.java deleted file mode 100644 index 4ebff64..0000000 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/SlideGravity.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.yarolegovich.slidingrootnav; - -import androidx.customview.widget.ViewDragHelper; - -/** - * Created by yarolegovich on 25.03.2017. - */ - -public enum SlideGravity { - - LEFT { - @Override - Helper createHelper() { - return new LeftHelper(); - } - }, - RIGHT { - @Override - Helper createHelper() { - return new RightHelper(); - } - }; - - abstract Helper createHelper(); - - interface Helper { - - int getLeftAfterFling(float flingVelocity, int maxDrag); - - int getLeftToSettle(float dragProgress, int maxDrag); - - int getRootLeft(float dragProgress, int maxDrag); - - float getDragProgress(int viewLeft, int maxDrag); - - int clampViewPosition(int left, int maxDrag); - - void enableEdgeTrackingOn(ViewDragHelper dragHelper); - } - - static class LeftHelper implements Helper { - - @Override - public int getLeftAfterFling(float flingVelocity, int maxDrag) { - return flingVelocity > 0 ? maxDrag : 0; - } - - @Override - public int getLeftToSettle(float dragProgress, int maxDrag) { - return dragProgress > 0.5f ? maxDrag : 0; - } - - @Override - public int getRootLeft(float dragProgress, int maxDrag) { - return (int) (dragProgress * maxDrag); - } - - @Override - public float getDragProgress(int viewLeft, int maxDrag) { - return ((float) viewLeft) / maxDrag; - } - - @Override - public int clampViewPosition(int left, int maxDrag) { - return Math.max(0, Math.min(left, maxDrag)); - } - - @Override - public void enableEdgeTrackingOn(ViewDragHelper dragHelper) { - dragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT); - } - } - - static class RightHelper implements Helper { - - @Override - public int getLeftAfterFling(float flingVelocity, int maxDrag) { - return flingVelocity > 0 ? 0 : -maxDrag; - } - - @Override - public int getLeftToSettle(float dragProgress, int maxDrag) { - return dragProgress > 0.5f ? -maxDrag : 0; - } - - @Override - public int getRootLeft(float dragProgress, int maxDrag) { - return (int) -(dragProgress * maxDrag); - } - - @Override - public float getDragProgress(int viewLeft, int maxDrag) { - return ((float) Math.abs(viewLeft)) / maxDrag; - } - - @Override - public int clampViewPosition(int left, int maxDrag) { - return Math.max(-maxDrag, Math.min(left, 0)); - } - - @Override - public void enableEdgeTrackingOn(ViewDragHelper dragHelper) { - dragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_RIGHT); - } - } - -} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/SlideGravity.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/SlideGravity.kt new file mode 100644 index 0000000..0d31261 --- /dev/null +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/SlideGravity.kt @@ -0,0 +1,93 @@ +package com.yarolegovich.slidingrootnav + +import androidx.customview.widget.ViewDragHelper + +/** + * Created by yarolegovich on 25.03.2017. + */ + +enum class SlideGravity { + + LEFT { + override fun createHelper(): Helper { + return LeftHelper() + } + }, + RIGHT { + override fun createHelper(): Helper { + return RightHelper() + } + }; + + internal abstract fun createHelper(): Helper + + internal interface Helper { + + fun getLeftAfterFling(flingVelocity: Float, maxDrag: Int): Int + + fun getLeftToSettle(dragProgress: Float, maxDrag: Int): Int + + fun getRootLeft(dragProgress: Float, maxDrag: Int): Int + + fun getDragProgress(viewLeft: Int, maxDrag: Int): Float + + fun clampViewPosition(left: Int, maxDrag: Int): Int + + fun enableEdgeTrackingOn(dragHelper: ViewDragHelper) + } + + internal class LeftHelper : Helper { + + override fun getLeftAfterFling(flingVelocity: Float, maxDrag: Int): Int { + return if (flingVelocity > 0) maxDrag else 0 + } + + override fun getLeftToSettle(dragProgress: Float, maxDrag: Int): Int { + return if (dragProgress > 0.5f) maxDrag else 0 + } + + override fun getRootLeft(dragProgress: Float, maxDrag: Int): Int { + return (dragProgress * maxDrag).toInt() + } + + override fun getDragProgress(viewLeft: Int, maxDrag: Int): Float { + return viewLeft.toFloat() / maxDrag + } + + override fun clampViewPosition(left: Int, maxDrag: Int): Int { + return Math.max(0, Math.min(left, maxDrag)) + } + + override fun enableEdgeTrackingOn(dragHelper: ViewDragHelper) { + dragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT) + } + } + + internal class RightHelper : Helper { + + override fun getLeftAfterFling(flingVelocity: Float, maxDrag: Int): Int { + return if (flingVelocity > 0) 0 else -maxDrag + } + + override fun getLeftToSettle(dragProgress: Float, maxDrag: Int): Int { + return if (dragProgress > 0.5f) -maxDrag else 0 + } + + override fun getRootLeft(dragProgress: Float, maxDrag: Int): Int { + return (-(dragProgress * maxDrag)).toInt() + } + + override fun getDragProgress(viewLeft: Int, maxDrag: Int): Float { + return Math.abs(viewLeft).toFloat() / maxDrag + } + + override fun clampViewPosition(left: Int, maxDrag: Int): Int { + return Math.max(-maxDrag, Math.min(left, 0)) + } + + override fun enableEdgeTrackingOn(dragHelper: ViewDragHelper) { + dragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_RIGHT) + } + } + +} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNav.java b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNav.java deleted file mode 100644 index d6e46dd..0000000 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNav.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.yarolegovich.slidingrootnav; - -/** - * Created by yarolegovich on 25.03.2017. - */ - -public interface SlidingRootNav { - - boolean isMenuClosed(); - - boolean isMenuOpened(); - - boolean isMenuLocked(); - - void closeMenu(); - - void closeMenu(boolean animated); - - void openMenu(); - - void openMenu(boolean animated); - - void setMenuLocked(boolean locked); - - SlidingRootNavLayout getLayout(); - -} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNav.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNav.kt new file mode 100644 index 0000000..982d252 --- /dev/null +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNav.kt @@ -0,0 +1,25 @@ +package com.yarolegovich.slidingrootnav + +/** + * Created by yarolegovich on 25.03.2017. + */ + +public interface SlidingRootNav { + + val isMenuClosed: Boolean + + val isMenuOpened: Boolean + + var isMenuLocked: Boolean + + val layout: SlidingRootNavLayout + + fun closeMenu() + + fun closeMenu(animated: Boolean) + + fun openMenu() + + fun openMenu(animated: Boolean) + +} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavBuilder.java b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavBuilder.java deleted file mode 100644 index cf16691..0000000 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavBuilder.java +++ /dev/null @@ -1,265 +0,0 @@ -package com.yarolegovich.slidingrootnav; - -import android.app.Activity; -import android.os.Bundle; -import androidx.annotation.FloatRange; -import androidx.annotation.IntRange; -import androidx.annotation.LayoutRes; -import androidx.appcompat.app.ActionBarDrawerToggle; -import androidx.appcompat.widget.Toolbar; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.yarolegovich.slidingrootnav.callback.DragListener; -import com.yarolegovich.slidingrootnav.callback.DragStateListener; -import com.yarolegovich.slidingrootnav.transform.CompositeTransformation; -import com.yarolegovich.slidingrootnav.transform.ElevationTransformation; -import com.yarolegovich.slidingrootnav.transform.RootTransformation; -import com.yarolegovich.slidingrootnav.transform.ScaleTransformation; -import com.yarolegovich.slidingrootnav.transform.YTranslationTransformation; -import com.yarolegovich.slidingrootnav.util.ActionBarToggleAdapter; -import com.yarolegovich.slidingrootnav.util.DrawerListenerAdapter; -import com.yarolegovich.slidingrootnav.util.HiddenMenuClickConsumer; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Created by yarolegovich on 24.03.2017. - */ - -public class SlidingRootNavBuilder { - - private static final float DEFAULT_END_SCALE = 0.65f; - private static final int DEFAULT_END_ELEVATION_DP = 8; - private static final int DEFAULT_DRAG_DIST_DP = 180; - - private Activity activity; - - private ViewGroup contentView; - - private View menuView; - private int menuLayoutRes; - - private List transformations; - - private List dragListeners; - - private List dragStateListeners; - - private int dragDistance; - - private Toolbar toolbar; - - private SlideGravity gravity; - - private boolean isMenuOpened; - - private boolean isMenuLocked; - - private boolean isContentClickableWhenMenuOpened; - - private Bundle savedState; - - public SlidingRootNavBuilder(Activity activity) { - this.activity = activity; - this.transformations = new ArrayList<>(); - this.dragListeners = new ArrayList<>(); - this.dragStateListeners = new ArrayList<>(); - this.gravity = SlideGravity.LEFT; - this.dragDistance = dpToPx(DEFAULT_DRAG_DIST_DP); - this.isContentClickableWhenMenuOpened = true; - } - - public SlidingRootNavBuilder withMenuView(View view) { - menuView = view; - return this; - } - - public SlidingRootNavBuilder withMenuLayout(@LayoutRes int layout) { - menuLayoutRes = layout; - return this; - } - - public SlidingRootNavBuilder withToolbarMenuToggle(Toolbar tb) { - toolbar = tb; - return this; - } - - public SlidingRootNavBuilder withGravity(SlideGravity g) { - gravity = g; - return this; - } - - public SlidingRootNavBuilder withContentView(ViewGroup cv) { - contentView = cv; - return this; - } - - public SlidingRootNavBuilder withMenuLocked(boolean locked) { - isMenuLocked = locked; - return this; - } - - public SlidingRootNavBuilder withSavedState(Bundle state) { - savedState = state; - return this; - } - - public SlidingRootNavBuilder withMenuOpened(boolean opened) { - isMenuOpened = opened; - return this; - } - - public SlidingRootNavBuilder withContentClickableWhenMenuOpened(boolean clickable) { - isContentClickableWhenMenuOpened = clickable; - return this; - } - - public SlidingRootNavBuilder withDragDistance(int dp) { - return withDragDistancePx(dpToPx(dp)); - } - - public SlidingRootNavBuilder withDragDistancePx(int px) { - dragDistance = px; - return this; - } - - public SlidingRootNavBuilder withRootViewScale(@FloatRange(from = 0.01f) float scale) { - transformations.add(new ScaleTransformation(scale)); - return this; - } - - public SlidingRootNavBuilder withRootViewElevation(@IntRange(from = 0) int elevation) { - return withRootViewElevationPx(dpToPx(elevation)); - } - - public SlidingRootNavBuilder withRootViewElevationPx(@IntRange(from = 0) int elevation) { - transformations.add(new ElevationTransformation(elevation)); - return this; - } - - public SlidingRootNavBuilder withRootViewYTranslation(int translation) { - return withRootViewYTranslationPx(dpToPx(translation)); - } - - public SlidingRootNavBuilder withRootViewYTranslationPx(int translation) { - transformations.add(new YTranslationTransformation(translation)); - return this; - } - - public SlidingRootNavBuilder addRootTransformation(RootTransformation transformation) { - transformations.add(transformation); - return this; - } - - public SlidingRootNavBuilder addDragListener(DragListener dragListener) { - dragListeners.add(dragListener); - return this; - } - - public SlidingRootNavBuilder addDragStateListener(DragStateListener dragStateListener) { - dragStateListeners.add(dragStateListener); - return this; - } - - public SlidingRootNav inject() { - ViewGroup contentView = getContentView(); - - View oldRoot = contentView.getChildAt(0); - contentView.removeAllViews(); - - SlidingRootNavLayout newRoot = createAndInitNewRoot(oldRoot); - - View menu = getMenuViewFor(newRoot); - - initToolbarMenuVisibilityToggle(newRoot, menu); - - HiddenMenuClickConsumer clickConsumer = new HiddenMenuClickConsumer(activity); - clickConsumer.setMenuHost(newRoot); - - newRoot.addView(menu); - newRoot.addView(clickConsumer); - newRoot.addView(oldRoot); - - contentView.addView(newRoot); - - if (savedState == null) { - if (isMenuOpened) { - newRoot.openMenu(false); - } - } - - newRoot.setMenuLocked(isMenuLocked); - - return newRoot; - } - - private SlidingRootNavLayout createAndInitNewRoot(View oldRoot) { - SlidingRootNavLayout newRoot = new SlidingRootNavLayout(activity); - newRoot.setId(R.id.srn_root_layout); - newRoot.setRootTransformation(createCompositeTransformation()); - newRoot.setMaxDragDistance(dragDistance); - newRoot.setGravity(gravity); - newRoot.setRootView(oldRoot); - newRoot.setContentClickableWhenMenuOpened(isContentClickableWhenMenuOpened); - for (DragListener l : dragListeners) { - newRoot.addDragListener(l); - } - for (DragStateListener l : dragStateListeners) { - newRoot.addDragStateListener(l); - } - return newRoot; - } - - private ViewGroup getContentView() { - if (contentView == null) { - contentView = (ViewGroup) activity.findViewById(android.R.id.content); - } - if (contentView.getChildCount() != 1) { - throw new IllegalStateException(activity.getString(R.string.srn_ex_bad_content_view)); - } - return contentView; - } - - private View getMenuViewFor(SlidingRootNavLayout parent) { - if (menuView == null) { - if (menuLayoutRes == 0) { - throw new IllegalStateException(activity.getString(R.string.srn_ex_no_menu_view)); - } - menuView = LayoutInflater.from(activity).inflate(menuLayoutRes, parent, false); - } - return menuView; - } - - private RootTransformation createCompositeTransformation() { - if (transformations.isEmpty()) { - return new CompositeTransformation(Arrays.asList( - new ScaleTransformation(DEFAULT_END_SCALE), - new ElevationTransformation(dpToPx(DEFAULT_END_ELEVATION_DP)))); - } else { - return new CompositeTransformation(transformations); - } - } - - protected void initToolbarMenuVisibilityToggle(final SlidingRootNavLayout sideNav, View drawer) { - if (toolbar != null) { - ActionBarToggleAdapter dlAdapter = new ActionBarToggleAdapter(activity); - dlAdapter.setAdaptee(sideNav); - ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(activity, dlAdapter, toolbar, - R.string.srn_drawer_open, - R.string.srn_drawer_close); - toggle.syncState(); - DrawerListenerAdapter listenerAdapter = new DrawerListenerAdapter(toggle, drawer); - sideNav.addDragListener(listenerAdapter); - sideNav.addDragStateListener(listenerAdapter); - } - } - - private int dpToPx(int dp) { - return Math.round(activity.getResources().getDisplayMetrics().density * dp); - } - -} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavBuilder.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavBuilder.kt new file mode 100644 index 0000000..a81cdca --- /dev/null +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavBuilder.kt @@ -0,0 +1,264 @@ +package com.yarolegovich.slidingrootnav + +import android.app.Activity +import android.os.Bundle +import androidx.annotation.FloatRange +import androidx.annotation.IntRange +import androidx.annotation.LayoutRes +import androidx.appcompat.app.ActionBarDrawerToggle +import androidx.appcompat.widget.Toolbar +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup + +import com.yarolegovich.slidingrootnav.callback.DragListener +import com.yarolegovich.slidingrootnav.callback.DragStateListener +import com.yarolegovich.slidingrootnav.transform.CompositeTransformation +import com.yarolegovich.slidingrootnav.transform.ElevationTransformation +import com.yarolegovich.slidingrootnav.transform.RootTransformation +import com.yarolegovich.slidingrootnav.transform.ScaleTransformation +import com.yarolegovich.slidingrootnav.transform.YTranslationTransformation +import com.yarolegovich.slidingrootnav.util.ActionBarToggleAdapter +import com.yarolegovich.slidingrootnav.util.DrawerListenerAdapter +import com.yarolegovich.slidingrootnav.util.HiddenMenuClickConsumer + +import java.util.ArrayList +import java.util.Arrays + +/** + * Created by yarolegovich on 24.03.2017. + */ + +class SlidingRootNavBuilder(private val activity: Activity) { + + private var contentView: ViewGroup? = null + + private var menuView: View? = null + private var menuLayoutRes: Int = 0 + + private val transformations: MutableList + + private val dragListeners: MutableList + + private val dragStateListeners: MutableList + + private var dragDistance: Int = 0 + + private var toolbar: Toolbar? = null + + private var gravity: SlideGravity? = null + + private var isMenuOpened: Boolean = false + + private var isMenuLocked: Boolean = false + + private var isContentClickableWhenMenuOpened: Boolean = false + + private var savedState: Bundle? = null + + init { + this.transformations = ArrayList() + this.dragListeners = ArrayList() + this.dragStateListeners = ArrayList() + this.gravity = SlideGravity.LEFT + this.dragDistance = dpToPx(DEFAULT_DRAG_DIST_DP) + this.isContentClickableWhenMenuOpened = true + } + + fun withMenuView(view: View): SlidingRootNavBuilder { + menuView = view + return this + } + + fun withMenuLayout(@LayoutRes layout: Int): SlidingRootNavBuilder { + menuLayoutRes = layout + return this + } + + fun withToolbarMenuToggle(tb: Toolbar): SlidingRootNavBuilder { + toolbar = tb + return this + } + + fun withGravity(g: SlideGravity): SlidingRootNavBuilder { + gravity = g + return this + } + + fun withContentView(cv: ViewGroup): SlidingRootNavBuilder { + contentView = cv + return this + } + + fun withMenuLocked(locked: Boolean): SlidingRootNavBuilder { + isMenuLocked = locked + return this + } + + fun withSavedState(state: Bundle): SlidingRootNavBuilder { + savedState = state + return this + } + + fun withMenuOpened(opened: Boolean): SlidingRootNavBuilder { + isMenuOpened = opened + return this + } + + fun withContentClickableWhenMenuOpened(clickable: Boolean): SlidingRootNavBuilder { + isContentClickableWhenMenuOpened = clickable + return this + } + + fun withDragDistance(dp: Int): SlidingRootNavBuilder { + return withDragDistancePx(dpToPx(dp)) + } + + fun withDragDistancePx(px: Int): SlidingRootNavBuilder { + dragDistance = px + return this + } + + fun withRootViewScale(@FloatRange(from = 0.01) scale: Float): SlidingRootNavBuilder { + transformations.add(ScaleTransformation(scale)) + return this + } + + fun withRootViewElevation(@IntRange(from = 0) elevation: Int): SlidingRootNavBuilder { + return withRootViewElevationPx(dpToPx(elevation)) + } + + fun withRootViewElevationPx(@IntRange(from = 0) elevation: Int): SlidingRootNavBuilder { + transformations.add(ElevationTransformation(elevation.toFloat())) + return this + } + + fun withRootViewYTranslation(translation: Int): SlidingRootNavBuilder { + return withRootViewYTranslationPx(dpToPx(translation)) + } + + fun withRootViewYTranslationPx(translation: Int): SlidingRootNavBuilder { + transformations.add(YTranslationTransformation(translation.toFloat())) + return this + } + + fun addRootTransformation(transformation: RootTransformation): SlidingRootNavBuilder { + transformations.add(transformation) + return this + } + + fun addDragListener(dragListener: DragListener): SlidingRootNavBuilder { + dragListeners.add(dragListener) + return this + } + + fun addDragStateListener(dragStateListener: DragStateListener): SlidingRootNavBuilder { + dragStateListeners.add(dragStateListener) + return this + } + + fun inject(): SlidingRootNav { + val contentView = getContentView() + + val oldRoot = contentView.getChildAt(0) + contentView.removeAllViews() + + val newRoot = createAndInitNewRoot(oldRoot) + + val menu = getMenuViewFor(newRoot) + + initToolbarMenuVisibilityToggle(newRoot, menu) + + val clickConsumer = HiddenMenuClickConsumer(activity) + clickConsumer.setMenuHost(newRoot) + + newRoot.addView(menu) + newRoot.addView(clickConsumer) + newRoot.addView(oldRoot) + + contentView.addView(newRoot) + + if (savedState == null) { + if (isMenuOpened) { + newRoot.openMenu(false) + } + } + + newRoot.isMenuLocked = isMenuLocked + + return newRoot + } + + private fun createAndInitNewRoot(oldRoot: View): SlidingRootNavLayout { + val newRoot = SlidingRootNavLayout(activity) + newRoot.id = R.id.srn_root_layout + newRoot.setRootTransformation(createCompositeTransformation()) + newRoot.setMaxDragDistance(dragDistance) + newRoot.setGravity(gravity!!) + newRoot.rootView = oldRoot + newRoot.setContentClickableWhenMenuOpened(isContentClickableWhenMenuOpened) + for (l in dragListeners) { + newRoot.addDragListener(l) + } + for (l in dragStateListeners) { + newRoot.addDragStateListener(l) + } + return newRoot + } + + private fun getContentView(): ViewGroup { + if (contentView == null) { + contentView = activity.findViewById(android.R.id.content) as ViewGroup + } + if (contentView!!.childCount != 1) { + throw IllegalStateException(activity.getString(R.string.srn_ex_bad_content_view)) + } + return contentView as ViewGroup + } + + private fun getMenuViewFor(parent: SlidingRootNavLayout): View? { + if (menuView == null) { + if (menuLayoutRes == 0) { + throw IllegalStateException(activity.getString(R.string.srn_ex_no_menu_view)) + } + menuView = LayoutInflater.from(activity).inflate(menuLayoutRes, parent, false) + } + return menuView + } + + private fun createCompositeTransformation(): RootTransformation { + return if (transformations.isEmpty()) { + CompositeTransformation(Arrays.asList( + ScaleTransformation(DEFAULT_END_SCALE), + ElevationTransformation(dpToPx(DEFAULT_END_ELEVATION_DP).toFloat()))) + } else { + CompositeTransformation(transformations) + } + } + + protected fun initToolbarMenuVisibilityToggle(sideNav: SlidingRootNavLayout, drawer: View?) { + if (toolbar != null) { + val dlAdapter = ActionBarToggleAdapter(activity) + dlAdapter.setAdaptee(sideNav) + val toggle = ActionBarDrawerToggle(activity, dlAdapter, toolbar, + R.string.srn_drawer_open, + R.string.srn_drawer_close) + toggle.syncState() + val listenerAdapter = DrawerListenerAdapter(toggle, drawer!!) + sideNav.addDragListener(listenerAdapter) + sideNav.addDragStateListener(listenerAdapter) + } + } + + private fun dpToPx(dp: Int): Int { + return Math.round(activity.resources.displayMetrics.density * dp) + } + + companion object { + + private val DEFAULT_END_SCALE = 0.65f + private val DEFAULT_END_ELEVATION_DP = 8 + private val DEFAULT_DRAG_DIST_DP = 180 + } + +} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavLayout.java b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavLayout.java deleted file mode 100644 index fc9c44b..0000000 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavLayout.java +++ /dev/null @@ -1,314 +0,0 @@ -package com.yarolegovich.slidingrootnav; - -import android.content.Context; -import android.graphics.Rect; -import android.os.Bundle; -import android.os.Parcelable; -import androidx.core.view.ViewCompat; -import androidx.customview.widget.ViewDragHelper; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewConfiguration; -import android.widget.FrameLayout; - -import com.yarolegovich.slidingrootnav.callback.DragListener; -import com.yarolegovich.slidingrootnav.callback.DragStateListener; -import com.yarolegovich.slidingrootnav.transform.RootTransformation; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by yarolegovich on 24.03.2017. - */ -public class SlidingRootNavLayout extends FrameLayout implements SlidingRootNav { - - private static final String EXTRA_IS_OPENED = "extra_is_opened"; - private static final String EXTRA_SUPER = "extra_super"; - private static final String EXTRA_SHOULD_BLOCK_CLICK = "extra_should_block_click"; - - private static final Rect tempRect = new Rect(); - - private final float FLING_MIN_VELOCITY; - - private boolean isMenuLocked; - private boolean isMenuHidden; - private boolean isContentClickableWhenMenuOpened; - - private RootTransformation rootTransformation; - private View rootView; - - private float dragProgress; - private int maxDragDistance; - private int dragState; - - private ViewDragHelper dragHelper; - private SlideGravity.Helper positionHelper; - - private List dragListeners; - private List dragStateListeners; - - public SlidingRootNavLayout(Context context) { - super(context); - dragListeners = new ArrayList<>(); - dragStateListeners = new ArrayList<>(); - - FLING_MIN_VELOCITY = ViewConfiguration.get(context).getScaledMinimumFlingVelocity(); - - dragHelper = ViewDragHelper.create(this, new ViewDragCallback()); - - dragProgress = 0f; - isMenuHidden = true; - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - return (!isMenuLocked - && dragHelper.shouldInterceptTouchEvent(ev)) - || shouldBlockClick(ev); - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - dragHelper.processTouchEvent(event); - return true; - } - - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - for (int i = 0; i < getChildCount(); i++) { - View child = getChildAt(i); - if (child == rootView) { - int rootLeft = positionHelper.getRootLeft(dragProgress, maxDragDistance); - child.layout(rootLeft, top, rootLeft + (right - left), bottom); - } else { - child.layout(left, top, right, bottom); - } - } - } - - @Override - public void computeScroll() { - if (dragHelper.continueSettling(true)) { - ViewCompat.postInvalidateOnAnimation(this); - } - } - - private void changeMenuVisibility(boolean animated, float newDragProgress) { - isMenuHidden = calculateIsMenuHidden(); - if (animated) { - int left = positionHelper.getLeftToSettle(newDragProgress, maxDragDistance); - if (dragHelper.smoothSlideViewTo(rootView, left, rootView.getTop())) { - ViewCompat.postInvalidateOnAnimation(this); - } - } else { - dragProgress = newDragProgress; - rootTransformation.transform(dragProgress, rootView); - requestLayout(); - } - } - - @Override - public boolean isMenuClosed() { - return isMenuHidden; - } - - @Override public boolean isMenuOpened() { - return !isMenuHidden; - } - - @Override - public SlidingRootNavLayout getLayout() { - return this; - } - - @Override - public boolean isMenuLocked() { - return isMenuLocked; - } - - @Override - public void closeMenu() { - closeMenu(true); - } - - @Override - public void closeMenu(boolean animated) { - changeMenuVisibility(animated, 0f); - } - - @Override - public void openMenu() { - openMenu(true); - } - - @Override - public void openMenu(boolean animated) { - changeMenuVisibility(animated, 1f); - } - - @Override - public void setMenuLocked(boolean locked) { - isMenuLocked = locked; - } - - public void setRootView(View view) { - rootView = view; - } - - public void setContentClickableWhenMenuOpened(boolean contentClickableWhenMenuOpened) { - isContentClickableWhenMenuOpened = contentClickableWhenMenuOpened; - } - - public void setRootTransformation(RootTransformation transformation) { - rootTransformation = transformation; - } - - public void setMaxDragDistance(int maxDragDistance) { - this.maxDragDistance = maxDragDistance; - } - - public void setGravity(SlideGravity gravity) { - positionHelper = gravity.createHelper(); - positionHelper.enableEdgeTrackingOn(dragHelper); - } - - public void addDragListener(DragListener listener) { - dragListeners.add(listener); - } - - public void addDragStateListener(DragStateListener listener) { - dragStateListeners.add(listener); - } - - public void removeDragListener(DragListener listener) { - dragListeners.remove(listener); - } - - public void removeDragStateListener(DragStateListener listener) { - dragStateListeners.remove(listener); - } - - public float getDragProgress() { - return dragProgress; - } - - private boolean shouldBlockClick(MotionEvent event) { - if (isContentClickableWhenMenuOpened) { - return false; - } - if (rootView != null && isMenuOpened()) { - rootView.getHitRect(tempRect); - if (tempRect.contains((int) event.getX(), (int) event.getY())) { - return true; - } - } - return false; - } - - private void notifyDrag() { - for (DragListener listener : dragListeners) { - listener.onDrag(dragProgress); - } - } - - private void notifyDragStart() { - for (DragStateListener listener : dragStateListeners) { - listener.onDragStart(); - } - } - - private void notifyDragEnd(boolean isOpened) { - for (DragStateListener listener : dragStateListeners) { - listener.onDragEnd(isOpened); - } - } - - @Override - protected Parcelable onSaveInstanceState() { - Bundle savedState = new Bundle(); - savedState.putParcelable(EXTRA_SUPER, super.onSaveInstanceState()); - savedState.putInt(EXTRA_IS_OPENED, dragProgress > 0.5 ? 1 : 0); - savedState.putBoolean(EXTRA_SHOULD_BLOCK_CLICK, isContentClickableWhenMenuOpened); - return savedState; - } - - @Override - protected void onRestoreInstanceState(Parcelable state) { - Bundle savedState = (Bundle) state; - super.onRestoreInstanceState(savedState.getParcelable(EXTRA_SUPER)); - changeMenuVisibility(false, savedState.getInt(EXTRA_IS_OPENED, 0)); - isMenuHidden = calculateIsMenuHidden(); - isContentClickableWhenMenuOpened = savedState.getBoolean(EXTRA_SHOULD_BLOCK_CLICK); - } - - private boolean calculateIsMenuHidden() { - return dragProgress == 0f; - } - - private class ViewDragCallback extends ViewDragHelper.Callback { - - private boolean edgeTouched; - - @Override - public boolean tryCaptureView(View child, int pointerId) { - if (isMenuLocked) { - return false; - } - boolean isOnEdge = edgeTouched; - edgeTouched = false; - if (isMenuClosed()) { - return child == rootView && isOnEdge; - } else { - if (child != rootView) { - dragHelper.captureChildView(rootView, pointerId); - return false; - } - return true; - } - } - - @Override - public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { - dragProgress = positionHelper.getDragProgress(left, maxDragDistance); - rootTransformation.transform(dragProgress, rootView); - notifyDrag(); - invalidate(); - } - - @Override - public void onViewReleased(View releasedChild, float xvel, float yvel) { - int left = Math.abs(xvel) < FLING_MIN_VELOCITY ? - positionHelper.getLeftToSettle(dragProgress, maxDragDistance) : - positionHelper.getLeftAfterFling(xvel, maxDragDistance); - dragHelper.settleCapturedViewAt(left, rootView.getTop()); - invalidate(); - } - - @Override - public void onViewDragStateChanged(int state) { - if (dragState == ViewDragHelper.STATE_IDLE && state != ViewDragHelper.STATE_IDLE) { - notifyDragStart(); - } else if (dragState != ViewDragHelper.STATE_IDLE && state == ViewDragHelper.STATE_IDLE) { - isMenuHidden = calculateIsMenuHidden(); - notifyDragEnd(isMenuOpened()); - } - dragState = state; - } - - @Override - public void onEdgeTouched(int edgeFlags, int pointerId) { - edgeTouched = true; - } - - @Override - public int getViewHorizontalDragRange(View child) { - return child == rootView ? maxDragDistance : 0; - } - - @Override - public int clampViewPositionHorizontal(View child, int left, int dx) { - return positionHelper.clampViewPosition(left, maxDragDistance); - } - } -} \ No newline at end of file diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavLayout.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavLayout.kt new file mode 100644 index 0000000..f3c106f --- /dev/null +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavLayout.kt @@ -0,0 +1,277 @@ +package com.yarolegovich.slidingrootnav + +import android.content.Context +import android.graphics.Rect +import android.os.Bundle +import android.os.Parcelable +import androidx.core.view.ViewCompat +import androidx.customview.widget.ViewDragHelper +import android.view.MotionEvent +import android.view.View +import android.view.ViewConfiguration +import android.widget.FrameLayout + +import com.yarolegovich.slidingrootnav.callback.DragListener +import com.yarolegovich.slidingrootnav.callback.DragStateListener +import com.yarolegovich.slidingrootnav.transform.RootTransformation + +import java.util.ArrayList + +/** + * Created by yarolegovich on 24.03.2017. + */ +class SlidingRootNavLayout(context: Context) : FrameLayout(context), SlidingRootNav { + + private val FLING_MIN_VELOCITY: Float + + override var isMenuLocked: Boolean = false + override var isMenuClosed: Boolean = false + private set + private var isContentClickableWhenMenuOpened: Boolean = false + + private var rootTransformation: RootTransformation? = null + private var mRootView: View? = null + + var dragProgress: Float = 0.toFloat() + private set + private var maxDragDistance: Int = 0 + private var dragState: Int = 0 + + private val dragHelper: ViewDragHelper + private var positionHelper: SlideGravity.Helper? = null + + private val dragListeners: MutableList + private val dragStateListeners: MutableList + + override val isMenuOpened: Boolean + get() = !isMenuClosed + + override val layout: SlidingRootNavLayout + get() = this + + init { + dragListeners = ArrayList() + dragStateListeners = ArrayList() + + FLING_MIN_VELOCITY = ViewConfiguration.get(context).scaledMinimumFlingVelocity.toFloat() + + dragHelper = ViewDragHelper.create(this, ViewDragCallback()) + + dragProgress = 0f + isMenuClosed = true + } + + override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { + return !isMenuLocked && dragHelper.shouldInterceptTouchEvent(ev) || shouldBlockClick(ev) + } + + override fun onTouchEvent(event: MotionEvent): Boolean { + dragHelper.processTouchEvent(event) + return true + } + + override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { + for (i in 0 until childCount) { + val child = getChildAt(i) + if (child === mRootView) { + val rootLeft = positionHelper!!.getRootLeft(dragProgress, maxDragDistance) + child.layout(rootLeft, top, rootLeft + (right - left), bottom) + } else { + child.layout(left, top, right, bottom) + } + } + } + + override fun computeScroll() { + if (dragHelper.continueSettling(true)) { + ViewCompat.postInvalidateOnAnimation(this) + } + } + + private fun changeMenuVisibility(animated: Boolean, newDragProgress: Float) { + isMenuClosed = calculateIsMenuHidden() + if (animated) { + val left = positionHelper!!.getLeftToSettle(newDragProgress, maxDragDistance) + if (dragHelper.smoothSlideViewTo(mRootView!!, left, mRootView!!.top)) { + ViewCompat.postInvalidateOnAnimation(this) + } + } else { + dragProgress = newDragProgress + rootTransformation!!.transform(dragProgress, mRootView!!) + requestLayout() + } + } + + override fun closeMenu() { + closeMenu(true) + } + + override fun closeMenu(animated: Boolean) { + changeMenuVisibility(animated, 0f) + } + + override fun openMenu() { + openMenu(true) + } + + override fun openMenu(animated: Boolean) { + changeMenuVisibility(animated, 1f) + } + + fun setRootView(view: View) { + mRootView = view + } + + fun setContentClickableWhenMenuOpened(contentClickableWhenMenuOpened: Boolean) { + isContentClickableWhenMenuOpened = contentClickableWhenMenuOpened + } + + fun setRootTransformation(transformation: RootTransformation) { + rootTransformation = transformation + } + + fun setMaxDragDistance(maxDragDistance: Int) { + this.maxDragDistance = maxDragDistance + } + + fun setGravity(gravity: SlideGravity) { + positionHelper = gravity.createHelper() + positionHelper!!.enableEdgeTrackingOn(dragHelper) + } + + fun addDragListener(listener: DragListener) { + dragListeners.add(listener) + } + + fun addDragStateListener(listener: DragStateListener) { + dragStateListeners.add(listener) + } + + fun removeDragListener(listener: DragListener) { + dragListeners.remove(listener) + } + + fun removeDragStateListener(listener: DragStateListener) { + dragStateListeners.remove(listener) + } + + private fun shouldBlockClick(event: MotionEvent): Boolean { + if (isContentClickableWhenMenuOpened) { + return false + } + if (mRootView != null && isMenuOpened) { + mRootView!!.getHitRect(tempRect) + if (tempRect.contains(event.x.toInt(), event.y.toInt())) { + return true + } + } + return false + } + + private fun notifyDrag() { + for (listener in dragListeners) { + listener.onDrag(dragProgress) + } + } + + private fun notifyDragStart() { + for (listener in dragStateListeners) { + listener.onDragStart() + } + } + + private fun notifyDragEnd(isOpened: Boolean) { + for (listener in dragStateListeners) { + listener.onDragEnd(isOpened) + } + } + + override fun onSaveInstanceState(): Parcelable? { + val savedState = Bundle() + savedState.putParcelable(EXTRA_SUPER, super.onSaveInstanceState()) + savedState.putInt(EXTRA_IS_OPENED, if (dragProgress > 0.5) 1 else 0) + savedState.putBoolean(EXTRA_SHOULD_BLOCK_CLICK, isContentClickableWhenMenuOpened) + return savedState + } + + override fun onRestoreInstanceState(state: Parcelable) { + val savedState = state as Bundle + super.onRestoreInstanceState(savedState.getParcelable(EXTRA_SUPER)) + changeMenuVisibility(false, savedState.getInt(EXTRA_IS_OPENED, 0).toFloat()) + isMenuClosed = calculateIsMenuHidden() + isContentClickableWhenMenuOpened = savedState.getBoolean(EXTRA_SHOULD_BLOCK_CLICK) + } + + private fun calculateIsMenuHidden(): Boolean { + return dragProgress == 0f + } + + private inner class ViewDragCallback : ViewDragHelper.Callback() { + + private var edgeTouched: Boolean = false + + override fun tryCaptureView(child: View, pointerId: Int): Boolean { + if (isMenuLocked) { + return false + } + val isOnEdge = edgeTouched + edgeTouched = false + if (isMenuClosed) { + return child === mRootView && isOnEdge + } else { + if (child !== mRootView) { + dragHelper.captureChildView(mRootView!!, pointerId) + return false + } + return true + } + } + + override fun onViewPositionChanged(changedView: View, left: Int, top: Int, dx: Int, dy: Int) { + dragProgress = positionHelper!!.getDragProgress(left, maxDragDistance) + rootTransformation!!.transform(dragProgress, mRootView!!) + notifyDrag() + invalidate() + } + + override fun onViewReleased(releasedChild: View, xvel: Float, yvel: Float) { + val left = if (Math.abs(xvel) < FLING_MIN_VELOCITY) + positionHelper!!.getLeftToSettle(dragProgress, maxDragDistance) + else + positionHelper!!.getLeftAfterFling(xvel, maxDragDistance) + dragHelper.settleCapturedViewAt(left, mRootView!!.top) + invalidate() + } + + override fun onViewDragStateChanged(state: Int) { + if (dragState == ViewDragHelper.STATE_IDLE && state != ViewDragHelper.STATE_IDLE) { + notifyDragStart() + } else if (dragState != ViewDragHelper.STATE_IDLE && state == ViewDragHelper.STATE_IDLE) { + isMenuClosed = calculateIsMenuHidden() + notifyDragEnd(isMenuOpened) + } + dragState = state + } + + override fun onEdgeTouched(edgeFlags: Int, pointerId: Int) { + edgeTouched = true + } + + override fun getViewHorizontalDragRange(child: View): Int { + return if (child === mRootView) maxDragDistance else 0 + } + + override fun clampViewPositionHorizontal(child: View, left: Int, dx: Int): Int { + return positionHelper!!.clampViewPosition(left, maxDragDistance) + } + } + + companion object { + + private val EXTRA_IS_OPENED = "extra_is_opened" + private val EXTRA_SUPER = "extra_super" + private val EXTRA_SHOULD_BLOCK_CLICK = "extra_should_block_click" + + private val tempRect = Rect() + } +} \ No newline at end of file diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragListener.java b/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragListener.java deleted file mode 100644 index bb0420f..0000000 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragListener.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.yarolegovich.slidingrootnav.callback; - -/** - * Created by yarolegovich on 25.03.2017. - */ - -public interface DragListener { - - void onDrag(float progress); -} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragListener.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragListener.kt new file mode 100644 index 0000000..ff87f58 --- /dev/null +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragListener.kt @@ -0,0 +1,10 @@ +package com.yarolegovich.slidingrootnav.callback + +/** + * Created by yarolegovich on 25.03.2017. + */ + +interface DragListener { + + fun onDrag(progress: Float) +} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragStateListener.java b/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragStateListener.java deleted file mode 100644 index 2715aa9..0000000 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragStateListener.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.yarolegovich.slidingrootnav.callback; - -/** - * Created by yarolegovich on 25.03.2017. - */ - -public interface DragStateListener { - - void onDragStart(); - - void onDragEnd(boolean isMenuOpened); -} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragStateListener.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragStateListener.kt new file mode 100644 index 0000000..d792ecc --- /dev/null +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragStateListener.kt @@ -0,0 +1,12 @@ +package com.yarolegovich.slidingrootnav.callback + +/** + * Created by yarolegovich on 25.03.2017. + */ + +interface DragStateListener { + + fun onDragStart() + + fun onDragEnd(isMenuOpened: Boolean) +} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/CompositeTransformation.java b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/CompositeTransformation.java deleted file mode 100644 index a75cf55..0000000 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/CompositeTransformation.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.yarolegovich.slidingrootnav.transform; - -import android.view.View; - -import java.util.List; - -/** - * Created by yarolegovich on 25.03.2017. - */ - -public class CompositeTransformation implements RootTransformation { - - private List transformations; - - public CompositeTransformation(List transformations) { - this.transformations = transformations; - } - - @Override - public void transform(float dragProgress, View rootView) { - for (RootTransformation t : transformations) { - t.transform(dragProgress, rootView); - } - } -} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/CompositeTransformation.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/CompositeTransformation.kt new file mode 100644 index 0000000..4f87b8a --- /dev/null +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/CompositeTransformation.kt @@ -0,0 +1,16 @@ +package com.yarolegovich.slidingrootnav.transform + +import android.view.View + +/** + * Created by yarolegovich on 25.03.2017. + */ + +class CompositeTransformation(private val transformations: List) : RootTransformation { + + override fun transform(dragProgress: Float, rootView: View) { + for (t in transformations) { + t.transform(dragProgress, rootView) + } + } +} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ElevationTransformation.java b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ElevationTransformation.java deleted file mode 100644 index d914b0a..0000000 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ElevationTransformation.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.yarolegovich.slidingrootnav.transform; - -import android.os.Build; -import android.view.View; - -import com.yarolegovich.slidingrootnav.util.SideNavUtils; - -/** - * Created by yarolegovich on 25.03.2017. - */ - -public class ElevationTransformation implements RootTransformation { - - private static final float START_ELEVATION = 0f; - - private final float endElevation; - - public ElevationTransformation(float endElevation) { - this.endElevation = endElevation; - } - - @Override - public void transform(float dragProgress, View rootView) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - float elevation = SideNavUtils.evaluate(dragProgress, START_ELEVATION, endElevation); - rootView.setElevation(elevation); - } - } -} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ElevationTransformation.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ElevationTransformation.kt new file mode 100644 index 0000000..494f521 --- /dev/null +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ElevationTransformation.kt @@ -0,0 +1,25 @@ +package com.yarolegovich.slidingrootnav.transform + +import android.os.Build +import android.view.View + +import com.yarolegovich.slidingrootnav.util.SideNavUtils + +/** + * Created by yarolegovich on 25.03.2017. + */ + +class ElevationTransformation(private val endElevation: Float) : RootTransformation { + + override fun transform(dragProgress: Float, rootView: View) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + val elevation = SideNavUtils.evaluate(dragProgress, START_ELEVATION, endElevation) + rootView.elevation = elevation + } + } + + companion object { + + private val START_ELEVATION = 0f + } +} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/RootTransformation.java b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/RootTransformation.java deleted file mode 100644 index 4755914..0000000 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/RootTransformation.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.yarolegovich.slidingrootnav.transform; - -import android.view.View; - -/** - * Created by yarolegovich on 25.03.2017. - */ - -public interface RootTransformation { - - void transform(float dragProgress, View rootView); -} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/RootTransformation.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/RootTransformation.kt new file mode 100644 index 0000000..bc38b95 --- /dev/null +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/RootTransformation.kt @@ -0,0 +1,12 @@ +package com.yarolegovich.slidingrootnav.transform + +import android.view.View + +/** + * Created by yarolegovich on 25.03.2017. + */ + +interface RootTransformation { + + fun transform(dragProgress: Float, rootView: View) +} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ScaleTransformation.java b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ScaleTransformation.java deleted file mode 100644 index d5fcf30..0000000 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ScaleTransformation.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.yarolegovich.slidingrootnav.transform; - -import android.view.View; - -import com.yarolegovich.slidingrootnav.util.SideNavUtils; - -/** - * Created by yarolegovich on 25.03.2017. - */ - -public class ScaleTransformation implements RootTransformation { - - private static final float START_SCALE = 1f; - - private final float endScale; - - public ScaleTransformation(float endScale) { - this.endScale = endScale; - } - - @Override - public void transform(float dragProgress, View rootView) { - float scale = SideNavUtils.evaluate(dragProgress, START_SCALE, endScale); - rootView.setScaleX(scale); - rootView.setScaleY(scale); - } -} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ScaleTransformation.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ScaleTransformation.kt new file mode 100644 index 0000000..71877a0 --- /dev/null +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ScaleTransformation.kt @@ -0,0 +1,23 @@ +package com.yarolegovich.slidingrootnav.transform + +import android.view.View + +import com.yarolegovich.slidingrootnav.util.SideNavUtils + +/** + * Created by yarolegovich on 25.03.2017. + */ + +class ScaleTransformation(private val endScale: Float) : RootTransformation { + + override fun transform(dragProgress: Float, rootView: View) { + val scale = SideNavUtils.evaluate(dragProgress, START_SCALE, endScale) + rootView.scaleX = scale + rootView.scaleY = scale + } + + companion object { + + private val START_SCALE = 1f + } +} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/YTranslationTransformation.java b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/YTranslationTransformation.java deleted file mode 100644 index 70f2a0d..0000000 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/YTranslationTransformation.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.yarolegovich.slidingrootnav.transform; - -import android.view.View; - -import com.yarolegovich.slidingrootnav.util.SideNavUtils; - -/** - * Created by yarolegovich on 25.03.2017. - */ - -public class YTranslationTransformation implements RootTransformation { - - private static final float START_TRANSLATION = 0f; - - private final float endTranslation; - - public YTranslationTransformation(float endTranslation) { - this.endTranslation = endTranslation; - } - - @Override - public void transform(float dragProgress, View rootView) { - float translation = SideNavUtils.evaluate(dragProgress, START_TRANSLATION, endTranslation); - rootView.setTranslationY(translation); - } -} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/YTranslationTransformation.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/YTranslationTransformation.kt new file mode 100644 index 0000000..84d3008 --- /dev/null +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/YTranslationTransformation.kt @@ -0,0 +1,22 @@ +package com.yarolegovich.slidingrootnav.transform + +import android.view.View + +import com.yarolegovich.slidingrootnav.util.SideNavUtils + +/** + * Created by yarolegovich on 25.03.2017. + */ + +class YTranslationTransformation(private val endTranslation: Float) : RootTransformation { + + override fun transform(dragProgress: Float, rootView: View) { + val translation = SideNavUtils.evaluate(dragProgress, START_TRANSLATION, endTranslation) + rootView.translationY = translation + } + + companion object { + + private val START_TRANSLATION = 0f + } +} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/util/ActionBarToggleAdapter.java b/library/src/main/java/com/yarolegovich/slidingrootnav/util/ActionBarToggleAdapter.java deleted file mode 100644 index 11e35df..0000000 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/util/ActionBarToggleAdapter.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.yarolegovich.slidingrootnav.util; - -import android.content.Context; -import androidx.drawerlayout.widget.DrawerLayout; - -import com.yarolegovich.slidingrootnav.SlidingRootNavLayout; - -/** - * Created by yarolegovich on 26.03.2017. - */ - -public class ActionBarToggleAdapter extends DrawerLayout { - - private SlidingRootNavLayout adaptee; - - public ActionBarToggleAdapter(Context context) { - super(context); - } - - @Override - public void openDrawer(int gravity) { - adaptee.openMenu(); - } - - @Override - public void closeDrawer(int gravity) { - adaptee.closeMenu(); - } - - @Override - public boolean isDrawerVisible(int drawerGravity) { - return !adaptee.isMenuClosed(); - } - - @Override - public int getDrawerLockMode(int edgeGravity) { - if (adaptee.isMenuLocked() && adaptee.isMenuClosed()) { - return DrawerLayout.LOCK_MODE_LOCKED_CLOSED; - } else if (adaptee.isMenuLocked() && !adaptee.isMenuClosed()) { - return DrawerLayout.LOCK_MODE_LOCKED_OPEN; - } else { - return DrawerLayout.LOCK_MODE_UNLOCKED; - } - } - - public void setAdaptee(SlidingRootNavLayout adaptee) { - this.adaptee = adaptee; - } -} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/util/ActionBarToggleAdapter.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/util/ActionBarToggleAdapter.kt new file mode 100644 index 0000000..40aa130 --- /dev/null +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/util/ActionBarToggleAdapter.kt @@ -0,0 +1,41 @@ +package com.yarolegovich.slidingrootnav.util + +import android.content.Context +import androidx.drawerlayout.widget.DrawerLayout + +import com.yarolegovich.slidingrootnav.SlidingRootNavLayout + +/** + * Created by yarolegovich on 26.03.2017. + */ + +class ActionBarToggleAdapter(context: Context) : DrawerLayout(context) { + + private var adaptee: SlidingRootNavLayout? = null + + override fun openDrawer(gravity: Int) { + adaptee!!.openMenu() + } + + override fun closeDrawer(gravity: Int) { + adaptee!!.closeMenu() + } + + override fun isDrawerVisible(drawerGravity: Int): Boolean { + return !adaptee!!.isMenuClosed + } + + override fun getDrawerLockMode(edgeGravity: Int): Int { + return if (adaptee!!.isMenuLocked && adaptee!!.isMenuClosed) { + DrawerLayout.LOCK_MODE_LOCKED_CLOSED + } else if (adaptee!!.isMenuLocked && !adaptee!!.isMenuClosed) { + DrawerLayout.LOCK_MODE_LOCKED_OPEN + } else { + DrawerLayout.LOCK_MODE_UNLOCKED + } + } + + fun setAdaptee(adaptee: SlidingRootNavLayout) { + this.adaptee = adaptee + } +} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/util/DrawerListenerAdapter.java b/library/src/main/java/com/yarolegovich/slidingrootnav/util/DrawerListenerAdapter.java deleted file mode 100644 index de821b8..0000000 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/util/DrawerListenerAdapter.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.yarolegovich.slidingrootnav.util; - -import androidx.drawerlayout.widget.DrawerLayout; -import android.view.View; - -import com.yarolegovich.slidingrootnav.callback.DragListener; -import com.yarolegovich.slidingrootnav.callback.DragStateListener; - -/** - * Created by yarolegovich on 26.03.2017. - */ - -public class DrawerListenerAdapter implements DragListener, DragStateListener { - - private DrawerLayout.DrawerListener adaptee; - private View drawer; - - public DrawerListenerAdapter(DrawerLayout.DrawerListener adaptee, View drawer) { - this.adaptee = adaptee; - this.drawer = drawer; - } - - @Override - public void onDrag(float progress) { - adaptee.onDrawerSlide(drawer, progress); - } - - @Override - public void onDragStart() { - adaptee.onDrawerStateChanged(DrawerLayout.STATE_DRAGGING); - } - - @Override - public void onDragEnd(boolean isMenuOpened) { - if (isMenuOpened) { - adaptee.onDrawerOpened(drawer); - } else { - adaptee.onDrawerClosed(drawer); - } - adaptee.onDrawerStateChanged(DrawerLayout.STATE_IDLE); - } -} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/util/DrawerListenerAdapter.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/util/DrawerListenerAdapter.kt new file mode 100644 index 0000000..680003b --- /dev/null +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/util/DrawerListenerAdapter.kt @@ -0,0 +1,31 @@ +package com.yarolegovich.slidingrootnav.util + +import androidx.drawerlayout.widget.DrawerLayout +import android.view.View + +import com.yarolegovich.slidingrootnav.callback.DragListener +import com.yarolegovich.slidingrootnav.callback.DragStateListener + +/** + * Created by yarolegovich on 26.03.2017. + */ + +class DrawerListenerAdapter(private val adaptee: DrawerLayout.DrawerListener, private val drawer: View) : DragListener, DragStateListener { + + override fun onDrag(progress: Float) { + adaptee.onDrawerSlide(drawer, progress) + } + + override fun onDragStart() { + adaptee.onDrawerStateChanged(DrawerLayout.STATE_DRAGGING) + } + + override fun onDragEnd(isMenuOpened: Boolean) { + if (isMenuOpened) { + adaptee.onDrawerOpened(drawer) + } else { + adaptee.onDrawerClosed(drawer) + } + adaptee.onDrawerStateChanged(DrawerLayout.STATE_IDLE) + } +} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/util/HiddenMenuClickConsumer.java b/library/src/main/java/com/yarolegovich/slidingrootnav/util/HiddenMenuClickConsumer.java deleted file mode 100644 index 75d8369..0000000 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/util/HiddenMenuClickConsumer.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.yarolegovich.slidingrootnav.util; - -import android.content.Context; -import android.view.MotionEvent; -import android.view.View; - -import com.yarolegovich.slidingrootnav.SlidingRootNavLayout; - -/** - * Created by yarolegovich on 26.03.2017. - */ - -public class HiddenMenuClickConsumer extends View { - - private SlidingRootNavLayout menuHost; - - public HiddenMenuClickConsumer(Context context) { - super(context); - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - return menuHost.isMenuClosed(); - } - - public void setMenuHost(SlidingRootNavLayout layout) { - this.menuHost = layout; - } -} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/util/HiddenMenuClickConsumer.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/util/HiddenMenuClickConsumer.kt new file mode 100644 index 0000000..d0d586f --- /dev/null +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/util/HiddenMenuClickConsumer.kt @@ -0,0 +1,24 @@ +package com.yarolegovich.slidingrootnav.util + +import android.content.Context +import android.view.MotionEvent +import android.view.View + +import com.yarolegovich.slidingrootnav.SlidingRootNavLayout + +/** + * Created by yarolegovich on 26.03.2017. + */ + +class HiddenMenuClickConsumer(context: Context) : View(context) { + + private var menuHost: SlidingRootNavLayout? = null + + override fun onTouchEvent(event: MotionEvent): Boolean { + return menuHost!!.isMenuClosed + } + + fun setMenuHost(layout: SlidingRootNavLayout) { + this.menuHost = layout + } +} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/util/SideNavUtils.java b/library/src/main/java/com/yarolegovich/slidingrootnav/util/SideNavUtils.java deleted file mode 100644 index 4df260d..0000000 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/util/SideNavUtils.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.yarolegovich.slidingrootnav.util; - -/** - * Created by yarolegovich on 25.03.2017. - */ - -public abstract class SideNavUtils { - - public static float evaluate(float fraction, float startValue, float endValue) { - return startValue + fraction * (endValue - startValue); - } -} diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/util/SideNavUtils.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/util/SideNavUtils.kt new file mode 100644 index 0000000..35905c0 --- /dev/null +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/util/SideNavUtils.kt @@ -0,0 +1,12 @@ +package com.yarolegovich.slidingrootnav.util + +/** + * Created by yarolegovich on 25.03.2017. + */ + +object SideNavUtils { + + fun evaluate(fraction: Float, startValue: Float, endValue: Float): Float { + return startValue + fraction * (endValue - startValue) + } +} diff --git a/sample/build.gradle b/sample/build.gradle index 588214a..9546407 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,4 +1,6 @@ apply plugin: 'com.android.application' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-android' android { compileSdkVersion rootProject.ext.compileSdkVersion @@ -24,4 +26,8 @@ dependencies { implementation "androidx.recyclerview:recyclerview:$supportLibVersion" implementation project(':library') + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} +repositories { + mavenCentral() } diff --git a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/SampleActivity.java b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/SampleActivity.java index 9cfceba..40fcacf 100644 --- a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/SampleActivity.java +++ b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/SampleActivity.java @@ -48,13 +48,17 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - slidingRootNav = new SlidingRootNavBuilder(this) + SlidingRootNavBuilder slidingRootNavBuilder = new SlidingRootNavBuilder(this) .withToolbarMenuToggle(toolbar) .withMenuOpened(false) .withContentClickableWhenMenuOpened(false) - .withSavedState(savedInstanceState) - .withMenuLayout(R.layout.menu_left_drawer) - .inject(); + .withMenuLayout(R.layout.menu_left_drawer); + + if (savedInstanceState != null) { + slidingRootNavBuilder.withSavedState(savedInstanceState); + } + + slidingRootNav = slidingRootNavBuilder.inject(); screenIcons = loadScreenIcons(); screenTitles = loadScreenTitles(); From 57560e609cd264e2624fcc01ef013b1ede81bb0a Mon Sep 17 00:00:00 2001 From: Mehdi Date: Tue, 26 Feb 2019 18:23:18 +0100 Subject: [PATCH 4/4] Library and project converted to Kotlin --- build.gradle | 3 +- library/build.gradle | 4 +- .../slidingrootnav/SlideGravity.kt | 1 + .../slidingrootnav/SlidingRootNav.kt | 3 +- .../slidingrootnav/SlidingRootNavBuilder.kt | 1 + .../slidingrootnav/SlidingRootNavLayout.kt | 1 + .../slidingrootnav/callback/DragListener.kt | 1 + .../callback/DragStateListener.kt | 1 + .../transform/CompositeTransformation.kt | 4 +- .../transform/ElevationTransformation.kt | 8 +- .../transform/RootTransformation.kt | 1 + .../transform/ScaleTransformation.kt | 8 +- .../transform/YTranslationTransformation.kt | 5 +- .../util/ActionBarToggleAdapter.kt | 1 + .../util/DrawerListenerAdapter.kt | 1 + .../util/HiddenMenuClickConsumer.kt | 1 + .../slidingrootnav/util/SideNavUtils.kt | 5 +- .../slidingrootnav/sample/SampleActivity.java | 128 ------------------ .../slidingrootnav/sample/SampleActivity.kt | 128 ++++++++++++++++++ .../sample/fragment/CenteredTextFragment.java | 48 ------- .../sample/fragment/CenteredTextFragment.kt | 46 +++++++ .../sample/menu/DrawerAdapter.java | 111 --------------- .../sample/menu/DrawerAdapter.kt | 98 ++++++++++++++ .../sample/menu/DrawerItem.java | 30 ---- .../slidingrootnav/sample/menu/DrawerItem.kt | 23 ++++ .../sample/menu/SimpleItem.java | 78 ----------- .../slidingrootnav/sample/menu/SimpleItem.kt | 69 ++++++++++ .../slidingrootnav/sample/menu/SpaceItem.java | 46 ------- .../slidingrootnav/sample/menu/SpaceItem.kt | 29 ++++ sample/src/main/res/values/arrays.xml | 2 +- 30 files changed, 433 insertions(+), 452 deletions(-) delete mode 100644 sample/src/main/java/com/yarolegovich/slidingrootnav/sample/SampleActivity.java create mode 100644 sample/src/main/java/com/yarolegovich/slidingrootnav/sample/SampleActivity.kt delete mode 100644 sample/src/main/java/com/yarolegovich/slidingrootnav/sample/fragment/CenteredTextFragment.java create mode 100644 sample/src/main/java/com/yarolegovich/slidingrootnav/sample/fragment/CenteredTextFragment.kt delete mode 100644 sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerAdapter.java create mode 100644 sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerAdapter.kt delete mode 100644 sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerItem.java create mode 100644 sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerItem.kt delete mode 100644 sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/SimpleItem.java create mode 100644 sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/SimpleItem.kt delete mode 100644 sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/SpaceItem.java create mode 100644 sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/SpaceItem.kt diff --git a/build.gradle b/build.gradle index bac3273..6816333 100644 --- a/build.gradle +++ b/build.gradle @@ -36,4 +36,5 @@ ext { targetSdkVersion = 28 supportLibVersion = '1.0.0-beta01' -} \ No newline at end of file +} + diff --git a/library/build.gradle b/library/build.gradle index 8d74ba6..8053437 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -14,6 +14,7 @@ android { dependencies { implementation "androidx.appcompat:appcompat:$supportLibVersion" + implementation "androidx.annotation:annotation:1.0.1" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } @@ -28,4 +29,5 @@ publish { } repositories { mavenCentral() -} \ No newline at end of file +} + diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/SlideGravity.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/SlideGravity.kt index 0d31261..f399e09 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/SlideGravity.kt +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/SlideGravity.kt @@ -4,6 +4,7 @@ import androidx.customview.widget.ViewDragHelper /** * Created by yarolegovich on 25.03.2017. + * Edited by Mehdi on 27.02.2019 */ enum class SlideGravity { diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNav.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNav.kt index 982d252..03f6dd5 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNav.kt +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNav.kt @@ -2,9 +2,10 @@ package com.yarolegovich.slidingrootnav /** * Created by yarolegovich on 25.03.2017. + * Edited by Mehdi on 27.02.2019 */ -public interface SlidingRootNav { +interface SlidingRootNav { val isMenuClosed: Boolean diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavBuilder.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavBuilder.kt index a81cdca..71c4d32 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavBuilder.kt +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavBuilder.kt @@ -27,6 +27,7 @@ import java.util.Arrays /** * Created by yarolegovich on 24.03.2017. + * Edited by Mehdi on 27.02.2019 */ class SlidingRootNavBuilder(private val activity: Activity) { diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavLayout.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavLayout.kt index f3c106f..693a119 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavLayout.kt +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/SlidingRootNavLayout.kt @@ -19,6 +19,7 @@ import java.util.ArrayList /** * Created by yarolegovich on 24.03.2017. + * Edited by Mehdi on 27.02.2019 */ class SlidingRootNavLayout(context: Context) : FrameLayout(context), SlidingRootNav { diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragListener.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragListener.kt index ff87f58..8d2bb66 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragListener.kt +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragListener.kt @@ -2,6 +2,7 @@ package com.yarolegovich.slidingrootnav.callback /** * Created by yarolegovich on 25.03.2017. + * Edited by Mehdi on 27.02.2019 */ interface DragListener { diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragStateListener.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragStateListener.kt index d792ecc..10dfa61 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragStateListener.kt +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/callback/DragStateListener.kt @@ -2,6 +2,7 @@ package com.yarolegovich.slidingrootnav.callback /** * Created by yarolegovich on 25.03.2017. + * Edited by Mehdi on 27.02.2019 */ interface DragStateListener { diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/CompositeTransformation.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/CompositeTransformation.kt index 4f87b8a..d0a5bd8 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/CompositeTransformation.kt +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/CompositeTransformation.kt @@ -4,9 +4,11 @@ import android.view.View /** * Created by yarolegovich on 25.03.2017. + * Edited by Mehdi on 27.02.2019 */ -class CompositeTransformation(private val transformations: List) : RootTransformation { +class CompositeTransformation(private val transformations: List) + : RootTransformation { override fun transform(dragProgress: Float, rootView: View) { for (t in transformations) { diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ElevationTransformation.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ElevationTransformation.kt index 494f521..92f844d 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ElevationTransformation.kt +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ElevationTransformation.kt @@ -7,13 +7,17 @@ import com.yarolegovich.slidingrootnav.util.SideNavUtils /** * Created by yarolegovich on 25.03.2017. + * Edited by Mehdi on 27.02.2019 */ -class ElevationTransformation(private val endElevation: Float) : RootTransformation { +class ElevationTransformation(private val endElevation: Float) + : RootTransformation { override fun transform(dragProgress: Float, rootView: View) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - val elevation = SideNavUtils.evaluate(dragProgress, START_ELEVATION, endElevation) + val elevation = SideNavUtils.evaluate(dragProgress + , START_ELEVATION + , endElevation) rootView.elevation = elevation } } diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/RootTransformation.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/RootTransformation.kt index bc38b95..dc97ccd 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/RootTransformation.kt +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/RootTransformation.kt @@ -4,6 +4,7 @@ import android.view.View /** * Created by yarolegovich on 25.03.2017. + * Edited by Mehdi on 27.02.2019 */ interface RootTransformation { diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ScaleTransformation.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ScaleTransformation.kt index 71877a0..ef38863 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ScaleTransformation.kt +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/ScaleTransformation.kt @@ -6,12 +6,16 @@ import com.yarolegovich.slidingrootnav.util.SideNavUtils /** * Created by yarolegovich on 25.03.2017. + * Edited by Mehdi on 27.02.2019 */ -class ScaleTransformation(private val endScale: Float) : RootTransformation { +class ScaleTransformation(private val endScale: Float) + : RootTransformation { override fun transform(dragProgress: Float, rootView: View) { - val scale = SideNavUtils.evaluate(dragProgress, START_SCALE, endScale) + val scale = SideNavUtils.evaluate(dragProgress + , START_SCALE + , endScale) rootView.scaleX = scale rootView.scaleY = scale } diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/YTranslationTransformation.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/YTranslationTransformation.kt index 84d3008..3198b72 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/transform/YTranslationTransformation.kt +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/transform/YTranslationTransformation.kt @@ -6,12 +6,15 @@ import com.yarolegovich.slidingrootnav.util.SideNavUtils /** * Created by yarolegovich on 25.03.2017. + * Edited by Mehdi on 27.02.2019 */ class YTranslationTransformation(private val endTranslation: Float) : RootTransformation { override fun transform(dragProgress: Float, rootView: View) { - val translation = SideNavUtils.evaluate(dragProgress, START_TRANSLATION, endTranslation) + val translation = SideNavUtils.evaluate(dragProgress + , START_TRANSLATION + , endTranslation) rootView.translationY = translation } diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/util/ActionBarToggleAdapter.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/util/ActionBarToggleAdapter.kt index 40aa130..bbfca15 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/util/ActionBarToggleAdapter.kt +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/util/ActionBarToggleAdapter.kt @@ -7,6 +7,7 @@ import com.yarolegovich.slidingrootnav.SlidingRootNavLayout /** * Created by yarolegovich on 26.03.2017. + * Edited by Mehdi on 27.02.2019 */ class ActionBarToggleAdapter(context: Context) : DrawerLayout(context) { diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/util/DrawerListenerAdapter.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/util/DrawerListenerAdapter.kt index 680003b..523a11f 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/util/DrawerListenerAdapter.kt +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/util/DrawerListenerAdapter.kt @@ -8,6 +8,7 @@ import com.yarolegovich.slidingrootnav.callback.DragStateListener /** * Created by yarolegovich on 26.03.2017. + * Edited by Mehdi on 27.02.2019 */ class DrawerListenerAdapter(private val adaptee: DrawerLayout.DrawerListener, private val drawer: View) : DragListener, DragStateListener { diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/util/HiddenMenuClickConsumer.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/util/HiddenMenuClickConsumer.kt index d0d586f..321500d 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/util/HiddenMenuClickConsumer.kt +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/util/HiddenMenuClickConsumer.kt @@ -8,6 +8,7 @@ import com.yarolegovich.slidingrootnav.SlidingRootNavLayout /** * Created by yarolegovich on 26.03.2017. + * Edited by Mehdi on 27.02.2019 */ class HiddenMenuClickConsumer(context: Context) : View(context) { diff --git a/library/src/main/java/com/yarolegovich/slidingrootnav/util/SideNavUtils.kt b/library/src/main/java/com/yarolegovich/slidingrootnav/util/SideNavUtils.kt index 35905c0..698550c 100644 --- a/library/src/main/java/com/yarolegovich/slidingrootnav/util/SideNavUtils.kt +++ b/library/src/main/java/com/yarolegovich/slidingrootnav/util/SideNavUtils.kt @@ -2,11 +2,14 @@ package com.yarolegovich.slidingrootnav.util /** * Created by yarolegovich on 25.03.2017. + * Edited by Mehdi on 27.02.2019 */ object SideNavUtils { - fun evaluate(fraction: Float, startValue: Float, endValue: Float): Float { + fun evaluate(fraction: Float + , startValue: Float + , endValue: Float): Float { return startValue + fraction * (endValue - startValue) } } diff --git a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/SampleActivity.java b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/SampleActivity.java deleted file mode 100644 index 40fcacf..0000000 --- a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/SampleActivity.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.yarolegovich.slidingrootnav.sample; - -import android.app.Fragment; -import android.content.res.TypedArray; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import androidx.annotation.ColorInt; -import androidx.annotation.ColorRes; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; -import androidx.appcompat.app.AppCompatActivity; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.appcompat.widget.Toolbar; - -import com.yarolegovich.slidingrootnav.SlidingRootNav; -import com.yarolegovich.slidingrootnav.SlidingRootNavBuilder; -import com.yarolegovich.slidingrootnav.sample.menu.DrawerAdapter; -import com.yarolegovich.slidingrootnav.sample.menu.DrawerItem; -import com.yarolegovich.slidingrootnav.sample.menu.SimpleItem; -import com.yarolegovich.slidingrootnav.sample.menu.SpaceItem; -import com.yarolegovich.slidingrootnav.sample.fragment.CenteredTextFragment; - -import java.util.Arrays; - -/** - * Created by yarolegovich on 25.03.2017. - */ - -public class SampleActivity extends AppCompatActivity implements DrawerAdapter.OnItemSelectedListener { - - private static final int POS_DASHBOARD = 0; - private static final int POS_ACCOUNT = 1; - private static final int POS_MESSAGES = 2; - private static final int POS_CART = 3; - private static final int POS_LOGOUT = 5; - - private String[] screenTitles; - private Drawable[] screenIcons; - - private SlidingRootNav slidingRootNav; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - - SlidingRootNavBuilder slidingRootNavBuilder = new SlidingRootNavBuilder(this) - .withToolbarMenuToggle(toolbar) - .withMenuOpened(false) - .withContentClickableWhenMenuOpened(false) - .withMenuLayout(R.layout.menu_left_drawer); - - if (savedInstanceState != null) { - slidingRootNavBuilder.withSavedState(savedInstanceState); - } - - slidingRootNav = slidingRootNavBuilder.inject(); - - screenIcons = loadScreenIcons(); - screenTitles = loadScreenTitles(); - - DrawerAdapter adapter = new DrawerAdapter(Arrays.asList( - createItemFor(POS_DASHBOARD).setChecked(true), - createItemFor(POS_ACCOUNT), - createItemFor(POS_MESSAGES), - createItemFor(POS_CART), - new SpaceItem(48), - createItemFor(POS_LOGOUT))); - adapter.setListener(this); - - RecyclerView list = findViewById(R.id.list); - list.setNestedScrollingEnabled(false); - list.setLayoutManager(new LinearLayoutManager(this)); - list.setAdapter(adapter); - - adapter.setSelected(POS_DASHBOARD); - } - - @Override - public void onItemSelected(int position) { - if (position == POS_LOGOUT) { - finish(); - } - slidingRootNav.closeMenu(); - Fragment selectedScreen = CenteredTextFragment.createFor(screenTitles[position]); - showFragment(selectedScreen); - } - - private void showFragment(Fragment fragment) { - getFragmentManager().beginTransaction() - .replace(R.id.container, fragment) - .commit(); - } - - private DrawerItem createItemFor(int position) { - return new SimpleItem(screenIcons[position], screenTitles[position]) - .withIconTint(color(R.color.textColorSecondary)) - .withTextTint(color(R.color.textColorPrimary)) - .withSelectedIconTint(color(R.color.colorAccent)) - .withSelectedTextTint(color(R.color.colorAccent)); - } - - private String[] loadScreenTitles() { - return getResources().getStringArray(R.array.ld_activityScreenTitles); - } - - private Drawable[] loadScreenIcons() { - TypedArray ta = getResources().obtainTypedArray(R.array.ld_activityScreenIcons); - Drawable[] icons = new Drawable[ta.length()]; - for (int i = 0; i < ta.length(); i++) { - int id = ta.getResourceId(i, 0); - if (id != 0) { - icons[i] = ContextCompat.getDrawable(this, id); - } - } - ta.recycle(); - return icons; - } - - @ColorInt - private int color(@ColorRes int res) { - return ContextCompat.getColor(this, res); - } -} diff --git a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/SampleActivity.kt b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/SampleActivity.kt new file mode 100644 index 0000000..456d014 --- /dev/null +++ b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/SampleActivity.kt @@ -0,0 +1,128 @@ +package com.yarolegovich.slidingrootnav.sample + + +import android.graphics.drawable.Drawable +import android.os.Bundle +import androidx.annotation.ColorInt +import androidx.annotation.ColorRes +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.LinearLayoutManager +import com.yarolegovich.slidingrootnav.SlidingRootNav +import com.yarolegovich.slidingrootnav.SlidingRootNavBuilder +import com.yarolegovich.slidingrootnav.sample.fragment.CenteredTextFragment +import com.yarolegovich.slidingrootnav.sample.menu.DrawerAdapter +import com.yarolegovich.slidingrootnav.sample.menu.DrawerItem +import com.yarolegovich.slidingrootnav.sample.menu.SimpleItem +import com.yarolegovich.slidingrootnav.sample.menu.SpaceItem +import kotlinx.android.synthetic.main.activity_main.* +import kotlinx.android.synthetic.main.menu_left_drawer.* +import java.util.* + + +/** + * Created by yarolegovich on 25.03.2017. + * Edited by Mehdi on 27.02.2019 + */ + +class SampleActivity : AppCompatActivity(), DrawerAdapter.OnItemSelectedListener { + + private var screenTitles: Array? = null + private var screenIcons: Array? = null + private var slidingRootNav: SlidingRootNav? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + val toolbar = toolbar + setSupportActionBar(toolbar) + + val slidingRootNavBuilder = SlidingRootNavBuilder(this) + .withToolbarMenuToggle(toolbar) + .withMenuOpened(false) + .withContentClickableWhenMenuOpened(false) + .withMenuLayout(R.layout.menu_left_drawer) + + if (savedInstanceState != null) { + slidingRootNavBuilder.withSavedState(savedInstanceState) + } + + slidingRootNav = slidingRootNavBuilder.inject() + screenIcons = loadScreenIconse() + screenTitles = loadScreenTitles() + + val testList: List> = Arrays.asList( + createItemFor(POS_DASHBOARD).setChecked(true), + createItemFor(POS_ACCOUNT), + createItemFor(POS_MESSAGES), + createItemFor(POS_CART), + SpaceItem(48), + createItemFor(POS_LOGOUT)) as List> + + val adapter = DrawerAdapter(testList) + adapter.setListener(this) + + val list = list + list.isNestedScrollingEnabled = false + list.layoutManager = LinearLayoutManager(this) + list.adapter = adapter + + adapter.setSelected(POS_DASHBOARD) + } + + override fun onItemSelected(position: Int) { + if (position == POS_LOGOUT) { + finish() + } + slidingRootNav!!.closeMenu() + val selectedScreen = CenteredTextFragment.createFor(screenTitles!![position]) + showFragment(selectedScreen) + } + + private fun showFragment(fragment: androidx.fragment.app.Fragment) { + supportFragmentManager.beginTransaction() + .replace(R.id.container, fragment) + .commit() + } + + private fun createItemFor(position: Int): DrawerItem<*> { + return SimpleItem(screenIcons!![position]!! + , screenTitles!![position]) + .withIconTint(color(R.color.textColorSecondary)) + .withTextTint(color(R.color.textColorPrimary)) + .withSelectedIconTint(color(R.color.colorAccent)) + .withSelectedTextTint(color(R.color.colorAccent)) + } + + private fun loadScreenTitles(): Array { + return resources.getStringArray(R.array.ld_activityScreenTitles) + } + + private fun loadScreenIconse(): Array { + val ta = resources.obtainTypedArray(R.array.ld_activityScreenIcons) + val icons = arrayOfNulls(ta.length()) + for (i in 0 until ta.length()) { + val id = ta.getResourceId(i, 0) + if (id != 0) { + icons[i] = ContextCompat.getDrawable(this, id) + } + } + ta.recycle() + return icons + } + + @ColorInt + private fun color(@ColorRes res: Int): Int { + return ContextCompat.getColor(this, res) + } + + companion object { + + private val POS_DASHBOARD = 0 + private val POS_ACCOUNT = 1 + private val POS_MESSAGES = 2 + private val POS_CART = 3 + private val POS_LOGOUT = 5 + } +} diff --git a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/fragment/CenteredTextFragment.java b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/fragment/CenteredTextFragment.java deleted file mode 100644 index b2ef7d4..0000000 --- a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/fragment/CenteredTextFragment.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.yarolegovich.slidingrootnav.sample.fragment; - -import android.app.Fragment; -import android.os.Bundle; -import androidx.annotation.Nullable; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; -import android.widget.Toast; - -import com.yarolegovich.slidingrootnav.sample.R; - - -/** - * Created by yarolegovich on 25.03.2017. - */ - -public class CenteredTextFragment extends Fragment { - - private static final String EXTRA_TEXT = "text"; - - public static CenteredTextFragment createFor(String text) { - CenteredTextFragment fragment = new CenteredTextFragment(); - Bundle args = new Bundle(); - args.putString(EXTRA_TEXT, text); - fragment.setArguments(args); - return fragment; - } - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_text, container, false); - } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - final String text = getArguments().getString(EXTRA_TEXT); - TextView textView = view.findViewById(R.id.text); - textView.setText(text); - textView.setOnClickListener(new View.OnClickListener() { - @Override public void onClick(View v) { - Toast.makeText(v.getContext(), text, Toast.LENGTH_SHORT).show(); - } - }); - } -} diff --git a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/fragment/CenteredTextFragment.kt b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/fragment/CenteredTextFragment.kt new file mode 100644 index 0000000..ad2de03 --- /dev/null +++ b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/fragment/CenteredTextFragment.kt @@ -0,0 +1,46 @@ +package com.yarolegovich.slidingrootnav.sample.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import android.widget.Toast + +import com.yarolegovich.slidingrootnav.sample.R + + +/** + * Created by yarolegovich on 25.03.2017. + * Edited by Mehdi on 27.02.2019 + */ + +class CenteredTextFragment : androidx.fragment.app.Fragment() { + + override fun onCreateView(inflater: LayoutInflater + , container: ViewGroup? + , savedInstanceState: Bundle?): View? + { + return inflater.inflate(R.layout.fragment_text, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + val text = arguments?.getString(EXTRA_TEXT) + val textView = view.findViewById(R.id.text) + textView.text = text + textView.setOnClickListener { v -> Toast.makeText(v.context, text, Toast.LENGTH_SHORT).show() } + } + + companion object { + + private val EXTRA_TEXT = "text" + + fun createFor(text: String): CenteredTextFragment { + val fragment = CenteredTextFragment() + val args = Bundle() + args.putString(EXTRA_TEXT, text) + fragment.arguments = args + return fragment + } + } +} diff --git a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerAdapter.java b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerAdapter.java deleted file mode 100644 index 93bb950..0000000 --- a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerAdapter.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.yarolegovich.slidingrootnav.sample.menu; - -import androidx.recyclerview.widget.RecyclerView; -import android.util.SparseArray; -import android.view.View; -import android.view.ViewGroup; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Created by yarolegovich on 25.03.2017. - */ - -public class DrawerAdapter extends RecyclerView.Adapter { - - private List items; - private Map, Integer> viewTypes; - private SparseArray holderFactories; - - private OnItemSelectedListener listener; - - public DrawerAdapter(List items) { - this.items = items; - this.viewTypes = new HashMap<>(); - this.holderFactories = new SparseArray<>(); - - processViewTypes(); - } - - @Override - public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - ViewHolder holder = holderFactories.get(viewType).createViewHolder(parent); - holder.adapter = this; - return holder; - } - - @Override - @SuppressWarnings("unchecked") - public void onBindViewHolder(ViewHolder holder, int position) { - items.get(position).bindViewHolder(holder); - } - - @Override - public int getItemCount() { - return items.size(); - } - - @Override - public int getItemViewType(int position) { - return viewTypes.get(items.get(position).getClass()); - } - - private void processViewTypes() { - int type = 0; - for (DrawerItem item : items) { - if (!viewTypes.containsKey(item.getClass())) { - viewTypes.put(item.getClass(), type); - holderFactories.put(type, item); - type++; - } - } - } - - public void setSelected(int position) { - DrawerItem newChecked = items.get(position); - if (!newChecked.isSelectable()) { - return; - } - - for (int i = 0; i < items.size(); i++) { - DrawerItem item = items.get(i); - if (item.isChecked()) { - item.setChecked(false); - notifyItemChanged(i); - break; - } - } - - newChecked.setChecked(true); - notifyItemChanged(position); - - if (listener != null) { - listener.onItemSelected(position); - } - } - - public void setListener(OnItemSelectedListener listener) { - this.listener = listener; - } - - static abstract class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { - - private DrawerAdapter adapter; - - public ViewHolder(View itemView) { - super(itemView); - itemView.setOnClickListener(this); - } - - @Override - public void onClick(View v) { - adapter.setSelected(getAdapterPosition()); - } - } - - public interface OnItemSelectedListener { - void onItemSelected(int position); - } -} diff --git a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerAdapter.kt b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerAdapter.kt new file mode 100644 index 0000000..8286864 --- /dev/null +++ b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerAdapter.kt @@ -0,0 +1,98 @@ +package com.yarolegovich.slidingrootnav.sample.menu + +import androidx.recyclerview.widget.RecyclerView +import android.util.SparseArray +import android.view.View +import android.view.ViewGroup + + +/** + * Created by yarolegovich on 25.03.2017. + * Edited by Mehdi on 27.02.2019 + */ + +class DrawerAdapter(private var items: List>) + : RecyclerView.Adapter() { + + private var viewTypes: HashMap>, Int> = HashMap() + private var holderFactories: SparseArray> = SparseArray() + + private var listener: OnItemSelectedListener? = null + + init { + processViewTypes() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val holder = holderFactories.get(viewType).createViewHolder(parent) + holder.adapter = this + return holder + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + items[position].bindViewHolder(holder) + } + + override fun getItemCount(): Int { + return items.size + } + + override fun getItemViewType(position: Int): Int { + return viewTypes[items[position].javaClass]!! + } + + private fun processViewTypes() { + var type = 0 + for (item in items) { + if (!viewTypes.containsKey(item.javaClass)) { + viewTypes[item.javaClass] = type + holderFactories.put(type, item) + type++ + } + } + } + + fun setSelected(position: Int) { + val newChecked = items[position] + if (!newChecked.isSelectable) { + return + } + + for (i in items.indices) { + val item = items[i] + if (item.isChecked) { + item.isChecked = false + notifyItemChanged(i) + break + } + } + + newChecked.isChecked = true + notifyItemChanged(position) + + if (listener != null) { + listener!!.onItemSelected(position) + } + } + + fun setListener(listener: OnItemSelectedListener) { + this.listener = listener + } + + abstract class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener { + + var adapter: DrawerAdapter? = null + + init { + itemView.setOnClickListener(this) + } + + override fun onClick(v: View) { + adapter!!.setSelected(adapterPosition) + } + } + + interface OnItemSelectedListener { + fun onItemSelected(position: Int) + } +} diff --git a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerItem.java b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerItem.java deleted file mode 100644 index 932374b..0000000 --- a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerItem.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.yarolegovich.slidingrootnav.sample.menu; - -import android.view.ViewGroup; - -/** - * Created by yarolegovich on 25.03.2017. - */ - -public abstract class DrawerItem { - - protected boolean isChecked; - - public abstract T createViewHolder(ViewGroup parent); - - public abstract void bindViewHolder(T holder); - - public DrawerItem setChecked(boolean isChecked) { - this.isChecked = isChecked; - return this; - } - - public boolean isChecked() { - return isChecked; - } - - public boolean isSelectable() { - return true; - } - -} diff --git a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerItem.kt b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerItem.kt new file mode 100644 index 0000000..9b3a8a1 --- /dev/null +++ b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/DrawerItem.kt @@ -0,0 +1,23 @@ +package com.yarolegovich.slidingrootnav.sample.menu + +import android.view.ViewGroup + +/** + * Created by yarolegovich on 25.03.2017. + * Edited by Mehdi on 27.02.2019 + */ + +abstract class DrawerItem { + + var isChecked: Boolean = false + open var isSelectable: Boolean = true + + fun setChecked(isChecked: Boolean): DrawerItem { + this.isChecked = isChecked + return this + } + + abstract fun createViewHolder(parent: ViewGroup): T + + abstract fun bindViewHolder(holder: T) +} diff --git a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/SimpleItem.java b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/SimpleItem.java deleted file mode 100644 index 3fc596f..0000000 --- a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/SimpleItem.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.yarolegovich.slidingrootnav.sample.menu; - -import android.graphics.drawable.Drawable; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import com.yarolegovich.slidingrootnav.sample.R; - -/** - * Created by yarolegovich on 25.03.2017. - */ -public class SimpleItem extends DrawerItem { - - private int selectedItemIconTint; - private int selectedItemTextTint; - - private int normalItemIconTint; - private int normalItemTextTint; - - private Drawable icon; - private String title; - - public SimpleItem(Drawable icon, String title) { - this.icon = icon; - this.title = title; - } - - @Override - public ViewHolder createViewHolder(ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - View v = inflater.inflate(R.layout.item_option, parent, false); - return new ViewHolder(v); - } - - @Override - public void bindViewHolder(ViewHolder holder) { - holder.title.setText(title); - holder.icon.setImageDrawable(icon); - - holder.title.setTextColor(isChecked ? selectedItemTextTint : normalItemTextTint); - holder.icon.setColorFilter(isChecked ? selectedItemIconTint : normalItemIconTint); - } - - public SimpleItem withSelectedIconTint(int selectedItemIconTint) { - this.selectedItemIconTint = selectedItemIconTint; - return this; - } - - public SimpleItem withSelectedTextTint(int selectedItemTextTint) { - this.selectedItemTextTint = selectedItemTextTint; - return this; - } - - public SimpleItem withIconTint(int normalItemIconTint) { - this.normalItemIconTint = normalItemIconTint; - return this; - } - - public SimpleItem withTextTint(int normalItemTextTint) { - this.normalItemTextTint = normalItemTextTint; - return this; - } - - static class ViewHolder extends DrawerAdapter.ViewHolder { - - private ImageView icon; - private TextView title; - - public ViewHolder(View itemView) { - super(itemView); - icon = (ImageView) itemView.findViewById(R.id.icon); - title = (TextView) itemView.findViewById(R.id.title); - } - } -} diff --git a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/SimpleItem.kt b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/SimpleItem.kt new file mode 100644 index 0000000..3527d98 --- /dev/null +++ b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/SimpleItem.kt @@ -0,0 +1,69 @@ +package com.yarolegovich.slidingrootnav.sample.menu + +import android.graphics.drawable.Drawable +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView + +import com.yarolegovich.slidingrootnav.sample.R + +/** + * Created by yarolegovich on 25.03.2017. + * Edited by Mehdi on 27.02.2019 + */ +class SimpleItem(private val icon: Drawable, private val title: String) + : DrawerItem() { + + private var selectedItemIconTint: Int = 0 + private var selectedItemTextTint: Int = 0 + + private var normalItemIconTint: Int = 0 + private var normalItemTextTint: Int = 0 + + override fun createViewHolder(parent: ViewGroup): ViewHolder { + val inflater = LayoutInflater.from(parent.context) + val v = inflater.inflate(R.layout.item_option, parent, false) + return ViewHolder(v) + } + + override fun bindViewHolder(holder: ViewHolder) { + holder.title.text = title + holder.icon.setImageDrawable(icon) + + holder.title.setTextColor(if (isChecked) selectedItemTextTint else normalItemTextTint) + holder.icon.setColorFilter(if (isChecked) selectedItemIconTint else normalItemIconTint) + } + + fun withSelectedIconTint(selectedItemIconTint: Int): SimpleItem { + this.selectedItemIconTint = selectedItemIconTint + return this + } + + fun withSelectedTextTint(selectedItemTextTint: Int): SimpleItem { + this.selectedItemTextTint = selectedItemTextTint + return this + } + + fun withIconTint(normalItemIconTint: Int): SimpleItem { + this.normalItemIconTint = normalItemIconTint + return this + } + + fun withTextTint(normalItemTextTint: Int): SimpleItem { + this.normalItemTextTint = normalItemTextTint + return this + } + + class ViewHolder(itemView: View) : DrawerAdapter.ViewHolder(itemView) { + + val icon: ImageView + val title: TextView + + init { + icon = itemView.findViewById(R.id.icon) as ImageView + title = itemView.findViewById(R.id.title) as TextView + } + } +} diff --git a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/SpaceItem.java b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/SpaceItem.java deleted file mode 100644 index 7ae76cc..0000000 --- a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/SpaceItem.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.yarolegovich.slidingrootnav.sample.menu; - -import android.content.Context; -import android.view.View; -import android.view.ViewGroup; - -/** - * Created by yarolegovich on 25.03.2017. - */ - -public class SpaceItem extends DrawerItem { - - private int spaceDp; - - public SpaceItem(int spaceDp) { - this.spaceDp = spaceDp; - } - - @Override - public ViewHolder createViewHolder(ViewGroup parent) { - Context c = parent.getContext(); - View view = new View(c); - int height = (int) (c.getResources().getDisplayMetrics().density * spaceDp); - view.setLayoutParams(new ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - height)); - return new ViewHolder(view); - } - - @Override - public void bindViewHolder(ViewHolder holder) { - - } - - @Override - public boolean isSelectable() { - return false; - } - - static class ViewHolder extends DrawerAdapter.ViewHolder { - - public ViewHolder(View itemView) { - super(itemView); - } - } -} diff --git a/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/SpaceItem.kt b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/SpaceItem.kt new file mode 100644 index 0000000..c3335d8 --- /dev/null +++ b/sample/src/main/java/com/yarolegovich/slidingrootnav/sample/menu/SpaceItem.kt @@ -0,0 +1,29 @@ +package com.yarolegovich.slidingrootnav.sample.menu + +import android.content.Context +import android.view.View +import android.view.ViewGroup + +/** + * Created by yarolegovich on 25.03.2017. + * Edited by Mehdi on 27.02.2019 + */ + +class SpaceItem(private val spaceDp: Int) : DrawerItem() { + + override var isSelectable: Boolean = false + + override fun createViewHolder(parent: ViewGroup): ViewHolder { + val c = parent.context + val view = View(c) + val height = (c.resources.displayMetrics.density * spaceDp).toInt() + view.layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + height) + return ViewHolder(view) + } + + override fun bindViewHolder(holder: ViewHolder) {} + + class ViewHolder(itemView: View) : DrawerAdapter.ViewHolder(itemView) +} diff --git a/sample/src/main/res/values/arrays.xml b/sample/src/main/res/values/arrays.xml index 164e1c7..5a31bcf 100644 --- a/sample/src/main/res/values/arrays.xml +++ b/sample/src/main/res/values/arrays.xml @@ -6,7 +6,7 @@ My Account Messages Cart - + Log Out