2 Commits a302d78056 ... f5ce5cfcd7

Author SHA1 Message Date
  Adam Pioterek f5ce5cfcd7 make planning layout 5 years ago
  Adam Pioterek 9a2e1229c3 remove chips on backspace 5 years ago

+ 9 - 1
Ibackdrop/src/main/java/com/pedromassango/ibackdrop/Backdrop.kt

@@ -17,12 +17,16 @@ class Backdrop(context: Context,
     private var openIcon: Drawable? = ResourcesCompat.getDrawable(resources, R.drawable.ic_drop_open, null)
     private var closeIcon: Drawable? = ResourcesCompat.getDrawable(resources, R.drawable.ic_drop_close, null)
     private var frontLayerBackground: Int = R.drawable.backdrop_background
-    private var backdropSize: Int = 0
+    var backdropSize: Int = 0
     private var animationDuration: Long = 200L
     private lateinit var navIconClickListener: NavigationIconClickListener
 
     private var mcToolbarId: Int
 
+    interface OnSwitchListener{
+        fun onSwitch(hidden: Boolean)
+    }
+
     init {
         val customProperties = context.obtainStyledAttributes(attributeSet, R.styleable.Backdrop)
 
@@ -46,6 +50,10 @@ class Backdrop(context: Context,
 
     }
 
+    fun setOnSwitchListener(listener: OnSwitchListener) {
+        navIconClickListener.onSwitchListener = listener
+    }
+
     /**
      * Build the backdrop view.
      *

+ 2 - 0
Ibackdrop/src/main/java/com/pedromassango/ibackdrop/NavigationIconClickListener.kt

@@ -24,6 +24,7 @@ class NavigationIconClickListener @JvmOverloads internal constructor(
     private val animatorSet = AnimatorSet()
     private var height: Int
     private var backdropShown = false
+    var onSwitchListener: Backdrop.OnSwitchListener? = null
 
     init {
         val displayMetrics = DisplayMetrics()
@@ -83,6 +84,7 @@ class NavigationIconClickListener @JvmOverloads internal constructor(
         // play the animation
         animatorSet.playTogether(moveAnimator, opacityAnimator)
         animatorSet.start()
+        onSwitchListener?.onSwitch(backdropShown)
     }
 
     /**

+ 15 - 0
Ibackdrop/src/main/res/drawable-night/backdrop_background.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <corners android:topLeftRadius="16dp"
+        android:topRightRadius="16dp"
+        android:bottomLeftRadius="0dp"
+        android:bottomRightRadius="0dp"/>
+
+    <solid android:color="#424242"/>
+
+    <padding android:bottom="0dp"
+        android:top="0dp"
+        android:left="0dp"
+        android:right="0dp"/>
+</shape>

+ 45 - 28
app/src/main/java/ml/adamsprogs/bimba/fragments/PlanningFragment.kt

@@ -23,7 +23,8 @@ import android.graphics.Canvas
 import android.graphics.Paint
 import android.text.Editable
 import android.text.SpannableStringBuilder
-import android.text.TextWatcher
+import android.util.TypedValue
+import ml.adamsprogs.bimba.views.StopAutoCompleteTextView
 
 
 class PlanningFragment : Fragment(), MainActivity.OnActivityActionListener {
@@ -34,6 +35,26 @@ class PlanningFragment : Fragment(), MainActivity.OnActivityActionListener {
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                               savedInstanceState: Bundle?): View? {
         root = inflater.inflate(R.layout.fragment_planning, container, false)
+        root.post {
+            val height = root.measuredHeight
+            with(root.findViewById<Backdrop>(R.id.backdrop_view)) {
+                val px = TypedValue.applyDimension(
+                        TypedValue.COMPLEX_UNIT_DIP,
+                        48f, resources.displayMetrics).toInt()
+                backdropSize = height - px
+                buildWithToolbar(toolbar)
+                root.arrow_icon.visibility = View.VISIBLE
+                openBackdrop()
+                setOnSwitchListener(object : Backdrop.OnSwitchListener {
+                    override fun onSwitch(hidden: Boolean) {
+                        root.arrow_icon.visibility = if (hidden) View.VISIBLE else View.GONE
+                    }
+                })
+                root.arrow_icon.setOnClickListener {
+                    closeBackdrop()
+                }
+            }
+        }
         val activity = context as AppCompatActivity
 
         val appBarLayout = activity.findViewById<AppBarLayout>(R.id.appbar)
@@ -42,12 +63,14 @@ class PlanningFragment : Fragment(), MainActivity.OnActivityActionListener {
         }
         toolbar = activity.findViewById(R.id.toolbar)
 
-        with(root.findViewById<Backdrop>(R.id.backdrop_view)) {
-            buildWithToolbar(toolbar)
-            this.openBackdrop()
-        }
 
-        StopsAutoCompleteEditText(root.from_input, context as Context)
+        StopsAutoCompleteEditText(root.from_input as StopAutoCompleteTextView, context as Context)
+        StopsAutoCompleteEditText(root.to_input as StopAutoCompleteTextView, context as Context)
+
+
+        root.search_button.setOnClickListener {
+            // todo
+        }
 
         return root
     }
@@ -86,7 +109,7 @@ class PlanningFragment : Fragment(), MainActivity.OnActivityActionListener {
         return false
     }
 
-    class StopsAutoCompleteEditText(private val inputView: AutoCompleteTextView, val context: Context) {
+    class StopsAutoCompleteEditText(private val inputView: StopAutoCompleteTextView, val context: Context) {
         private val PEOPLE = arrayOf("John Smith", "Kate Eckhart", "Emily Sun", "Frodo Baggins")
         private val stops = ArrayList<String>()
 
@@ -95,27 +118,22 @@ class PlanningFragment : Fragment(), MainActivity.OnActivityActionListener {
                     android.R.layout.simple_dropdown_item_1line, PEOPLE)
             inputView.setAdapter(adapter)
 
-            inputView.addTextChangedListener(object : TextWatcher {
-                override fun afterTextChanged(s: Editable?) {
-                    /* todo check backspace
-                    if (s != null) {
-                        val tokens = s.getSpans(0, s.length, VerticalImageSpan::class.java)
-                        println("changed to tokens: $tokens")
-                        if (tokens.size - 1 != stops.size) {
-                            stops.clear()
-                            stops.addAll(tokens.map {
-                                (it.drawable as ChipDrawable).text.toString()
-                            })
-                        }
-                    }*/
-                }
-
-                override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
-                }
-
-                override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+            inputView.setOnKeyPressListener(object : StopAutoCompleteTextView.OnBackspacePressedListener {
+                override fun onBackspacePressed(s: Editable, start: Int, end: Int) {
+                    val tokens = s.getSpans(0, s.length, VerticalImageSpan::class.java)
+                    val result = ArrayList<StopsAutoCompleteEditText.VerticalImageSpan>()
+                    var length = 0
+                    tokens.forEach {
+                        val textLength = (it.drawable as ChipDrawable).text.length
+                        if (textLength + length != start)
+                            result.add(it)
+                        length += textLength
+                    }
+                    stops.clear()
+                    stops.addAll(result.map {
+                        (it.drawable as ChipDrawable).text.toString()
+                    })
                 }
-
             })
 
             inputView.setOnItemClickListener { parent, _, position, _ ->
@@ -127,7 +145,6 @@ class PlanningFragment : Fragment(), MainActivity.OnActivityActionListener {
         }
 
         private fun addChipToGroup() {
-            // https://stackoverflow.com/questions/50574943/how-to-add-chips-from-material-components-library-to-input-field-in-android
             val ss = SpannableStringBuilder()
             for (stop in stops)
                 ss.append(stop)

+ 55 - 0
app/src/main/java/ml/adamsprogs/bimba/views/StopAutoCompleteTextView.kt

@@ -0,0 +1,55 @@
+package ml.adamsprogs.bimba.views
+
+import android.content.Context
+import android.text.Editable
+import android.util.AttributeSet
+import android.view.KeyEvent
+import android.view.inputmethod.EditorInfo
+import android.view.inputmethod.InputConnection
+import android.view.inputmethod.InputConnectionWrapper
+import android.widget.AutoCompleteTextView
+
+class StopAutoCompleteTextView : AutoCompleteTextView {
+    interface OnBackspacePressedListener {
+        fun onBackspacePressed(s: Editable, start: Int, end: Int)
+    }
+
+    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle)
+
+    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
+
+    constructor(context: Context) : super(context)
+
+    private var listener: OnBackspacePressedListener? = null
+
+    fun setOnKeyPressListener(listener: OnBackspacePressedListener) {
+        this.listener = listener
+    }
+
+    override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection {
+        return StopInputConnection(super.onCreateInputConnection(outAttrs),
+                true)
+    }
+
+    private inner class StopInputConnection(target: InputConnection, mutable: Boolean) : InputConnectionWrapper(target, mutable) {
+
+        override fun sendKeyEvent(event: KeyEvent): Boolean {
+            if (event.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_DEL) {
+                with(this@StopAutoCompleteTextView) {
+                    listener?.onBackspacePressed(text, selectionStart, selectionEnd)
+                }
+            }
+            return super.sendKeyEvent(event)
+        }
+
+        override fun deleteSurroundingText(beforeLength: Int, afterLength: Int): Boolean {
+            return if (beforeLength == 1 && afterLength == 0) {
+                sendKeyEvent(KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL)) && sendKeyEvent(KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL))
+            } else super.deleteSurroundingText(beforeLength, afterLength)
+
+        }
+
+    }
+
+}
+

+ 9 - 0
app/src/main/res/drawable/ic_arrow_up.xml

@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M7.41,15.41L12,10.83l4.59,4.58L18,14l-6,-6 -6,6z"/>
+</vector>

+ 62 - 17
app/src/main/res/layout/fragment_planning.xml

@@ -20,6 +20,20 @@
             android:layout_width="match_parent"
             android:layout_height="match_parent">
 
+            <Button
+                android:id="@+id/search_button"
+                style="@style/Widget.AppCompat.Button.Colored"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="8dp"
+                android:layout_marginEnd="8dp"
+                android:text="Search"
+                android:textAppearance="@style/Base.TextAppearance.MaterialComponents.Button"
+                android:textColor="@color/textDark"
+                app:backgroundTint="@color/colorAccent"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintTop_toBottomOf="@+id/to_input" />
+
             <TextView
                 android:id="@+id/from_label"
                 android:layout_width="wrap_content"
@@ -28,35 +42,51 @@
                 android:labelFor="@+id/from_input"
                 android:text="From:"
                 android:textColor="@color/textLight"
-                app:layout_constraintBottom_toBottomOf="@+id/from_inputLayout"
+                app:layout_constraintBottom_toBottomOf="@+id/from_input"
                 app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="@+id/from_inputLayout" />
+                app:layout_constraintTop_toTopOf="@+id/from_input" />
 
-            <com.google.android.material.textfield.TextInputLayout
-                android:id="@+id/from_inputLayout"
+            <ml.adamsprogs.bimba.views.StopAutoCompleteTextView
+                android:id="@+id/from_input"
                 android:layout_width="0dp"
-                android:layout_height="43dp"
+                android:layout_height="55dp"
                 android:layout_marginStart="8dp"
                 android:layout_marginTop="12dp"
                 android:layout_marginEnd="8dp"
                 android:minWidth="32dp"
+                android:textColor="@color/textLight"
                 android:theme="@style/BackDropTheme"
                 app:layout_constraintEnd_toEndOf="parent"
                 app:layout_constraintStart_toEndOf="@id/from_label"
                 app:layout_constraintTop_toTopOf="parent"
-                app:layout_constraintWidth_min="32dp">
-
-                <AutoCompleteTextView
-                    android:id="@+id/from_input"
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:textColor="@color/textLight"
-                    android:theme="@style/BackDropTheme">
+                app:layout_constraintWidth_min="32dp" />
 
-                </AutoCompleteTextView>
+            <TextView
+                android:id="@+id/to_label"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="8dp"
+                android:labelFor="@+id/from_input"
+                android:text="To:"
+                android:textColor="@color/textLight"
+                app:layout_constraintBottom_toBottomOf="@+id/to_input"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="@+id/to_input" />
 
+            <ml.adamsprogs.bimba.views.StopAutoCompleteTextView
+                android:id="@+id/to_input"
+                android:layout_width="0dp"
+                android:layout_height="55dp"
+                android:layout_marginTop="12dp"
+                android:layout_marginEnd="8dp"
+                android:minWidth="32dp"
+                android:textColor="@color/textLight"
+                android:theme="@style/BackDropTheme"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintStart_toStartOf="@id/from_input"
+                app:layout_constraintTop_toBottomOf="@id/from_input"
+                app:layout_constraintWidth_min="32dp" />
 
-            </com.google.android.material.textfield.TextInputLayout>
 
         </androidx.constraintlayout.widget.ConstraintLayout>
 
@@ -64,7 +94,19 @@
         <androidx.constraintlayout.widget.ConstraintLayout
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:visibility="invisible">
+            android:visibility="visible">
+
+            <ImageView
+                android:id="@+id/arrow_icon"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="12dp"
+                android:layout_marginEnd="16dp"
+                android:tint="@color/text"
+                android:visibility="gone"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                app:srcCompat="@drawable/ic_arrow_up" />
 
             <TextView
                 android:id="@+id/textView"
@@ -77,14 +119,17 @@
                 app:layout_constraintTop_toTopOf="parent" />
 
             <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/recyclerView"
                 android:layout_width="0dp"
                 android:layout_height="0dp"
                 android:layout_marginTop="12dp"
                 android:layout_marginBottom="8dp"
                 app:layout_constraintBottom_toBottomOf="parent"
                 app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintHorizontal_bias="1.0"
                 app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toBottomOf="@+id/textView" />
+                app:layout_constraintTop_toBottomOf="@+id/textView"
+                app:layout_constraintVertical_bias="0.0" />
         </androidx.constraintlayout.widget.ConstraintLayout>
     </com.pedromassango.ibackdrop.Backdrop>
 </LinearLayout>

+ 1 - 1
app/src/main/res/values/colors.xml

@@ -2,7 +2,7 @@
 <resources>
     <color name="colorPrimary">#3a3a3b</color>
     <color name="colorPrimaryDark">#141415</color>
-    <color name="colorAccent">#54af39</color>
+    <color name="colorAccent">#54AF39</color>
     <color name="colorAccentDark">#197f00</color>
     <color name="colorAccent2">#be7e3e</color>
 

+ 1 - 1
build.gradle

@@ -9,7 +9,7 @@ buildscript {
         google()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.3.1'
+        classpath 'com.android.tools.build:gradle:3.3.2'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
 
         // NOTE: Do not place your application dependencies here; they belong