Log manga tracking

pull/26/head
Koitharu 6 years ago
parent 7cf57535ab
commit 140a0f4d66

@ -19,8 +19,6 @@ android {
versionCode gitCommits versionCode gitCommits
versionName '0.4' versionName '0.4'
buildConfigField 'String', 'GIT_BRANCH', "\"${gitBranch}\""
kapt { kapt {
arguments { arguments {
arg 'room.schemaLocation', "$projectDir/schemas".toString() arg 'room.schemaLocation', "$projectDir/schemas".toString()
@ -73,7 +71,7 @@ dependencies {
implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha03' implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha03'
implementation 'androidx.viewpager2:viewpager2:1.1.0-alpha01' implementation 'androidx.viewpager2:viewpager2:1.1.0-alpha01'
implementation 'androidx.preference:preference-ktx:1.1.1' 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 'com.google.android.material:material:1.2.0-alpha06'
implementation 'androidx.room:room-runtime:2.2.5' implementation 'androidx.room:room-runtime:2.2.5'

@ -17,8 +17,8 @@ import androidx.room.PrimaryKey
) )
data class TrackLogEntity( data class TrackLogEntity(
@PrimaryKey(autoGenerate = true) @PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id") val id: Long, @ColumnInfo(name = "id") val id: Long = 0L,
@ColumnInfo(name = "manga_id") val mangaId: Long, @ColumnInfo(name = "manga_id", index = true) val mangaId: Long,
@ColumnInfo(name = "chapters") val chapters: String, @ColumnInfo(name = "chapters") val chapters: String,
@ColumnInfo(name = "created_at") val createdAt: Long = System.currentTimeMillis() @ColumnInfo(name = "created_at") val createdAt: Long = System.currentTimeMillis()
) )

@ -3,6 +3,8 @@ package org.koitharu.kotatsu.core.db.entity
import androidx.room.Embedded import androidx.room.Embedded
import androidx.room.Junction import androidx.room.Junction
import androidx.room.Relation import androidx.room.Relation
import org.koitharu.kotatsu.core.model.TrackingLogItem
import java.util.*
data class TrackLogWithManga( data class TrackLogWithManga(
@Embedded val trackLog: TrackLogEntity, @Embedded val trackLog: TrackLogEntity,
@ -17,4 +19,12 @@ data class TrackLogWithManga(
associateBy = Junction(MangaTagsEntity::class) associateBy = Junction(MangaTagsEntity::class)
) )
val tags: List<TagEntity> val tags: List<TagEntity>
) ) {
fun toTrackingLogItem() = TrackingLogItem(
id = trackLog.id,
chapters = trackLog.chapters.split('\n'),
manga = manga.toManga(tags.map { x -> x.toMangaTag() }.toSet()),
createdAt = Date(trackLog.createdAt)
)
}

@ -7,5 +7,6 @@ object Migration5To6 : Migration(4, 5) {
override fun migrate(database: SupportSQLiteDatabase) { 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 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)")
} }
} }

@ -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<String>,
val createdAt: Date
): Parcelable

@ -1,11 +1,15 @@
package org.koitharu.kotatsu.domain.tracking package org.koitharu.kotatsu.domain.tracking
import androidx.room.withTransaction
import org.koin.core.KoinComponent import org.koin.core.KoinComponent
import org.koin.core.inject import org.koin.core.inject
import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.db.MangaDatabase
import org.koitharu.kotatsu.core.db.entity.TrackEntity 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.Manga
import org.koitharu.kotatsu.core.model.MangaChapter
import org.koitharu.kotatsu.core.model.MangaTracking import org.koitharu.kotatsu.core.model.MangaTracking
import org.koitharu.kotatsu.core.model.TrackingLogItem
import java.util.* import java.util.*
class TrackingRepository : KoinComponent { class TrackingRepository : KoinComponent {
@ -34,22 +38,36 @@ class TrackingRepository : KoinComponent {
} }
} }
suspend fun getTrackingLog(offset: Int, limit: Int): List<TrackingLogItem> {
return db.trackLogsDao.findAll(offset, limit).map { x ->
x.toTrackingLogItem()
}
}
suspend fun storeTrackResult( suspend fun storeTrackResult(
mangaId: Long, mangaId: Long,
knownChaptersCount: Int, knownChaptersCount: Int,
lastChapterId: Long, lastChapterId: Long,
newChapters: Int, newChapters: List<MangaChapter>,
lastNotifiedChapterId: Long lastNotifiedChapterId: Long
) { ) {
val entity = TrackEntity( val entity = TrackEntity(
mangaId = mangaId, mangaId = mangaId,
newChapters = newChapters, newChapters = newChapters.size,
lastCheck = System.currentTimeMillis(), lastCheck = System.currentTimeMillis(),
lastChapterId = lastChapterId, lastChapterId = lastChapterId,
totalChapters = knownChaptersCount, totalChapters = knownChaptersCount,
lastNotifiedChapterId = lastNotifiedChapterId 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) { suspend fun upsert(manga: Manga) {

@ -56,7 +56,7 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) :
knownChaptersCount = chapters.size, knownChaptersCount = chapters.size,
lastChapterId = chapters.lastOrNull()?.id ?: 0L, lastChapterId = chapters.lastOrNull()?.id ?: 0L,
lastNotifiedChapterId = 0L, lastNotifiedChapterId = 0L,
newChapters = 0 newChapters = emptyList()
) )
} }
track.knownChaptersCount == 0 && track.lastChapterId == 0L -> { //manga was empty on last check 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, knownChaptersCount = track.knownChaptersCount,
lastChapterId = 0L, lastChapterId = 0L,
lastNotifiedChapterId = chapters.lastOrNull()?.id ?: 0L, lastNotifiedChapterId = chapters.lastOrNull()?.id ?: 0L,
newChapters = chapters.size newChapters = chapters
) )
showNotification(track.manga, chapters) showNotification(track.manga, chapters)
} }
@ -83,10 +83,10 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) :
knownChaptersCount = chapters.size, knownChaptersCount = chapters.size,
lastChapterId = chapters.lastOrNull()?.id ?: 0L, lastChapterId = chapters.lastOrNull()?.id ?: 0L,
lastNotifiedChapterId = chapters.lastOrNull()?.id ?: 0L, lastNotifiedChapterId = chapters.lastOrNull()?.id ?: 0L,
newChapters = 0 newChapters = emptyList()
) )
} else { } else {
val newChapters = chapters.size - knownChapter + 1 val newChapters = chapters.takeLast(chapters.size - knownChapter + 1)
repo.storeTrackResult( repo.storeTrackResult(
mangaId = track.manga.id, mangaId = track.manga.id,
knownChaptersCount = knownChapter + 1, knownChaptersCount = knownChapter + 1,
@ -95,13 +95,13 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) :
newChapters = newChapters newChapters = newChapters
) )
if (chapters.lastOrNull()?.id != track.lastNotifiedChapterId) { if (chapters.lastOrNull()?.id != track.lastNotifiedChapterId) {
showNotification(track.manga, chapters.takeLast(newChapters)) showNotification(track.manga, newChapters)
} }
} }
} }
} }
else -> { else -> {
val newChapters = chapters.size - track.knownChaptersCount val newChapters = chapters.takeLast(chapters.size - track.knownChaptersCount)
repo.storeTrackResult( repo.storeTrackResult(
mangaId = track.manga.id, mangaId = track.manga.id,
knownChaptersCount = track.knownChaptersCount, knownChaptersCount = track.knownChaptersCount,
@ -110,7 +110,7 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) :
newChapters = newChapters newChapters = newChapters
) )
if (chapters.lastOrNull()?.id != track.lastNotifiedChapterId) { if (chapters.lastOrNull()?.id != track.lastNotifiedChapterId) {
showNotification(track.manga, chapters.takeLast(newChapters)) showNotification(track.manga, newChapters)
} }
} }
} }

Loading…
Cancel
Save