From 140a0f4d66d6879166d4061510dcbb4a729138fd Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 22 May 2020 19:20:08 +0300 Subject: [PATCH] Log manga tracking --- app/build.gradle | 4 +--- .../kotatsu/core/db/entity/TrackLogEntity.kt | 4 ++-- .../core/db/entity/TrackLogWithManga.kt | 12 +++++++++- .../core/db/migrations/Migration5To6.kt | 1 + .../kotatsu/core/model/TrackingLogItem.kt | 13 ++++++++++ .../domain/tracking/TrackingRepository.kt | 24 ++++++++++++++++--- .../kotatsu/ui/tracker/TrackWorker.kt | 14 +++++------ 7 files changed, 56 insertions(+), 16 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/model/TrackingLogItem.kt diff --git a/app/build.gradle b/app/build.gradle index 5ace4d9fe..483804f1b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,8 +19,6 @@ android { versionCode gitCommits versionName '0.4' - buildConfigField 'String', 'GIT_BRANCH', "\"${gitBranch}\"" - kapt { arguments { arg 'room.schemaLocation', "$projectDir/schemas".toString() @@ -73,7 +71,7 @@ dependencies { implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha03' implementation 'androidx.viewpager2:viewpager2:1.1.0-alpha01' implementation 'androidx.preference:preference-ktx:1.1.1' - implementation 'androidx.work:work-runtime-ktx:2.4.0-beta1' + implementation 'androidx.work:work-runtime-ktx:2.4.0-beta01' implementation 'com.google.android.material:material:1.2.0-alpha06' implementation 'androidx.room:room-runtime:2.2.5' diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/entity/TrackLogEntity.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/entity/TrackLogEntity.kt index cf46e2338..e73d34d74 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/entity/TrackLogEntity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/entity/TrackLogEntity.kt @@ -17,8 +17,8 @@ import androidx.room.PrimaryKey ) data class TrackLogEntity( @PrimaryKey(autoGenerate = true) - @ColumnInfo(name = "id") val id: Long, - @ColumnInfo(name = "manga_id") val mangaId: Long, + @ColumnInfo(name = "id") val id: Long = 0L, + @ColumnInfo(name = "manga_id", index = true) val mangaId: Long, @ColumnInfo(name = "chapters") val chapters: String, @ColumnInfo(name = "created_at") val createdAt: Long = System.currentTimeMillis() ) \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/entity/TrackLogWithManga.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/entity/TrackLogWithManga.kt index 8c3b8c1b9..d783c41d3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/entity/TrackLogWithManga.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/entity/TrackLogWithManga.kt @@ -3,6 +3,8 @@ package org.koitharu.kotatsu.core.db.entity import androidx.room.Embedded import androidx.room.Junction import androidx.room.Relation +import org.koitharu.kotatsu.core.model.TrackingLogItem +import java.util.* data class TrackLogWithManga( @Embedded val trackLog: TrackLogEntity, @@ -17,4 +19,12 @@ data class TrackLogWithManga( associateBy = Junction(MangaTagsEntity::class) ) val tags: List -) \ No newline at end of file +) { + + fun toTrackingLogItem() = TrackingLogItem( + id = trackLog.id, + chapters = trackLog.chapters.split('\n'), + manga = manga.toManga(tags.map { x -> x.toMangaTag() }.toSet()), + createdAt = Date(trackLog.createdAt) + ) +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration5To6.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration5To6.kt index 02da0bdfa..9cf52d819 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration5To6.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration5To6.kt @@ -7,5 +7,6 @@ object Migration5To6 : Migration(4, 5) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("CREATE TABLE IF NOT EXISTS track_logs (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, manga_id INTEGER NOT NULL, chapters TEXT NOT NULL, created_at INTEGER NOT NULL, FOREIGN KEY(manga_id) REFERENCES manga(manga_id) ON UPDATE NO ACTION ON DELETE CASCADE)") + database.execSQL("CREATE INDEX IF NOT EXISTS index_track_logs_manga_id ON track_logs (manga_id)") } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/model/TrackingLogItem.kt b/app/src/main/java/org/koitharu/kotatsu/core/model/TrackingLogItem.kt new file mode 100644 index 000000000..3f5d50984 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/model/TrackingLogItem.kt @@ -0,0 +1,13 @@ +package org.koitharu.kotatsu.core.model + +import android.os.Parcelable +import kotlinx.android.parcel.Parcelize +import java.util.* + +@Parcelize +data class TrackingLogItem ( + val id: Long, + val manga: Manga, + val chapters: List, + val createdAt: Date +): Parcelable \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/tracking/TrackingRepository.kt b/app/src/main/java/org/koitharu/kotatsu/domain/tracking/TrackingRepository.kt index 97bcc9b7c..eba1084eb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/domain/tracking/TrackingRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/domain/tracking/TrackingRepository.kt @@ -1,11 +1,15 @@ package org.koitharu.kotatsu.domain.tracking +import androidx.room.withTransaction import org.koin.core.KoinComponent import org.koin.core.inject import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.db.entity.TrackEntity +import org.koitharu.kotatsu.core.db.entity.TrackLogEntity import org.koitharu.kotatsu.core.model.Manga +import org.koitharu.kotatsu.core.model.MangaChapter import org.koitharu.kotatsu.core.model.MangaTracking +import org.koitharu.kotatsu.core.model.TrackingLogItem import java.util.* class TrackingRepository : KoinComponent { @@ -34,22 +38,36 @@ class TrackingRepository : KoinComponent { } } + suspend fun getTrackingLog(offset: Int, limit: Int): List { + return db.trackLogsDao.findAll(offset, limit).map { x -> + x.toTrackingLogItem() + } + } + suspend fun storeTrackResult( mangaId: Long, knownChaptersCount: Int, lastChapterId: Long, - newChapters: Int, + newChapters: List, lastNotifiedChapterId: Long ) { val entity = TrackEntity( mangaId = mangaId, - newChapters = newChapters, + newChapters = newChapters.size, lastCheck = System.currentTimeMillis(), lastChapterId = lastChapterId, totalChapters = knownChaptersCount, lastNotifiedChapterId = lastNotifiedChapterId ) - db.tracksDao.upsert(entity) + val logEntity = TrackLogEntity( + mangaId = mangaId, + chapters = newChapters.joinToString("\n") { x -> x.name }, + createdAt = System.currentTimeMillis() + ) + db.withTransaction { + db.tracksDao.upsert(entity) + db.trackLogsDao.insert(logEntity) + } } suspend fun upsert(manga: Manga) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/tracker/TrackWorker.kt b/app/src/main/java/org/koitharu/kotatsu/ui/tracker/TrackWorker.kt index 8b4acfd14..c5e3fab78 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/tracker/TrackWorker.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/tracker/TrackWorker.kt @@ -56,7 +56,7 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : knownChaptersCount = chapters.size, lastChapterId = chapters.lastOrNull()?.id ?: 0L, lastNotifiedChapterId = 0L, - newChapters = 0 + newChapters = emptyList() ) } track.knownChaptersCount == 0 && track.lastChapterId == 0L -> { //manga was empty on last check @@ -65,7 +65,7 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : knownChaptersCount = track.knownChaptersCount, lastChapterId = 0L, lastNotifiedChapterId = chapters.lastOrNull()?.id ?: 0L, - newChapters = chapters.size + newChapters = chapters ) showNotification(track.manga, chapters) } @@ -83,10 +83,10 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : knownChaptersCount = chapters.size, lastChapterId = chapters.lastOrNull()?.id ?: 0L, lastNotifiedChapterId = chapters.lastOrNull()?.id ?: 0L, - newChapters = 0 + newChapters = emptyList() ) } else { - val newChapters = chapters.size - knownChapter + 1 + val newChapters = chapters.takeLast(chapters.size - knownChapter + 1) repo.storeTrackResult( mangaId = track.manga.id, knownChaptersCount = knownChapter + 1, @@ -95,13 +95,13 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : newChapters = newChapters ) if (chapters.lastOrNull()?.id != track.lastNotifiedChapterId) { - showNotification(track.manga, chapters.takeLast(newChapters)) + showNotification(track.manga, newChapters) } } } } else -> { - val newChapters = chapters.size - track.knownChaptersCount + val newChapters = chapters.takeLast(chapters.size - track.knownChaptersCount) repo.storeTrackResult( mangaId = track.manga.id, knownChaptersCount = track.knownChaptersCount, @@ -110,7 +110,7 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : newChapters = newChapters ) if (chapters.lastOrNull()?.id != track.lastNotifiedChapterId) { - showNotification(track.manga, chapters.takeLast(newChapters)) + showNotification(track.manga, newChapters) } } }