Bimba.git

commit 71f5ddbeb87020e33e568d3dbb2e9187f71b4231

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

rolling timetable over day boundary

 app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt | 94 
 app/src/main/java/ml/adamsprogs/bimba/TimetableDownloader.kt | 2 
 app/src/main/java/ml/adamsprogs/bimba/models/Departure.kt | 12 
 app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt | 5 
 app/src/main/res/drawable/ic_departure_timetable.xml | 12 
  | 0 
 app/src/main/res/menu/menu_stop.xml | 2 


diff --git a/app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt b/app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt
index 21063fe7c436594f6e88ce8213fa0896b081357e..bfcc9eab8ed77ebf76163f409d4555ae4cbd0ccc 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/StopActivity.kt
@@ -1,53 +1,27 @@
 package ml.adamsprogs.bimba
 
-import android.support.design.widget.TabLayout
-import android.support.design.widget.FloatingActionButton
-import android.support.design.widget.Snackbar
+import android.support.design.widget.*
 import android.support.v7.app.AppCompatActivity
 import android.support.v7.widget.Toolbar
 
-import android.support.v4.app.Fragment
-import android.support.v4.app.FragmentManager
-import android.support.v4.app.FragmentPagerAdapter
+import android.support.v4.app.*
 import android.support.v4.view.ViewPager
 import android.os.Bundle
 import android.support.v4.content.res.ResourcesCompat
-import android.view.LayoutInflater
-import android.view.Menu
-import android.view.MenuItem
-import android.view.View
-import android.view.ViewGroup
+import android.view.*
 
-import ml.adamsprogs.bimba.models.Departure
-import ml.adamsprogs.bimba.models.Timetable
-import android.support.v7.widget.LinearLayoutManager
-import android.support.v7.widget.RecyclerView
-import ml.adamsprogs.bimba.models.DeparturesAdapter
-import ml.adamsprogs.bimba.models.fromString
-import android.support.v7.widget.DividerItemDecoration
-import android.util.Log
+import ml.adamsprogs.bimba.models.*
+import android.support.v7.widget.*
 import java.util.*
 
 
-class StopActivity : AppCompatActivity() {
+class StopActivity : AppCompatActivity() { //todo refresh
 
     private lateinit var stopId: String
     private var departures: HashMap<String, ArrayList<Departure>>? = null
-    private var timetableType = "timetable"
-
-    /**
-     * The [android.support.v4.view.PagerAdapter] that will provide
-     * fragments for each of the sections. We use a
-     * [FragmentPagerAdapter] derivative, which will keep every
-     * loaded fragment in memory. If this becomes too memory intensive, it
-     * may be best to switch to a
-     * [android.support.v4.app.FragmentStatePagerAdapter].
-     */
+    private var timetableType = "departure"
+    private val rolledDepartures = HashMap<String, ArrayList<Departure>>()
     private var sectionsPagerAdapter: SectionsPagerAdapter? = null
-
-    /**
-     * The [ViewPager] that will host the section contents.
-     */
     private var viewPager: ViewPager? = null
 
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -65,7 +39,18 @@          */
         val timetable = Timetable(this)
         supportActionBar?.title = timetable.getStopName(stopId) ?: "Stop"
         departures = timetable.getStopDepartures(stopId)
-        //todo if departures == null -> …
+
+        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)
 
@@ -97,13 +82,12 @@         val id = item.itemId
 
 
         if (id == R.id.action_change_type) {
-            if(timetableType == "timetable") {
-                timetableType = "vm"
-                item.icon = (ResourcesCompat.getDrawable(resources, R.drawable.ic_vm, null))
-            }
-            else {
-                timetableType = "timetable"
-                item.icon = (ResourcesCompat.getDrawable(resources, R.drawable.ic_timetable, null))
+            if (timetableType == "departure") {
+                timetableType = "full"
+                item.icon = (ResourcesCompat.getDrawable(resources, R.drawable.ic_departure_timetable, null))
+            } else {
+                timetableType = "departure"
+                item.icon = (ResourcesCompat.getDrawable(resources, R.drawable.ic_full_timetable, null))
             }
             //todo change type
             return true
@@ -112,9 +96,6 @@
         return super.onOptionsItemSelected(item)
     }
 
-    /**
-     * A placeholder fragment containing a simple view.
-     */
     class PlaceholderFragment : Fragment() {
 
         override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
@@ -132,7 +113,7 @@             departuresList.layoutManager = layoutManager
             return rootView
         }
 
-        fun filterDepartures(departures: List<Departure>): List<Departure> { //todo and tomorrow
+        fun filterDepartures(departures: List<Departure>): List<Departure> {
             val filtered = ArrayList<Departure>()
             val lines = HashMap<String, Int>()
             val now = Calendar.getInstance()
@@ -140,13 +121,14 @@             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]
-                Log.i("Filter", "line: ${departure.line} existed $lineExistedTimes times")
                 if (now.before(time) && lineExistedTimes ?: 0 < 3) {
-                    Log.i("Filter", "less than 3 so adding")
                     lineExistedTimes = (lineExistedTimes ?: 0) + 1
                     lines[departure.line] = lineExistedTimes
-                    Log.i("Filter", "and increment so now existed ${lines[departure.line]} times")
                     filtered.add(departure)
                 }
             }
@@ -154,16 +136,8 @@             return filtered
         }
 
         companion object {
-            /**
-             * The fragment argument representing the section number for this
-             * fragment.
-             */
             private val ARG_SECTION_NUMBER = "section_number"
 
-            /**
-             * Returns a new instance of this fragment for the given section
-             * number.
-             */
             fun newInstance(sectionNumber: Int, stopId: String, departures: ArrayList<Departure>?): PlaceholderFragment {
                 val fragment = PlaceholderFragment()
                 val args = Bundle()
@@ -178,10 +152,6 @@             }
         }
     }
 
-    /**
-     * A [FragmentPagerAdapter] that returns a fragment corresponding to
-     * one of the sections/tabs/pages.
-     */
     inner class SectionsPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) {
 
         override fun getItem(position: Int): Fragment {
@@ -191,7 +161,7 @@                 0 -> mode = "workdays"
                 1 -> mode = "saturdays"
                 2 -> mode = "sundays"
             }
-            return PlaceholderFragment.newInstance(position + 1, stopId, departures?.get(mode))
+            return PlaceholderFragment.newInstance(position + 1, stopId, rolledDepartures[mode])
         }
 
         override fun getCount() = 3




diff --git a/app/src/main/java/ml/adamsprogs/bimba/TimetableDownloader.kt b/app/src/main/java/ml/adamsprogs/bimba/TimetableDownloader.kt
index a39ebacecf238e3ff98cc59a3f0acfb6fb2ce697..b7187dcc8a173bb5893a41b4d6bbdbc31299adc7 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/TimetableDownloader.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/TimetableDownloader.kt
@@ -89,7 +89,7 @@         val md = MessageDigest.getInstance("SHA-512")
         var hex = ""
         try {
             val out = FileOutputStream(file)
-            val buf = ByteArray(1024) //todo bigger?
+            val buf = ByteArray(5 * 1024)
             var lenSum = 0.0f
             var len = 42
             while (len > 0) {




diff --git a/app/src/main/java/ml/adamsprogs/bimba/models/Departure.kt b/app/src/main/java/ml/adamsprogs/bimba/models/Departure.kt
index a4563e113ae9b9044d10753ddcf2aaec3f936e74..d3ba92039a371047e48002649b1412bf4a038997 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/models/Departure.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/models/Departure.kt
@@ -2,13 +2,15 @@ package ml.adamsprogs.bimba.models
 
 fun fromString(string: String): Departure {
     val array = string.split("|")
-    return Departure(array[0], array[1], array[2], array[3] == "1", array[4], array[5])
+    return Departure(array[0], array[1], array[2], array[3] == "1", array[4], array[5],
+            array[6] == "true", array[7] == "true")
 }
 
 data class Departure(val line: String, val mode: String, val time: String, val lowFloor: Boolean,
-                val modification: String?, val direction: String) {
-    val vm = false //todo
-    override fun toString():String {
-        return "$line|$mode|$time|$lowFloor|$modification|$direction|$vm"
+                     val modification: String?, val direction: String, val vm: Boolean = false,
+                     var tomorrow: Boolean = false) {
+
+    override fun toString(): String {
+        return "$line|$mode|$time|$lowFloor|$modification|$direction|$vm|$tomorrow"
     }
 }
\ No newline at end of file




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 c251efcdc44d6f75f9f37e1560021d3603538d01..2c183b1ad57c541c08e9c7c0946d2eab627ac270 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/models/DeparturesAdapter.kt
@@ -23,6 +23,9 @@         val now = Calendar.getInstance()
         val departureTime = Calendar.getInstance()
         departureTime.set(Calendar.HOUR_OF_DAY, Integer.parseInt(departure.time.split(":")[0]))
         departureTime.set(Calendar.MINUTE, Integer.parseInt(departure.time.split(":")[1]))
+        if (departure.tomorrow)
+            departureTime.add(Calendar.DAY_OF_MONTH, 1)
+
         val departureIn = (departureTime.timeInMillis - now.timeInMillis) / (1000 * 60)
         val departureTimeShown: String
         val timeString: Int
@@ -45,7 +48,7 @@         val icon = holder?.typeIcon
         if (departure.vm)
             icon?.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_vm, null))
         else
-            icon?.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_timetable, null))
+            icon?.setImageDrawable(ResourcesCompat.getDrawable(context.resources, R.drawable.ic_departure_timetable, null))
     }
 
     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
new file mode 100644
index 0000000000000000000000000000000000000000..3d00295ba557febf30a9d23490f04458d5510443
--- /dev/null
+++ b/app/src/main/res/drawable/ic_departure_timetable.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="#000000"/>
+    <path
+        android:pathData="m17,12h-5v5h5z"
+        android:fillColor="#000000"/>
+</vector>




diff --git a/app/src/main/res/drawable/ic_full_timetable.xml b/app/src/main/res/drawable/ic_full_timetable.xml
new file mode 100644
index 0000000000000000000000000000000000000000..078cd98aefc97e2083345c046c3263359cee5a1a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_full_timetable.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="#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.xml b/app/src/main/res/drawable/ic_timetable.xml
deleted file mode 100644
index 078cd98aefc97e2083345c046c3263359cee5a1a..0000000000000000000000000000000000000000
--- a/app/src/main/res/drawable/ic_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/menu/menu_stop.xml b/app/src/main/res/menu/menu_stop.xml
index 91de776b6cce0eb0f4cc4fd7f8d524a5c3c28a8f..6a45cee41c223f4c6e93ea85bc4b0f28afd3d97d 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_timetable"
+        android:icon="@drawable/ic_full_timetable"
         app:showAsAction="always" />
 </menu>