Skip to content

Commit

Permalink
Merge in J2K newest changes into Neko (#511)
Browse files Browse the repository at this point in the history
  • Loading branch information
nonproto authored Jun 11, 2021
1 parent ade72f2 commit 2d7e8e7
Show file tree
Hide file tree
Showing 587 changed files with 21,906 additions and 12,016 deletions.
47 changes: 25 additions & 22 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import java.time.format.DateTimeFormatter
plugins {
id(Plugins.androidApplication)
kotlin(Plugins.kotlinAndroid)
kotlin(Plugins.kotlinExtensions)
kotlin(Plugins.kapt)
id(Plugins.kotlinParcelize)
id(Plugins.kotlinSerialization)
id(Plugins.aboutLibraries)
id(Plugins.firebaseCrashlytics)
Expand All @@ -29,7 +29,6 @@ fun runCommand(command: String): String {

android {
compileSdkVersion(Configs.compileSdkVersion)
buildToolsVersion(Configs.buildToolsVersion)

defaultConfig {
minSdkVersion(Configs.minSdkVersion)
Expand All @@ -56,6 +55,10 @@ android {
}
}

buildFeatures {
viewBinding = true
}

flavorDimensions("default")

productFlavors {
Expand All @@ -68,6 +71,7 @@ android {
}

lintOptions {
disable("MissingTranslation")
isAbortOnError = false
isCheckReleaseBuilds = false
}
Expand All @@ -80,13 +84,12 @@ android {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
}
androidExtensions {
isExperimental = true
}

dependencies {
// Modified dependencies
implementation(Libs.UI.subsamplingScaleImageView)
// Source models and interfaces from Tachiyomi 1.x
implementation("tachiyomi.sourceapi:source-api:1.1")
// Android support library
implementation(Libs.Android.appCompat)
implementation(Libs.Android.cardView)
Expand Down Expand Up @@ -227,9 +230,6 @@ dependencies {

// Conductor
implementation(Libs.Navigation.conductor)
implementation(Libs.Navigation.conductorSupport) {
exclude("group", "com.android.support")
}
implementation(Libs.Navigation.conductorSupportPreferences)

// RxBindings
Expand All @@ -248,6 +248,7 @@ dependencies {
testImplementation(Libs.Test.roboElectricShadowPlayServices)

implementation(Libs.Kotlin.stdLib)
implementation(Libs.Kotlin.reflection)
implementation(Libs.Kotlin.coroutines)

// Text distance
Expand All @@ -264,21 +265,23 @@ dependencies {
implementation(Libs.Util.aboutLibraries)
}

// 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 += 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 {
// See https://kotlinlang.org/docs/reference/experimental.html#experimental-status-of-experimental-api(-markers)
withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
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 {
dependsOn(tasks.ktlintFormat)
preBuild {
// dependsOn(formatKotlin)
}
}

if (gradle.startParameter.taskRequests.toString().contains("Standard")) {
Expand Down
19 changes: 12 additions & 7 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="eu.kanade.tachiyomi">

<uses-permission android:name="android.permission.INTERNET" />
Expand All @@ -14,24 +15,28 @@
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />

<application
android:name=".App"
android:allowBackup="true"
android:fullBackupContent="@xml/backup_rules"
android:hardwareAccelerated="true"
android:hasFragileUserData="true"
android:hardwareAccelerated="true"
android:usesCleartextTraffic="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/neko_app_name"
android:largeHeap="true"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/Theme.Tachiyomi"
android:usesCleartextTraffic="true">
android:networkSecurityConfig="@xml/network_security_config">
<activity
android:name=".ui.main.MainActivity"
android:theme="@style/Theme.Splash"
android:windowSoftInputMode="adjustPan">
android:windowSoftInputMode="adjustNothing"
android:theme="@style/Theme.Splash">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
Expand Down Expand Up @@ -81,7 +86,7 @@
<activity android:name=".ui.security.BiometricActivity" />
<activity
android:name=".widget.CustomLayoutPickerActivity"
android:label="@string/neko_app_name"
android:label="@string/app_name"
android:theme="@style/FilePickerTheme" />
<activity
android:name=".ui.setting.track.MyAnimeListLoginActivity"
Expand Down
7 changes: 6 additions & 1 deletion app/src/main/java/eu/kanade/tachiyomi/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ import java.security.Security

open class App : Application(), LifecycleObserver {

val preferences: PreferencesHelper by injectLazy()

override fun onCreate() {
super.onCreate()
XLogSetup(this)
Expand All @@ -45,12 +47,15 @@ open class App : Application(), LifecycleObserver {
Iconics.registerFont(CommunityMaterial)
Iconics.registerFont(MaterialDesignDx)
ProcessLifecycleOwner.get().lifecycle.addObserver(this)

// Reset Incognito Mode on relaunch
preferences.incognitoMode().set(false)
}

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
@Suppress("unused")
fun onAppBackgrounded() {
// App in background
val preferences: PreferencesHelper by injectLazy()
if (preferences.lockAfter().getOrDefault() >= 0) {
SecureActivityDelegate.locked = true
}
Expand Down
8 changes: 7 additions & 1 deletion app/src/main/java/eu/kanade/tachiyomi/AppModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ 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 eu.kanade.tachiyomi.util.manga.MangaShortcutManager
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.serialization.json.Json
Expand All @@ -35,7 +36,6 @@ import uy.kohesive.injekt.api.get
class AppModule(val app: Application) : InjektModule {

override fun InjektRegistrar.registerInjectables() {

addSingleton(app)

addSingletonFactory { PreferencesHelper(app) }
Expand Down Expand Up @@ -84,6 +84,12 @@ class AppModule(val app: Application) : InjektModule {

addSingleton(MangaPlusHandler())

addSingletonFactory { Json { ignoreUnknownKeys = true } }

addSingletonFactory { ChapterFilter() }

addSingletonFactory { MangaShortcutManager() }

// Asynchronously init expensive components for a faster cold start

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

import com.elvishew.xlog.XLog
import androidx.core.content.edit
import androidx.preference.PreferenceManager
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.PreferenceKeys
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.data.updater.UpdaterJob
import eu.kanade.tachiyomi.source.online.utils.MdUtil
import eu.kanade.tachiyomi.network.PREF_DOH_CLOUDFLARE
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 Down Expand Up @@ -61,10 +59,23 @@ object Migrations {
context.toast(R.string.myanimelist_relogin)
}
}
if(oldVersion < 114 && oldVersion != 0) {
if (oldVersion < 114 && oldVersion != 0) {
// Force migrate all manga to the new V5 ids
V5MigrationJob.doWorkNow()
}
if (oldVersion < 115) {
// Migrate DNS over HTTPS setting
val prefs = PreferenceManager.getDefaultSharedPreferences(context)
val wasDohEnabled = prefs.getBoolean("enable_doh", false)
if (wasDohEnabled) {
prefs.edit {
putInt(PreferenceKeys.dohProvider, PREF_DOH_CLOUDFLARE)
remove("enable_doh")
}
}
// Reset rotation to Free after replacing Lock
preferences.rotation().set(1)
}
return true
}
return false
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package eu.kanade.tachiyomi.data.backup

import android.content.Context
import android.net.Uri
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.library.CustomMangaManager
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
import uy.kohesive.injekt.injectLazy

abstract class AbstractBackupManager(protected val context: Context) {

internal val databaseHelper: DatabaseHelper by injectLazy()
internal val sourceManager: SourceManager by injectLazy()
internal val trackManager: TrackManager by injectLazy()
protected val preferences: PreferencesHelper by injectLazy()
protected val customMangaManager: CustomMangaManager by injectLazy()

abstract fun createBackup(uri: Uri, flags: Int, isJob: Boolean): String?

/**
* Returns manga
*
* @return [Manga], null if not found
*/
internal fun getMangaFromDatabase(manga: Manga): Manga? =
databaseHelper.getManga(manga.url, manga.source).executeAsBlocking()

/**
* Fetches chapter information.
*
* @param source source of manga
* @param manga manga that needs updating
* @param chapters list of chapters in the backup
* @return Updated manga chapters.
*/
internal suspend fun restoreChapters(source: Source, manga: Manga, chapters: List<Chapter>): Pair<List<Chapter>, List<Chapter>> {
val fetchedChapters = source.fetchChapterList(manga)
val syncedChapters = syncChaptersWithSource(databaseHelper, fetchedChapters, manga)
if (syncedChapters.first.isNotEmpty()) {
chapters.forEach { it.manga_id = manga.id }
updateChapters(chapters)
}
return syncedChapters
}

/**
* Returns list containing manga from library
*
* @return [Manga] from library
*/
protected fun getFavoriteManga(): List<Manga> =
databaseHelper.getFavoriteMangas().executeAsBlocking()

/**
* Inserts manga and returns id
*
* @return id of [Manga], null if not found
*/
internal fun insertManga(manga: Manga): Long? =
databaseHelper.insertManga(manga).executeAsBlocking().insertedId()

/**
* Inserts list of chapters
*/
protected fun insertChapters(chapters: List<Chapter>) {
databaseHelper.insertChapters(chapters).executeAsBlocking()
}

/**
* Updates a list of chapters
*/
protected fun updateChapters(chapters: List<Chapter>) {
databaseHelper.updateChaptersBackup(chapters).executeAsBlocking()
}

/**
* Updates a list of chapters with known database ids
*/
protected fun updateKnownChapters(chapters: List<Chapter>) {
databaseHelper.updateKnownChaptersBackup(chapters).executeAsBlocking()
}

/**
* Return number of backups.
*
* @return number of backups selected by user
*/
protected fun numberOfBackups(): Int = preferences.numberOfBackups().get()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package eu.kanade.tachiyomi.data.backup

import android.content.Context
import android.net.Uri
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.source.SourceManager
import uy.kohesive.injekt.injectLazy

abstract class AbstractBackupRestoreValidator {
protected val sourceManager: SourceManager by injectLazy()
protected val trackManager: TrackManager by injectLazy()

abstract fun validate(context: Context, uri: Uri): Results

data class Results(val missingSources: List<String>, val missingTrackers: List<String>)
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,10 @@ import eu.kanade.tachiyomi.BuildConfig.APPLICATION_ID as ID
object BackupConst {

private const val NAME = "BackupRestoreServices"
const val EXTRA_URI = "$ID.$NAME.EXTRA_URI"
const val EXTRA_FLAGS = "$ID.$NAME.EXTRA_FLAGS"
const val EXTRA_TYPE = "$ID.$NAME.EXTRA_TYPE"
const val INTENT_FILTER = "SettingsBackupFragment"
const val ACTION_BACKUP_COMPLETED_DIALOG = "$ID.$INTENT_FILTER.ACTION_BACKUP_COMPLETED_DIALOG"
const val ACTION_ERROR_BACKUP_DIALOG = "$ID.$INTENT_FILTER.ACTION_ERROR_BACKUP_DIALOG"
const val ACTION = "$ID.$INTENT_FILTER.ACTION"
const val EXTRA_ERROR_MESSAGE = "$ID.$INTENT_FILTER.EXTRA_ERROR_MESSAGE"
const val EXTRA_URI = "$ID.$INTENT_FILTER.EXTRA_URI"
const val EXTRA_MODE = "$ID.$NAME.EXTRA_MODE"
const val EXTRA_TYPE = "$ID.$NAME.EXTRA_TYPE"

const val BACKUP_TYPE_LEGACY = 0
const val BACKUP_TYPE_FULL = 1
Expand Down
Loading

0 comments on commit 2d7e8e7

Please sign in to comment.