Bimba.git

commit 32104f0de2ec531ce921c93ff436cdf0df4b703a

Author: Adam Evyčędo <git@apiote.xyz>

show last update in departures

%!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 a2a8152df98efb81157b5bfd8062c55123f6736a..04c4d0a1eab4505ce9237ecf6e031cf6c5beeb22 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
@@ -75,8 +75,9 @@ 	private var departures: List,
 	private val onClickListener: ((Departure) -> Unit)
 ) :
 	RecyclerView.Adapter<BimbaDepartureViewHolder>() {
-	private var lastUpdate: ZonedDateTime =
+	var lastUpdate: ZonedDateTime =
 		ZonedDateTime.of(0, 1, 1, 0, 0, 0, 0, ZoneId.systemDefault())
+		private set
 
 	inner class DiffUtilCallback(
 		private val oldDepartures: List<Departure>,




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 eb5383ab99b21df06a3e578c4693a22051aeab3f..f47185c9f0a0948217cb80a2aa3dbbb6db37e310 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
@@ -8,6 +8,9 @@ import android.content.Intent
 import android.os.Bundle
 import android.os.Handler
 import android.os.Looper
+import android.text.format.DateUtils
+import android.text.format.DateUtils.MINUTE_IN_MILLIS
+import android.util.Log
 import android.view.View
 import androidx.appcompat.app.AppCompatActivity
 import androidx.appcompat.content.res.AppCompatResources
@@ -16,12 +19,14 @@ import androidx.core.view.WindowCompat
 import androidx.lifecycle.ViewModelProvider
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
+import com.google.android.material.snackbar.Snackbar
 import kotlinx.coroutines.Runnable
 import xyz.apiote.bimba.czwek.R
 import xyz.apiote.bimba.czwek.api.Error
 import xyz.apiote.bimba.czwek.databinding.ActivityDeparturesBinding
 import xyz.apiote.bimba.czwek.repo.Departure
 import xyz.apiote.bimba.czwek.repo.Stop
+import java.time.ZonedDateTime
 
 class DeparturesActivity : AppCompatActivity() {
 	private var _binding: ActivityDeparturesBinding? = null
@@ -33,6 +38,7 @@ 	private val handler = Handler(Looper.getMainLooper())
 	private var runnable = Runnable {}
 
 	private var openBottomSheet: DepartureBottomSheet? = null
+	private lateinit var snackbar: Snackbar
 
 	private lateinit var viewModel: DeparturesViewModel
 
@@ -83,6 +89,8 @@ 			}
 		}
 		binding.departuresRecycler.adapter = adapter
 		WindowCompat.setDecorFitsSystemWindows(window, false)
+
+		snackbar = Snackbar.make(binding.root, "", Snackbar.LENGTH_INDEFINITE)
 	}
 
 	override fun onResume() {
@@ -112,12 +120,28 @@ 	}
 
 	fun getDepartures() {
 		adapter.refreshItems()
+		setupSnackbar()
 		viewModel.getDepartures(this, getLine())
 		handler.removeCallbacks(runnable)
 		runnable = Runnable { getDepartures() }
 		handler.postDelayed(runnable, 30 * 1000)
 	}
 
+	private fun setupSnackbar() {
+		val lastUpdateAgo = ZonedDateTime.now().toEpochSecond() - adapter.lastUpdate.toEpochSecond()
+		if (lastUpdateAgo > 59 && adapter.lastUpdate.year != 0) {
+			snackbar.setText(getString(R.string.departures_snackbar,
+				DateUtils.getRelativeTimeSpanString(
+				adapter.lastUpdate.toEpochSecond() * 1000,
+				ZonedDateTime.now().toEpochSecond() * 1000,
+				MINUTE_IN_MILLIS,
+				DateUtils.FORMAT_ABBREV_RELATIVE))
+			).show()
+		} else {
+			snackbar.dismiss()
+		}
+	}
+
 	private fun showError(error: Error) {
 		binding.departuresProgress.visibility = View.GONE
 		binding.departuresRecycler.visibility = View.GONE
@@ -129,6 +153,7 @@ 		binding.errorImage.setImageDrawable(AppCompatResources.getDrawable(this, error.imageResource))
 	}
 
 	private fun updateItems(departures: List<Departure>, stop: Stop) {
+		setupSnackbar()
 		binding.departuresProgress.visibility = View.GONE
 		adapter.update(departures, true)
 		binding.collapsingLayout.apply {




diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e75dfa8d49488d81835c80e0f4e068f0e095800f..8b0524c6126083cb284dacaa638ca95ba4efe2b3 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -114,4 +114,5 @@ 	App version is not compatible with the server
 	<string name="filter_localities">filter localities</string>
 	<string name="error_41">This locality is not supported by the server</string>
 	<string name="stop_from_qr_code">QR code stop</string>
+    <string name="departures_snackbar">Last update: %1$s</string>
 </resources>
\ No newline at end of file