Bimba.git

commit e97fe14b0acfb80c7011dd2ea7865b5a82df3a04

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

favourites show departures for 2 days

 app/src/main/java/ml/adamsprogs/bimba/activities/DashActivity.kt | 1 
 app/src/main/java/ml/adamsprogs/bimba/models/Favourite.kt | 33 
 app/src/main/java/ml/adamsprogs/bimba/models/FavouritesAdapter.kt | 59 
 app/src/main/java/ml/adamsprogs/bimba/models/Timetable.kt | 35 
 app/src/main/res/layout/row_favourite.xml | 6 
 app/src/main/res/values/strings.xml | 1 


diff --git a/app/src/main/java/ml/adamsprogs/bimba/activities/DashActivity.kt b/app/src/main/java/ml/adamsprogs/bimba/activities/DashActivity.kt
index bc53abdac252f6feb1e7314e3d3ca03a76691871..bb989fcd4ae56fb64aa5f59c10cdb7a95579b989 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/activities/DashActivity.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/activities/DashActivity.kt
@@ -146,7 +146,6 @@     }
 
     override fun onResume() {
         super.onResume()
-        Toast.makeText(this, "Resume", Toast.LENGTH_LONG).show()
         favouritesList.adapter = FavouritesAdapter(context, favourites.favouritesList, this)
         favouritesList.adapter.notifyDataSetChanged()
     }




diff --git a/app/src/main/java/ml/adamsprogs/bimba/models/Favourite.kt b/app/src/main/java/ml/adamsprogs/bimba/models/Favourite.kt
index 79e96cdf9859734f4181aab9597bfd2a8c812aef..2b331637014250caf507c243227817d17a194550 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/models/Favourite.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/models/Favourite.kt
@@ -9,7 +9,7 @@ import kotlin.collections.ArrayList
 import kotlin.collections.HashMap
 
 class Favourite : Parcelable {
-    lateinit var name:String
+    lateinit var name: String
     lateinit var timetables: ArrayList<HashMap<String, String>>
     lateinit var context: Context
 
@@ -51,7 +51,9 @@
     var nextDeparture: Departure? = null
         get() {
             val today: String
-            val allDepartures = ArrayList<Departure>()
+            val tomorrow: String
+            val oneDayDepartures = ArrayList<HashMap<String, ArrayList<Departure>>>()
+            val twoDayDepartures = ArrayList<Departure>()
             val now = Calendar.getInstance()
             val departureTime = Calendar.getInstance()
             when (Calendar.getInstance().get(Calendar.DAY_OF_WEEK)) {
@@ -59,12 +61,31 @@                 Calendar.SUNDAY -> today = "sundays"
                 Calendar.SATURDAY -> today = "saturdays"
                 else -> today = "workdays"
             }
+            val tomorrowCal = Calendar.getInstance()
+            tomorrowCal.add(Calendar.DAY_OF_MONTH, 1)
+            when (tomorrowCal.get(Calendar.DAY_OF_WEEK)) {
+                Calendar.SUNDAY -> tomorrow = "sundays"
+                Calendar.SATURDAY -> tomorrow = "saturdays"
+                else -> tomorrow = "workdays"
+            }
 
-            for (t in timetables)
-                allDepartures.addAll(timetable.getStopDepartures(t["stop"] as String, t["line"])!![today]!!)
-            var minDeparture: Departure = allDepartures[0]
+            timetables.mapTo(oneDayDepartures) { timetable.getStopDepartures(it["stop"] as String, it["line"])!! }
+            oneDayDepartures.forEach {
+                it[today]!!.forEach {
+                    twoDayDepartures.add(fromString(it.toString()))
+                }
+            }
+            oneDayDepartures.forEach {
+                it[tomorrow]!!.forEach {
+                    val d = fromString(it.toString())
+                    d.tomorrow = true
+                    twoDayDepartures.add(d)
+                }
+            }
+
+            var minDeparture: Departure = twoDayDepartures[0]
             var minInterval = 24 * 60L
-            for (departure in allDepartures) {
+            for (departure in twoDayDepartures) {
                 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)




diff --git a/app/src/main/java/ml/adamsprogs/bimba/models/FavouritesAdapter.kt b/app/src/main/java/ml/adamsprogs/bimba/models/FavouritesAdapter.kt
index b0df901aa1f92774af921db31a166d13fbd16508..d14bb6508bd8a86adf3dce0fd28b4422316df9aa 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/models/FavouritesAdapter.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/models/FavouritesAdapter.kt
@@ -1,5 +1,6 @@
 package ml.adamsprogs.bimba.models
 
+import android.app.Activity
 import android.content.Context
 import android.support.v7.widget.PopupMenu
 import android.support.v7.widget.RecyclerView
@@ -10,6 +11,7 @@ import android.widget.TextView
 import ml.adamsprogs.bimba.R
 import android.view.LayoutInflater
 import java.util.*
+import kotlin.concurrent.thread
 
 
 class FavouritesAdapter(val context: Context, var favourites: List<Favourite>, val onMenuItemClickListener: FavouritesAdapter.OnMenuItemClickListener) :
@@ -20,30 +22,43 @@     }
 
     override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
 
-        val favourite = favourites[position]
-        holder?.nameTextView?.text = favourite.name
-        val nextDeparture = favourite.nextDeparture ?: return
-        val now = Calendar.getInstance()
-        val departureTime = Calendar.getInstance()
-        departureTime.set(Calendar.HOUR_OF_DAY, Integer.parseInt(nextDeparture.time.split(":")[0]))
-        departureTime.set(Calendar.MINUTE, Integer.parseInt(nextDeparture.time.split(":")[1]))
-        if (nextDeparture.tomorrow)
-            departureTime.add(Calendar.DAY_OF_MONTH, 1)
-        val interval = (departureTime.timeInMillis - now.timeInMillis) / (1000 * 60)
-        holder?.timeTextView?.text = context.getString(R.string.departure_in, interval.toString())
-        holder?.lineTextView?.text = context.getString(R.string.departure_to_line, nextDeparture.line, nextDeparture.direction)
-        holder?.moreButton?.setOnClickListener {
-            val popup = PopupMenu(context, it)
-            val inflater = popup.menuInflater
-            popup.setOnMenuItemClickListener {
-                when (it.itemId) {
-                    R.id.favourite_edit -> onMenuItemClickListener.edit(favourite.name)
-                    R.id.favourite_delete -> onMenuItemClickListener.delete(favourite.name)
-                    else -> false
+        thread {
+            val favourite = favourites[position]
+            holder?.nameTextView?.text = favourite.name
+            val nextDeparture = favourite.nextDeparture
+            val nextDepartureText: String
+            val nextDepartureLineText: String
+            if (nextDeparture != null) {
+                val now = Calendar.getInstance()
+                val departureTime = Calendar.getInstance()
+                departureTime.set(Calendar.HOUR_OF_DAY, Integer.parseInt(nextDeparture.time.split(":")[0]))
+                departureTime.set(Calendar.MINUTE, Integer.parseInt(nextDeparture.time.split(":")[1]))
+                if (nextDeparture.tomorrow)
+                    departureTime.add(Calendar.DAY_OF_MONTH, 1)
+                val interval = ((departureTime.timeInMillis - now.timeInMillis) / (1000 * 60)).toString()
+                nextDepartureText = context.getString(R.string.departure_in, interval)
+                nextDepartureLineText =context.getString(R.string.departure_to_line, nextDeparture.line, nextDeparture.direction)
+            } else {
+                nextDepartureText = context.getString(R.string.no_next_departure)
+                nextDepartureLineText = ""
+            }
+            (context as Activity).runOnUiThread {
+                holder?.timeTextView?.text = nextDepartureText
+                holder?.lineTextView?.text = nextDepartureLineText
+                holder?.moreButton?.setOnClickListener {
+                    val popup = PopupMenu(context, it)
+                    val inflater = popup.menuInflater
+                    popup.setOnMenuItemClickListener {
+                        when (it.itemId) {
+                            R.id.favourite_edit -> onMenuItemClickListener.edit(favourite.name)
+                            R.id.favourite_delete -> onMenuItemClickListener.delete(favourite.name)
+                            else -> false
+                        }
+                    }
+                    inflater.inflate(R.menu.favourite_actions, popup.menu)
+                    popup.show()
                 }
             }
-            inflater.inflate(R.menu.favourite_actions, popup.menu)
-            popup.show()
         }
     }
 




diff --git a/app/src/main/java/ml/adamsprogs/bimba/models/Timetable.kt b/app/src/main/java/ml/adamsprogs/bimba/models/Timetable.kt
index 5a6dd7f77f03f0d8dfda60870f338da73911e40a..a72e4d39081641a2cd05c084aea9b01cbd285c34 100644
--- a/app/src/main/java/ml/adamsprogs/bimba/models/Timetable.kt
+++ b/app/src/main/java/ml/adamsprogs/bimba/models/Timetable.kt
@@ -1,7 +1,6 @@
 package ml.adamsprogs.bimba.models
 
 import android.content.Context
-import android.database.Cursor
 import android.database.sqlite.SQLiteCantOpenDatabaseException
 import android.database.sqlite.SQLiteDatabase
 import android.database.sqlite.SQLiteDatabaseCorruptException
@@ -28,14 +27,15 @@                     }
                     timetable = Timetable()
                     timetable!!.db = db
                     return timetable as Timetable
-                }
-                else
+                } else
                     throw IllegalArgumentException("new timetable requested and no context given")
             else
                 return timetable as Timetable
         }
     }
+
     lateinit var db: SQLiteDatabase
+    private var _stops: ArrayList<StopSuggestion>? = null
 
     init {
         readDbFile()
@@ -48,20 +48,17 @@
     private fun readDbFile() {
     }
 
-    fun getStops(): ArrayList<StopSuggestion>? {
+    fun getStops(): ArrayList<StopSuggestion> {
+        if (_stops != null)
+            return _stops!!
+
         val stops = ArrayList<StopSuggestion>()
-        var cursor: Cursor? = null
-        try {
-            cursor = db.rawQuery("select name ||char(10)|| headsigns as suggestion, id, stops.symbol || number as stopSymbol from stops" +
-                    " join nodes on(stops.symbol = nodes.symbol) order by name, id;", null)
-            while (cursor.moveToNext())
-                stops.add(StopSuggestion(cursor.getString(0), cursor.getString(1), cursor.getString(2)))
-        } catch (e: SQLiteDatabaseCorruptException) {
-            cursor?.close()
-            return null
-        } finally {
-            cursor?.close()
-        }
+        val cursor = db.rawQuery("select name ||char(10)|| headsigns as suggestion, id, stops.symbol || number as stopSymbol from stops" +
+                " join nodes on(stops.symbol = nodes.symbol) order by name, id;", null)
+        while (cursor.moveToNext())
+            stops.add(StopSuggestion(cursor.getString(0), cursor.getString(1), cursor.getString(2)))
+        cursor?.close()
+        _stops = stops
         return stops
     }
 
@@ -75,7 +72,7 @@         cursor.close()
         return name
     }
 
-    fun getStopDepartures(stopId: String, lineId: String? = null): HashMap<String, ArrayList<Departure>>? {
+    fun getStopDepartures(stopId: String, lineId: String? = null, tomorrow: Boolean = false): HashMap<String, ArrayList<Departure>>? {
         val andLine: String
         if (lineId == null)
             andLine = ""
@@ -92,13 +89,13 @@         departures.put("sundays", ArrayList())
         while (cursor.moveToNext()) {
             departures[cursor.getString(1)]?.add(Departure(cursor.getString(0),
                     cursor.getString(1), cursor.getString(2), cursor.getInt(3) == 1,
-                    cursor.getString(4), cursor.getString(5)))
+                    cursor.getString(4), cursor.getString(5), tomorrow = tomorrow))
         }
         cursor.close()
         return departures
     }
 
-    fun getLines(stopId: String?): ArrayList<String>? {
+    fun getLines(stopId: String): ArrayList<String> {
         val cursor = db.rawQuery(" select distinct line_id from timetables join " +
                 "stops on(stop_id = stops.id) where stops.id = ?;",
                 listOf(stopId).toTypedArray())




diff --git a/app/src/main/res/layout/row_favourite.xml b/app/src/main/res/layout/row_favourite.xml
index 9c910b3c54a773d5b850cf5db7b73fa7ae6588b8..592c44f24f3d4825361c83d2e582d2108be3283f 100644
--- a/app/src/main/res/layout/row_favourite.xml
+++ b/app/src/main/res/layout/row_favourite.xml
@@ -17,7 +17,7 @@             android:id="@+id/favourite_name"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="21dp"
-            android:text="aaaa"
+            android:text=""
             android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
             app:layout_constraintStart_toStartOf="@+id/favourite_time"
             app:layout_constraintTop_toTopOf="parent"
@@ -30,7 +30,7 @@             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginBottom="16dp"
             android:layout_marginStart="16dp"
-            android:text="bbbbb"
+            android:text=""
             android:textAppearance="@style/TextAppearance.AppCompat.Subhead"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintStart_toStartOf="parent"
@@ -42,7 +42,7 @@                      android:id="@+id/favourite_time"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="ccccc"
+            android:text=""
             android:textAppearance="@style/TextAppearance.AppCompat.Headline"
             app:layout_constraintStart_toStartOf="@+id/favourite_line"
             app:layout_constraintTop_toBottomOf="@+id/favourite_name"




diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0b51534b6cc7f6959a008a85a3a2ff2c5c43534f..2661da5259d90e15438ee399361b8406876d04db 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -32,4 +32,5 @@     Favourite name
     <string name="edit_favourite_title">Edit ā€˜%1$sā€™</string>
     <string name="favourite_element_delete_button" translatable="false">favourite element delete button</string>
     <string name="favourite_element_split_button" translatable="false">favourite element split button</string>
+    <string name="no_next_departure">No next departure</string>
 </resources>