diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000000..32d6b8a7e2
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,2 @@
+[*.{kt,kts}]
+disabled_rules=import-ordering
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
deleted file mode 100644
index 1d77babeaf..0000000000
--- a/app/build.gradle
+++ /dev/null
@@ -1,273 +0,0 @@
-import java.text.SimpleDateFormat
-
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
-apply plugin: 'kotlin-kapt'
-apply plugin: 'com.github.zellius.shortcut-helper'
-
-shortcutHelper.filePath = './shortcuts.xml'
-
-ext {
- // Git is needed in your system PATH for these commands to work.
- // If it's not installed, you can return a random value as a workaround
- getCommitCount = {
- return 'git rev-list --count HEAD'.execute().text.trim()
- // return "1"
- }
-
- getGitSha = {
- return 'git rev-parse --short HEAD'.execute().text.trim()
- // return "1"
- }
-
- getBuildTime = {
- def df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'")
- df.setTimeZone(TimeZone.getTimeZone("UTC"))
- return df.format(new Date())
- }
-}
-
-android {
- compileSdkVersion 29
- buildToolsVersion '29.0.2'
- publishNonDefault true
-
- defaultConfig {
- applicationId "eu.kanade.tachiyomi"
- minSdkVersion 21
- targetSdkVersion 29
- testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
- versionCode 60
- versionName '0.9.81'
-
- buildConfigField "String", "COMMIT_COUNT", "\"${getCommitCount()}\""
- buildConfigField "String", "COMMIT_SHA", "\"${getGitSha()}\""
- buildConfigField "String", "BUILD_TIME", "\"${getBuildTime()}\""
- buildConfigField "boolean", "INCLUDE_UPDATER", "false"
-
- vectorDrawables.useSupportLibrary = true
-
- multiDexEnabled true
-
- ndk {
- abiFilters "armeabi-v7a", "arm64-v8a", "x86"
- }
- }
-
- buildTypes {
- debug {
- versionNameSuffix "-${getCommitCount()}"
- applicationIdSuffix ".debug"
- }
- release {
- applicationIdSuffix = '.j2k'
- }
- }
-
- flavorDimensions "default"
-
- productFlavors {
- standard {
- buildConfigField "boolean", "INCLUDE_UPDATER", "true"
- dimension "default"
- }
- fdroid {
- dimension "default"
- }
- dev {
- resConfigs "en"
- dimension "default"
- }
- }
-
- packagingOptions {
- exclude 'META-INF/DEPENDENCIES'
- exclude 'LICENSE.txt'
- exclude 'META-INF/LICENSE'
- exclude 'META-INF/LICENSE.txt'
- exclude 'META-INF/NOTICE'
- }
-
- lintOptions {
- abortOnError false
- checkReleaseBuilds false
- }
-
- compileOptions {
- sourceCompatibility = 1.8
- targetCompatibility = 1.8
- }
-
- kotlinOptions {
- jvmTarget = "1.8"
- }
-}
-
-dependencies {
-
- // Modified dependencies
- implementation 'com.github.inorichi:subsampling-scale-image-view:ac0dae7'
- implementation 'com.github.inorichi:junrar-android:634c1f5'
-
- // Android support library
- implementation 'androidx.appcompat:appcompat:1.1.0'
- implementation 'androidx.cardview:cardview:1.0.0'
- implementation 'com.google.android.material:material:1.0.0'
- implementation 'androidx.recyclerview:recyclerview:1.1.0'
- implementation 'androidx.preference:preference:1.1.0'
- implementation 'androidx.annotation:annotation:1.1.0'
- implementation 'androidx.browser:browser:1.2.0'
- implementation 'androidx.biometric:biometric:1.0.1'
-
- implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
-
- implementation 'androidx.multidex:multidex:2.0.1'
-
- standardImplementation 'com.google.firebase:firebase-core:17.2.2'
-
- final lifecycle_version = "2.1.0"
- implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
- implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
-
- // ReactiveX
- implementation 'io.reactivex:rxandroid:1.2.1'
- implementation 'io.reactivex:rxjava:1.3.8'
- implementation 'com.jakewharton.rxrelay:rxrelay:1.2.0'
- implementation 'com.f2prateek.rx.preferences:rx-preferences:1.0.2'
- implementation 'com.github.pwittchen:reactivenetwork:0.13.0'
-
- // Network client
- final okhttp_version = '4.3.1'
- implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
- implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version"
- implementation 'com.squareup.okio:okio:2.4.3'
-
- // REST
- final retrofit_version = '2.7.1'
- implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
- implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
- implementation "com.squareup.retrofit2:adapter-rxjava:$retrofit_version"
-
- // JSON
- implementation 'com.google.code.gson:gson:2.8.6'
- implementation 'com.github.salomonbrys.kotson:kotson:2.5.0'
-
- // JavaScript engine
- implementation 'com.squareup.duktape:duktape-android:1.3.0'
-
- // Disk
- implementation 'com.jakewharton:disklrucache:2.0.2'
- implementation 'com.github.inorichi:unifile:e9ee588'
-
- // HTML parser
- implementation 'org.jsoup:jsoup:1.12.1'
-
- // Job scheduling
- implementation 'com.evernote:android-job:1.2.5'
- implementation 'com.google.android.gms:play-services-gcm:17.0.0'
-
- // Changelog
- implementation 'com.github.gabrielemariotti.changeloglib:changelog:2.1.0'
-
- // Database
- implementation 'androidx.sqlite:sqlite:2.1.0'
- implementation 'com.github.inorichi.storio:storio-common:8be19de@aar'
- implementation 'com.github.inorichi.storio:storio-sqlite:8be19de@aar'
- implementation 'io.requery:sqlite-android:3.25.2'
-
- // Model View Presenter
- final nucleus_version = '3.0.0'
- implementation "info.android15.nucleus:nucleus:$nucleus_version"
- implementation "info.android15.nucleus:nucleus-support-v7:$nucleus_version"
-
- // Dependency injection
- implementation "com.github.inorichi.injekt:injekt-core:65b0440"
-
- // Image library
- final glide_version = '4.11.0'
- implementation "com.github.bumptech.glide:glide:$glide_version"
- implementation "com.github.bumptech.glide:okhttp3-integration:$glide_version"
- kapt "com.github.bumptech.glide:compiler:$glide_version"
-
- // Transformations
- implementation 'jp.wasabeef:glide-transformations:4.0.0'
-
- // Logging
- implementation 'com.jakewharton.timber:timber:4.7.1'
-
- // Crash reports
- implementation 'ch.acra:acra:4.9.2'
-
- // UI
- implementation 'com.dmitrymalkovich.android:material-design-dimens:1.4'
- implementation 'com.github.dmytrodanylyk.android-process-button:library:1.0.4'
- implementation 'eu.davidea:flexible-adapter:5.1.0'
- implementation 'eu.davidea:flexible-adapter-ui:1.0.0'
- implementation 'com.nononsenseapps:filepicker:2.5.2'
- implementation 'com.github.amulyakhare:TextDrawable:558677e'
- implementation 'com.afollestad.material-dialogs:core:3.1.1'
- implementation 'com.afollestad.material-dialogs:input:3.1.1'
- implementation 'me.zhanghai.android.systemuihelper:library:1.0.0'
- implementation 'com.nightlynexus.viewstatepageradapter:viewstatepageradapter:1.1.0'
- implementation 'com.github.mthli:Slice:v1.2'
- implementation 'com.github.kizitonwose:AndroidTagGroup:1.6.0'
- implementation 'com.github.chrisbanes:PhotoView:2.3.0'
- implementation 'com.github.carlosesco:DirectionalViewPager:a844dbca0a'
-
- // Conductor
- implementation 'com.bluelinelabs:conductor:2.1.5'
- implementation ("com.bluelinelabs:conductor-support:2.1.5") {
- exclude group: "com.android.support"
- }
- implementation 'com.github.inorichi:conductor-support-preference:a32c357'
-
- // RxBindings
- final rxbindings_version = '1.0.1'
- implementation "com.jakewharton.rxbinding:rxbinding-kotlin:$rxbindings_version"
- implementation "com.jakewharton.rxbinding:rxbinding-appcompat-v7-kotlin:$rxbindings_version"
- implementation "com.jakewharton.rxbinding:rxbinding-support-v4-kotlin:$rxbindings_version"
- implementation "com.jakewharton.rxbinding:rxbinding-recyclerview-v7-kotlin:$rxbindings_version"
-
- // Tests
- testImplementation 'junit:junit:4.12'
- testImplementation 'org.assertj:assertj-core:1.7.1'
- testImplementation 'org.mockito:mockito-core:1.10.19'
-
- final robolectric_version = '3.1.4'
- testImplementation "org.robolectric:robolectric:$robolectric_version"
- testImplementation "org.robolectric:shadows-multidex:$robolectric_version"
- testImplementation "org.robolectric:shadows-play-services:$robolectric_version"
-
- implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
-
- final coroutines_version = '1.3.2'
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
-
- // Text distance
- implementation 'info.debatty:java-string-similarity:1.2.1'
-}
-
-buildscript {
- ext.kotlin_version = '1.3.61'
- repositories {
- mavenCentral()
- }
- dependencies {
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
- classpath "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
- }
-}
-
-repositories {
- mavenCentral()
-}
-
-androidExtensions {
- experimental = true
-}
-
-if (getGradle().getStartParameter().getTaskRequests().toString().contains("Standard")) {
- apply plugin: 'com.google.gms.google-services'
-}
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
new file mode 100644
index 0000000000..7e1caf8f8e
--- /dev/null
+++ b/app/build.gradle.kts
@@ -0,0 +1,252 @@
+import java.io.ByteArrayOutputStream
+import java.time.LocalDateTime
+import java.time.ZoneOffset
+import java.time.format.DateTimeFormatter
+
+plugins {
+ id("com.android.application")
+ kotlin("android")
+ kotlin("android.extensions")
+ kotlin("kapt")
+ id("org.jmailen.kotlinter") version "2.3.1"
+ id("com.github.zellius.shortcut-helper")
+ id("com.google.gms.google-services") apply false
+}
+
+fun getBuildTime() = DateTimeFormatter.ISO_DATE_TIME.format(LocalDateTime.now(ZoneOffset.UTC))
+fun getCommitCount() = runCommand("git rev-list --count HEAD")
+fun getGitSha() = runCommand("git rev-parse --short HEAD")
+
+fun runCommand(command: String): String {
+ val byteOut = ByteArrayOutputStream()
+ project.exec {
+ commandLine = command.split(" ")
+ standardOutput = byteOut
+ }
+ return String(byteOut.toByteArray()).trim()
+}
+
+android {
+ compileSdkVersion(29)
+ buildToolsVersion("29.0.2")
+
+ defaultConfig {
+ minSdkVersion(23)
+ targetSdkVersion(29)
+ applicationId = "eu.kanade.tachiyomi"
+ versionCode = 62
+ versionName = "0.9.82"
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ multiDexEnabled = true
+
+ buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"")
+ buildConfigField("String", "COMMIT_SHA", "\"${getGitSha()}\"")
+ buildConfigField("String", "BUILD_TIME", "\"${getBuildTime()}\"")
+ buildConfigField("Boolean", "INCLUDE_UPDATER", "false")
+
+
+ ndk {
+ abiFilters("armeabi-v7a", "arm64-v8a", "x86")
+ }
+ }
+ buildTypes {
+ getByName("debug") {
+ applicationIdSuffix = ".debugJ2K"
+ }
+ getByName("release") {
+ applicationIdSuffix = ".j2k"
+ }
+ }
+
+ flavorDimensions("default")
+
+ productFlavors {
+ create("standard") {
+ buildConfigField("Boolean", "INCLUDE_UPDATER", "true")
+ }
+ create("dev") {
+ resConfig("en")
+ }
+ }
+
+ lintOptions {
+ isAbortOnError = false
+ isCheckReleaseBuilds = false
+ }
+
+ compileOptions {
+ setSourceCompatibility(1.8)
+ setTargetCompatibility(1.8)
+ }
+ kotlinOptions {
+ jvmTarget = "1.8"
+ }
+}
+androidExtensions {
+ isExperimental = true
+}
+
+shortcutHelper {
+ setFilePath("./shortcuts.xml")
+}
+
+dependencies {
+// Modified dependencies
+ implementation("com.github.inorichi:subsampling-scale-image-view:ac0dae7")
+ implementation("com.github.inorichi:junrar-android:634c1f5")
+
+
+// Android support library
+ implementation("androidx.appcompat:appcompat:1.1.0")
+ implementation("androidx.cardview:cardview:1.0.0")
+ implementation("com.google.android.material:material:1.1.0")
+ implementation("androidx.recyclerview:recyclerview:1.1.0")
+ implementation("androidx.preference:preference:1.1.0")
+ implementation("androidx.annotation:annotation:1.1.0")
+ implementation("androidx.browser:browser:1.2.0")
+ implementation("androidx.biometric:biometric:1.0.1")
+ implementation("androidx.palette:palette:1.0.0")
+
+
+ implementation("androidx.constraintlayout:constraintlayout:1.1.3")
+
+ implementation("androidx.multidex:multidex:2.0.1")
+
+ implementation("com.google.firebase:firebase-core:17.2.3")
+
+ val lifecycleVersion = "2.1.0"
+ implementation("androidx.lifecycle:lifecycle-extensions:$lifecycleVersion")
+ implementation("androidx.lifecycle:lifecycle-common-java8:$lifecycleVersion")
+
+// ReactiveX
+ implementation("io.reactivex:rxandroid:1.2.1")
+ implementation("io.reactivex:rxjava:1.3.8")
+ implementation("com.jakewharton.rxrelay:rxrelay:1.2.0")
+ implementation("com.f2prateek.rx.preferences:rx-preferences:1.0.2")
+ implementation("com.github.pwittchen:reactivenetwork:0.13.0")
+
+// Network client
+ val okhttpVersion = "4.3.1"
+ implementation("com.squareup.okhttp3:okhttp:$okhttpVersion")
+ implementation("com.squareup.okhttp3:logging-interceptor:$okhttpVersion")
+ implementation("com.squareup.okio:okio:2.4.3")
+
+// REST
+ val retrofitVersion = "2.7.1"
+ implementation("com.squareup.retrofit2:retrofit:$retrofitVersion")
+ implementation("com.squareup.retrofit2:converter-gson:$retrofitVersion")
+
+// JSON
+ implementation("com.google.code.gson:gson:2.8.6")
+ implementation("com.github.salomonbrys.kotson:kotson:2.5.0")
+
+// JavaScript engine
+ implementation("com.squareup.duktape:duktape-android:1.3.0")
+
+// Disk
+ implementation("com.jakewharton:disklrucache:2.0.2")
+ implementation("com.github.inorichi:unifile:e9ee588")
+
+// HTML parser
+ implementation("org.jsoup:jsoup:1.13.1")
+
+// Job scheduling
+ implementation("com.evernote:android-job:1.4.2")
+ implementation("com.google.android.gms:play-services-gcm:17.0.0")
+
+// Changelog
+ implementation("com.github.gabrielemariotti.changeloglib:changelog:2.1.0")
+
+// Database
+ implementation("androidx.sqlite:sqlite:2.1.0")
+ implementation("com.github.inorichi.storio:storio-common:8be19de@aar")
+ implementation("com.github.inorichi.storio:storio-sqlite:8be19de@aar")
+ implementation("io.requery:sqlite-android:3.31.0")
+
+// Model View Presenter
+ val nucleusVersion = "3.0.0"
+ implementation("info.android15.nucleus:nucleus:$nucleusVersion")
+ implementation("info.android15.nucleus:nucleus-support-v7:$nucleusVersion")
+
+// Dependency injection
+ implementation("com.github.inorichi.injekt:injekt-core:65b0440")
+
+// Image library
+ val glideVersion = "4.11.0"
+ implementation("com.github.bumptech.glide:glide:$glideVersion")
+ implementation("com.github.bumptech.glide:okhttp3-integration:$glideVersion")
+ kapt("com.github.bumptech.glide:compiler:$glideVersion")
+
+// Transformations
+ implementation("jp.wasabeef:glide-transformations:4.1.0")
+
+// Logging
+ implementation("com.jakewharton.timber:timber:4.7.1")
+
+// UI
+ implementation("com.dmitrymalkovich.android:material-design-dimens:1.4")
+ implementation("com.github.dmytrodanylyk.android-process-button:library:1.0.4")
+ implementation("eu.davidea:flexible-adapter:5.1.0")
+ implementation("eu.davidea:flexible-adapter-ui:1.0.0")
+ implementation("com.nononsenseapps:filepicker:2.5.2")
+ implementation("com.github.amulyakhare:TextDrawable:558677e")
+ implementation("com.afollestad.material-dialogs:core:3.3.0")
+ implementation("com.afollestad.material-dialogs:input:3.3.0")
+ implementation("me.zhanghai.android.systemuihelper:library:1.0.0")
+ implementation("com.nightlynexus.viewstatepageradapter:viewstatepageradapter:1.1.0")
+ implementation("com.github.mthli:Slice:v1.2")
+ implementation("com.reddit:indicator-fast-scroll:1.2.1")
+
+ implementation("com.github.kizitonwose:AndroidTagGroup:1.6.0")
+ implementation("com.github.chrisbanes:PhotoView:2.3.0")
+ implementation("com.github.carlosesco:DirectionalViewPager:a844dbca0a")
+
+// Conductor
+ implementation("com.bluelinelabs:conductor:2.1.5")
+ implementation("com.bluelinelabs:conductor-support:2.1.5") {
+ exclude("group", "com.android.support")
+ }
+ implementation("com.github.inorichi:conductor-support-preference:a32c357")
+
+// RxBindings
+ val rxbindingsVersion = "1.0.1"
+ implementation("com.jakewharton.rxbinding:rxbinding-kotlin:$rxbindingsVersion")
+ implementation("com.jakewharton.rxbinding:rxbinding-appcompat-v7-kotlin:$rxbindingsVersion")
+ implementation("com.jakewharton.rxbinding:rxbinding-support-v4-kotlin:$rxbindingsVersion")
+ implementation("com.jakewharton.rxbinding:rxbinding-recyclerview-v7-kotlin:$rxbindingsVersion")
+
+// Tests
+ testImplementation("junit:junit:4.13")
+ testImplementation("org.assertj:assertj-core:3.12.2")
+ testImplementation("org.mockito:mockito-core:1.10.19")
+
+ val robolectricVersion = "3.1.4"
+ testImplementation("org.robolectric:robolectric:$robolectricVersion")
+ testImplementation("org.robolectric:shadows-multidex:$robolectricVersion")
+ testImplementation("org.robolectric:shadows-play-services:$robolectricVersion")
+
+
+ implementation(kotlin("stdlib", org.jetbrains.kotlin.config.KotlinCompilerVersion.VERSION))
+
+ val coroutinesVersion = "1.3.3"
+ implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion")
+ implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion")
+
+ //Crash reports
+ val acraVersion = "4.9.2"
+ implementation("ch.acra:acra:$acraVersion")
+
+ // Text distance
+ implementation("info.debatty:java-string-similarity:1.2.1")
+}
+
+tasks.preBuild {
+ dependsOn(tasks.lintKotlin)
+}
+tasks.lintKotlin {
+ dependsOn(tasks.formatKotlin)
+}
+
+if (gradle.startParameter.taskRequests.toString().contains("Standard")) {
+ apply(mapOf("plugin" to "com.google.gms.google-services"))
+}
\ No newline at end of file
diff --git a/app/shortcuts.xml b/app/shortcuts.xml
index f0d74789ea..f831c257ed 100644
--- a/app/shortcuts.xml
+++ b/app/shortcuts.xml
@@ -1,25 +1,15 @@
-
-
-
+ android:shortcutLongLabel="@string/recent_updates"
+ android:shortcutShortLabel="@string/updates">
+ android:shortcutLongLabel="@string/history"
+ android:shortcutShortLabel="@string/history">
+ android:shortcutId="show_extensions"
+ android:shortcutLongLabel="@string/extensions"
+ android:shortcutShortLabel="@string/extensions">
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 493250655a..f4cf12020a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -30,6 +30,7 @@
android:networkSecurityConfig="@xml/network_security_config">
@@ -61,7 +62,7 @@
android:name=".ui.webview.WebViewActivity"
android:configChanges="uiMode|orientation|screenSize"/>
+ android:name=".ui.security.BiometricActivity" />
= 0) {
- MainActivity.unlocked = false
+ SecureActivityDelegate.locked = true
}
}
@@ -92,5 +92,4 @@ open class App : Application(), LifecycleObserver {
protected open fun setupNotificationChannels() {
Notifications.createChannels(this)
}
-
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt b/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt
index 4c0621a1a8..f9aa0a6dc3 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt
@@ -13,7 +13,11 @@ import eu.kanade.tachiyomi.network.NetworkHelper
import eu.kanade.tachiyomi.source.SourceManager
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
-import uy.kohesive.injekt.api.*
+import uy.kohesive.injekt.api.InjektModule
+import uy.kohesive.injekt.api.InjektRegistrar
+import uy.kohesive.injekt.api.addSingleton
+import uy.kohesive.injekt.api.addSingletonFactory
+import uy.kohesive.injekt.api.get
class AppModule(val app: Application) : InjektModule {
@@ -52,7 +56,5 @@ class AppModule(val app: Application) : InjektModule {
GlobalScope.launch { get() }
GlobalScope.launch { get() }
-
}
-
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt
index 25b91118ca..6bb2fca7ca 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt
@@ -5,6 +5,7 @@ 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.updater.UpdaterJob
+import eu.kanade.tachiyomi.ui.library.LibraryPresenter
import java.io.File
object Migrations {
@@ -25,7 +26,7 @@ object Migrations {
if (BuildConfig.INCLUDE_UPDATER && preferences.automaticUpdates()) {
UpdaterJob.setupTask()
}
- return false
+ return BuildConfig.DEBUG
}
if (oldVersion < 14) {
@@ -63,9 +64,10 @@ object Migrations {
}
if (oldVersion < 54)
DownloadProvider(context).renameChaapters()
+ if (oldVersion < 62)
+ LibraryPresenter.updateDB()
return true
}
return false
}
-
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupConst.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupConst.kt
index 643c469a28..8a8cc45fba 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupConst.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupConst.kt
@@ -1,7 +1,6 @@
package eu.kanade.tachiyomi.data.backup
import eu.kanade.tachiyomi.BuildConfig.APPLICATION_ID as ID
-
object BackupConst {
const val INTENT_FILTER = "SettingsBackupFragment"
@@ -18,5 +17,5 @@ object BackupConst {
const val EXTRA_TIME = "$ID.$INTENT_FILTER.EXTRA_TIME"
const val EXTRA_ERROR_FILE_PATH = "$ID.$INTENT_FILTER.EXTRA_ERROR_FILE_PATH"
const val EXTRA_ERROR_FILE = "$ID.$INTENT_FILTER.EXTRA_ERROR_FILE"
- const val EXTRA_MINI_ERROR= "$ID.$INTENT_FILTER.EXTRA_MINI_ERROR"
-}
\ No newline at end of file
+ const val EXTRA_MINI_ERROR = "$ID.$INTENT_FILTER.EXTRA_MINI_ERROR"
+}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateService.kt
index d7095642db..1721ff624c 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateService.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateService.kt
@@ -45,7 +45,6 @@ class BackupCreateService : IntentService(NAME) {
}
context.startService(intent)
}
-
}
private val backupManager by lazy { BackupManager(this) }
@@ -60,5 +59,4 @@ class BackupCreateService : IntentService(NAME) {
if (uri != null)
backupManager.createBackup(uri, flags, false)
}
-
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt
index fb03033dc6..69bf1a57f2 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt
@@ -3,8 +3,15 @@ package eu.kanade.tachiyomi.data.backup
import android.content.Context
import android.content.Intent
import android.net.Uri
-import com.github.salomonbrys.kotson.*
-import com.google.gson.*
+import com.github.salomonbrys.kotson.fromJson
+import com.github.salomonbrys.kotson.registerTypeAdapter
+import com.github.salomonbrys.kotson.registerTypeHierarchyAdapter
+import com.github.salomonbrys.kotson.set
+import com.google.gson.Gson
+import com.google.gson.GsonBuilder
+import com.google.gson.JsonArray
+import com.google.gson.JsonElement
+import com.google.gson.JsonObject
import com.hippo.unifile.UniFile
import eu.kanade.tachiyomi.data.backup.BackupCreateService.Companion.BACKUP_CATEGORY
import eu.kanade.tachiyomi.data.backup.BackupCreateService.Companion.BACKUP_CATEGORY_MASK
@@ -22,18 +29,31 @@ import eu.kanade.tachiyomi.data.backup.models.Backup.HISTORY
import eu.kanade.tachiyomi.data.backup.models.Backup.MANGA
import eu.kanade.tachiyomi.data.backup.models.Backup.TRACK
import eu.kanade.tachiyomi.data.backup.models.DHistory
-import eu.kanade.tachiyomi.data.backup.serializer.*
+import eu.kanade.tachiyomi.data.backup.serializer.CategoryTypeAdapter
+import eu.kanade.tachiyomi.data.backup.serializer.ChapterTypeAdapter
+import eu.kanade.tachiyomi.data.backup.serializer.HistoryTypeAdapter
+import eu.kanade.tachiyomi.data.backup.serializer.MangaTypeAdapter
+import eu.kanade.tachiyomi.data.backup.serializer.TrackTypeAdapter
import eu.kanade.tachiyomi.data.database.DatabaseHelper
-import eu.kanade.tachiyomi.data.database.models.*
+import eu.kanade.tachiyomi.data.database.models.CategoryImpl
+import eu.kanade.tachiyomi.data.database.models.Chapter
+import eu.kanade.tachiyomi.data.database.models.ChapterImpl
+import eu.kanade.tachiyomi.data.database.models.History
+import eu.kanade.tachiyomi.data.database.models.Manga
+import eu.kanade.tachiyomi.data.database.models.MangaCategory
+import eu.kanade.tachiyomi.data.database.models.MangaImpl
+import eu.kanade.tachiyomi.data.database.models.Track
+import eu.kanade.tachiyomi.data.database.models.TrackImpl
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.withContext
+import eu.kanade.tachiyomi.source.fetchMangaDetailsAsync
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
import eu.kanade.tachiyomi.util.system.sendLocalBroadcast
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.withContext
import rx.Observable
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
@@ -267,7 +287,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
*/
suspend fun restoreMangaFetch(source: Source, manga: Manga): Manga {
return withContext(Dispatchers.IO) {
- val networkManga = source.fetchMangaDetails(manga).toBlocking().single()
+ val networkManga = source.fetchMangaDetailsAsync(manga)!!
manga.copyFrom(networkManga)
manga.favorite = true
manga.initialized = true
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreService.kt
index 9417af1fb0..af8a4b7c99 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreService.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreService.kt
@@ -25,19 +25,23 @@ import eu.kanade.tachiyomi.data.backup.models.Backup.TRACK
import eu.kanade.tachiyomi.data.backup.models.Backup.VERSION
import eu.kanade.tachiyomi.data.backup.models.DHistory
import eu.kanade.tachiyomi.data.database.DatabaseHelper
-import eu.kanade.tachiyomi.data.database.models.*
+import eu.kanade.tachiyomi.data.database.models.ChapterImpl
+import eu.kanade.tachiyomi.data.database.models.Manga
+import eu.kanade.tachiyomi.data.database.models.MangaImpl
+import eu.kanade.tachiyomi.data.database.models.Track
+import eu.kanade.tachiyomi.data.database.models.TrackImpl
import eu.kanade.tachiyomi.data.notification.NotificationReceiver
import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.source.SourceNotFoundException
import eu.kanade.tachiyomi.util.lang.chop
import eu.kanade.tachiyomi.util.storage.getUriCompat
+import eu.kanade.tachiyomi.util.system.isServiceRunning
import eu.kanade.tachiyomi.util.system.notificationManager
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
-import eu.kanade.tachiyomi.util.system.isServiceRunning
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import java.io.File
@@ -50,7 +54,6 @@ import java.util.concurrent.TimeUnit
*/
class BackupRestoreService : Service() {
-
/**
* Wake lock that will be held until the service is destroyed.
*/
@@ -83,7 +86,6 @@ class BackupRestoreService : Service() {
*/
private val trackingErrors = mutableListOf()
-
/**
* List containing missing sources
*/
@@ -109,7 +111,6 @@ class BackupRestoreService : Service() {
*/
internal val trackManager: TrackManager by injectLazy()
-
/**
* Method called when the service is created. It injects dependencies and acquire the wake lock.
*/
@@ -147,9 +148,7 @@ class BackupRestoreService : Service() {
* @return the start value of the command.
*/
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
- if (intent == null) return START_NOT_STICKY
-
- val uri = intent.getParcelableExtra(BackupConst.EXTRA_URI) ?: return START_NOT_STICKY
+ val uri = intent?.getParcelableExtra(BackupConst.EXTRA_URI) ?: return START_NOT_STICKY
// Unsubscribe from any previous subscription if needed.
job?.cancel()
@@ -159,7 +158,7 @@ class BackupRestoreService : Service() {
stopSelf(startId)
}
job = GlobalScope.launch(handler) {
- restoreBackup(uri!!)
+ restoreBackup(uri)
}
job?.invokeOnCompletion { stopSelf(startId) }
@@ -179,7 +178,7 @@ class BackupRestoreService : Service() {
*/
private suspend fun restoreBackup(uri: Uri) {
val reader = JsonReader(contentResolver.openInputStream(uri)!!.bufferedReader())
- val json = JsonParser().parse(reader).asJsonObject
+ val json = JsonParser.parseReader(reader).asJsonObject
// Get parser version
val version = json.get(VERSION)?.asInt ?: 1
@@ -214,7 +213,6 @@ class BackupRestoreService : Service() {
showResultNotification(logFile.parent, logFile.name)
}
-
/**Restore categories if they were backed up
*
*/
@@ -244,8 +242,7 @@ class BackupRestoreService : Service() {
if (job?.isCancelled == false) {
showProgressNotification(restoreProgress, totalAmount, manga.title)
restoreProgress += 1
- }
- else {
+ } else {
throw java.lang.Exception("Job was cancelled")
}
val dbManga = backupManager.getMangaFromDatabase(manga)
@@ -260,7 +257,7 @@ class BackupRestoreService : Service() {
}
if (!dbMangaExists || !backupManager.restoreChaptersForManga(manga, chapters)) {
- //manga gets chapters added
+ // manga gets chapters added
backupManager.restoreChapterFetch(source, manga, chapters)
}
// Restore categories
@@ -278,8 +275,7 @@ class BackupRestoreService : Service() {
val cause = e.cause
if (cause is SourceNotFoundException) {
sourcesMissing.add(cause.id)
- }
- else if (e.message?.contains("licensed", true) == true) {
+ } else if (e.message?.contains("licensed", true) == true) {
lincensedManga++
}
errors.add("${manga.title} - ${cause?.message ?: e.message}")
@@ -294,19 +290,19 @@ class BackupRestoreService : Service() {
* @param manga manga that needs updating.
* @param tracks list containing tracks from restore file.
*/
- private fun trackingFetch(manga: Manga, tracks: List