From b45147563a38f906fe4f70d667e9bd8add7b3fa3 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Tue, 21 Mar 2023 20:03:57 +0200 Subject: [PATCH] Fix progress percent computatiion #327 --- .../kotatsu/details/ui/DetailsViewModel.kt | 2 +- .../kotatsu/reader/ui/ReaderViewModel.kt | 3 +- .../tracker/domain/TrackingRepository.kt | 18 ++++++++- .../kotatsu/tracker/work/TrackWorker.kt | 37 +++++++++++-------- 4 files changed, 42 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt index ffe2bbd72..a804a3166 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt @@ -265,7 +265,7 @@ class DetailsViewModel @Inject constructor( fun markChapterAsCurrent(chapterId: Long) { launchJob(Dispatchers.Default) { val manga = checkNotNull(delegate.manga.value) - val chapters = checkNotNull(manga.chapters) + val chapters = checkNotNull(manga.getChapters(selectedBranchValue)) val chapterIndex = chapters.indexOfFirst { it.id == chapterId } check(chapterIndex in chapters.indices) { "Chapter not found" } val percent = chapterIndex / chapters.size.toFloat() diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt index 3a7c6b786..67bf38502 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt @@ -381,7 +381,8 @@ class ReaderViewModel @Inject constructor( } private fun computePercent(chapterId: Long, pageIndex: Int): Float { - val chapters = manga?.chapters ?: return PROGRESS_NONE + val branch = chapters[chapterId]?.branch + val chapters = manga?.getChapters(branch) ?: return PROGRESS_NONE val chaptersCount = chapters.size val chapterIndex = chapters.indexOfFirst { x -> x.id == chapterId } val pagesCount = chaptersLoader.getPagesCount(chapterId) diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/domain/TrackingRepository.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/domain/TrackingRepository.kt index ee1253901..4514515c1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/domain/TrackingRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/domain/TrackingRepository.kt @@ -113,7 +113,8 @@ class TrackingRepository @Inject constructor( db.withTransaction { val track = getOrCreateTrack(updates.manga.id).mergeWith(updates) db.tracksDao.upsert(track) - if (updates.isValid && updates.newChapters.isNotEmpty()) { + if (updates.isValid /*&& updates.newChapters.isNotEmpty()*/) { + updatePercent(updates) val logEntity = TrackLogEntity( mangaId = updates.manga.id, chapters = updates.newChapters.joinToString("\n") { x -> x.name }, @@ -177,6 +178,21 @@ class TrackingRepository @Inject constructor( ) } + private suspend fun updatePercent(updates: MangaUpdates) { + val history = db.historyDao.find(updates.manga.id) ?: return + val chapters = updates.manga.chapters + if (chapters.isNullOrEmpty()) { + return + } + val chapterIndex = chapters.indexOfFirst { it.id == history.chapterId } + if (chapterIndex < 0) { + return + } + val position = (chapters.size - updates.newChapters.size) * history.percent + val newPercent = position / chapters.size.toFloat() + db.historyDao.update(history.copy(percent = newPercent)) + } + private fun TrackEntity.mergeWith(updates: MangaUpdates): TrackEntity { val chapters = updates.manga.chapters.orEmpty() return TrackEntity( 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 7aaca6808..1b670e2b6 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 @@ -195,9 +195,7 @@ class TrackWorker @AssistedInject constructor( builder.setDefaults(defaults) } } - withContext(Dispatchers.Main) { - notificationManager.notify(TAG, id, builder.build()) - } + notificationManager.notify(TAG, id, builder.build()) } override suspend fun getForegroundInfo(): ForegroundInfo { @@ -214,13 +212,17 @@ class TrackWorker @AssistedInject constructor( channel.enableLights(false) notificationManager.createNotificationChannel(channel) } - - val notification = NotificationCompat.Builder(applicationContext, WORKER_CHANNEL_ID).setContentTitle(title) - .setPriority(NotificationCompat.PRIORITY_MIN).setDefaults(0) - .setColor(ContextCompat.getColor(applicationContext, R.color.blue_primary_dark)).setSilent(true) - .setProgress(0, 0, true).setSmallIcon(android.R.drawable.stat_notify_sync) - .setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_DEFERRED).setOngoing(true).build() - + val notification = NotificationCompat.Builder(applicationContext, WORKER_CHANNEL_ID) + .setContentTitle(title) + .setPriority(NotificationCompat.PRIORITY_MIN) + .setDefaults(0) + .setColor(ContextCompat.getColor(applicationContext, R.color.blue_primary_dark)) + .setSilent(true) + .setProgress(0, 0, true) + .setSmallIcon(android.R.drawable.stat_notify_sync) + .setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_DEFERRED) + .setOngoing(true) + .build() return ForegroundInfo(WORKER_NOTIFICATION_ID, notification) } @@ -243,16 +245,21 @@ class TrackWorker @AssistedInject constructor( fun setup(context: Context) { val constraints = Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build() - val request = - PeriodicWorkRequestBuilder(4, TimeUnit.HOURS).setConstraints(constraints).addTag(TAG) - .setBackoffCriteria(BackoffPolicy.LINEAR, 30, TimeUnit.MINUTES).build() + val request = PeriodicWorkRequestBuilder(4, TimeUnit.HOURS) + .setConstraints(constraints) + .addTag(TAG) + .setBackoffCriteria(BackoffPolicy.LINEAR, 30, TimeUnit.MINUTES) + .build() WorkManager.getInstance(context).enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.KEEP, request) } fun startNow(context: Context) { val constraints = Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build() - val request = OneTimeWorkRequestBuilder().setConstraints(constraints).addTag(TAG_ONESHOT) - .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST).build() + val request = OneTimeWorkRequestBuilder() + .setConstraints(constraints) + .addTag(TAG_ONESHOT) + .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) + .build() WorkManager.getInstance(context).enqueue(request) }