Bimba.git

commit a72c45eb44dfc2a63f8d9df2541e4308adb43e62

Author: Adam Pioterek <adam.pioterek@protonmail.ch>

timetable full and departure-based & icons day-night colour

 app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt | 116 
 app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt | 22 
 app/src/main/res/drawable/ic_departure_timetable.xml | 16 
 app/src/main/res/drawable/ic_full_timetable.xml | 5 
 app/src/main/res/drawable/ic_timetable_departure.xml | 12 
 app/src/main/res/drawable/ic_timetable_full.xml | 5 
  | 2 
 app/src/main/res/menu/menu_stop.xml | 2 
 app/src/main/res/values/strings.xml | 1 


diff --git a/app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt b/app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt
index bfcc9eab8ed77ebf76163f409d4555ae4cbd0ccc..fec00e38ef21786cd40a5b42f300e898b136793b 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt
@@ -8,23 +8,25 @@ import android.support.v4.app.*
 import android.support.v4.view.ViewPager
 import android.os.Bundle
 import android.support.v4.content.res.ResourcesCompat
+import android.support.v4.view.PagerAdapter
 import android.view.*
 
 import ml.adamsprogs.bimba.models.*
 import android.support.v7.widget.*
 import java.util.*
+import kotlin.collections.ArrayList
+import kotlin.collections.HashMap
 
 
 class StopActivity : AppCompatActivity() { //todo refresh
 
     private lateinit var stopId: String
-    private var departures: HashMap<String, ArrayList<Departure>>? = null
     private var timetableType = "departure"
-    private val rolledDepartures = HashMap<String, ArrayList<Departure>>()
     private var sectionsPagerAdapter: SectionsPagerAdapter? = null
     private var viewPager: ViewPager? = null
+    private lateinit var timetable: Timetable
 
-    override fun onCreate(savedInstanceState: Bundle?) {
+    override fun onCreate(savedInstanceState: Bundle?) { //todo select current mode
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_stop)
         stopId = intent.getStringExtra("stop")
@@ -36,29 +38,15 @@         /*todo when Internet connection
         exists -> download vm
         else -> timetable
          */
-        val timetable = Timetable(this)
+        timetable = Timetable(this)
         supportActionBar?.title = timetable.getStopName(stopId) ?: "Stop"
-        departures = timetable.getStopDepartures(stopId)
-
-        val moreDepartures = timetable.getStopDepartures(stopId)
-
-        for ((_, departures) in moreDepartures!!) {
-            departures.forEach{it.tomorrow = true}
-        }
-
-        for ((mode, _) in departures!!) {
-            rolledDepartures[mode] = (departures!![mode] as ArrayList<Departure> +
-                    moreDepartures[mode] as ArrayList<Departure>) as ArrayList<Departure>
-        }
-
-
-        sectionsPagerAdapter = SectionsPagerAdapter(supportFragmentManager)
 
         viewPager = findViewById(R.id.container) as ViewPager
-        viewPager!!.adapter = sectionsPagerAdapter
+        val tabLayout = findViewById(R.id.tabs) as TabLayout
 
-        val tabLayout = findViewById(R.id.tabs) as TabLayout
+        sectionsPagerAdapter = SectionsPagerAdapter(supportFragmentManager, createDepartures())
 
+        viewPager!!.adapter = sectionsPagerAdapter
         viewPager!!.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabLayout))
         tabLayout.addOnTabSelectedListener(TabLayout.ViewPagerOnTabSelectedListener(viewPager))
 
@@ -68,7 +56,46 @@             Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                     .setAction("Action", null).show()
             //todo favourites
         }
+    }
 
+    fun createDepartures(): HashMap<String, ArrayList<Departure>> {
+        val departures = timetable.getStopDepartures(stopId)
+        val moreDepartures = timetable.getStopDepartures(stopId)
+        val rolledDepartures = HashMap<String, ArrayList<Departure>>()
+
+        for ((_, tomorrowDepartures) in moreDepartures!!) {
+            tomorrowDepartures.forEach{it.tomorrow = true}
+        }
+
+        for ((mode, _) in departures!!) {
+            rolledDepartures[mode] = (departures[mode] as ArrayList<Departure> +
+                    moreDepartures[mode] as ArrayList<Departure>) as ArrayList<Departure>
+            rolledDepartures[mode] = filterDepartures(rolledDepartures[mode])
+        }
+
+        return rolledDepartures
+    }
+
+    fun filterDepartures(departures: List<Departure>?): ArrayList<Departure> {
+        val filtered = ArrayList<Departure>()
+        val lines = HashMap<String, Int>()
+        val now = Calendar.getInstance()
+        for (departure in departures!!) {
+            val time = Calendar.getInstance()
+            time.set(Calendar.HOUR_OF_DAY, Integer.parseInt(departure.time.split(":")[0]))
+            time.set(Calendar.MINUTE, Integer.parseInt(departure.time.split(":")[1]))
+            time.set(Calendar.SECOND, 0)
+            time.set(Calendar.MILLISECOND, 0)
+            if (departure.tomorrow)
+                time.add(Calendar.DAY_OF_MONTH, 1)
+            var lineExistedTimes = lines[departure.line]
+            if (now.before(time) && lineExistedTimes ?: 0 < 3) {
+                lineExistedTimes = (lineExistedTimes ?: 0) + 1
+                lines[departure.line] = lineExistedTimes
+                filtered.add(departure)
+            }
+        }
+        return filtered
     }
 
 
@@ -80,16 +107,18 @@
     override fun onOptionsItemSelected(item: MenuItem): Boolean {
         val id = item.itemId
 
-
         if (id == R.id.action_change_type) {
             if (timetableType == "departure") {
                 timetableType = "full"
-                item.icon = (ResourcesCompat.getDrawable(resources, R.drawable.ic_departure_timetable, null))
+                item.icon = (ResourcesCompat.getDrawable(resources, R.drawable.ic_timetable_departure, this.theme))
+                sectionsPagerAdapter?.changeDepartures(timetable.getStopDepartures(stopId)!!)
+                sectionsPagerAdapter?.notifyDataSetChanged()
             } else {
                 timetableType = "departure"
-                item.icon = (ResourcesCompat.getDrawable(resources, R.drawable.ic_full_timetable, null))
+                item.icon = (ResourcesCompat.getDrawable(resources, R.drawable.ic_timetable_full, this.theme))
+                sectionsPagerAdapter?.changeDepartures(createDepartures())
+                sectionsPagerAdapter?.notifyDataSetChanged()
             }
-            //todo change type
             return true
         }
 
@@ -106,35 +135,12 @@             val layoutManager = LinearLayoutManager(activity)
             val departuresList: RecyclerView = rootView.findViewById(R.id.departuresList) as RecyclerView
             val dividerItemDecoration = DividerItemDecoration(departuresList.context, layoutManager.orientation)
             departuresList.addItemDecoration(dividerItemDecoration)
-            val adapter = DeparturesAdapter(activity,
-                    filterDepartures(arguments.getStringArrayList("departures").map { fromString(it) }))
+            val adapter = DeparturesAdapter(activity, arguments.getStringArrayList("departures").map { fromString(it) })
             departuresList.adapter = adapter
             departuresList.layoutManager = layoutManager
             return rootView
         }
 
-        fun filterDepartures(departures: List<Departure>): List<Departure> {
-            val filtered = ArrayList<Departure>()
-            val lines = HashMap<String, Int>()
-            val now = Calendar.getInstance()
-            for (departure in departures) {
-                val time = Calendar.getInstance()
-                time.set(Calendar.HOUR_OF_DAY, Integer.parseInt(departure.time.split(":")[0]))
-                time.set(Calendar.MINUTE, Integer.parseInt(departure.time.split(":")[1]))
-                time.set(Calendar.SECOND, 0)
-                time.set(Calendar.MILLISECOND, 0)
-                if (departure.tomorrow)
-                    time.add(Calendar.DAY_OF_MONTH, 1)
-                var lineExistedTimes = lines[departure.line]
-                if (now.before(time) && lineExistedTimes ?: 0 < 3) {
-                    lineExistedTimes = (lineExistedTimes ?: 0) + 1
-                    lines[departure.line] = lineExistedTimes
-                    filtered.add(departure)
-                }
-            }
-            return filtered
-        }
-
         companion object {
             private val ARG_SECTION_NUMBER = "section_number"
 
@@ -152,7 +158,11 @@             }
         }
     }
 
-    inner class SectionsPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) {
+    inner class SectionsPagerAdapter(fm: FragmentManager, var departures: HashMap<String, ArrayList<Departure>>) : FragmentStatePagerAdapter(fm) {
+
+        override fun getItemPosition(obj: Any?): Int {
+            return PagerAdapter.POSITION_NONE
+        }
 
         override fun getItem(position: Int): Fragment {
             var mode: String? = null
@@ -161,7 +171,11 @@                 0 -> mode = "workdays"
                 1 -> mode = "saturdays"
                 2 -> mode = "sundays"
             }
-            return PlaceholderFragment.newInstance(position + 1, stopId, rolledDepartures[mode])
+            return PlaceholderFragment.newInstance(position + 1, stopId, departures[mode])
+        }
+
+        fun changeDepartures(departures: HashMap<String, ArrayList<Departure>>) {
+            this.departures = departures
         }
 
         override fun getCount() = 3




diff --git a/app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt b/app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt
index 2c183b1ad57c541c08e9c7c0946d2eab627ac270..e899fc8cb3079e7e3c13c5be30c5beb1f787383b 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt
@@ -27,28 +27,26 @@         if (departure.tomorrow)
             departureTime.add(Calendar.DAY_OF_MONTH, 1)
 
         val departureIn = (departureTime.timeInMillis - now.timeInMillis) / (1000 * 60)
-        val departureTimeShown: String
-        val timeString: Int
+        val timeString: String
 
-        if (departureIn > 60) {
-            timeString = R.string.departure_at
-            departureTimeShown = departure.time
-        } else {
-            timeString = R.string.departure_in
-            departureTimeShown = "$departureIn"
-        }
+        if (departureIn > 60 || departureIn < 0)
+            timeString = context.getString(R.string.departure_at, departure.time)
+        else if (departureIn > 0)
+            timeString = context.getString(R.string.departure_in, departureIn.toString())
+        else
+            timeString = context.getString(R.string.now)
 
         val line = holder?.lineTextView
         line?.text = departure.line
         val time = holder?.timeTextView
-        time?.text = context.getString(timeString, departureTimeShown)
+        time?.text = timeString
         val direction = holder?.directionTextView
         direction?.text = context.getString(R.string.departure_to, departure.direction)
         val icon = holder?.typeIcon
         if (departure.vm)
-            icon?.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_vm, null))
+            icon?.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_departure_vm, context.theme))
         else
-            icon?.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_departure_timetable, null))
+            icon?.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_departure_timetable, context.theme))
     }
 
     override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {




diff --git a/app/src/main/res/drawable/ic_departure_timetable.xml b/app/src/main/res/drawable/ic_departure_timetable.xml
index 3d00295ba557febf30a9d23490f04458d5510443..3a193ca963bada05c9c0f3e0b6bc3270fc00d5c5 100644
--- a/app/src/main/res/drawable/ic_departure_timetable.xml
+++ b/app/src/main/res/drawable/ic_departure_timetable.xml
@@ -1,12 +1,12 @@
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportHeight="24.0"
+    android:viewportWidth="24.0">
     <path
-        android:pathData="M19,3C12,2.48 12,2.482 5,3 3.89,3 3.01,3.9 3.01,5L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5C21,3.9 20.1,3 19,3ZM19,19L5,19L5,8h14z"
-        android:fillColor="#000000"/>
+        android:fillColor="?attr/editTextColor"
+        android:pathData="M19,3C12,2.48 12,2.482 5,3 3.89,3 3.01,3.9 3.01,5L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5C21,3.9 20.1,3 19,3ZM19,19L5,19L5,8h14z" />
     <path
-        android:pathData="m17,12h-5v5h5z"
-        android:fillColor="#000000"/>
+        android:fillColor="?attr/editTextColor"
+        android:pathData="m17,12h-5v5h5z" />
 </vector>




diff --git a/app/src/main/res/drawable/ic_departure_vm.xml b/app/src/main/res/drawable/ic_departure_vm.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8f8d66ee3262b481adf6dfbf7cad5c1db0160410
--- /dev/null
+++ b/app/src/main/res/drawable/ic_departure_vm.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:pathData="M12,4C9.11,4 6.6,5.639 5.35,8.039C2.34,8.359 -0,10.91 0,14C0,17.31 2.69,20 6,20L19,20C21.76,20 24,17.76 24,15C24,12.36 21.95,10.219 19.35,10.039C18.67,6.589 15.64,4 12,4zM4.404,10.652L5.922,10.652L7.418,15.643L8.922,10.652L10.443,10.652L8.133,17.289L6.707,17.289L4.404,10.652zM11.072,10.652L12.859,10.652L14.563,15.465L16.258,10.652L18.055,10.652L18.055,17.289L16.682,17.289L16.682,15.475L16.818,12.344L15.027,17.289L14.09,17.289L12.303,12.348L12.439,15.475L12.439,17.289L11.072,17.289L11.072,10.652z"
+        android:fillColor="?attr/editTextColor" />
+</vector>




diff --git a/app/src/main/res/drawable/ic_full_timetable.xml b/app/src/main/res/drawable/ic_full_timetable.xml
deleted file mode 100644
index 078cd98aefc97e2083345c046c3263359cee5a1a..0000000000000000000000000000000000000000
--- a/app/src/main/res/drawable/ic_full_timetable.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<vector android:autoMirrored="true" android:height="24dp"
-    android:viewportHeight="24.0" android:viewportWidth="24.0"
-    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
-    <path android:fillColor="#000000" android:pathData="M17,10L7,10v2L17,12ZM19,3C12,2.48 12,2.482 5,3 3.89,3 3.01,3.9 3.01,5L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5C21,3.9 20.1,3 19,3ZM19,19L5,19L5,8L19,8ZM14,14L7,14v2h7z"/>
-</vector>




diff --git a/app/src/main/res/drawable/ic_timetable_departure.xml b/app/src/main/res/drawable/ic_timetable_departure.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ebb06922c12d84759b046b70104492d6f3e1d33d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_timetable_departure.xml
@@ -0,0 +1,12 @@
+<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:pathData="M19,3C12,2.48 12,2.482 5,3 3.89,3 3.01,3.9 3.01,5L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5C21,3.9 20.1,3 19,3ZM19,19L5,19L5,8h14z"
+        android:fillColor="?attr/editTextColor"/>
+    <path
+        android:pathData="m17,12h-5v5h5z"
+        android:fillColor="?attr/editTextColor"/>
+</vector>




diff --git a/app/src/main/res/drawable/ic_timetable_full.xml b/app/src/main/res/drawable/ic_timetable_full.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0a5efef40e3814fb86d4b7371569c69de23d7e2a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_timetable_full.xml
@@ -0,0 +1,5 @@
+<vector android:autoMirrored="true" android:height="24dp"
+    android:viewportHeight="24.0" android:viewportWidth="24.0"
+    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="?attr/editTextColor" android:pathData="M17,10L7,10v2L17,12ZM19,3C12,2.48 12,2.482 5,3 3.89,3 3.01,3.9 3.01,5L3,19c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5C21,3.9 20.1,3 19,3ZM19,19L5,19L5,8L19,8ZM14,14L7,14v2h7z"/>
+</vector>




diff --git a/app/src/main/res/drawable/ic_vm.xml b/app/src/main/res/drawable/ic_vm.xml
deleted file mode 100644
index 6f0f48dfea25593fe7200f6c46a62146bd730449..0000000000000000000000000000000000000000
--- a/app/src/main/res/drawable/ic_vm.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<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:pathData="M12,4C9.11,4 6.6,5.639 5.35,8.039C2.34,8.359 -0,10.91 0,14C0,17.31 2.69,20 6,20L19,20C21.76,20 24,17.76 24,15C24,12.36 21.95,10.219 19.35,10.039C18.67,6.589 15.64,4 12,4zM4.404,10.652L5.922,10.652L7.418,15.643L8.922,10.652L10.443,10.652L8.133,17.289L6.707,17.289L4.404,10.652zM11.072,10.652L12.859,10.652L14.563,15.465L16.258,10.652L18.055,10.652L18.055,17.289L16.682,17.289L16.682,15.475L16.818,12.344L15.027,17.289L14.09,17.289L12.303,12.348L12.439,15.475L12.439,17.289L11.072,17.289L11.072,10.652z"
-        android:fillColor="#000000"/>
-</vector>




diff --git a/app/src/main/res/menu/menu_stop.xml b/app/src/main/res/menu/menu_stop.xml
index 6a45cee41c223f4c6e93ea85bc4b0f28afd3d97d..b6a44d35ffee8bde31c57b994a4b54b58eeca51a 100644
--- a/app/src/main/res/menu/menu_stop.xml
+++ b/app/src/main/res/menu/menu_stop.xml
@@ -6,6 +6,6 @@              android:id="@+id/action_change_type"
         android:orderInCategory="100"
         android:title="@string/action_change_type"
-        android:icon="@drawable/ic_full_timetable"
+        android:icon="@drawable/ic_timetable_full"
         app:showAsAction="always" />
 </menu>




diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 54b6e3bedc3affa2cc01ff48b8811d78aa25f21a..20ab2a24fb33ddcc4ee2667bac4d46107eccabd2 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -20,4 +20,5 @@     No connectivity – can’t update timetable
     <string name="timetable_up_to_date">Timetable is up-to-date</string>
     <string name="validity_failed">Downloaded timetable is corrupted – can’t update</string>
     <string name="error_try_later">Error. Try again later</string>
+    <string name="now">Now</string>
 </resources>