diff --git a/.idea/dictionaries/admin.xml b/.idea/dictionaries/admin.xml
index dce652d7a..64cf6888c 100644
--- a/.idea/dictionaries/admin.xml
+++ b/.idea/dictionaries/admin.xml
@@ -8,6 +8,7 @@
koin
kotatsu
manga
+ snackbar
upsert
webtoon
diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt
index f6d88c124..1712241e6 100644
--- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt
@@ -19,6 +19,7 @@ import org.koitharu.kotatsu.list.ui.model.ListModel
import org.koitharu.kotatsu.tracker.ui.adapter.FeedAdapter
import org.koitharu.kotatsu.tracker.work.TrackWorker
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
+import org.koitharu.kotatsu.utils.progress.Progress
class FeedFragment : BaseFragment(), PaginationScrollListener.Callback,
OnListItemClickListener {
@@ -26,6 +27,7 @@ class FeedFragment : BaseFragment(), PaginationScrollListen
private val viewModel by viewModel()
private var feedAdapter: FeedAdapter? = null
+ private var updateStatusSnackbar: Snackbar? = null
override fun getTitle() = context?.getString(R.string.updates)
@@ -53,6 +55,8 @@ class FeedFragment : BaseFragment(), PaginationScrollListen
viewModel.content.observe(viewLifecycleOwner, this::onListChanged)
viewModel.onError.observe(viewLifecycleOwner, this::onError)
+ TrackWorker.getProgressLiveData(view.context.applicationContext)
+ .observe(viewLifecycleOwner, this::onUpdateProgressChanged)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
@@ -66,7 +70,7 @@ class FeedFragment : BaseFragment(), PaginationScrollListen
Snackbar.make(
binding.recyclerView,
R.string.feed_will_update_soon,
- Snackbar.LENGTH_LONG
+ Snackbar.LENGTH_SHORT
).show()
true
}
@@ -75,6 +79,7 @@ class FeedFragment : BaseFragment(), PaginationScrollListen
override fun onDestroyView() {
feedAdapter = null
+ updateStatusSnackbar = null
super.onDestroyView()
}
@@ -98,6 +103,25 @@ class FeedFragment : BaseFragment(), PaginationScrollListen
).show()
}
+ private fun onUpdateProgressChanged(progress: Progress?) {
+ if (progress == null) {
+ updateStatusSnackbar?.dismiss()
+ updateStatusSnackbar = null
+ return
+ }
+ val summaryText = getString(
+ R.string.chapers_checking_progress,
+ progress.value + 1,
+ progress.total
+ )
+ updateStatusSnackbar?.setText(summaryText) ?: run {
+ val snackbar =
+ Snackbar.make(binding.recyclerView, summaryText, Snackbar.LENGTH_INDEFINITE)
+ updateStatusSnackbar = snackbar
+ snackbar.show()
+ }
+ }
+
override fun onScrolledToEnd() {
viewModel.loadList(append = true)
}
diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/work/TrackWorker.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/work/TrackWorker.kt
index f80dcac07..81a6ee468 100644
--- a/app/src/main/java/org/koitharu/kotatsu/tracker/work/TrackWorker.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/tracker/work/TrackWorker.kt
@@ -8,6 +8,8 @@ import android.os.Build
import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.map
import androidx.work.*
import coil.ImageLoader
import coil.request.ImageRequest
@@ -24,6 +26,7 @@ import org.koitharu.kotatsu.tracker.domain.TrackingRepository
import org.koitharu.kotatsu.utils.ext.mangaRepositoryOf
import org.koitharu.kotatsu.utils.ext.toBitmapOrNull
import org.koitharu.kotatsu.utils.ext.toUriOrNull
+import org.koitharu.kotatsu.utils.progress.Progress
import java.util.concurrent.TimeUnit
class TrackWorker(context: Context, workerParams: WorkerParameters) :
@@ -50,10 +53,14 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) :
return Result.success()
}
var success = 0
- for (track in tracks) {
+ val workData = Data.Builder()
+ .putInt(DATA_TOTAL, tracks.size)
+ for ((index, track) in tracks.withIndex()) {
val details = runCatching {
mangaRepositoryOf(track.manga.source).getDetails(track.manga)
}.getOrNull()
+ workData.putInt(DATA_PROGRESS, index)
+ setProgress(workData.build())
val chapters = details?.chapters ?: continue
when {
track.knownChaptersCount == -1 -> { //first check
@@ -194,6 +201,8 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) :
companion object {
const val CHANNEL_ID = "tracking"
+ private const val DATA_PROGRESS = "progress"
+ private const val DATA_TOTAL = "total"
private const val TAG = "tracking"
@RequiresApi(Build.VERSION_CODES.O)
@@ -240,5 +249,20 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) :
WorkManager.getInstance(context)
.enqueue(request)
}
+
+ fun getProgressLiveData(context: Context): LiveData