From eddcf472054c14b0353b4a6db524229fddeff283 Mon Sep 17 00:00:00 2001
From: Piotr Dec <piotr_dec@msn.com>
Date: Sat, 17 Aug 2024 00:14:53 +0200
Subject: [PATCH] feat: UI basics (#6)

---
 app/src/main/java/eu/ztsh/garmin/UI.kt        |   2 +
 .../eu/ztsh/garmin/view/ExtendableButton.kt   | 119 ++++++++++++++++++
 app/src/main/res/layout/activity_main.xml     |  11 ++
 app/src/main/res/values/attrs.xml             |   7 ++
 app/src/main/res/values/strings.xml           |   2 +
 5 files changed, 141 insertions(+)
 create mode 100644 app/src/main/java/eu/ztsh/garmin/view/ExtendableButton.kt
 create mode 100644 app/src/main/res/values/attrs.xml

diff --git a/app/src/main/java/eu/ztsh/garmin/UI.kt b/app/src/main/java/eu/ztsh/garmin/UI.kt
index c16bae5..0277486 100644
--- a/app/src/main/java/eu/ztsh/garmin/UI.kt
+++ b/app/src/main/java/eu/ztsh/garmin/UI.kt
@@ -59,4 +59,6 @@ class UI(b: ActivityMainBinding) {
     val searchResultsView = b.searchResults
     val searchPlaceView = b.searchPlaces
     val queryEditText = b.query
+
+    val reconnect = b.reconnect
 }
\ No newline at end of file
diff --git a/app/src/main/java/eu/ztsh/garmin/view/ExtendableButton.kt b/app/src/main/java/eu/ztsh/garmin/view/ExtendableButton.kt
new file mode 100644
index 0000000..7ada0b3
--- /dev/null
+++ b/app/src/main/java/eu/ztsh/garmin/view/ExtendableButton.kt
@@ -0,0 +1,119 @@
+package eu.ztsh.garmin.view
+
+import android.content.Context
+import android.content.res.TypedArray
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import androidx.annotation.StyleRes
+import androidx.annotation.UiThread
+import androidx.constraintlayout.widget.ConstraintLayout
+import com.mapbox.navigation.ui.components.R
+import eu.ztsh.garmin.R.styleable.*
+import com.mapbox.navigation.ui.components.databinding.ExtendableButtonLayoutBinding
+import com.mapbox.navigation.ui.utils.internal.ExtendableButtonHelper
+
+/**
+ * Mapbox extendable generic.
+ */
+@UiThread
+class ExtendableButton : ConstraintLayout {
+
+    private val binding = ExtendableButtonLayoutBinding.inflate(LayoutInflater.from(context), this)
+    private val helper = ExtendableButtonHelper(
+        binding.buttonText,
+        context.resources.getDimensionPixelSize(R.dimen.mapbox_button_size),
+        context.resources.getDimension(R.dimen.mapbox_recenterButton_minExtendedWidth),
+    )
+    private lateinit var expandedText: String
+
+    /**
+     *
+     * @param context Context
+     * @constructor
+     */
+    constructor(context: Context) : super(context)
+
+    /**
+     *
+     * @param context Context
+     * @param attrs AttributeSet?
+     * @constructor
+     */
+    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
+        initAttributes(attrs)
+    }
+
+    /**
+     *
+     * @param context Context
+     * @param attrs AttributeSet?
+     * @param defStyleAttr Int
+     * @constructor
+     */
+    constructor(
+        context: Context,
+        attrs: AttributeSet?,
+        defStyleAttr: Int
+    ) : super(context, attrs, defStyleAttr) {
+        initAttributes(attrs)
+    }
+
+    /**
+     * Allows you to change the style of [ExtendableButton].
+     * @param style Int
+     */
+    fun updateStyle(@StyleRes style: Int) {
+        val typedArray = context.obtainStyledAttributes(
+            style,
+            ExtendableButton
+        )
+        applyAttributes(typedArray)
+        typedArray.recycle()
+    }
+
+    /**
+     * Invoke the function to show optional text associated with the view.
+     * @param duration for the view to be in the extended mode before it starts to shrink.
+     * @param text for the view to show in the extended mode.
+     */
+    @JvmOverloads
+    fun showTextAndExtend(
+        duration: Long,
+        text: String = expandedText,
+    ) {
+        if (!helper.isAnimationRunning) {
+            helper.showTextAndExtend(text, duration)
+        }
+    }
+
+    private fun initAttributes(attrs: AttributeSet?) {
+        val typedArray = context.obtainStyledAttributes(
+            attrs,
+            ExtendableButton,
+            0,
+            0
+        )
+        applyAttributes(typedArray)
+        typedArray.recycle()
+    }
+
+    private fun applyAttributes(typedArray: TypedArray) {
+        typedArray.getDrawable(ExtendableButton_btn_icon)
+            .also { binding.buttonIcon.setImageDrawable(it) }
+
+        typedArray.getDrawable(
+            R.styleable.MapboxRecenterButton_recenterButtonBackground,
+        )?.let { background ->
+            binding.buttonIcon.background = background
+            binding.buttonText.background = background
+        }
+
+        typedArray.getColorStateList(
+            R.styleable.MapboxRecenterButton_recenterButtonTextColor,
+        )?.let { binding.buttonText.setTextColor(it) }
+
+        typedArray.apply {
+            expandedText = getString(ExtendableButton_expanded_text) ?: "DUNNO"
+        }
+    }
+}
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index bfea266..83cf4b1 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -127,4 +127,15 @@
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintTop_toBottomOf="@id/routeOverview" />
 
+    <eu.ztsh.garmin.view.ExtendableButton
+            android:id="@+id/reconnect"
+            app:btn_icon="@android:drawable/ic_menu_rotate"
+            app:expanded_text="@string/reconnect"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            android:layout_marginEnd="16dp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/recenter" />
+
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..ef249b8
--- /dev/null
+++ b/app/src/main/res/values/attrs.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <declare-styleable name="ExtendableButton">
+        <attr name="expanded_text" format="string"/>
+        <attr name="btn_icon" format="reference"/>
+    </declare-styleable>
+</resources>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 774ae0a..b845fca 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -7,4 +7,6 @@
     <string name="place_autocomplete_selection_error">Error happened during request</string>
     <string name="not_implemented_yet">Not implemented yet</string>
 
+    <string name="reconnect">Reconnect</string>
+
 </resources>