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 { + return WorkManager.getInstance(context) + .getWorkInfosByTagLiveData(TAG) + .map { list -> + list.find { work -> + work.state == WorkInfo.State.RUNNING + }?.let { workInfo -> + Progress( + value = workInfo.progress.getInt(DATA_PROGRESS, 0), + total = workInfo.progress.getInt(DATA_TOTAL, -1) + ).takeUnless { it.isIndeterminate } + } + } + } } } \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 999c15302..c86d80cda 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -192,4 +192,5 @@ Resolve Очистить куки Все куки удалены + Проверка новых глав: %1$d из %2$d \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a264fd016..5966784cf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -194,4 +194,5 @@ Resolve Clear cookies All cookies was removed + Checking for new chapters: %1$d of %2$d \ No newline at end of file