Skip to content

Commit

Permalink
V5changes (#483)
Browse files Browse the repository at this point in the history
* began v5

* more v5

* fix toString stuff

* add content rating filter defaults

* add ssl 443 only option

* fix monsters tag

* add option to default ssl port

* fix login and partially fix follows list

* V5changes goldbattle (#478)

* remove similar manga background job

* added non-running migration job

* change to dedicated notification channel

* Works :)

* remove logs

* fix follows

* add db to gitattributes binary

* add cover db

* add initial cover loading

* fix authors not loading

* fix publication status

* V5changes goldbattle similar (#479)

* Apply default filter to popular page (so content rating setting is set properly)

* Get similar manga from network (need to cache it still)

* change download folder for debug

* add old_mangadex_chapter_id to table
check old id format, and new format for downloads
store both in download cache
force download cache to refresh after migration

* fix follows list

* add option for renewing download cache

* add rx coroutine bridge

* update compiler args

* update download checker

* update download checker

* update download checker

* fix space after .

* fix login issue

* V5changes goldbattle for release (#481)

* Correctly convert ids on backup restore (legacy and proto)

* Cache similar manga response

* Swipe to refresh similar

* Re-add cache searching and backup (also now filter search based on content rating)

* Disable comments for now :(

* Remove unused file

* update from /manga to /title
migrate tracking for mdlist

* fix md@home reporting
up download limit

* inject mangaplus

* use the mangaplus client

* use current master db version

* update covers db
up manga limit during search

* Autocomplete for searching (requires cache information to have loaded) (#482)

* fix updating follow status

* add content type

* add logging

* add changelog

* release 2.4

Co-authored-by: Patrick Geneva <[email protected]>
  • Loading branch information
nonproto and goldbattle authored May 15, 2021
1 parent beac7af commit 71d9e70
Show file tree
Hide file tree
Showing 109 changed files with 3,195 additions and 2,235 deletions.
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,4 @@
*.woff binary
*.pyc binary
*.swp binary
*.db binary
19 changes: 17 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ android {
abiFilters("armeabi-v7a", "arm64-v8a", "x86")
}
}

dataBinding {
isEnabled = true
}

buildTypes {
getByName("debug") {
applicationIdSuffix = ".debug"
Expand Down Expand Up @@ -100,6 +105,9 @@ dependencies {
implementation(Libs.Android.constraintLayout)
implementation(Libs.Android.multiDex)

// Databinding for autocomplete search
kapt(Libs.Android.dataBinding)

implementation(Libs.Google.firebaseAnayltics)
implementation(Libs.Google.firebaseCrashltyics)
implementation(Libs.Google.firebaseCore)
Expand Down Expand Up @@ -259,8 +267,15 @@ dependencies {

// See https://kotlinlang.org/docs/reference/experimental.html#experimental-status-of-experimental-api-markers
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().all {
kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn"
kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlinx.serialization.ExperimentalSerializationApi"
kotlinOptions.freeCompilerArgs += listOf(
"-Xopt-in=kotlin.Experimental",
"-Xopt-in=kotlin.RequiresOptIn",
"-Xuse-experimental=kotlin.ExperimentalStdlibApi",
"-Xuse-experimental=kotlinx.coroutines.FlowPreview",
"-Xuse-experimental=kotlinx.coroutines.ExperimentalCoroutinesApi",
"-Xuse-experimental=kotlinx.coroutines.InternalCoroutinesApi",
"-Xuse-experimental=kotlinx.serialization.ExperimentalSerializationApi"
)
}

tasks.preBuild {
Expand Down
6 changes: 5 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,10 @@
android:name=".data.library.LibraryUpdateService"
android:exported="false" />

<service
android:name=".data.similar.MangaCacheUpdateService"
android:exported="false" />

<service
android:name=".data.download.DownloadService"
android:exported="false" />
Expand All @@ -201,7 +205,7 @@
android:exported="false" />

<service
android:name=".data.similar.SimilarUpdateService"
android:name=".v5.job.V5MigrationService"
android:exported="false" />

</application>
Expand Down
Binary file added app/src/main/assets/covers.db
Binary file not shown.
Binary file added app/src/main/assets/mangadex.db
Binary file not shown.
33 changes: 33 additions & 0 deletions app/src/main/java/eu/kanade/tachiyomi/AppModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,18 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.network.NetworkHelper
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.online.MangaDexLoginHelper
import eu.kanade.tachiyomi.source.online.handlers.ApiMangaParser
import eu.kanade.tachiyomi.source.online.handlers.FilterHandler
import eu.kanade.tachiyomi.source.online.handlers.FollowsHandler
import eu.kanade.tachiyomi.source.online.handlers.MangaHandler
import eu.kanade.tachiyomi.source.online.handlers.MangaPlusHandler
import eu.kanade.tachiyomi.source.online.handlers.PageHandler
import eu.kanade.tachiyomi.source.online.handlers.PopularHandler
import eu.kanade.tachiyomi.source.online.handlers.SearchHandler
import eu.kanade.tachiyomi.source.online.handlers.SimilarHandler
import eu.kanade.tachiyomi.util.chapter.ChapterFilter
import eu.kanade.tachiyomi.v5.db.V5DbHelper
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.serialization.json.Json
Expand Down Expand Up @@ -51,6 +62,28 @@ class AppModule(val app: Application) : InjektModule {

addSingletonFactory { Json { ignoreUnknownKeys = true } }

addSingletonFactory { V5DbHelper(app.applicationContext) }

addSingleton(FilterHandler())

addSingleton(FollowsHandler())

addSingleton(MangaHandler())

addSingleton(ApiMangaParser())

addSingleton(PopularHandler())

addSingleton(SearchHandler())

addSingleton(PageHandler())

addSingleton(SimilarHandler())

addSingleton(MangaDexLoginHelper())

addSingleton(MangaPlusHandler())

// Asynchronously init expensive components for a faster cold start

GlobalScope.launch { get<PreferencesHelper>() }
Expand Down
17 changes: 11 additions & 6 deletions app/src/main/java/eu/kanade/tachiyomi/Migrations.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
package eu.kanade.tachiyomi

import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.data.backup.BackupCreatorJob
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.data.similar.SimilarUpdateJob
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.updater.UpdaterJob
import eu.kanade.tachiyomi.source.online.utils.MdUtil
import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.v5.db.V5DbHelper
import eu.kanade.tachiyomi.v5.db.V5DbQueries
import eu.kanade.tachiyomi.v5.job.V5MigrationJob
import eu.kanade.tachiyomi.v5.job.V5MigrationService
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get

Expand All @@ -24,13 +30,11 @@ object Migrations {
val oldVersion = preferences.lastVersionCode().getOrDefault()
if (oldVersion < BuildConfig.VERSION_CODE) {
preferences.lastVersionCode().set(BuildConfig.VERSION_CODE)

if (oldVersion < 38) {
if (preferences.automaticUpdates()) {
UpdaterJob.setupTask()
}
}

if (oldVersion < 39) {
// Restore jobs after migrating from Evernote's job scheduler to WorkManager.
if (BuildConfig.INCLUDE_UPDATER && preferences.automaticUpdates()) {
Expand All @@ -40,15 +44,13 @@ object Migrations {
if (oldVersion < 53) {
LibraryUpdateJob.setupTask()
BackupCreatorJob.setupTask()
SimilarUpdateJob.setupTask(true)
}
if (oldVersion < 95 && oldVersion != 0) {
// Force MAL log out due to login flow change
val trackManager = Injekt.get<TrackManager>()
trackManager.myAnimeList.logout()
context.toast(R.string.myanimelist_relogin)
}

if (oldVersion < 113 && oldVersion != 0) {
// Force MAL log out due to login flow change
// v67: switched from scraping to WebView
Expand All @@ -59,7 +61,10 @@ object Migrations {
context.toast(R.string.myanimelist_relogin)
}
}

if(oldVersion < 114 && oldVersion != 0) {
// Force migrate all manga to the new V5 ids
V5MigrationJob.doWorkNow()
}
return true
}
return false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.data.backup.full

import android.content.Context
import android.net.Uri
import androidx.core.text.isDigitsOnly
import com.elvishew.xlog.XLog
import eu.kanade.tachiyomi.data.backup.RestoreHelper
import eu.kanade.tachiyomi.data.backup.full.models.BackupCategory
Expand All @@ -10,7 +11,10 @@ import eu.kanade.tachiyomi.data.backup.full.models.BackupSerializer
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.source.online.utils.MdUtil
import eu.kanade.tachiyomi.util.system.notificationManager
import eu.kanade.tachiyomi.v5.db.V5DbHelper
import eu.kanade.tachiyomi.v5.db.V5DbQueries
import kotlinx.coroutines.Job
import okio.buffer
import okio.gzip
Expand Down Expand Up @@ -44,6 +48,7 @@ class FullRestore(val context: Context, val job: Job?) {
private val trackingErrors = mutableListOf<String>()

private val db: DatabaseHelper by injectLazy()
internal val dbV5: V5DbHelper by injectLazy()
internal val trackManager: TrackManager by injectLazy()

suspend fun restoreBackup(uri: Uri) {
Expand Down Expand Up @@ -108,6 +113,16 @@ class FullRestore(val context: Context, val job: Job?) {
var dbManga = backupManager.getMangaFromDatabase(manga)
val dbMangaExists = dbManga != null

// If it is an old pre-V5 manga try to find the new id
val oldMangaId = MdUtil.getMangaId(manga.url)
val isNumericId = oldMangaId.isDigitsOnly()
if (isNumericId) {
val newMangaId = V5DbQueries.getNewMangaId(dbV5.idDb, oldMangaId)
if (newMangaId.isNotBlank()) {
manga.url = "/title/${newMangaId}"
}
}

if (dbMangaExists) {
backupManager.restoreMangaNoFetch(manga, dbManga!!)
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.data.backup.legacy

import android.content.Context
import android.net.Uri
import androidx.core.text.isDigitsOnly
import com.elvishew.xlog.XLog
import com.github.salomonbrys.kotson.fromJson
import com.google.gson.JsonArray
Expand All @@ -20,7 +21,10 @@ import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.database.models.TrackImpl
import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.source.online.utils.MdUtil
import eu.kanade.tachiyomi.util.system.notificationManager
import eu.kanade.tachiyomi.v5.db.V5DbHelper
import eu.kanade.tachiyomi.v5.db.V5DbQueries
import kotlinx.coroutines.Job
import uy.kohesive.injekt.injectLazy

Expand Down Expand Up @@ -68,6 +72,11 @@ class LegacyRestore(val context: Context, val job: Job?) {
*/
private val db: DatabaseHelper by injectLazy()

/**
* pre-V5 mangadex to V5 mangadex utility class
*/
internal val dbV5: V5DbHelper by injectLazy()

/**
* Tracking manager
*/
Expand Down Expand Up @@ -158,6 +167,16 @@ class LegacyRestore(val context: Context, val job: Job?) {
val dbManga = backupManager.getMangaFromDatabase(manga)
val dbMangaExists = dbManga != null

// If it is an old pre-V5 manga try to find the new id
val oldMangaId = MdUtil.getMangaId(manga.url)
val isNumericId = oldMangaId.isDigitsOnly()
if (isNumericId) {
val newMangaId = V5DbQueries.getNewMangaId(dbV5.idDb, oldMangaId)
if (newMangaId != "") {
manga.url = "/title/${newMangaId}"
}
}

if (dbMangaExists) {
// Manga in database copy information from manga already in database
backupManager.restoreMangaNoFetch(manga, dbManga!!)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class DbOpenCallback : SupportSQLiteOpenHelper.Callback(DATABASE_VERSION) {
/**
* Version of the database.
*/
const val DATABASE_VERSION = 25
const val DATABASE_VERSION = 26
}

override fun onCreate(db: SupportSQLiteDatabase) = with(db) {
Expand Down Expand Up @@ -60,7 +60,6 @@ class DbOpenCallback : SupportSQLiteOpenHelper.Callback(DATABASE_VERSION) {
}
if (oldVersion < 12) {
db.execSQL(SimilarTable.createTableQuery)
db.execSQL(SimilarTable.createMangaIdIndexQuery)
}
if (oldVersion < 13) {
db.execSQL(CategoryTable.addMangaOrder)
Expand Down Expand Up @@ -101,6 +100,14 @@ class DbOpenCallback : SupportSQLiteOpenHelper.Callback(DATABASE_VERSION) {
if (oldVersion < 24) {
db.execSQL(CachedMangaTable.createVirtualTableQuery)
}
if (oldVersion < 26) {
db.execSQL(ChapterTable.addOldMangaDexChapterId)
db.execSQL(SimilarTable.dropTableQuery)
db.execSQL(SimilarTable.createTableQuery)
db.execSQL(SimilarTable.createMangaIdIndexQuery)
db.execSQL(CachedMangaTable.dropVirtualTableQuery)
db.execSQL(CachedMangaTable.createVirtualTableQuery)
}
}

override fun onConfigure(db: SupportSQLiteDatabase) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ import com.pushtorefresh.storio.sqlite.queries.DeleteQuery
import com.pushtorefresh.storio.sqlite.queries.InsertQuery
import com.pushtorefresh.storio.sqlite.queries.UpdateQuery
import eu.kanade.tachiyomi.data.database.models.CachedManga
import eu.kanade.tachiyomi.data.database.tables.CachedMangaTable.COL_MANGA_ID
import eu.kanade.tachiyomi.data.database.tables.CachedMangaTable.COL_MANGA_TITLE
import eu.kanade.tachiyomi.data.database.tables.CachedMangaTable.COL_MANGA_UUID
import eu.kanade.tachiyomi.data.database.tables.CachedMangaTable.COL_MANGA_RATING
import eu.kanade.tachiyomi.data.database.tables.CachedMangaTable.TABLE_FTS

class CacheMangaTypeMapping : SQLiteTypeMapping<CachedManga>(
Expand All @@ -28,29 +29,31 @@ class CacheMangaPutResolver : DefaultPutResolver<CachedManga>() {

override fun mapToUpdateQuery(obj: CachedManga) = UpdateQuery.builder()
.table(TABLE_FTS)
.where("$COL_MANGA_ID = ?")
.whereArgs(obj.mangaId)
.where("$COL_MANGA_UUID = ?")
.whereArgs(obj.uuid)
.build()

override fun mapToContentValues(obj: CachedManga) = ContentValues(2).apply {
put(COL_MANGA_ID, obj.mangaId)
override fun mapToContentValues(obj: CachedManga) = ContentValues(3).apply {
put(COL_MANGA_TITLE, obj.title)
put(COL_MANGA_UUID, obj.uuid)
put(COL_MANGA_RATING, obj.rating)
}
}

class CacheMangaGetResolver : DefaultGetResolver<CachedManga>() {

override fun mapFromCursor(cursor: Cursor): CachedManga = CachedManga(
mangaId = cursor.getLong(cursor.getColumnIndex(COL_MANGA_ID)),
title = cursor.getString(cursor.getColumnIndex(COL_MANGA_TITLE))
title = cursor.getString(cursor.getColumnIndex(COL_MANGA_TITLE)),
uuid = cursor.getString(cursor.getColumnIndex(COL_MANGA_UUID)),
rating = cursor.getString(cursor.getColumnIndex(COL_MANGA_RATING))
)
}

class CacheMangaDeleteResolver : DefaultDeleteResolver<CachedManga>() {

override fun mapToDeleteQuery(obj: CachedManga) = DeleteQuery.builder()
.table(TABLE_FTS)
.where("$COL_MANGA_ID = ?")
.whereArgs(obj.mangaId)
.where("$COL_MANGA_UUID = ?")
.whereArgs(obj.uuid)
.build()
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.data.database.mappers

import android.content.ContentValues
import android.database.Cursor
import androidx.core.database.getStringOrNull
import com.pushtorefresh.storio.sqlite.SQLiteTypeMapping
import com.pushtorefresh.storio.sqlite.operations.delete.DefaultDeleteResolver
import com.pushtorefresh.storio.sqlite.operations.get.DefaultGetResolver
Expand All @@ -23,6 +24,7 @@ import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_LAST_PAGE_READ
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_MANGADEX_CHAPTER_ID
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_MANGA_ID
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_NAME
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_OLD_MANGADEX_CHAPTER_ID
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_PAGES_LEFT
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_READ
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_SCANLATOR
Expand Down Expand Up @@ -68,6 +70,7 @@ class ChapterPutResolver : DefaultPutResolver<Chapter>() {
put(COL_SOURCE_ORDER, obj.source_order)
put(COL_MANGADEX_CHAPTER_ID, obj.mangadex_chapter_id)
put(COL_LANGUAGE, obj.language)
put(COL_OLD_MANGADEX_CHAPTER_ID, obj.old_mangadex_id)
}
}

Expand All @@ -92,6 +95,7 @@ class ChapterGetResolver : DefaultGetResolver<Chapter>() {
source_order = cursor.getInt(cursor.getColumnIndex(COL_SOURCE_ORDER))
mangadex_chapter_id = cursor.getString(cursor.getColumnIndex(COL_MANGADEX_CHAPTER_ID))
language = cursor.getString(cursor.getColumnIndex(COL_LANGUAGE))
old_mangadex_id = cursor.getStringOrNull(cursor.getColumnIndex(COL_OLD_MANGADEX_CHAPTER_ID))
}
}

Expand Down
Loading

0 comments on commit 71d9e70

Please sign in to comment.