Compare commits
13
Commits
main
...
1.8.9.4-gms
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a6d215a0bf | ||
|
|
cf9441adb5 | ||
|
|
36b16d7be8 | ||
|
|
fab5532407 | ||
|
|
8ad4e8640f | ||
|
|
5b5a2a9a33 | ||
|
|
7719312355 | ||
|
|
48f1b0a958 | ||
|
|
9abeba6b15 | ||
|
|
75bec4314e | ||
|
|
b767c041b9 | ||
|
|
4e916731b3 | ||
|
|
6c24407fb7 |
No files matched your search
@@ -45,7 +45,6 @@ jobs:
|
|||||||
uses: softprops/action-gh-release@v1
|
uses: softprops/action-gh-release@v1
|
||||||
with:
|
with:
|
||||||
body: Bump Version
|
body: Bump Version
|
||||||
discussion_category_name: Announcements
|
|
||||||
files: |
|
files: |
|
||||||
app/build/outputs/apk/release/EhViewer-universal.apk
|
app/build/outputs/apk/release/EhViewer-universal.apk
|
||||||
app/build/outputs/apk/release/EhViewer-arm64-v8a.apk
|
app/build/outputs/apk/release/EhViewer-arm64-v8a.apk
|
||||||
@@ -53,24 +52,3 @@ jobs:
|
|||||||
app/build/outputs/apk/release/EhViewer-x86.apk
|
app/build/outputs/apk/release/EhViewer-x86.apk
|
||||||
app/build/outputs/apk/release/EhViewer-armeabi-v7a.apk
|
app/build/outputs/apk/release/EhViewer-armeabi-v7a.apk
|
||||||
app/build/outputs/mapping/release/mapping.txt
|
app/build/outputs/mapping/release/mapping.txt
|
||||||
|
|
||||||
- name: Collect Apks
|
|
||||||
run: |
|
|
||||||
mkdir app/build/outputs/apk/release/fdroid
|
|
||||||
cp app/build/outputs/apk/release/app-arm64-v8a-release.apk app/build/outputs/apk/release/fdroid/EhViewer-v$GITHUB_REF_NAME.apk
|
|
||||||
cp app/build/outputs/apk/release/app-armeabi-v7a-release.apk app/build/outputs/apk/release/fdroid/EhViewer-v$GITHUB_REF_NAME-armv7.apk
|
|
||||||
|
|
||||||
- name: Push Apks
|
|
||||||
uses: Ehviewer-Overhauled/github-action-push-to-another-repository@main
|
|
||||||
env:
|
|
||||||
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
|
|
||||||
with:
|
|
||||||
source-directory: app/build/outputs/apk/release/fdroid
|
|
||||||
destination-github-username: Ehviewer-Overhauled
|
|
||||||
destination-repository-name: fdroid-repo
|
|
||||||
user-name: 'github-actions[bot]'
|
|
||||||
user-email: 'github-actions[bot]@users.noreply.github.com'
|
|
||||||
target-branch: deploy
|
|
||||||
create-target-branch: true
|
|
||||||
commit-message: Add apks from $GITHUB_REF
|
|
||||||
target-directory: fdroid/tmp-apks
|
|
||||||
@@ -63,8 +63,8 @@ android {
|
|||||||
applicationId = "moe.tarsin.ehviewer"
|
applicationId = "moe.tarsin.ehviewer"
|
||||||
minSdk = 28
|
minSdk = 28
|
||||||
targetSdk = 34
|
targetSdk = 34
|
||||||
versionCode = 180042
|
versionCode = 180043
|
||||||
versionName = "1.8.9.0-SNAPSHOT"
|
versionName = "1.8.9.4-gms"
|
||||||
resourceConfigurations.addAll(
|
resourceConfigurations.addAll(
|
||||||
listOf(
|
listOf(
|
||||||
"zh",
|
"zh",
|
||||||
@@ -250,6 +250,9 @@ dependencies {
|
|||||||
implementation("io.ktor:ktor-io-jvm:$ktor")
|
implementation("io.ktor:ktor-io-jvm:$ktor")
|
||||||
implementation("io.ktor:ktor-utils-jvm:$ktor")
|
implementation("io.ktor:ktor-utils-jvm:$ktor")
|
||||||
|
|
||||||
|
implementation("org.chromium.net:cronet-api:113.5672.61")
|
||||||
|
implementation("com.google.android.gms:play-services-cronet:18.0.1")
|
||||||
|
|
||||||
val serialization = "1.6.0"
|
val serialization = "1.6.0"
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-serialization-cbor:$serialization")
|
implementation("org.jetbrains.kotlinx:kotlinx-serialization-cbor:$serialization")
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serialization")
|
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serialization")
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import androidx.lifecycle.coroutineScope
|
|||||||
import coil.ImageLoaderFactory
|
import coil.ImageLoaderFactory
|
||||||
import coil.decode.ImageDecoderDecoder
|
import coil.decode.ImageDecoderDecoder
|
||||||
import coil.util.DebugLogger
|
import coil.util.DebugLogger
|
||||||
|
import com.google.android.gms.net.CronetProviderInstaller
|
||||||
import com.hippo.ehviewer.client.EhCookieStore
|
import com.hippo.ehviewer.client.EhCookieStore
|
||||||
import com.hippo.ehviewer.client.EhTagDatabase
|
import com.hippo.ehviewer.client.EhTagDatabase
|
||||||
import com.hippo.ehviewer.client.data.GalleryDetail
|
import com.hippo.ehviewer.client.data.GalleryDetail
|
||||||
@@ -77,6 +78,7 @@ class EhApplication : Application(), ImageLoaderFactory {
|
|||||||
handler?.uncaughtException(t, e)
|
handler?.uncaughtException(t, e)
|
||||||
}
|
}
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
|
CronetProviderInstaller.installProvider(appCtx)
|
||||||
System.loadLibrary("ehviewer")
|
System.loadLibrary("ehviewer")
|
||||||
System.loadLibrary("ehviewer_rust")
|
System.loadLibrary("ehviewer_rust")
|
||||||
ReadableTime.initialize(this)
|
ReadableTime.initialize(this)
|
||||||
|
|||||||
@@ -1,12 +1,9 @@
|
|||||||
@file:Suppress("BlockingMethodInNonBlockingContext")
|
@file:Suppress("BlockingMethodInNonBlockingContext")
|
||||||
@file:RequiresExtension(extension = Build.VERSION_CODES.S, version = 7)
|
|
||||||
|
|
||||||
package com.hippo.ehviewer.coil
|
package com.hippo.ehviewer.coil
|
||||||
|
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
|
||||||
import android.webkit.MimeTypeMap
|
import android.webkit.MimeTypeMap
|
||||||
import androidx.annotation.RequiresExtension
|
|
||||||
import coil.ComponentRegistry
|
import coil.ComponentRegistry
|
||||||
import coil.ImageLoader
|
import coil.ImageLoader
|
||||||
import coil.decode.DataSource
|
import coil.decode.DataSource
|
||||||
@@ -30,7 +27,7 @@ class CronetHttpUriFetcher(private val data: String, private val options: Option
|
|||||||
val diskCache = requireNotNull(imageLoader.diskCache)
|
val diskCache = requireNotNull(imageLoader.diskCache)
|
||||||
val snapshot = diskCache.openSnapshot(diskCacheKey) ?: run {
|
val snapshot = diskCache.openSnapshot(diskCacheKey) ?: run {
|
||||||
val success = cronetRequest(data) {
|
val success = cronetRequest(data) {
|
||||||
setCacheDisabled(true)
|
disableCache()
|
||||||
}.execute {
|
}.execute {
|
||||||
diskCache.suspendEdit(diskCacheKey) {
|
diskCache.suspendEdit(diskCacheKey) {
|
||||||
RandomAccessFile(data.toFile(), "rw").use {
|
RandomAccessFile(data.toFile(), "rw").use {
|
||||||
|
|||||||
@@ -1,13 +1,5 @@
|
|||||||
@file:RequiresExtension(extension = Build.VERSION_CODES.S, version = 7)
|
|
||||||
|
|
||||||
package com.hippo.ehviewer.cronet
|
package com.hippo.ehviewer.cronet
|
||||||
|
|
||||||
import android.net.http.HttpEngine
|
|
||||||
import android.net.http.HttpException
|
|
||||||
import android.net.http.UrlRequest
|
|
||||||
import android.net.http.UrlResponseInfo
|
|
||||||
import android.os.Build
|
|
||||||
import androidx.annotation.RequiresExtension
|
|
||||||
import com.hippo.ehviewer.EhApplication
|
import com.hippo.ehviewer.EhApplication
|
||||||
import com.hippo.ehviewer.client.CHROME_ACCEPT
|
import com.hippo.ehviewer.client.CHROME_ACCEPT
|
||||||
import com.hippo.ehviewer.client.CHROME_ACCEPT_LANGUAGE
|
import com.hippo.ehviewer.client.CHROME_ACCEPT_LANGUAGE
|
||||||
@@ -20,6 +12,10 @@ import kotlinx.coroutines.launch
|
|||||||
import kotlinx.coroutines.suspendCancellableCoroutine
|
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
import okio.Path.Companion.toOkioPath
|
import okio.Path.Companion.toOkioPath
|
||||||
|
import org.chromium.net.CronetEngine
|
||||||
|
import org.chromium.net.CronetException
|
||||||
|
import org.chromium.net.UrlRequest
|
||||||
|
import org.chromium.net.UrlResponseInfo
|
||||||
import splitties.init.appCtx
|
import splitties.init.appCtx
|
||||||
import java.nio.ByteBuffer
|
import java.nio.ByteBuffer
|
||||||
import java.nio.channels.FileChannel
|
import java.nio.channels.FileChannel
|
||||||
@@ -32,23 +28,24 @@ import kotlin.coroutines.resumeWithException
|
|||||||
private const val TAG = "CronetRequest"
|
private const val TAG = "CronetRequest"
|
||||||
val pool = DirectByteBufferPool(32)
|
val pool = DirectByteBufferPool(32)
|
||||||
|
|
||||||
val cronetHttpClient: HttpEngine = HttpEngine.Builder(appCtx).apply {
|
val cronetHttpClient: CronetEngine = CronetEngine.Builder(appCtx).apply {
|
||||||
setEnableBrotli(true)
|
enableBrotli(true)
|
||||||
val cache = (appCtx.cacheDir.toOkioPath() / "http_cache").toFile().apply { mkdirs() }
|
val cache = (appCtx.cacheDir.toOkioPath() / "http_cache").toFile().apply { mkdirs() }
|
||||||
setStoragePath(cache.absolutePath)
|
setStoragePath(cache.absolutePath)
|
||||||
setEnableHttpCache(HttpEngine.Builder.HTTP_CACHE_DISK_NO_HTTP, 100 * 1024)
|
enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK_NO_HTTP, 100 * 1024)
|
||||||
setUserAgent(CHROME_USER_AGENT)
|
setUserAgent(CHROME_USER_AGENT)
|
||||||
}.build()
|
}.build()
|
||||||
|
|
||||||
val cronetHttpClientExecutor = EhApplication.baseOkHttpClient.dispatcher.executorService
|
val cronetHttpClientExecutor = EhApplication.baseOkHttpClient.dispatcher.executorService
|
||||||
|
|
||||||
|
// TODO: Rewrite this to use android.net.http.HttpEngine and make it Android 14 only when released
|
||||||
class CronetRequest {
|
class CronetRequest {
|
||||||
lateinit var consumer: (ByteBuffer) -> Unit
|
lateinit var consumer: (ByteBuffer) -> Unit
|
||||||
lateinit var onResponse: CronetRequest.(UrlResponseInfo) -> Unit
|
lateinit var onResponse: CronetRequest.(UrlResponseInfo) -> Unit
|
||||||
lateinit var request: UrlRequest
|
lateinit var request: UrlRequest
|
||||||
lateinit var onError: (Throwable) -> Unit
|
lateinit var onError: (Throwable) -> Unit
|
||||||
lateinit var readerCont: Continuation<Unit>
|
lateinit var readerCont: Continuation<Unit>
|
||||||
val callback = object : UrlRequest.Callback {
|
val callback = object : UrlRequest.Callback() {
|
||||||
override fun onRedirectReceived(req: UrlRequest, info: UrlResponseInfo, url: String) {
|
override fun onRedirectReceived(req: UrlRequest, info: UrlResponseInfo, url: String) {
|
||||||
logcat(tag = TAG) { "Redirected to $url" }
|
logcat(tag = TAG) { "Redirected to $url" }
|
||||||
req.followRedirect()
|
req.followRedirect()
|
||||||
@@ -67,18 +64,14 @@ class CronetRequest {
|
|||||||
readerCont.resume(Unit)
|
readerCont.resume(Unit)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFailed(req: UrlRequest, info: UrlResponseInfo?, e: HttpException) {
|
override fun onFailed(req: UrlRequest, info: UrlResponseInfo?, e: CronetException) {
|
||||||
onError(e)
|
onError(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCanceled(req: UrlRequest, info: UrlResponseInfo?) {
|
|
||||||
// No-op
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun cronetRequest(url: String, referer: String? = null, conf: UrlRequest.Builder.() -> Unit = {}) = CronetRequest().apply {
|
inline fun cronetRequest(url: String, referer: String? = null, conf: UrlRequest.Builder.() -> Unit = {}) = CronetRequest().apply {
|
||||||
request = cronetHttpClient.newUrlRequestBuilder(url, cronetHttpClientExecutor, callback).apply {
|
request = cronetHttpClient.newUrlRequestBuilder(url, callback, cronetHttpClientExecutor).apply {
|
||||||
addHeader("Cookie", EhCookieStore.getCookieHeader(url.toHttpUrl()))
|
addHeader("Cookie", EhCookieStore.getCookieHeader(url.toHttpUrl()))
|
||||||
addHeader("Accept", CHROME_ACCEPT)
|
addHeader("Accept", CHROME_ACCEPT)
|
||||||
addHeader("Accept-Language", CHROME_ACCEPT_LANGUAGE)
|
addHeader("Accept-Language", CHROME_ACCEPT_LANGUAGE)
|
||||||
|
|||||||
@@ -135,9 +135,9 @@ class SpiderDen(mGalleryInfo: GalleryInfo) {
|
|||||||
): Boolean {
|
): Boolean {
|
||||||
return if (isCronetSupported) {
|
return if (isCronetSupported) {
|
||||||
cronetRequest(url, referer) {
|
cronetRequest(url, referer) {
|
||||||
setCacheDisabled(true)
|
disableCache()
|
||||||
}.execute { info ->
|
}.execute { info ->
|
||||||
val headers = info.headers.asMap
|
val headers = info.allHeaders
|
||||||
val type = headers["Content-Type"]?.first()?.toMediaType()?.subtype ?: "jpg"
|
val type = headers["Content-Type"]?.first()?.toMediaType()?.subtype ?: "jpg"
|
||||||
val length = headers["Content-Length"]!!.first().toLong()
|
val length = headers["Content-Length"]!!.first().toLong()
|
||||||
saveResponseMeta(index, type, length) { file ->
|
saveResponseMeta(index, type, length) { file ->
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package com.hippo.ehviewer.util
|
package com.hippo.ehviewer.util
|
||||||
|
|
||||||
import android.os.Build
|
import com.google.android.gms.net.CronetProviderInstaller
|
||||||
import androidx.annotation.ChecksSdkIntAtLeast
|
|
||||||
|
|
||||||
@get:ChecksSdkIntAtLeast(Build.VERSION_CODES.S, extension = 7)
|
|
||||||
val isCronetSupported: Boolean
|
val isCronetSupported: Boolean
|
||||||
get() = isAtLeastSExtension7
|
get() = isAtLeastQ && CronetProviderInstaller.isInstalled()
|
||||||
@@ -1,8 +1,5 @@
|
|||||||
package com.hippo.ehviewer.util
|
package com.hippo.ehviewer.util
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.ext.SdkExtensions
|
|
||||||
|
|
||||||
val isAtLeastQ = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
|
val isAtLeastQ = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
|
||||||
val isAtLeastR = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
|
|
||||||
val isAtLeastSExtension7 = isAtLeastR && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.S) >= 7
|
|
||||||
Reference in new issue
Block a user