From 5a2e8a838c17e39b6cf7cf6822664771e49785bb Mon Sep 17 00:00:00 2001 From: Samuel Bronson Date: Wed, 18 Sep 2019 01:31:15 -0400 Subject: [PATCH 01/36] Update to kotlinx.coroutines 0.23.4 --- app/build.gradle | 2 +- .../java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 141e7ec695..cd36ad7c68 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -228,7 +228,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - final coroutines_version = '0.22.2' + final coroutines_version = '0.23.4' implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version" } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt index a5313ac1f7..04d55ecdbf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt @@ -7,7 +7,7 @@ import kotlinx.coroutines.experimental.android.UI import kotlinx.coroutines.experimental.launch fun launchUI(block: suspend CoroutineScope.() -> Unit): Job = - launch(UI, CoroutineStart.DEFAULT, null, block) + launch(UI, CoroutineStart.DEFAULT, null, null, block) fun launchNow(block: suspend CoroutineScope.() -> Unit): Job = - launch(UI, CoroutineStart.UNDISPATCHED, null, block) + launch(UI, CoroutineStart.UNDISPATCHED, null, null, block) From ccd360687ec56cc7f4f69c5207257a8a641c3ff9 Mon Sep 17 00:00:00 2001 From: Samuel Bronson Date: Wed, 18 Sep 2019 13:20:39 -0400 Subject: [PATCH 02/36] Update to kotlinx.coroutines 0.26.0 --- app/build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index cd36ad7c68..ee5f75ddac 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -228,8 +228,9 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - final coroutines_version = '0.23.4' + final coroutines_version = '0.26.0' implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutines_version" // TODO: hack! implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version" } From 5362f62078532e47a5400304553c46731dd64cee Mon Sep 17 00:00:00 2001 From: Samuel Bronson Date: Wed, 18 Sep 2019 13:32:42 -0400 Subject: [PATCH 03/36] Update deprecated coroutines code --- .../extension/util/ExtensionInstallReceiver.kt | 5 ++++- .../eu/kanade/tachiyomi/util/CoroutinesExtensions.kt | 11 ++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt index 5067aa9362..12df620f14 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt @@ -7,6 +7,9 @@ import android.content.IntentFilter import eu.kanade.tachiyomi.extension.model.Extension import eu.kanade.tachiyomi.extension.model.LoadResult import eu.kanade.tachiyomi.util.launchNow +import kotlinx.coroutines.experimental.CoroutineStart +import kotlinx.coroutines.experimental.Dispatchers +import kotlinx.coroutines.experimental.GlobalScope import kotlinx.coroutines.experimental.async /** @@ -91,7 +94,7 @@ internal class ExtensionInstallReceiver(private val listener: Listener) : private suspend fun getExtensionFromIntent(context: Context, intent: Intent?): LoadResult { val pkgName = getPackageNameFromIntent(intent) ?: return LoadResult.Error("Package name not found") - return async { ExtensionLoader.loadExtensionFromPkgName(context, pkgName) }.await() + return GlobalScope.async(Dispatchers.Default, CoroutineStart.DEFAULT, null, { ExtensionLoader.loadExtensionFromPkgName(context, pkgName) }).await() } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt index 04d55ecdbf..dda2051c17 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt @@ -1,13 +1,10 @@ package eu.kanade.tachiyomi.util -import kotlinx.coroutines.experimental.CoroutineScope -import kotlinx.coroutines.experimental.CoroutineStart -import kotlinx.coroutines.experimental.Job -import kotlinx.coroutines.experimental.android.UI -import kotlinx.coroutines.experimental.launch +import kotlinx.coroutines.experimental.* +import kotlinx.coroutines.experimental.android.Main fun launchUI(block: suspend CoroutineScope.() -> Unit): Job = - launch(UI, CoroutineStart.DEFAULT, null, null, block) + GlobalScope.launch(Dispatchers.Main, CoroutineStart.DEFAULT, null, block) fun launchNow(block: suspend CoroutineScope.() -> Unit): Job = - launch(UI, CoroutineStart.UNDISPATCHED, null, null, block) + GlobalScope.launch(Dispatchers.Main, CoroutineStart.UNDISPATCHED, null, block) From 934a37c36bf45fb72cf7a10a123389bd4a4a8e82 Mon Sep 17 00:00:00 2001 From: Samuel Bronson Date: Wed, 18 Sep 2019 13:37:57 -0400 Subject: [PATCH 04/36] Update to kotlinx.coroutines 0.30.2 Almost done, honest! --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index ee5f75ddac..f7945d9d46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -228,7 +228,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - final coroutines_version = '0.26.0' + final coroutines_version = '0.30.2' implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutines_version" // TODO: hack! implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version" From fa59b4f8a7d10b30c69c7444048f219e160352e0 Mon Sep 17 00:00:00 2001 From: Samuel Bronson Date: Wed, 18 Sep 2019 17:41:09 -0400 Subject: [PATCH 05/36] Fix coroutine deprecations again --- .../tachiyomi/extension/util/ExtensionInstallReceiver.kt | 2 +- .../java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt index 12df620f14..6f08d8bc9b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt @@ -94,7 +94,7 @@ internal class ExtensionInstallReceiver(private val listener: Listener) : private suspend fun getExtensionFromIntent(context: Context, intent: Intent?): LoadResult { val pkgName = getPackageNameFromIntent(intent) ?: return LoadResult.Error("Package name not found") - return GlobalScope.async(Dispatchers.Default, CoroutineStart.DEFAULT, null, { ExtensionLoader.loadExtensionFromPkgName(context, pkgName) }).await() + return GlobalScope.async(Dispatchers.Default, CoroutineStart.DEFAULT, { ExtensionLoader.loadExtensionFromPkgName(context, pkgName) }).await() } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt index dda2051c17..2c77a7eb8a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt @@ -4,7 +4,7 @@ import kotlinx.coroutines.experimental.* import kotlinx.coroutines.experimental.android.Main fun launchUI(block: suspend CoroutineScope.() -> Unit): Job = - GlobalScope.launch(Dispatchers.Main, CoroutineStart.DEFAULT, null, block) + GlobalScope.launch(Dispatchers.Main, CoroutineStart.DEFAULT, block) fun launchNow(block: suspend CoroutineScope.() -> Unit): Job = - GlobalScope.launch(Dispatchers.Main, CoroutineStart.UNDISPATCHED, null, block) + GlobalScope.launch(Dispatchers.Main, CoroutineStart.UNDISPATCHED, block) From 9276c491bc053226f734dce153276e560583c734 Mon Sep 17 00:00:00 2001 From: Samuel Bronson Date: Wed, 18 Sep 2019 22:45:54 -0400 Subject: [PATCH 06/36] Upgrade Kotlin (to 1.3), Coroutines, Gradle and Android gradle plugin. Kotlin: 1.2.71 -> 1.3.50 Coroutines: 0.30.2 -> 1.3.1 Gradle: 4.6 -> 5.4.1 Android gradle plugin: 3.2.1 -> 3.5.0 This brings us down to *one* experimental coroutine API, and we've opted in to using it in just *one* place. (The fact that the API to opt-in to using an experimental API in a specific place is *also* experimental surely will not come back to bite us later.) --- app/build.gradle | 13 +++++-------- .../eu/kanade/tachiyomi/data/download/Downloader.kt | 2 +- .../kanade/tachiyomi/extension/ExtensionManager.kt | 2 +- .../extension/util/ExtensionInstallReceiver.kt | 8 ++++---- .../tachiyomi/extension/util/ExtensionLoader.kt | 4 ++-- .../kanade/tachiyomi/util/CoroutinesExtensions.kt | 4 ++-- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 8 files changed, 18 insertions(+), 21 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f7945d9d46..da328ac366 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -228,14 +228,12 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - final coroutines_version = '0.30.2' - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutines_version" // TODO: hack! + final coroutines_version = '1.3.1' implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version" } buildscript { - ext.kotlin_version = '1.2.71' + ext.kotlin_version = '1.3.50' repositories { mavenCentral() } @@ -248,10 +246,9 @@ repositories { mavenCentral() } -kotlin { - experimental { - coroutines 'enable' - } +// See https://kotlinlang.org/docs/reference/experimental.html#experimental-status-of-experimental-api-markers +tasks.withType(org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile).all { + kotlinOptions.freeCompilerArgs += ["-Xuse-experimental=kotlin.Experimental"] } androidExtensions { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt index 0ca5449361..f49585bc2e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt @@ -14,7 +14,7 @@ import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.fetchAllImageUrlsFromPageList import eu.kanade.tachiyomi.util.* -import kotlinx.coroutines.experimental.async +import kotlinx.coroutines.async import okhttp3.Response import rx.Observable import rx.android.schedulers.AndroidSchedulers diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt index a625c06e74..8dfcb27a40 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt @@ -13,7 +13,7 @@ import eu.kanade.tachiyomi.extension.util.ExtensionInstaller import eu.kanade.tachiyomi.extension.util.ExtensionLoader import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.util.launchNow -import kotlinx.coroutines.experimental.async +import kotlinx.coroutines.async import rx.Observable import rx.android.schedulers.AndroidSchedulers import rx.schedulers.Schedulers diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt index 6f08d8bc9b..2a55ccd7d9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt @@ -7,10 +7,10 @@ import android.content.IntentFilter import eu.kanade.tachiyomi.extension.model.Extension import eu.kanade.tachiyomi.extension.model.LoadResult import eu.kanade.tachiyomi.util.launchNow -import kotlinx.coroutines.experimental.CoroutineStart -import kotlinx.coroutines.experimental.Dispatchers -import kotlinx.coroutines.experimental.GlobalScope -import kotlinx.coroutines.experimental.async +import kotlinx.coroutines.CoroutineStart +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.async /** * Broadcast receiver that listens for the system's packages installed, updated or removed, and only diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt index 805effe064..f211d7d95d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt @@ -13,8 +13,8 @@ import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.SourceFactory import eu.kanade.tachiyomi.util.Hash -import kotlinx.coroutines.experimental.async -import kotlinx.coroutines.experimental.runBlocking +import kotlinx.coroutines.async +import kotlinx.coroutines.runBlocking import timber.log.Timber import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt index 2c77a7eb8a..93665ffbed 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/CoroutinesExtensions.kt @@ -1,10 +1,10 @@ package eu.kanade.tachiyomi.util -import kotlinx.coroutines.experimental.* -import kotlinx.coroutines.experimental.android.Main +import kotlinx.coroutines.* fun launchUI(block: suspend CoroutineScope.() -> Unit): Job = GlobalScope.launch(Dispatchers.Main, CoroutineStart.DEFAULT, block) +@UseExperimental(ExperimentalCoroutinesApi::class) fun launchNow(block: suspend CoroutineScope.() -> Unit): Job = GlobalScope.launch(Dispatchers.Main, CoroutineStart.UNDISPATCHED, block) diff --git a/build.gradle b/build.gradle index 2885a88fc1..3381b34e4b 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.android.tools.build:gradle:3.5.0' classpath 'com.github.ben-manes:gradle-versions-plugin:0.17.0' classpath 'com.github.zellius:android-shortcut-gradle-plugin:0.1.2' classpath 'com.google.gms:google-services:3.2.0' diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bccb59f891..a35c3abf01 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Sep 25 08:47:56 CEST 2018 +#Wed Sep 18 21:00:59 EDT 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip From 76645bce6edc8b45403b6ab9291a3ecc385c2a47 Mon Sep 17 00:00:00 2001 From: Samuel Bronson Date: Fri, 20 Sep 2019 12:42:41 -0400 Subject: [PATCH 07/36] Remove redundant "publishNonDefault" setting I think I've seen the following message from just about every single gradle run throughout the upgrade process: publishNonDefault is deprecated and has no effect anymore. All variants are now published. --- app/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index da328ac366..9435d32a4c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -31,7 +31,6 @@ ext { android { compileSdkVersion 27 buildToolsVersion '28.0.3' - publishNonDefault true defaultConfig { applicationId "eu.kanade.tachiyomi" From 6c9135c093edadbf66139f13b581f04cb292fbb2 Mon Sep 17 00:00:00 2001 From: Harsh Parekh Date: Sun, 1 Dec 2019 13:49:47 -0500 Subject: [PATCH 08/36] Improve Issue reporting experience (#2189) * Improve issue reporting workflow. * Add meta request template * Remove old template * Fix label for bug * Add template text. * Remove meta request As per [review](https://github.com/inorichi/tachiyomi/pull/2189#discussion_r321668645) * Remove Acceptance Criteria As per [review](https://github.com/inorichi/tachiyomi/pull/2189#discussion_r321665449) * Requested changes from arkon All except the default template. * Revert "Remove old template" This reverts commit b9ef01f655e13e2582af68d3a454bd2db4723534. --- .github/ISSUE_TEMPLATE/bug_report.md | 24 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 12 ++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..ac0f44ea80 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,24 @@ +--- +name: "🐞 Bug report" +about: Report a bug +title: "[Bug] Write short description here" +labels: "bug" + +--- + +### Device information +* Tachiyomi version: ? +* Android version: ? + +## Steps to reproduce +1. First step +2. Second step + +### Expected behavior +This should happen. + +### Actual behavior +This happened instead. + +### Other details +Additional details and attachments. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000000..d3c307acf7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,12 @@ +--- +name: "🌟 Feature request" +about: Suggest a feature to improve Tachiyomi +title: "[Feature Request] Write short description here" +labels: "feature" + +--- +### Why/User Benefit/User Problem +(explain why this feature should be added) + +### What/Requirements +(explain how this feature would behave) From c36a47576d111a9feef754705daad35ae0868740 Mon Sep 17 00:00:00 2001 From: Ankit Singh Date: Tue, 3 Dec 2019 20:04:58 +0530 Subject: [PATCH 09/36] Update README.md (#2351) Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c3abbf3827..9a23d76041 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Features include: * Online reading from sources such as KissManga, MangaDex, [and more](https://github.com/inorichi/tachiyomi-extensions) * Local reading of downloaded manga * Configurable reader with multiple viewers, reading directions and other settings -* [MyAnimeList](https://myanimelist.net/), [AniList](https://anilist.co/), and [Kitsu](https://kitsu.io/explore/anime) support +* [MyAnimeList](https://myanimelist.net/), [AniList](https://anilist.co/), [Kitsu](https://kitsu.io/explore/anime), and [Shikimori](https://shikimori.one) support * Categories to organize your library * Light and dark themes * Schedule updating your library for new chapters From 3a7cdfcaa4ba0820d44020cb7e6ad994f5f0975e Mon Sep 17 00:00:00 2001 From: Ankit Singh Date: Sat, 21 Dec 2019 21:15:43 +0530 Subject: [PATCH 10/36] Update README.md (#2372) changed Chat to support server fixed grammar mistake --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9a23d76041..ea0b8fb32c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -| Build | Stable | Dev | Contribute | Contact | +| Build | Stable | Dev | Contribute | Support Server | |-------|----------|---------|------------|---------| | [![Travis](https://img.shields.io/travis/inorichi/tachiyomi.svg)](https://travis-ci.org/inorichi/tachiyomi) | [![stable release](https://img.shields.io/github/release/inorichi/tachiyomi.svg?maxAge=3600&label=download)](https://github.com/inorichi/tachiyomi/releases) | [![latest dev build](https://img.shields.io/badge/download-latest%20build-blue.svg)](http://tachiyomi.kanade.eu/latest) | [![Translation status](https://hosted.weblate.org/widgets/tachiyomi/-/svg-badge.svg)](https://hosted.weblate.org/engage/tachiyomi/?utm_source=widget) | [![Discord](https://img.shields.io/discord/349436576037732353.svg)](https://discord.gg/tachiyomi) | @@ -13,7 +13,7 @@ Tachiyomi is a free and open source manga reader for Android. Features include: * Online reading from sources such as KissManga, MangaDex, [and more](https://github.com/inorichi/tachiyomi-extensions) * Local reading of downloaded manga -* Configurable reader with multiple viewers, reading directions and other settings +* A configurable reader with multiple viewers, reading directions and other settings. * [MyAnimeList](https://myanimelist.net/), [AniList](https://anilist.co/), [Kitsu](https://kitsu.io/explore/anime), and [Shikimori](https://shikimori.one) support * Categories to organize your library * Light and dark themes From 0416a2ff15c6adee17f619667bd583d97e472984 Mon Sep 17 00:00:00 2001 From: Eugene Date: Sun, 22 Dec 2019 15:48:36 -0500 Subject: [PATCH 11/36] Extract some hardcoded strings (closes #1989) --- .../browse/BrowseCatalogueController.kt | 25 +++++++++++-------- .../tachiyomi/ui/migration/SelectionHeader.kt | 4 +-- app/src/main/res/values/strings.xml | 2 ++ 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt index b13a403dff..af047a26e9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt @@ -341,19 +341,22 @@ open class BrowseCatalogueController(bundle: Bundle) : adapter.onLoadMoreComplete(null) hideProgressBar() - val message = if (error is NoResultsException) "No results found" else (error.message ?: "") - snack?.dismiss() - snack = catalogue_view?.snack(message, Snackbar.LENGTH_INDEFINITE) { - setAction(R.string.action_retry) { - // If not the first page, show bottom progress bar. - if (adapter.mainItemCount > 0) { - val item = progressItem ?: return@setAction - adapter.addScrollableFooterWithDelay(item, 0, true) - } else { - showProgressBar() + + if (catalogue_view != null) { + val message = if (error is NoResultsException) catalogue_view.context.getString(R.string.no_results_found) else (error.message ?: "") + + snack = catalogue_view.snack(message, Snackbar.LENGTH_INDEFINITE) { + setAction(R.string.action_retry) { + // If not the first page, show bottom progress bar. + if (adapter.mainItemCount > 0) { + val item = progressItem ?: return@setAction + adapter.addScrollableFooterWithDelay(item, 0, true) + } else { + showProgressBar() + } + presenter.requestNext() } - presenter.requestNext() } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/migration/SelectionHeader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/migration/SelectionHeader.kt index cb87fcb9ea..d40028050b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/migration/SelectionHeader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/migration/SelectionHeader.kt @@ -5,7 +5,7 @@ import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.AbstractHeaderItem import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder -import kotlinx.android.synthetic.main.catalogue_main_controller_card.* +import kotlinx.android.synthetic.main.catalogue_main_controller_card.title /** * Item that contains the selection header. @@ -36,7 +36,7 @@ class SelectionHeader : AbstractHeaderItem() { class Holder(view: View, adapter: FlexibleAdapter<*>) : BaseFlexibleViewHolder(view, adapter) { init { - title.text = "Please select a source to migrate from" + title.text = view.context.getString(R.string.migration_selection_prompt) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f72686b4f3..da7bc6b98a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -323,6 +323,7 @@ Select a source Please enable at least one valid source No more results + No results found Local manga Other Default can\'t be selected with other categories @@ -455,6 +456,7 @@ Tap to select the source to migrate from Select data to include + Select a source to migrate from Select Migrate Copy From 08b06e1b4eca315ef4dfc929a12ca5520cc95d2e Mon Sep 17 00:00:00 2001 From: Eugene Date: Sun, 22 Dec 2019 15:56:25 -0500 Subject: [PATCH 12/36] Update to latest version of Android support libraries Should make migration to AndroidX a bit smoother --- app/build.gradle | 4 ++-- .../ui/catalogue/global_search/CatalogueSearchAdapter.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 141e7ec695..ae8ee46c6a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -101,7 +101,7 @@ dependencies { implementation 'com.github.inorichi:junrar-android:634c1f5' // Android support library - final support_library_version = '27.0.2' + final support_library_version = '27.1.1' implementation "com.android.support:support-v4:$support_library_version" implementation "com.android.support:appcompat-v7:$support_library_version" implementation "com.android.support:cardview-v7:$support_library_version" @@ -111,7 +111,7 @@ dependencies { implementation "com.android.support:support-annotations:$support_library_version" implementation "com.android.support:customtabs:$support_library_version" - implementation 'com.android.support.constraint:constraint-layout:1.1.2' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.android.support:multidex:1.0.3' diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchAdapter.kt index 0b1b822e0f..f9ba52a024 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchAdapter.kt @@ -19,7 +19,7 @@ class CatalogueSearchAdapter(val controller: CatalogueSearchController) : */ private var bundle = Bundle() - override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int, payloads: List?) { + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int, payloads: List) { super.onBindViewHolder(holder, position, payloads) restoreHolderState(holder) } @@ -71,4 +71,4 @@ class CatalogueSearchAdapter(val controller: CatalogueSearchController) : private companion object { const val HOLDER_BUNDLE_KEY = "holder_bundle" } -} \ No newline at end of file +} From 011bb9f5b1c6ffb609757157a024d4e155011d17 Mon Sep 17 00:00:00 2001 From: arkon Date: Sun, 22 Dec 2019 16:14:09 -0500 Subject: [PATCH 13/36] Update to build tools v29.0.2 (#2385) --- .travis.yml | 2 +- app/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9667a53d82..bf00017ca9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ dist: trusty language: android android: components: - - build-tools-28.0.3 + - build-tools-29.0.2 - android-27 - extra-android-m2repository - extra-google-m2repository diff --git a/app/build.gradle b/app/build.gradle index ae8ee46c6a..112aa3bdcc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,7 +30,7 @@ ext { android { compileSdkVersion 27 - buildToolsVersion '28.0.3' + buildToolsVersion '29.0.2' publishNonDefault true defaultConfig { From ee4f0693412893776f154573708cbbfaec320c71 Mon Sep 17 00:00:00 2001 From: Ken Swenson Date: Sun, 22 Dec 2019 22:13:27 -0500 Subject: [PATCH 14/36] fix: Don't send newlines and whitespace in API calls (#2348) --- .../data/track/anilist/AnilistApi.kt | 148 +++++++++--------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt index 041852ea0f..7f1e8e5918 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt @@ -24,10 +24,10 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { fun addLibManga(track: Track): Observable { val query = """ - mutation AddManga(${'$'}mangaId: Int, ${'$'}progress: Int, ${'$'}status: MediaListStatus) { - SaveMediaListEntry (mediaId: ${'$'}mangaId, progress: ${'$'}progress, status: ${'$'}status) - { id status } } - """ + |mutation AddManga(${'$'}mangaId: Int, ${'$'}progress: Int, ${'$'}status: MediaListStatus) { + |SaveMediaListEntry (mediaId: ${'$'}mangaId, progress: ${'$'}progress, status: ${'$'}status) + |{ id status } } + |""".trimMargin() val variables = jsonObject( "mangaId" to track.media_id, "progress" to track.last_chapter_read, @@ -58,14 +58,14 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { fun updateLibManga(track: Track): Observable { val query = """ - mutation UpdateManga(${'$'}listId: Int, ${'$'}progress: Int, ${'$'}status: MediaListStatus, ${'$'}score: Int) { - SaveMediaListEntry (id: ${'$'}listId, progress: ${'$'}progress, status: ${'$'}status, scoreRaw: ${'$'}score) { - id - status - progress - } - } - """ + |mutation UpdateManga(${'$'}listId: Int, ${'$'}progress: Int, ${'$'}status: MediaListStatus, ${'$'}score: Int) { + |SaveMediaListEntry (id: ${'$'}listId, progress: ${'$'}progress, status: ${'$'}status, scoreRaw: ${'$'}score) { + |id + |status + |progress + |} + |} + """.trimMargin() val variables = jsonObject( "listId" to track.library_id, "progress" to track.last_chapter_read, @@ -90,29 +90,29 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { fun search(search: String): Observable> { val query = """ - query Search(${'$'}query: String) { - Page (perPage: 50) { - media(search: ${'$'}query, type: MANGA, format_not_in: [NOVEL]) { - id - title { - romaji - } - coverImage { - large - } - type - status - chapters - description - startDate { - year - month - day - } - } - } - } - """ + |query Search(${'$'}query: String) { + |Page (perPage: 50) { + |media(search: ${'$'}query, type: MANGA, format_not_in: [NOVEL]) { + |id + |title { + |romaji + |} + |coverImage { + |large + |} + |type + |status + |chapters + |description + |startDate { + |year + |month + |day + |} + |} + |} + |} + """.trimMargin() val variables = jsonObject( "query" to search ) @@ -144,35 +144,35 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { fun findLibManga(track: Track, userid: Int) : Observable { val query = """ - query (${'$'}id: Int!, ${'$'}manga_id: Int!) { - Page { - mediaList(userId: ${'$'}id, type: MANGA, mediaId: ${'$'}manga_id) { - id - status - scoreRaw: score(format: POINT_100) - progress - media{ - id - title { - romaji - } - coverImage { - large - } - type - status - chapters - description - startDate { - year - month - day - } - } - } - } - } - """ + |query (${'$'}id: Int!, ${'$'}manga_id: Int!) { + |Page { + |mediaList(userId: ${'$'}id, type: MANGA, mediaId: ${'$'}manga_id) { + |id + |status + |scoreRaw: score(format: POINT_100) + |progress + |media{ + |id + |title { + |romaji + |} + |coverImage { + |large + |} + |type + |status + |chapters + |description + |startDate { + |year + |month + |day + |} + |} + |} + |} + |} + """.trimMargin() val variables = jsonObject( "id" to userid, "manga_id" to track.media_id @@ -214,16 +214,16 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { fun getCurrentUser(): Observable> { val query = """ - query User - { - Viewer { - id - mediaListOptions { - scoreFormat - } - } - } - """ + |query User + |{ + |Viewer { + |id + |mediaListOptions { + |scoreFormat + |} + |} + |} + """.trimMargin() val payload = jsonObject( "query" to query ) From 89dc240a22d4c36f810a55b3a116ed12efd534bf Mon Sep 17 00:00:00 2001 From: Eugene Date: Sun, 22 Dec 2019 22:19:15 -0500 Subject: [PATCH 15/36] Clean up Anilist GraphQL query formatting --- .../data/track/anilist/AnilistApi.kt | 130 +++++++++--------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt index 7f1e8e5918..9a09658c60 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt @@ -21,13 +21,15 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { private val jsonMime = MediaType.parse("application/json; charset=utf-8") private val authClient = client.newBuilder().addInterceptor(interceptor).build() - fun addLibManga(track: Track): Observable { val query = """ |mutation AddManga(${'$'}mangaId: Int, ${'$'}progress: Int, ${'$'}status: MediaListStatus) { - |SaveMediaListEntry (mediaId: ${'$'}mangaId, progress: ${'$'}progress, status: ${'$'}status) - |{ id status } } - |""".trimMargin() + |SaveMediaListEntry (mediaId: ${'$'}mangaId, progress: ${'$'}progress, status: ${'$'}status) { + | id + | status + |} + |} + |""".trimMargin() val variables = jsonObject( "mangaId" to track.media_id, "progress" to track.last_chapter_read, @@ -59,13 +61,13 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { fun updateLibManga(track: Track): Observable { val query = """ |mutation UpdateManga(${'$'}listId: Int, ${'$'}progress: Int, ${'$'}status: MediaListStatus, ${'$'}score: Int) { - |SaveMediaListEntry (id: ${'$'}listId, progress: ${'$'}progress, status: ${'$'}status, scoreRaw: ${'$'}score) { - |id - |status - |progress - |} - |} - """.trimMargin() + |SaveMediaListEntry (id: ${'$'}listId, progress: ${'$'}progress, status: ${'$'}status, scoreRaw: ${'$'}score) { + |id + |status + |progress + |} + |} + |""".trimMargin() val variables = jsonObject( "listId" to track.library_id, "progress" to track.last_chapter_read, @@ -91,28 +93,28 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { fun search(search: String): Observable> { val query = """ |query Search(${'$'}query: String) { - |Page (perPage: 50) { + |Page (perPage: 50) { |media(search: ${'$'}query, type: MANGA, format_not_in: [NOVEL]) { - |id - |title { - |romaji - |} - |coverImage { - |large - |} - |type - |status - |chapters - |description - |startDate { - |year - |month - |day - |} + |id + |title { + |romaji + |} + |coverImage { + |large + |} + |type + |status + |chapters + |description + |startDate { + |year + |month + |day + |} |} - |} |} - """.trimMargin() + |} + |""".trimMargin() val variables = jsonObject( "query" to search ) @@ -142,37 +144,37 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { } - fun findLibManga(track: Track, userid: Int) : Observable { + fun findLibManga(track: Track, userid: Int): Observable { val query = """ |query (${'$'}id: Int!, ${'$'}manga_id: Int!) { - |Page { - |mediaList(userId: ${'$'}id, type: MANGA, mediaId: ${'$'}manga_id) { - |id - |status - |scoreRaw: score(format: POINT_100) - |progress - |media{ + |Page { + |mediaList(userId: ${'$'}id, type: MANGA, mediaId: ${'$'}manga_id) { |id - |title { - |romaji + |status + |scoreRaw: score(format: POINT_100) + |progress + |media { + |id + |title { + |romaji + |} + |coverImage { + |large + |} + |type + |status + |chapters + |description + |startDate { + |year + |month + |day + |} |} - |coverImage { - |large - |} - |type - |status - |chapters - |description - |startDate { - |year - |month - |day - |} - |} |} - |} |} - """.trimMargin() + |} + |""".trimMargin() val variables = jsonObject( "id" to userid, "manga_id" to track.media_id @@ -214,16 +216,15 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { fun getCurrentUser(): Observable> { val query = """ - |query User - |{ - |Viewer { + |query User { + |Viewer { |id |mediaListOptions { - |scoreFormat + |scoreFormat |} - |} |} - """.trimMargin() + |} + |""".trimMargin() val payload = jsonObject( "query" to query ) @@ -246,7 +247,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { } } - fun jsonToALManga(struct: JsonObject): ALManga{ + private fun jsonToALManga(struct: JsonObject): ALManga { val date = try { val date = Calendar.getInstance() date.set(struct["startDate"]["year"].nullInt ?: 0, (struct["startDate"]["month"].nullInt ?: 0) - 1, @@ -261,11 +262,10 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { date, struct["chapters"].nullInt ?: 0) } - fun jsonToALUserManga(struct: JsonObject): ALUserManga{ - return ALUserManga(struct["id"].asLong, struct["status"].asString, struct["scoreRaw"].asInt, struct["progress"].asInt, jsonToALManga(struct["media"].obj) ) + private fun jsonToALUserManga(struct: JsonObject): ALUserManga { + return ALUserManga(struct["id"].asLong, struct["status"].asString, struct["scoreRaw"].asInt, struct["progress"].asInt, jsonToALManga(struct["media"].obj)) } - companion object { private const val clientId = "385" private const val clientUrl = "tachiyomi://anilist-auth" From 6f8f6e9233f3c4232f5e64704610bb9fe63e4dea Mon Sep 17 00:00:00 2001 From: Eugene Date: Mon, 23 Dec 2019 22:03:07 -0500 Subject: [PATCH 16/36] Update Gradle --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 3da57b7bcf..d01606b312 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.0' + classpath 'com.android.tools.build:gradle:3.5.3' classpath 'com.github.ben-manes:gradle-versions-plugin:0.17.0' classpath 'com.github.zellius:android-shortcut-gradle-plugin:0.1.2' classpath 'com.google.gms:google-services:3.2.0' From c456812a4699d3c754737e516439979ac5d90dc2 Mon Sep 17 00:00:00 2001 From: Eugene Date: Mon, 23 Dec 2019 22:14:20 -0500 Subject: [PATCH 17/36] Update coroutines --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 188fb03944..983d4fb0cd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -228,7 +228,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - final coroutines_version = '1.3.1' + final coroutines_version = '1.3.3' implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version" } From 89793ac3384866914f7da6b9bc8b15f528fed95e Mon Sep 17 00:00:00 2001 From: Eugene Date: Mon, 23 Dec 2019 22:18:11 -0500 Subject: [PATCH 18/36] Update to Kotlin 1.3.61 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 983d4fb0cd..7e7a138931 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -233,7 +233,7 @@ dependencies { } buildscript { - ext.kotlin_version = '1.3.50' + ext.kotlin_version = '1.3.61' repositories { mavenCentral() } From 450b23436fd11b2187d0f4bbb4f9d50fca482d7c Mon Sep 17 00:00:00 2001 From: Eugene Date: Mon, 23 Dec 2019 22:20:59 -0500 Subject: [PATCH 19/36] Update DB architecture component Needs to eventually be replaced by androidx.sqlite.db --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 7e7a138931..9930d380c1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -156,7 +156,7 @@ dependencies { implementation 'com.github.gabrielemariotti.changeloglib:changelog:2.1.0' // Database - implementation 'android.arch.persistence:db:1.0.0' + implementation 'android.arch.persistence:db:1.1.1' 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' From 5ddd7d1b14eecfdf314ef5764d629b7563a9ec95 Mon Sep 17 00:00:00 2001 From: Eugene Date: Mon, 23 Dec 2019 22:23:05 -0500 Subject: [PATCH 20/36] Remove minSdkVersion 21 for dev builds (no longer needed for multidex) --- app/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 9930d380c1..9931564efb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -73,7 +73,6 @@ android { dimension "default" } dev { - minSdkVersion 21 resConfigs "en", "xxhdpi" dimension "default" } From b8b118bdebe99cec25c69a8e8424fd4605f7b200 Mon Sep 17 00:00:00 2001 From: arkon Date: Thu, 26 Dec 2019 12:39:20 -0500 Subject: [PATCH 21/36] Add .nomedia file in each chapter download folder (#2199) * Move .nomedia creation to directory fetch * Add .nomedia file to all chapter download directories --- .../tachiyomi/data/download/DownloadProvider.kt | 4 +++- .../kanade/tachiyomi/data/download/Downloader.kt | 2 ++ .../ui/setting/SettingsDownloadController.kt | 10 ---------- .../main/java/eu/kanade/tachiyomi/util/DiskUtil.kt | 14 ++++++++++++++ 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt index e38bb88e2c..bed8c5e369 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt @@ -28,7 +28,9 @@ class DownloadProvider(private val context: Context) { * The root directory for downloads. */ private var downloadsDir = preferences.downloadsDirectory().getOrDefault().let { - UniFile.fromUri(context, Uri.parse(it)) + val dir = UniFile.fromUri(context, Uri.parse(it)) + DiskUtil.createNoMediaFile(dir, context) + dir } init { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt index f49585bc2e..15ce3dc680 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt @@ -407,6 +407,8 @@ class Downloader( if (download.status == Download.DOWNLOADED) { tmpDir.renameTo(dirname) cache.addChapter(dirname, mangaDir, download.manga) + + DiskUtil.createNoMediaFile(tmpDir, context) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt index 1b6119b13c..6a06ec8ca3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt @@ -17,7 +17,6 @@ import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.getOrDefault import eu.kanade.tachiyomi.ui.base.controller.DialogController -import eu.kanade.tachiyomi.util.DiskUtil import eu.kanade.tachiyomi.util.getFilePicker import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -45,15 +44,6 @@ class SettingsDownloadController : SettingsController() { .subscribeUntilDestroy { path -> val dir = UniFile.fromUri(context, Uri.parse(path)) summary = dir.filePath ?: path - - // Don't display downloaded chapters in gallery apps creating .nomedia - if (dir != null && dir.exists()) { - val nomedia = dir.findFile(".nomedia") - if (nomedia == null) { - dir.createFile(".nomedia") - applicationContext?.let { DiskUtil.scanMedia(it, dir.uri) } - } - } } } switchPreference { diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/DiskUtil.kt b/app/src/main/java/eu/kanade/tachiyomi/util/DiskUtil.kt index edff38614f..c735c0b8d7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/DiskUtil.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/DiskUtil.kt @@ -7,6 +7,7 @@ import android.os.Build import android.os.Environment import android.support.v4.content.ContextCompat import android.support.v4.os.EnvironmentCompat +import com.hippo.unifile.UniFile import java.io.File object DiskUtil { @@ -54,6 +55,19 @@ object DiskUtil { return directories } + /** + * Don't display downloaded chapters in gallery apps creating `.nomedia`. + */ + fun createNoMediaFile(dir: UniFile?, context: Context?) { + if (dir != null && dir.exists()) { + val nomedia = dir.findFile(".nomedia") + if (nomedia == null) { + dir.createFile(".nomedia") + context?.let { scanMedia(it, dir.uri) } + } + } + } + /** * Scans the given file so that it can be shown in gallery apps, for example. */ From ebeee70931f2620af859acdfe244eadee4e7af99 Mon Sep 17 00:00:00 2001 From: FlaminSarge Date: Thu, 26 Dec 2019 10:40:11 -0700 Subject: [PATCH 22/36] Allow back button to navigate to previous URL in WebView, add Forward, Refresh, and Close menu options (#2176) --- .../ui/manga/info/MangaWebViewController.kt | 42 +++++++++++++++++-- app/src/main/res/menu/web_view.xml | 19 +++++++++ app/src/main/res/values/strings.xml | 2 + 3 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/menu/web_view.xml diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaWebViewController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaWebViewController.kt index 8d7d9687a0..2ae3667e81 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaWebViewController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaWebViewController.kt @@ -1,9 +1,7 @@ package eu.kanade.tachiyomi.ui.manga.info import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* import android.webkit.WebView import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.source.SourceManager @@ -16,6 +14,10 @@ class MangaWebViewController(bundle: Bundle? = null) : BaseController(bundle) { private val sourceManager by injectLazy() + init { + setHasOptionsMenu(true) + } + constructor(sourceId: Long, url: String) : this(Bundle().apply { putLong(SOURCE_KEY, sourceId) putString(URL_KEY, url) @@ -43,6 +45,40 @@ class MangaWebViewController(bundle: Bundle? = null) : BaseController(bundle) { web.loadUrl(url, headers) } + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.web_view, menu) + } + + override fun onPrepareOptionsMenu(menu: Menu) { + val web = view as WebView + menu.findItem(R.id.action_forward).isVisible = web.canGoForward() + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.action_forward -> { + val web = view as WebView + if (web.canGoForward()) web.goForward() + } + R.id.action_refresh -> { + val web = view as WebView + web.reload() + } + R.id.action_close -> router.popController(this) + else -> return super.onOptionsItemSelected(item) + } + return true + } + + override fun handleBack(): Boolean { + val web = view as WebView + if (web.canGoBack()) { + web.goBack() + return true + } + return super.handleBack() + } + override fun onDestroyView(view: View) { val web = view as WebView web.stopLoading() diff --git a/app/src/main/res/menu/web_view.xml b/app/src/main/res/menu/web_view.xml new file mode 100644 index 0000000000..1e4056460b --- /dev/null +++ b/app/src/main/res/menu/web_view.xml @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index da7bc6b98a..1502040f36 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -95,6 +95,8 @@ Restore Open Log in + Forward + Refresh Deleting… From 698e17178ae406d1e92986a0ab7681564e5e0b2f Mon Sep 17 00:00:00 2001 From: Anthony Nguyen Date: Thu, 26 Dec 2019 09:40:56 -0800 Subject: [PATCH 23/36] Increase default text size of the transition chapter page (#2285) --- .../tachiyomi/ui/reader/viewer/pager/PagerTransitionHolder.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerTransitionHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerTransitionHolder.kt index ce33d09f07..4133c19c5f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerTransitionHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerTransitionHolder.kt @@ -46,6 +46,7 @@ class PagerTransitionHolder( * Text view used to display the text of the current and next/prev chapters. */ private var textView = TextView(context).apply { + textSize = 17.5F wrapContent() } From ff8e3f0af492480fadf1d99d0ee63df335951885 Mon Sep 17 00:00:00 2001 From: arkon Date: Thu, 26 Dec 2019 16:01:16 -0500 Subject: [PATCH 24/36] Update to SDK 28 (#2394) --- .travis.yml | 4 ++-- app/build.gradle | 6 +++--- app/src/main/AndroidManifest.xml | 1 + .../catalogue/browse/BrowseCatalogueController.kt | 2 +- .../kanade/tachiyomi/ui/manga/MangaController.kt | 4 +--- .../reader/viewer/webtoon/WebtoonRecyclerView.kt | 4 ++-- .../ui/reader/viewer/webtoon/WebtoonViewer.kt | 14 ++++++++------ .../ui/setting/SettingsAboutController.kt | 4 ++-- 8 files changed, 20 insertions(+), 19 deletions(-) diff --git a/.travis.yml b/.travis.yml index bf00017ca9..edfc5a7c0f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ language: android android: components: - build-tools-29.0.2 - - android-27 + - android-28 - extra-android-m2repository - extra-google-m2repository - extra-android-support @@ -11,7 +11,7 @@ android: licenses: - android-sdk-license-.+ before_install: -- yes | sdkmanager "platforms;android-27" # workaround for accepting the license +- yes | sdkmanager "platforms;android-28" # workaround for accepting the license - if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then openssl aes-256-cbc -K $encrypted_e56be693d4fd_key -iv $encrypted_e56be693d4fd_iv -in "$PWD/.travis/secrets.tar.enc" -out secrets.tar -d; tar xf secrets.tar; diff --git a/app/build.gradle b/app/build.gradle index 9931564efb..7f5e0f6e8a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -29,14 +29,14 @@ ext { } android { - compileSdkVersion 27 + compileSdkVersion 28 buildToolsVersion '29.0.2' publishNonDefault true defaultConfig { applicationId "eu.kanade.tachiyomi" minSdkVersion 16 - targetSdkVersion 27 + targetSdkVersion 28 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" versionCode 41 versionName "0.8.4" @@ -100,7 +100,7 @@ dependencies { implementation 'com.github.inorichi:junrar-android:634c1f5' // Android support library - final support_library_version = '27.1.1' + final support_library_version = '28.0.0' implementation "com.android.support:support-v4:$support_library_version" implementation "com.android.support:appcompat-v7:$support_library_version" implementation "com.android.support:cardview-v7:$support_library_version" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e13d89ba7c..7d2b6144b5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + 0 && lastVisibleItemPosition == totalItemCount - 1 atFirstPosition = firstVisibleItemPosition == 0 } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt index 6adee83c2f..3eb092f802 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt @@ -67,7 +67,7 @@ class WebtoonViewer(val activity: ReaderActivity) : BaseViewer { recycler.layoutManager = layoutManager recycler.adapter = adapter recycler.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { val position = layoutManager.findLastEndVisibleItemPosition() val item = adapter.items.getOrNull(position) if (item != null && currentPage != item) { @@ -98,11 +98,13 @@ class WebtoonViewer(val activity: ReaderActivity) : BaseViewer { recycler.longTapListener = f@ { event -> if (activity.menuVisible || config.longTapEnabled) { val child = recycler.findChildViewUnder(event.x, event.y) - val position = recycler.getChildAdapterPosition(child) - val item = adapter.items.getOrNull(position) - if (item is ReaderPage) { - activity.onPageLongTap(item) - return@f true + if (child != null) { + val position = recycler.getChildAdapterPosition(child) + val item = adapter.items.getOrNull(position) + if (item is ReaderPage) { + activity.onPageLongTap(item) + return@f true + } } } false diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutController.kt index bbd23da2cf..b6ff16dcae 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutController.kt @@ -150,14 +150,14 @@ class SettingsAboutController : SettingsController() { override fun onCreateDialog(savedViewState: Bundle?): Dialog { return MaterialDialog.Builder(activity!!) .title(R.string.update_check_title) - .content(args.getString(BODY_KEY)) + .content(args.getString(BODY_KEY) ?: "") .positiveText(R.string.update_check_confirm) .negativeText(R.string.update_check_ignore) .onPositive { _, _ -> val appContext = applicationContext if (appContext != null) { // Start download - val url = args.getString(URL_KEY) + val url = args.getString(URL_KEY) ?: "" UpdaterService.downloadUpdate(appContext, url) } } From ad2ecd538db72cae0061074e2810f295c2689ecc Mon Sep 17 00:00:00 2001 From: Eugene Date: Thu, 26 Dec 2019 16:06:28 -0500 Subject: [PATCH 25/36] Allow cleartext traffic Certain catalogues (e.g. Mangakakalot) do not use HTTPS --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7d2b6144b5..fb5887d61f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,6 +17,7 @@ android:allowBackup="true" android:fullBackupContent="@xml/backup_rules" android:hardwareAccelerated="true" + android:usesCleartextTraffic="true" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:label="@string/app_name" From ed49ce8e1dec9a52749e2f66b94b45bf15de384d Mon Sep 17 00:00:00 2001 From: Eugene Date: Thu, 26 Dec 2019 16:06:37 -0500 Subject: [PATCH 26/36] Update project-level dependencies --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index d01606b312..373aaa2854 100644 --- a/build.gradle +++ b/build.gradle @@ -8,9 +8,9 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:3.5.3' - classpath 'com.github.ben-manes:gradle-versions-plugin:0.17.0' + classpath 'com.github.ben-manes:gradle-versions-plugin:0.22.0' classpath 'com.github.zellius:android-shortcut-gradle-plugin:0.1.2' - classpath 'com.google.gms:google-services:3.2.0' + classpath 'com.google.gms:google-services:4.3.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } From bc825bdefa7baf0e0ece569f4c01ae109109a65b Mon Sep 17 00:00:00 2001 From: Eugene Date: Thu, 26 Dec 2019 16:47:01 -0500 Subject: [PATCH 27/36] Minor dependency updates --- app/build.gradle | 6 +++--- .../eu/kanade/tachiyomi/data/download/DownloadService.kt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7f5e0f6e8a..ea615929ed 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -118,10 +118,10 @@ dependencies { // ReactiveX implementation 'io.reactivex:rxandroid:1.2.1' - implementation 'io.reactivex:rxjava:1.3.6' + 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.7.0' + implementation 'com.github.pwittchen:reactivenetwork:0.13.0' // Network client implementation "com.squareup.okhttp3:okhttp:3.10.0" @@ -178,7 +178,7 @@ dependencies { implementation 'jp.wasabeef:glide-transformations:3.1.1' // Logging - implementation 'com.jakewharton.timber:timber:4.6.1' + implementation 'com.jakewharton.timber:timber:4.7.1' // Crash reports implementation 'ch.acra:acra:4.9.2' diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt index 8fdb4f6267..33ef28abb7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt @@ -132,7 +132,7 @@ class DownloadService : Service() { .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ state -> onNetworkStateChanged(state) - }, { _ -> + }, { toast(R.string.download_queue_error) stopSelf() }) From c349fb0e375fc01705e8e2c632f3e4bbc693cdd2 Mon Sep 17 00:00:00 2001 From: Eugene Date: Thu, 26 Dec 2019 16:47:33 -0500 Subject: [PATCH 28/36] Enable Java 8 language feature support --- app/build.gradle | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index ea615929ed..c3becab094 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,6 +91,14 @@ android { checkReleaseBuilds false } + compileOptions { + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + } + + kotlinOptions { + jvmTarget = "1.8" + } } dependencies { From c339bd49d01a88570ef9cbeedfef36add00b0c4c Mon Sep 17 00:00:00 2001 From: Eugene Date: Thu, 26 Dec 2019 17:48:39 -0500 Subject: [PATCH 29/36] Address minor Kotlin compiler warnings --- .../java/eu/kanade/tachiyomi/data/cache/CoverCache.kt | 2 +- .../data/preference/SharedPreferencesDataStore.kt | 4 ++-- .../kanade/tachiyomi/data/track/kitsu/KitsuModels.kt | 7 +++---- .../extension/util/ExtensionInstallActivity.kt | 2 +- .../kanade/tachiyomi/extension/util/ExtensionLoader.kt | 2 +- .../ui/catalogue/SourceDividerItemDecoration.kt | 2 +- .../ui/catalogue/browse/CatalogueNavigationView.kt | 4 ++-- .../catalogue/global_search/CatalogueSearchAdapter.kt | 2 +- .../ui/extension/ExtensionDetailsController.kt | 4 ++-- .../ui/extension/ExtensionDividerItemDecoration.kt | 2 +- .../tachiyomi/ui/extension/ExtensionTrustDialog.kt | 4 ++-- .../eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt | 4 ++-- .../eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt | 2 +- .../tachiyomi/ui/reader/loader/DownloadPageLoader.kt | 4 ++-- .../eu/kanade/tachiyomi/util/ChapterRecognition.kt | 10 +++++----- .../java/eu/kanade/tachiyomi/util/ContextExtensions.kt | 4 ++-- 16 files changed, 29 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/cache/CoverCache.kt b/app/src/main/java/eu/kanade/tachiyomi/data/cache/CoverCache.kt index 4586f8c182..c13492d9dd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/cache/CoverCache.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/cache/CoverCache.kt @@ -60,7 +60,7 @@ class CoverCache(private val context: Context) { return false // Remove file. - val file = getCoverFile(thumbnailUrl!!) + val file = getCoverFile(thumbnailUrl) return file.exists() && file.delete() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/SharedPreferencesDataStore.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/SharedPreferencesDataStore.kt index bb07bb0a52..8d02d1c77d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/SharedPreferencesDataStore.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/SharedPreferencesDataStore.kt @@ -45,11 +45,11 @@ class SharedPreferencesDataStore(private val prefs: SharedPreferences) : Prefere prefs.edit().putString(key, value).apply() } - override fun getStringSet(key: String?, defValues: MutableSet?): MutableSet { + override fun getStringSet(key: String?, defValues: MutableSet?): MutableSet? { return prefs.getStringSet(key, defValues) } override fun putStringSet(key: String?, values: MutableSet?) { prefs.edit().putStringSet(key, values).apply() } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt index ca0de7d3d3..b5e55d9d97 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt @@ -18,13 +18,12 @@ class KitsuSearchManga(obj: JsonObject) { private val synopsis by obj.byString private var startDate = obj.get("startDate").nullString?.let { val outputDf = SimpleDateFormat("yyyy-MM-dd", Locale.US) - outputDf.format(Date(it!!.toLong() * 1000)) + outputDf.format(Date(it.toLong() * 1000)) } private val endDate = obj.get("endDate").nullString - @CallSuper - open fun toTrack() = TrackSearch.create(TrackManager.KITSU).apply { + fun toTrack() = TrackSearch.create(TrackManager.KITSU).apply { media_id = this@KitsuSearchManga.id title = canonicalTitle total_chapters = chapterCount ?: 0 @@ -55,7 +54,7 @@ class KitsuLibManga(obj: JsonObject, manga: JsonObject) { private val ratingTwenty = obj["attributes"].obj.get("ratingTwenty").nullString val progress by obj["attributes"].byInt - open fun toTrack() = TrackSearch.create(TrackManager.KITSU).apply { + fun toTrack() = TrackSearch.create(TrackManager.KITSU).apply { media_id = libraryId title = canonicalTitle total_chapters = chapterCount ?: 0 diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallActivity.kt index 421cfb191d..5dcd6bb126 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallActivity.kt @@ -39,7 +39,7 @@ class ExtensionInstallActivity : Activity() { } private fun checkInstallationResult(resultCode: Int) { - val downloadId = intent.extras.getLong(ExtensionInstaller.EXTRA_DOWNLOAD_ID) + val downloadId = intent.extras!!.getLong(ExtensionInstaller.EXTRA_DOWNLOAD_ID) val success = resultCode == RESULT_OK val extensionManager = Injekt.get() diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt index f211d7d95d..c4018f0461 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt @@ -121,7 +121,7 @@ internal object ExtensionLoader { val classLoader = PathClassLoader(appInfo.sourceDir, null, context.classLoader) - val sources = appInfo.metaData.getString(METADATA_SOURCE_CLASS) + val sources = appInfo.metaData.getString(METADATA_SOURCE_CLASS)!! .split(";") .map { val sourceClass = it.trim() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/SourceDividerItemDecoration.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/SourceDividerItemDecoration.kt index a4c33beb75..e21b58124f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/SourceDividerItemDecoration.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/SourceDividerItemDecoration.kt @@ -13,7 +13,7 @@ class SourceDividerItemDecoration(context: Context) : RecyclerView.ItemDecoratio init { val a = context.obtainStyledAttributes(intArrayOf(android.R.attr.listDivider)) - divider = a.getDrawable(0) + divider = a.getDrawable(0)!! a.recycle() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/CatalogueNavigationView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/CatalogueNavigationView.kt index 1f06fc4072..d78d1fd7a0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/CatalogueNavigationView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/CatalogueNavigationView.kt @@ -28,7 +28,7 @@ class CatalogueNavigationView @JvmOverloads constructor(context: Context, attrs: val view = inflate(R.layout.catalogue_drawer_content) ((view as ViewGroup).getChildAt(1) as ViewGroup).addView(recycler) addView(view) - title.text = context?.getString(R.string.source_search_options) + title.text = context.getString(R.string.source_search_options) search_btn.setOnClickListener { onSearchClicked() } reset_btn.setOnClickListener { onResetClicked() } } @@ -37,4 +37,4 @@ class CatalogueNavigationView @JvmOverloads constructor(context: Context, attrs: adapter.updateDataSet(items) } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchAdapter.kt index f9ba52a024..441d575c81 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchAdapter.kt @@ -38,7 +38,7 @@ class CatalogueSearchAdapter(val controller: CatalogueSearchController) : override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) - bundle = savedInstanceState.getBundle(HOLDER_BUNDLE_KEY) + bundle = savedInstanceState.getBundle(HOLDER_BUNDLE_KEY)!! } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDetailsController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDetailsController.kt index 2005a93889..c851b81ade 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDetailsController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDetailsController.kt @@ -47,7 +47,7 @@ class ExtensionDetailsController(bundle: Bundle? = null) : } override fun createPresenter(): ExtensionDetailsPresenter { - return ExtensionDetailsPresenter(args.getString(PKGNAME_KEY)) + return ExtensionDetailsPresenter(args.getString(PKGNAME_KEY)!!) } override fun getTitle(): String? { @@ -119,7 +119,7 @@ class ExtensionDetailsController(bundle: Bundle? = null) : private fun addPreferencesForSource(screen: PreferenceScreen, source: Source, multiSource: Boolean) { val context = screen.context - // TODO + // TODO val dataStore = SharedPreferencesDataStore(/*if (source is HttpSource) { source.preferences } else {*/ diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDividerItemDecoration.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDividerItemDecoration.kt index 40fe44505d..247206df7c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDividerItemDecoration.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDividerItemDecoration.kt @@ -13,7 +13,7 @@ class ExtensionDividerItemDecoration(context: Context) : RecyclerView.ItemDecora init { val a = context.obtainStyledAttributes(intArrayOf(android.R.attr.listDivider)) - divider = a.getDrawable(0) + divider = a.getDrawable(0)!! a.recycle() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionTrustDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionTrustDialog.kt index 3094e90620..6c1f8bc0a0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionTrustDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionTrustDialog.kt @@ -24,10 +24,10 @@ class ExtensionTrustDialog(bundle: Bundle? = null) : DialogController(bundle) .positiveText(R.string.ext_trust) .negativeText(R.string.ext_uninstall) .onPositive { _, _ -> - (targetController as? Listener)?.trustSignature(args.getString(SIGNATURE_KEY)) + (targetController as? Listener)?.trustSignature(args.getString(SIGNATURE_KEY)!!) } .onNegative { _, _ -> - (targetController as? Listener)?.uninstallExtension(args.getString(PKGNAME_KEY)) + (targetController as? Listener)?.uninstallExtension(args.getString(PKGNAME_KEY)!!) } .build() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index ee324e8966..beb7783ffe 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -119,8 +119,8 @@ class ReaderActivity : BaseRxActivity() { setContentView(R.layout.reader_activity) if (presenter.needsInit()) { - val manga = intent.extras.getLong("manga", -1) - val chapter = intent.extras.getLong("chapter", -1) + val manga = intent.extras!!.getLong("manga", -1) + val chapter = intent.extras!!.getLong("chapter", -1) if (manga == -1L || chapter == -1L) { finish() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt index b2aafa0a23..243e5bb6e7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt @@ -498,7 +498,7 @@ class ReaderPresenter( .observeOn(AndroidSchedulers.mainThread()) .subscribeFirst( { view, file -> view.onShareImageResult(file) }, - { view, error -> /* Empty */ } + { _, _ -> /* Empty */ } ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt index af7d969305..6a207502af 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt @@ -32,9 +32,9 @@ class DownloadPageLoader( return downloadManager.buildPageList(source, manga, chapter.chapter) .map { pages -> pages.map { page -> - ReaderPage(page.index, page.url, page.imageUrl, { + ReaderPage(page.index, page.url, page.imageUrl) { context.contentResolver.openInputStream(page.uri) - }).apply { + }.apply { status = Page.READY } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/ChapterRecognition.kt b/app/src/main/java/eu/kanade/tachiyomi/util/ChapterRecognition.kt index 9ee6774a76..742fa3e1a2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/ChapterRecognition.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/ChapterRecognition.kt @@ -91,7 +91,7 @@ object ChapterRecognition { * @param chapter chapter object * @return true if volume is found */ - fun updateChapter(match: MatchResult?, chapter: SChapter): Boolean { + private fun updateChapter(match: MatchResult?, chapter: SChapter): Boolean { match?.let { val initial = it.groups[1]?.value?.toFloat()!! val subChapterDecimal = it.groups[2]?.value @@ -109,12 +109,12 @@ object ChapterRecognition { * @param alpha alpha value of regex * @return decimal/alpha float value */ - fun checkForDecimal(decimal: String?, alpha: String?): Float { + private fun checkForDecimal(decimal: String?, alpha: String?): Float { if (!decimal.isNullOrEmpty()) - return decimal?.toFloat()!! + return decimal.toFloat() if (!alpha.isNullOrEmpty()) { - if (alpha!!.contains("extra")) + if (alpha.contains("extra")) return .99f if (alpha.contains("omake")) @@ -138,7 +138,7 @@ object ChapterRecognition { * x.a -> x.1, x.b -> x.2, etc */ private fun parseAlphaPostFix(alpha: Char): Float { - return ("0." + Integer.toString(alpha.toInt() - 96)).toFloat() + return ("0." + (alpha.toInt() - 96).toString()).toFloat() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/ContextExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/ContextExtensions.kt index 2c54b236c5..ad3ec5c510 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/ContextExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/ContextExtensions.kt @@ -172,11 +172,11 @@ fun Context.isServiceRunning(serviceClass: Class<*>): Boolean { */ fun Context.openInBrowser(url: String) { try { - val url = Uri.parse(url) + val parsedUrl = Uri.parse(url) val intent = CustomTabsIntent.Builder() .setToolbarColor(getResourceColor(R.attr.colorPrimary)) .build() - intent.launchUrl(this, url) + intent.launchUrl(this, parsedUrl) } catch (e: Exception) { toast(e.message) } From 2ebaacfc898a42e87225323281e70518bb36b564 Mon Sep 17 00:00:00 2001 From: arkon Date: Fri, 27 Dec 2019 07:18:30 -0500 Subject: [PATCH 30/36] Replace dependency for case insensitive natural sorting (#2389) Replace dependency for case insensitive natural sorting --- app/build.gradle | 3 --- .../eu/kanade/tachiyomi/source/LocalSource.kt | 26 ++++++++++--------- .../ui/reader/loader/DirectoryPageLoader.kt | 6 ++--- .../ui/reader/loader/RarPageLoader.kt | 6 ++--- .../ui/reader/loader/ZipPageLoader.kt | 6 ++--- .../kanade/tachiyomi/util/ComparatorUtil.kt | 5 ++++ 6 files changed, 25 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/util/ComparatorUtil.kt diff --git a/app/build.gradle b/app/build.gradle index c3becab094..05b5b64916 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,9 +191,6 @@ dependencies { // Crash reports implementation 'ch.acra:acra:4.9.2' - // Sort - implementation 'com.github.gpanther:java-nat-sort:natural-comparator-1.1' - // UI implementation 'com.dmitrymalkovich.android:material-design-dimens:1.4' implementation 'com.github.dmytrodanylyk.android-process-button:library:1.0.4' diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/LocalSource.kt b/app/src/main/java/eu/kanade/tachiyomi/source/LocalSource.kt index 4dd8d4936b..1630e723d7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/LocalSource.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/LocalSource.kt @@ -2,20 +2,24 @@ package eu.kanade.tachiyomi.source import android.content.Context import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.source.model.* +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.source.model.Page +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.util.ChapterRecognition +import eu.kanade.tachiyomi.util.ComparatorUtil.CaseInsensitiveNaturalComparator import eu.kanade.tachiyomi.util.DiskUtil import eu.kanade.tachiyomi.util.EpubFile import eu.kanade.tachiyomi.util.ImageUtil import junrar.Archive import junrar.rarfile.FileHeader -import net.greypanther.natsort.CaseInsensitiveSimpleNaturalComparator import rx.Observable import timber.log.Timber import java.io.File import java.io.FileInputStream import java.io.InputStream -import java.util.Comparator import java.util.Locale import java.util.concurrent.TimeUnit import java.util.zip.ZipEntry @@ -125,7 +129,6 @@ class LocalSource(private val context: Context) : CatalogueSource { override fun fetchMangaDetails(manga: SManga) = Observable.just(manga) override fun fetchChapterList(manga: SManga): Observable> { - val comparator = CaseInsensitiveSimpleNaturalComparator.getInstance() val chapters = getBaseDirectories(context) .mapNotNull { File(it, manga.url).listFiles()?.toList() } .flatten() @@ -146,7 +149,7 @@ class LocalSource(private val context: Context) : CatalogueSource { } .sortedWith(Comparator { c1, c2 -> val c = c2.chapter_number.compareTo(c1.chapter_number) - if (c == 0) comparator.compare(c2.name, c1.name) else c + if (c == 0) CaseInsensitiveNaturalComparator.compare(c2.name, c1.name) else c }) return Observable.just(chapters) @@ -189,20 +192,19 @@ class LocalSource(private val context: Context) : CatalogueSource { private fun updateCover(chapter: SChapter, manga: SManga): File? { val format = getFormat(chapter) - val comparator = CaseInsensitiveSimpleNaturalComparator.getInstance() return when (format) { is Format.Directory -> { val entry = format.file.listFiles() - .sortedWith(Comparator { f1, f2 -> comparator.compare(f1.name, f2.name) }) - .find { !it.isDirectory && ImageUtil.isImage(it.name, { FileInputStream(it) }) } + .sortedWith(Comparator { f1, f2 -> CaseInsensitiveNaturalComparator.compare(f1.name, f2.name) }) + .find { !it.isDirectory && ImageUtil.isImage(it.name) { FileInputStream(it) } } entry?.let { updateCover(context, manga, it.inputStream())} } is Format.Zip -> { ZipFile(format.file).use { zip -> val entry = zip.entries().toList() - .sortedWith(Comparator { f1, f2 -> comparator.compare(f1.name, f2.name) }) - .find { !it.isDirectory && ImageUtil.isImage(it.name, { zip.getInputStream(it) }) } + .sortedWith(Comparator { f1, f2 -> CaseInsensitiveNaturalComparator.compare(f1.name, f2.name) }) + .find { !it.isDirectory && ImageUtil.isImage(it.name) { zip.getInputStream(it) } } entry?.let { updateCover(context, manga, zip.getInputStream(it) )} } @@ -210,8 +212,8 @@ class LocalSource(private val context: Context) : CatalogueSource { is Format.Rar -> { Archive(format.file).use { archive -> val entry = archive.fileHeaders - .sortedWith(Comparator { f1, f2 -> comparator.compare(f1.fileNameString, f2.fileNameString) }) - .find { !it.isDirectory && ImageUtil.isImage(it.fileNameString, { archive.getInputStream(it) }) } + .sortedWith(Comparator { f1, f2 -> CaseInsensitiveNaturalComparator.compare(f1.fileNameString, f2.fileNameString) }) + .find { !it.isDirectory && ImageUtil.isImage(it.fileNameString) { archive.getInputStream(it) } } entry?.let { updateCover(context, manga, archive.getInputStream(it) )} } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DirectoryPageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DirectoryPageLoader.kt index d42efcef06..8d70d4a760 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DirectoryPageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DirectoryPageLoader.kt @@ -2,8 +2,8 @@ package eu.kanade.tachiyomi.ui.reader.loader import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.ui.reader.model.ReaderPage +import eu.kanade.tachiyomi.util.ComparatorUtil.CaseInsensitiveNaturalComparator import eu.kanade.tachiyomi.util.ImageUtil -import net.greypanther.natsort.CaseInsensitiveSimpleNaturalComparator import rx.Observable import java.io.File import java.io.FileInputStream @@ -18,11 +18,9 @@ class DirectoryPageLoader(val file: File) : PageLoader() { * comparator. */ override fun getPages(): Observable> { - val comparator = CaseInsensitiveSimpleNaturalComparator.getInstance() - return file.listFiles() .filter { !it.isDirectory && ImageUtil.isImage(it.name) { FileInputStream(it) } } - .sortedWith(Comparator { f1, f2 -> comparator.compare(f1.name, f2.name) }) + .sortedWith(Comparator { f1, f2 -> CaseInsensitiveNaturalComparator.compare(f1.name, f2.name) }) .mapIndexed { i, file -> val streamFn = { FileInputStream(file) } ReaderPage(i).apply { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/RarPageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/RarPageLoader.kt index dcba332aaa..4a30378a6d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/RarPageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/RarPageLoader.kt @@ -2,10 +2,10 @@ package eu.kanade.tachiyomi.ui.reader.loader import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.ui.reader.model.ReaderPage +import eu.kanade.tachiyomi.util.ComparatorUtil.CaseInsensitiveNaturalComparator import eu.kanade.tachiyomi.util.ImageUtil import junrar.Archive import junrar.rarfile.FileHeader -import net.greypanther.natsort.CaseInsensitiveSimpleNaturalComparator import rx.Observable import java.io.File import java.io.InputStream @@ -42,11 +42,9 @@ class RarPageLoader(file: File) : PageLoader() { * comparator. */ override fun getPages(): Observable> { - val comparator = CaseInsensitiveSimpleNaturalComparator.getInstance() - return archive.fileHeaders .filter { !it.isDirectory && ImageUtil.isImage(it.fileNameString) { archive.getInputStream(it) } } - .sortedWith(Comparator { f1, f2 -> comparator.compare(f1.fileNameString, f2.fileNameString) }) + .sortedWith(Comparator { f1, f2 -> CaseInsensitiveNaturalComparator.compare(f1.fileNameString, f2.fileNameString) }) .mapIndexed { i, header -> val streamFn = { getStream(header) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ZipPageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ZipPageLoader.kt index 3cd1b541e8..78d7488847 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ZipPageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ZipPageLoader.kt @@ -2,8 +2,8 @@ package eu.kanade.tachiyomi.ui.reader.loader import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.ui.reader.model.ReaderPage +import eu.kanade.tachiyomi.util.ComparatorUtil.CaseInsensitiveNaturalComparator import eu.kanade.tachiyomi.util.ImageUtil -import net.greypanther.natsort.CaseInsensitiveSimpleNaturalComparator import rx.Observable import java.io.File import java.util.zip.ZipEntry @@ -32,11 +32,9 @@ class ZipPageLoader(file: File) : PageLoader() { * comparator. */ override fun getPages(): Observable> { - val comparator = CaseInsensitiveSimpleNaturalComparator.getInstance() - return zip.entries().toList() .filter { !it.isDirectory && ImageUtil.isImage(it.name) { zip.getInputStream(it) } } - .sortedWith(Comparator { f1, f2 -> comparator.compare(f1.name, f2.name) }) + .sortedWith(Comparator { f1, f2 -> CaseInsensitiveNaturalComparator.compare(f1.name, f2.name) }) .mapIndexed { i, entry -> val streamFn = { zip.getInputStream(entry) } ReaderPage(i).apply { diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/ComparatorUtil.kt b/app/src/main/java/eu/kanade/tachiyomi/util/ComparatorUtil.kt new file mode 100644 index 0000000000..aff3603b65 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/util/ComparatorUtil.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.util + +object ComparatorUtil { + val CaseInsensitiveNaturalComparator = compareBy(String.CASE_INSENSITIVE_ORDER) { it }.then(naturalOrder()) +} From c90f985fcc72f2805b99b4b9bc587192a1cdcd08 Mon Sep 17 00:00:00 2001 From: Eugene Date: Fri, 27 Dec 2019 07:24:19 -0500 Subject: [PATCH 31/36] Add REQUEST_DELETE_PACKAGES permission for uninstalling extensions --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fb5887d61f..a218391ca5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + From 2bb903088e6aa8c78a6ff69a80844b05f29065fe Mon Sep 17 00:00:00 2001 From: Eugene Date: Fri, 27 Dec 2019 20:53:04 -0500 Subject: [PATCH 32/36] Tweak FAB sizing method (fixes #2398) Ref: https://stackoverflow.com/questions/56945314/floating-action-button-fab-icon-size-problems-after-migrating-to-sdk-28 --- app/src/main/res/values/styles.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 585e0e7ddf..d52818314c 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -137,8 +137,9 @@