Author: Adam Evyčędo <git@apiote.xyz>
force refresh departures when selecting date
%!v(PANIC=String method: strings: negative Repeat count)
diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/departures/Departures.kt b/app/src/main/java/xyz/apiote/bimba/czwek/departures/Departures.kt index 47ad78346e5db2f3a22ef6ffe49d7c00d4659d10..2648a7addef2f05aa7dae3c5d1a2131b019a1b27 100644 --- a/app/src/main/java/xyz/apiote/bimba/czwek/departures/Departures.kt +++ b/app/src/main/java/xyz/apiote/bimba/czwek/departures/Departures.kt @@ -89,7 +89,8 @@ private var showAsTime: Boolean = false inner class DiffUtilCallback( private val oldDepartures: List<Departure>, - private val newDepartures: List<Departure> + private val newDepartures: List<Departure>, + private val showAsTimeChanged: Boolean ) : DiffUtil.Callback() { override fun getOldListSize() = oldDepartures.size @@ -105,7 +106,7 @@ return oldDeparture.vehicle.Line == newDeparture.vehicle.Line && oldDeparture.vehicle.Headsign == newDeparture.vehicle.Headsign && oldDeparture.statusText(context, false, lastUpdate) == newDeparture.statusText( context, false - ) + ) && !showAsTimeChanged } } @@ -144,12 +145,13 @@ } } fun update(departures: List<Departure>, showAsTime: Boolean, areNewObserved: Boolean = false) { - this.showAsTime = showAsTime val newPositions: MutableMap<String, Int> = HashMap() departures.forEachIndexed { i, departure -> newPositions[departure.ID] = i } - val diff = DiffUtil.calculateDiff(DiffUtilCallback(this.departures, departures)) + val diff = DiffUtil.calculateDiff(DiffUtilCallback(this.departures, departures, this.showAsTime != showAsTime)) + + this.showAsTime = showAsTime this.departures = departures departuresPositions = newPositions diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/departures/DeparturesActivity.kt b/app/src/main/java/xyz/apiote/bimba/czwek/departures/DeparturesActivity.kt index 9dc89693b118a24847ff43bf057d7635e5e7923f..5ca71e7b4c41c8c2114b3be04ad12b3ae86ca08e 100644 --- a/app/src/main/java/xyz/apiote/bimba/czwek/departures/DeparturesActivity.kt +++ b/app/src/main/java/xyz/apiote/bimba/czwek/departures/DeparturesActivity.kt @@ -147,8 +147,10 @@ datePicker.addOnNegativeButtonClickListener { date = null + startTime = LocalTime.MIN + endTime = LocalTime.MAX binding.departuresAppBar.menu.findItem(R.id.departures_filter_bytime).setEnabled(false) - getDepartures() // TODO force clear and error + getDepartures(true) } datePicker.addOnPositiveButtonClickListener { if (date == null) { @@ -158,7 +160,7 @@ } date = Instant.ofEpochMilli(it).atZone(ZoneId.systemDefault()) .toLocalDate() binding.departuresAppBar.menu.findItem(R.id.departures_filter_bytime).setEnabled(true) - getDepartures() // TODO force clear and error + getDepartures(true) } binding.collapsingLayout.apply { @@ -197,11 +199,11 @@ .setNegativeButtonText(R.string.clear_date_selection) .build() timePickerEnd!!.addOnPositiveButtonClickListener { endTime = LocalTime.of(timePickerEnd!!.hour, timePickerEnd!!.minute) - getDepartures() // TODO force clear and error + getDepartures(true) } timePickerEnd!!.addOnNegativeButtonClickListener { endTime = LocalTime.MAX - getDepartures() // TODO force clear and error + getDepartures(true) } timePickerStart!!.addOnPositiveButtonClickListener { startTime = LocalTime.of(timePickerStart!!.hour, timePickerStart!!.minute) @@ -300,10 +302,14 @@ else -> null } } - fun getDepartures() { - adapter.refreshItems() - setupSnackbar() - viewModel.getDepartures(this, date) + fun getDepartures(force: Boolean = false) { + if (force) { + showLoading() + } else { + adapter.refreshItems() + setupSnackbar() + } + viewModel.getDepartures(this, date, force) handler.removeCallbacks(runnable) runnable = Runnable { getDepartures() } handler.postDelayed(runnable, 30 * 1000) @@ -341,6 +347,12 @@ this, error.imageResource ) ) + } + + private fun showLoading() { + binding.departuresOverlay.visibility = View.VISIBLE + binding.departuresProgress.visibility = View.VISIBLE + binding.departuresRecycler.visibility = View.GONE } private fun updateItems(departures: List<Departure>, stop: Stop) { diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/departures/DeparturesViewModel.kt b/app/src/main/java/xyz/apiote/bimba/czwek/departures/DeparturesViewModel.kt index f7f11028cc98d6a6293159a69cd838bef236a0ac..b973174eeb0b9325f3c5282aaa682545ac5187e4 100644 --- a/app/src/main/java/xyz/apiote/bimba/czwek/departures/DeparturesViewModel.kt +++ b/app/src/main/java/xyz/apiote/bimba/czwek/departures/DeparturesViewModel.kt @@ -34,7 +34,7 @@ var allItemsRequested = false private var feed: FeedInfo? = null private lateinit var code: String - fun getDepartures(context: Context, date: LocalDate?) { + fun getDepartures(context: Context, date: LocalDate?, force: Boolean) { MainScope().launch { try { if (feed == null) { @@ -59,7 +59,7 @@ } _departures.value = it } } catch (e: TrafficResponseException) { - if (!departures.isInitialized) { + if (!departures.isInitialized || force) { _error.value = e.error } Log.w("Departures", "$e")