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>