Bimba.git

commit 5085e486237837580be2a99760de358a51392970

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")