From ee0faab2649b9ca8c12ff0d50c3ac1e4c57bdd11 Mon Sep 17 00:00:00 2001 From: Joe Date: Thu, 28 Feb 2019 16:12:05 -0600 Subject: [PATCH] refactor --- .../bottomnavbar/ExampleInstrumentedTest.java | 26 ----------- .../joetr/com/bottomnavbar/BottomNavBar.kt | 46 +++++++++++++++++-- .../com/bottomnavbar/BottomNavBarIcon.kt | 42 ++++++++++------- .../com/bottomnavbar/ExampleUnitTest.java | 17 ------- .../joetr/com/bottomnavbar/ExampleUnitTest.kt | 16 +++++++ 5 files changed, 83 insertions(+), 64 deletions(-) delete mode 100644 bottomnavbar/src/androidTest/java/joetr/com/bottomnavbar/ExampleInstrumentedTest.java delete mode 100644 bottomnavbar/src/test/java/joetr/com/bottomnavbar/ExampleUnitTest.java create mode 100644 bottomnavbar/src/test/java/joetr/com/bottomnavbar/ExampleUnitTest.kt diff --git a/bottomnavbar/src/androidTest/java/joetr/com/bottomnavbar/ExampleInstrumentedTest.java b/bottomnavbar/src/androidTest/java/joetr/com/bottomnavbar/ExampleInstrumentedTest.java deleted file mode 100644 index 9d29166..0000000 --- a/bottomnavbar/src/androidTest/java/joetr/com/bottomnavbar/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package joetr.com.bottomnavbar; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("joetr.com.bottomnavbar.test", appContext.getPackageName()); - } -} diff --git a/bottomnavbar/src/main/java/joetr/com/bottomnavbar/BottomNavBar.kt b/bottomnavbar/src/main/java/joetr/com/bottomnavbar/BottomNavBar.kt index 421157b..3f2e88e 100644 --- a/bottomnavbar/src/main/java/joetr/com/bottomnavbar/BottomNavBar.kt +++ b/bottomnavbar/src/main/java/joetr/com/bottomnavbar/BottomNavBar.kt @@ -12,16 +12,22 @@ import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat import androidx.core.view.children +/** + * Container for [BottomNavBarIcon] + */ class BottomNavBar @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : ConstraintLayout(context, attrs, defStyleAttr) { init { + //make sure all children are attached post { children.forEach { child -> if(child is BottomNavBarIcon) { child.container().setOnClickListener { - handleInput(child, child.parent as BottomNavBar) + handleClick(child, child.parent as BottomNavBar) + + //perform custom click if user registered custom click child.performCustomClick() } } @@ -29,7 +35,15 @@ class BottomNavBar @JvmOverloads constructor( } } - private fun handleInput(bottomNavBarIcon: BottomNavBarIcon, parent: BottomNavBar) { + /** + * Handles click for icon + * + * Responsible for animating the clicked one to be selected, as well as deselecting other tabs. + * + * @param bottomNavBarIcon - Icon that was clicked on + * @param parent - Parent [BottomNavBar] + */ + private fun handleClick(bottomNavBarIcon: BottomNavBarIcon, parent: BottomNavBar) { val transition = ChangeBounds() transition.interpolator = OvershootInterpolator(2.0f) transition.duration = 400 @@ -38,17 +52,41 @@ class BottomNavBar @JvmOverloads constructor( val set = ConstraintSet() + selectEnabledIcon(set, bottomNavBarIcon) + + disableOtherIcons(parent, set, bottomNavBarIcon) + } + + /** + * Selects icon + * + * @param set - constraint set + * @param bottomNavBarIcon - icon + */ + private fun selectEnabledIcon(set: ConstraintSet, bottomNavBarIcon: BottomNavBarIcon) { set.clone(bottomNavBarIcon.container()) bottomNavBarIcon.setVisibilityOfText(set, View.VISIBLE) - bottomNavBarIcon.updateBackground() + bottomNavBarIcon.setBackgroundTint() set.applyTo(bottomNavBarIcon.container()) + } + /** + * Deselects other icons + * + * @param parent - [BottomNavBar] container + * @param set - ConstraintSet + */ + private fun disableOtherIcons( + parent: BottomNavBar, + set: ConstraintSet, + bottomNavBarIcon: BottomNavBarIcon + ) { parent.children.forEach { view -> if(view.id != bottomNavBarIcon.id && view is BottomNavBarIcon) { set.clone(view.container()) view.setVisibilityOfText(set, View.GONE) - DrawableCompat.setTint(view.navBackground(), ContextCompat.getColor(context, android.R.color.transparent)) + DrawableCompat.setTint(view.container().background, ContextCompat.getColor(context, android.R.color.transparent)) set.applyTo(view.container()) } diff --git a/bottomnavbar/src/main/java/joetr/com/bottomnavbar/BottomNavBarIcon.kt b/bottomnavbar/src/main/java/joetr/com/bottomnavbar/BottomNavBarIcon.kt index a408c96..09af575 100644 --- a/bottomnavbar/src/main/java/joetr/com/bottomnavbar/BottomNavBarIcon.kt +++ b/bottomnavbar/src/main/java/joetr/com/bottomnavbar/BottomNavBarIcon.kt @@ -1,7 +1,6 @@ package joetr.com.bottomnavbar import android.content.Context -import android.graphics.drawable.Drawable import android.util.AttributeSet import android.view.LayoutInflater import android.view.View @@ -11,6 +10,9 @@ import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat import kotlinx.android.synthetic.main.nav_bar_icon.view.* +/** + * Icon to be contained in [BottomNavBar] + */ class BottomNavBarIcon @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : ConstraintLayout(context, attrs, defStyleAttr) { @@ -46,33 +48,39 @@ class BottomNavBarIcon @JvmOverloads constructor( } } - private fun textViewId(): Int { - return bottomNavBarText.id - } - - - fun navBackground(): Drawable { - return bottomNavBarContainer.background - } - + /** + * Set visibility of only TextView + * + * @param set - ConstraintSet + * @param visibility - Visibility Int + */ fun setVisibilityOfText(set: ConstraintSet, visibility: Int) { - set.setVisibility(textViewId(), visibility) - } - - fun container(): ConstraintLayout { - return bottomNavBarContainer + set.setVisibility(bottomNavBarText.id, visibility) } - fun updateBackground() { - DrawableCompat.setTint(navBackground(), foregroundTint) + /** + * Set background tint + */ + fun setBackgroundTint() { + DrawableCompat.setTint(container().background, foregroundTint) } + /** + * Register click listener. + * + * This is the mechanism for having a developer get notified of a click event + */ fun registerClickListener(clickListener: View.OnClickListener) { this.clickListener = clickListener } + /** + * If developer registered a click listener, call it. + */ fun performCustomClick() { clickListener?.onClick(container()) } + + fun container() = bottomNavBarContainer!! } diff --git a/bottomnavbar/src/test/java/joetr/com/bottomnavbar/ExampleUnitTest.java b/bottomnavbar/src/test/java/joetr/com/bottomnavbar/ExampleUnitTest.java deleted file mode 100644 index cceea70..0000000 --- a/bottomnavbar/src/test/java/joetr/com/bottomnavbar/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package joetr.com.bottomnavbar; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file diff --git a/bottomnavbar/src/test/java/joetr/com/bottomnavbar/ExampleUnitTest.kt b/bottomnavbar/src/test/java/joetr/com/bottomnavbar/ExampleUnitTest.kt new file mode 100644 index 0000000..5bc8f06 --- /dev/null +++ b/bottomnavbar/src/test/java/joetr/com/bottomnavbar/ExampleUnitTest.kt @@ -0,0 +1,16 @@ +package joetr.com.bottomnavbar + +import org.junit.Assert.assertEquals +import org.junit.Test + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see [Testing documentation](http://d.android.com/tools/testing) + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, (2 + 2).toLong()) + } +} \ No newline at end of file