From 0561d5f55cff9bf14b8fdea7e1669a47d469e3c8 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Mon, 9 Dec 2019 09:36:36 +0900 Subject: [PATCH 1/5] Added code for saved reader --- .../java/xyz/quaver/pupil/util/GalleryDownloader.kt | 3 +-- libpupil/src/main/java/xyz/quaver/hitomi/reader.kt | 10 ++++++++-- libpupil/src/main/java/xyz/quaver/hiyobi/reader.kt | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/xyz/quaver/pupil/util/GalleryDownloader.kt b/app/src/main/java/xyz/quaver/pupil/util/GalleryDownloader.kt index 32a18e34..e942f0c8 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/GalleryDownloader.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/GalleryDownloader.kt @@ -31,7 +31,6 @@ import com.crashlytics.android.Crashlytics import kotlinx.coroutines.* import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonConfiguration -import xyz.quaver.availableInHiyobi import xyz.quaver.hitomi.Reader import xyz.quaver.hitomi.getReader import xyz.quaver.hitomi.getReferer @@ -124,7 +123,7 @@ class GalleryDownloader( val cached = json.parse(serializer, cache.readText()) if (cached.galleryInfo.isNotEmpty()) { - useHiyobi = availableInHiyobi(galleryID) + useHiyobi = cached.code == Reader.Code.HIYOBI onReaderLoadedHandler?.invoke(cached) diff --git a/libpupil/src/main/java/xyz/quaver/hitomi/reader.kt b/libpupil/src/main/java/xyz/quaver/hitomi/reader.kt index 23c9174d..b02df73f 100644 --- a/libpupil/src/main/java/xyz/quaver/hitomi/reader.kt +++ b/libpupil/src/main/java/xyz/quaver/hitomi/reader.kt @@ -32,7 +32,13 @@ data class GalleryInfo( ) @Serializable -open class Reader(val title: String, val galleryInfo: List) +class Reader(val code:Code, val title: String, val galleryInfo: List) { + enum class Code { + HITOMI, + HIYOBI, + SORALA + } +} //Set header `Referer` to reader url to avoid 403 error fun getReader(galleryID: Int) : Reader { @@ -40,5 +46,5 @@ fun getReader(galleryID: Int) : Reader { val doc = Jsoup.connect(readerUrl).get() - return Reader(doc.title(), getGalleryInfo(galleryID)) + return Reader(Reader.Code.HITOMI, doc.title(), getGalleryInfo(galleryID)) } \ No newline at end of file diff --git a/libpupil/src/main/java/xyz/quaver/hiyobi/reader.kt b/libpupil/src/main/java/xyz/quaver/hiyobi/reader.kt index f1ce9222..07c0a357 100644 --- a/libpupil/src/main/java/xyz/quaver/hiyobi/reader.kt +++ b/libpupil/src/main/java/xyz/quaver/hiyobi/reader.kt @@ -76,7 +76,7 @@ fun getReader(galleryID: Int) : Reader { } ) - return Reader(title, galleryInfo) + return Reader(Reader.Code.HIYOBI, title, galleryInfo) } fun createImgList(galleryID: Int, reader: Reader) = From 865bf0ba83cab185fc75e145b8efef9ff38a6d1d Mon Sep 17 00:00:00 2001 From: tom5079 Date: Mon, 9 Dec 2019 10:33:26 +0900 Subject: [PATCH 2/5] Added code for differentiating readers --- libpupil/src/main/java/xyz/quaver/hitomi/reader.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libpupil/src/main/java/xyz/quaver/hitomi/reader.kt b/libpupil/src/main/java/xyz/quaver/hitomi/reader.kt index b02df73f..4ed503a9 100644 --- a/libpupil/src/main/java/xyz/quaver/hitomi/reader.kt +++ b/libpupil/src/main/java/xyz/quaver/hitomi/reader.kt @@ -32,7 +32,7 @@ data class GalleryInfo( ) @Serializable -class Reader(val code:Code, val title: String, val galleryInfo: List) { +data class Reader(val code: Code, val title: String, val galleryInfo: List) { enum class Code { HITOMI, HIYOBI, From d40b4f3748d8ac5b278a8593d15cc83637a6f320 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Thu, 12 Dec 2019 20:14:55 +0900 Subject: [PATCH 3/5] Added update logic for outdated readers --- .../quaver/pupil/ExampleInstrumentedTest.kt | 34 ++++++++++++- .../main/java/xyz/quaver/pupil/util/update.kt | 49 +++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt b/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt index 4f3ce3c8..801d8d34 100644 --- a/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt @@ -25,6 +25,10 @@ import android.util.Log import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import androidx.test.rule.ActivityTestRule +import kotlinx.serialization.ImplicitReflectionSerializer +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonConfiguration +import kotlinx.serialization.json.JsonObject import org.junit.Assert.assertEquals import org.junit.Test import org.junit.runner.RunWith @@ -34,6 +38,7 @@ import xyz.quaver.hiyobi.getReader import xyz.quaver.hiyobi.user_agent import xyz.quaver.pupil.ui.LockActivity import xyz.quaver.pupil.util.getDownloadDirectory +import java.io.File import java.net.URL import javax.net.ssl.HttpsURLConnection @@ -63,7 +68,7 @@ class ExampleInstrumentedTest { @Test fun test_doSearch() { - val reader = getReader(1426382) + val reader = getReader( 1426382) val data: ByteArray @@ -76,4 +81,31 @@ class ExampleInstrumentedTest { Log.d("Pupil", data.size.toString()) } + + @UseExperimental(ImplicitReflectionSerializer::class) + @Test + fun test_deleteCodeFromReader() { + val context = InstrumentationRegistry.getInstrumentation().targetContext + + val json = Json(JsonConfiguration.Stable) + + listOf( + getDownloadDirectory(context), + File(context.cacheDir, "imageCache") + ).forEach { root -> + root.listFiles()?.forEach gallery@{ gallery -> + val reader = json.parseJson(File(gallery, "reader.json").apply { + if (!exists()) + return@gallery + }.readText()) + .jsonObject.toMutableMap() + + Log.d("PUPILD", gallery.name) + + reader.remove("code") + + File(gallery, "reader.json").writeText(JsonObject(reader).toString()) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/util/update.kt b/app/src/main/java/xyz/quaver/pupil/util/update.kt index 1c48f8e5..31e4fda0 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/update.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/update.kt @@ -18,8 +18,13 @@ package xyz.quaver.pupil.util +import android.content.Context +import kotlinx.serialization.ImplicitReflectionSerializer import kotlinx.serialization.json.* +import xyz.quaver.availableInHiyobi +import xyz.quaver.hitomi.Reader import xyz.quaver.pupil.BuildConfig +import java.io.File import java.net.URL fun getReleases(url: String) : JsonArray { @@ -61,4 +66,48 @@ fun getApkUrl(releases: JsonObject) : Pair? { else Pair(it.jsonObject["browser_download_url"]?.content, it.jsonObject["name"]?.content) } +} + +fun getOldReaderGalleries(context: Context) : List { + val oldGallery = mutableListOf() + + listOf( + getDownloadDirectory(context), + File(context.cacheDir, "imageCache") + ).forEach { root -> + root.listFiles()?.forEach { gallery -> + File(gallery, "reader.json").let { readerFile -> + if (!readerFile.exists()) + return@let + + Json(JsonConfiguration.Stable).parseJson(readerFile.readText()).jsonObject.let { reader -> + if (!reader.contains("code")) + oldGallery.add(gallery) + } + } + } + } + + return oldGallery +} + +@UseExperimental(ImplicitReflectionSerializer::class) +fun updateOldReaderGalleries(context: Context) { + + val json = Json(JsonConfiguration.Stable) + + getOldReaderGalleries(context).forEach { gallery -> + val reader = json.parseJson(File(gallery, "reader.json").readText()) + .jsonObject.toMutableMap() + + reader["code"] = when { + (File(gallery, "images").list()?. + all { !it.endsWith("webp") } ?: return@forEach) && + availableInHiyobi(gallery.name.toInt()) -> json.toJson(Reader.Code.HIYOBI) + else -> json.toJson(Reader.Code.HITOMI) + } + + File(gallery, "reader.json").writeText(JsonObject(reader).toString()) + } + } \ No newline at end of file From ed4911c4412161805a13be150179418627555d88 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Fri, 13 Dec 2019 18:39:12 +0900 Subject: [PATCH 4/5] Updated serialization library --- app/build.gradle | 4 ++-- .../java/xyz/quaver/pupil/ExampleInstrumentedTest.kt | 8 ++++++++ app/src/main/java/xyz/quaver/pupil/util/update.kt | 11 +++++++---- libpupil/build.gradle | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8576c6f5..02530dd6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -46,7 +46,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.1' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1' - implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.11.0" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.14.0" implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.preference:preference:1.1.0' @@ -60,7 +60,7 @@ dependencies { implementation "com.daimajia.swipelayout:library:1.2.0@aar" implementation 'com.google.android.material:material:1.2.0-alpha02' implementation 'com.google.firebase:firebase-core:17.2.1' - implementation 'com.google.firebase:firebase-perf:19.0.2' + implementation 'com.google.firebase:firebase-perf:19.0.3' implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' implementation 'com.github.arimorty:floatingsearchview:2.1.1' implementation 'com.github.clans:fab:1.6.4' diff --git a/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt b/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt index 801d8d34..663d6fc3 100644 --- a/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt @@ -38,6 +38,7 @@ import xyz.quaver.hiyobi.getReader import xyz.quaver.hiyobi.user_agent import xyz.quaver.pupil.ui.LockActivity import xyz.quaver.pupil.util.getDownloadDirectory +import xyz.quaver.pupil.util.updateOldReaderGalleries import java.io.File import java.net.URL import javax.net.ssl.HttpsURLConnection @@ -108,4 +109,11 @@ class ExampleInstrumentedTest { } } } + + @Test + fun test_updateOldReader() { + val context = InstrumentationRegistry.getInstrumentation().targetContext + + updateOldReaderGalleries(context) + } } \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/util/update.kt b/app/src/main/java/xyz/quaver/pupil/util/update.kt index 31e4fda0..0a2d76d0 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/update.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/update.kt @@ -19,7 +19,8 @@ package xyz.quaver.pupil.util import android.content.Context -import kotlinx.serialization.ImplicitReflectionSerializer +import kotlinx.serialization.InternalSerializationApi +import kotlinx.serialization.internal.EnumSerializer import kotlinx.serialization.json.* import xyz.quaver.availableInHiyobi import xyz.quaver.hitomi.Reader @@ -91,7 +92,7 @@ fun getOldReaderGalleries(context: Context) : List { return oldGallery } -@UseExperimental(ImplicitReflectionSerializer::class) +@UseExperimental(InternalSerializationApi::class) fun updateOldReaderGalleries(context: Context) { val json = Json(JsonConfiguration.Stable) @@ -100,11 +101,13 @@ fun updateOldReaderGalleries(context: Context) { val reader = json.parseJson(File(gallery, "reader.json").readText()) .jsonObject.toMutableMap() + val codeSerializer = EnumSerializer(Reader.Code::class) + reader["code"] = when { (File(gallery, "images").list()?. all { !it.endsWith("webp") } ?: return@forEach) && - availableInHiyobi(gallery.name.toInt()) -> json.toJson(Reader.Code.HIYOBI) - else -> json.toJson(Reader.Code.HITOMI) + availableInHiyobi(gallery.name.toInt()) -> json.toJson(codeSerializer, Reader.Code.HIYOBI) + else -> json.toJson(codeSerializer, Reader.Code.HITOMI) } File(gallery, "reader.json").writeText(JsonObject(reader).toString()) diff --git a/libpupil/build.gradle b/libpupil/build.gradle index 5a3ea8bf..055ae4dd 100644 --- a/libpupil/build.gradle +++ b/libpupil/build.gradle @@ -6,7 +6,7 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.1' - implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.11.0" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.14.0" implementation 'org.jsoup:jsoup:1.11.3' testImplementation 'junit:junit:4.12' } From d29c7bf91adb36d5344e5e26cace112f06dbff15 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Fri, 13 Dec 2019 19:30:19 +0900 Subject: [PATCH 5/5] Apply update on startup --- app/src/main/java/xyz/quaver/pupil/Pupil.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/xyz/quaver/pupil/Pupil.kt b/app/src/main/java/xyz/quaver/pupil/Pupil.kt index b9363bef..52b9a947 100644 --- a/app/src/main/java/xyz/quaver/pupil/Pupil.kt +++ b/app/src/main/java/xyz/quaver/pupil/Pupil.kt @@ -30,7 +30,11 @@ import androidx.preference.PreferenceManager import com.google.android.gms.common.GooglePlayServicesNotAvailableException import com.google.android.gms.common.GooglePlayServicesRepairableException import com.google.android.gms.security.ProviderInstaller +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import xyz.quaver.pupil.util.Histories +import xyz.quaver.pupil.util.updateOldReaderGalleries import java.io.File class Pupil : MultiDexApplication() { @@ -78,6 +82,10 @@ class Pupil : MultiDexApplication() { false -> AppCompatDelegate.MODE_NIGHT_NO }) + CoroutineScope(Dispatchers.IO).launch { + updateOldReaderGalleries(this@Pupil) + } + super.onCreate() }