From 44386f9c1850bacfe6546e1ad364410ac167694d Mon Sep 17 00:00:00 2001 From: Mygod Date: Sat, 14 Sep 2024 12:18:32 -0700 Subject: [PATCH 1/7] Enlarge media cache size to 256MB Android by default only seems to have a cache size of 20MB which leads to a lot of wasted bandwidth when using ReactMap daily. This aims to use Cronet library to intercept and cache media requests so that we can maintain control over the cache size. This is only supported on Android 14+ or 12-13 with the latest Google Play system update. --- .../mygod/reactmap/webkit/ReactMapFragment.kt | 66 ++++++++++++------- .../reactmap/webkit/ReactMapHttpEngine.kt | 9 +-- 2 files changed, 47 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt b/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt index 18ecc9f..032a65f 100644 --- a/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt +++ b/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt @@ -42,8 +42,11 @@ import org.json.JSONObject import org.json.JSONTokener import timber.log.Timber import java.io.IOException +import java.io.InputStream import java.io.Reader import java.io.StringWriter +import java.net.HttpURLConnection +import java.net.URL import java.net.URLDecoder import java.nio.charset.Charset import java.util.Locale @@ -140,7 +143,9 @@ class ReactMapFragment : Fragment() { } } + private var isOffMain = false override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) { + isOffMain = Uri.parse(url).host != hostname glocation.clear() if (url.toUri().host == hostname) glocation.setupGeolocation() } @@ -168,17 +173,27 @@ class ReactMapFragment : Fragment() { } } - override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest) = - if (!"https".equals(request.url.scheme, true) || request.url.host != hostname) null - else when (val path = request.url.path) { - // Since CookieManager.getCookie does not return session cookie on main requests, - // we can only edit secondary files - "/api/settings" -> handleSettings(request) - null -> null - else -> if (path.startsWith("/locales/") && path.endsWith("/translation.json")) { - handleTranslation(request) - } else if (vendorJsMatcher.matchEntire(path) != null) handleVendorJs(request) else null + private val mediaExtensions = setOf("apng", "png", "avif", "gif", "jpg", "jpeg", "jfif", "pjpeg", "pjp", "png", "svg", "webp", "bmp", "ico", "cur", "wav") + override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest): WebResourceResponse? { + if (request.isForMainFrame || isOffMain) return null + val path = request.url.path ?: return null + if (ReactMapHttpEngine.isCronet && path.substringAfterLast('.') + .lowercase(Locale.ENGLISH) in mediaExtensions) return try { + val conn = ReactMapHttpEngine.engine.openConnection(URL(request.url.toString())) as HttpURLConnection + setupConnection(request, conn) + createResponse(conn) { conn.findErrorStream } + } catch (e: IOException) { + Timber.d(e) + null } + if (!"https".equals(request.url.scheme, true) || request.url.host != hostname) return null + if (path == "/api/settings") return handleSettings(request) + if (path.startsWith("/locales/") && path.endsWith("/translation.json")) { + return handleTranslation(request) + } + if (vendorJsMatcher.matchEntire(path) != null) return handleVendorJs(request) + return null + } override fun onReceivedError(view: WebView?, request: WebResourceRequest, error: WebResourceError) { if (!request.isForMainFrame) return @@ -225,24 +240,27 @@ class ReactMapFragment : Fragment() { web.loadUrl(activeUrl) } - private fun buildResponse(request: WebResourceRequest, transform: (Reader) -> String) = try { - val url = request.url.toString() - val conn = ReactMapHttpEngine.connectWithCookie(url) { conn -> - conn.requestMethod = request.method - for ((key, value) in request.requestHeaders) conn.addRequestProperty(key, value) - } + private fun setupConnection(request: WebResourceRequest, conn: HttpURLConnection) { + conn.requestMethod = request.method + for ((key, value) in request.requestHeaders) conn.addRequestProperty(key, value) + } + private fun createResponse(conn: HttpURLConnection, data: (Charset) -> InputStream): WebResourceResponse { val charset = if (conn.contentEncoding == null) Charsets.UTF_8 else { Charset.forName(conn.contentEncoding) } - WebResourceResponse(conn.contentType?.substringBefore(';'), conn.contentEncoding, conn.responseCode, + return WebResourceResponse(conn.contentType?.substringBefore(';'), conn.contentEncoding, conn.responseCode, conn.responseMessage.let { if (it.isNullOrBlank()) "N/A" else it }, - conn.headerFields.mapValues { (_, value) -> value.joinToString() }, - if (conn.responseCode in 200..299) try { - transform(conn.inputStream.bufferedReader(charset)).byteInputStream(charset) - } catch (e: IOException) { - Timber.d(e) - conn.inputStream.bufferedReader(charset).readText().byteInputStream(charset) - } else conn.findErrorStream.bufferedReader(charset).readText().byteInputStream(charset)) + conn.headerFields.mapValues { (_, value) -> value.joinToString() }, data(charset)) + } + private fun buildResponse(request: WebResourceRequest, transform: (Reader) -> String) = try { + val url = request.url.toString() + val conn = ReactMapHttpEngine.connectWithCookie(url) { conn -> setupConnection(request, conn) } + createResponse(conn) { charset -> if (conn.responseCode in 200..299) try { + transform(conn.inputStream.bufferedReader(charset)).byteInputStream(charset) + } catch (e: IOException) { + Timber.d(e) + conn.inputStream.bufferedReader(charset).readText().byteInputStream(charset) + } else conn.findErrorStream.bufferedReader(charset).readText().byteInputStream(charset) } } catch (e: IOException) { Timber.d(e) null diff --git a/app/src/main/java/be/mygod/reactmap/webkit/ReactMapHttpEngine.kt b/app/src/main/java/be/mygod/reactmap/webkit/ReactMapHttpEngine.kt index 90d7881..1693b6d 100644 --- a/app/src/main/java/be/mygod/reactmap/webkit/ReactMapHttpEngine.kt +++ b/app/src/main/java/be/mygod/reactmap/webkit/ReactMapHttpEngine.kt @@ -23,13 +23,15 @@ import kotlin.coroutines.resumeWithException object ReactMapHttpEngine { private const val KEY_COOKIE = "cookie.graphql" + val isCronet get() = Build.VERSION.SDK_INT >= 34 || Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && + SdkExtensions.getExtensionVersion(Build.VERSION_CODES.S) >= 7 @get:RequiresExtension(Build.VERSION_CODES.S, 7) - private val engine by lazy @RequiresExtension(Build.VERSION_CODES.S, 7) { + val engine by lazy @RequiresExtension(Build.VERSION_CODES.S, 7) { val cache = File(app.deviceStorage.cacheDir, "httpEngine") HttpEngine.Builder(app.deviceStorage).apply { if (cache.mkdirs() || cache.isDirectory) { setStoragePath(cache.absolutePath) - setEnableHttpCache(HttpEngine.Builder.HTTP_CACHE_DISK, 1024 * 1024) + setEnableHttpCache(HttpEngine.Builder.HTTP_CACHE_DISK, 256 * 1024 * 1024) } setConnectionMigrationOptions(ConnectionMigrationOptions.Builder().apply { setDefaultNetworkMigration(ConnectionMigrationOptions.MIGRATION_OPTION_ENABLED) @@ -43,8 +45,7 @@ object ReactMapHttpEngine { path("/graphql") }.build().toString() - private fun openConnection(url: String) = (if (Build.VERSION.SDK_INT >= 34 || Build.VERSION.SDK_INT >= - Build.VERSION_CODES.S && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.S) >= 7) { + private fun openConnection(url: String) = (if (isCronet) { engine.openConnection(URL(url)) } else URL(url).openConnection()) as HttpURLConnection suspend fun connectCancellable(url: String, block: suspend (HttpURLConnection) -> T): T { From 39b87d923d228cfb7dd9ac65b237db2a248c50f4 Mon Sep 17 00:00:00 2001 From: Mygod Date: Sun, 15 Sep 2024 00:37:31 -0700 Subject: [PATCH 2/7] Support more response hijacking --- .../java/be/mygod/reactmap/util/UnblockCentral.kt | 6 +++++- .../be/mygod/reactmap/webkit/ReactMapFragment.kt | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/be/mygod/reactmap/util/UnblockCentral.kt b/app/src/main/java/be/mygod/reactmap/util/UnblockCentral.kt index d13e860..749ec9d 100644 --- a/app/src/main/java/be/mygod/reactmap/util/UnblockCentral.kt +++ b/app/src/main/java/be/mygod/reactmap/util/UnblockCentral.kt @@ -3,11 +3,12 @@ package be.mygod.reactmap.util import android.annotation.SuppressLint import android.os.Build import android.system.Os +import android.webkit.WebResourceResponse import androidx.annotation.RequiresApi import org.lsposed.hiddenapibypass.HiddenApiBypass import java.io.FileDescriptor -@SuppressLint("BlockedPrivateApi", "DiscouragedPrivateApi") +@SuppressLint("BlockedPrivateApi", "DiscouragedPrivateApi", "SoonBlockedPrivateApi") object UnblockCentral { /** * Retrieve this property before doing dangerous shit. @@ -35,4 +36,7 @@ object UnblockCentral { Os::class.java.getDeclaredMethod("setsockoptLinger", FileDescriptor::class.java, Int::class.java, Int::class.java, classStructLinger) } + + val mStatusCode by lazy { init.let { WebResourceResponse::class.java.getDeclaredField("mStatusCode") } } + val mReasonPhrase by lazy { init.let { WebResourceResponse::class.java.getDeclaredField("mReasonPhrase") } } } diff --git a/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt b/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt index 032a65f..f5ac590 100644 --- a/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt +++ b/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt @@ -32,6 +32,7 @@ import be.mygod.reactmap.MainActivity import be.mygod.reactmap.R import be.mygod.reactmap.follower.BackgroundLocationReceiver import be.mygod.reactmap.util.CreateDynamicDocument +import be.mygod.reactmap.util.UnblockCentral import be.mygod.reactmap.util.findErrorStream import com.google.android.material.snackbar.Snackbar import com.google.firebase.analytics.FirebaseAnalytics @@ -248,9 +249,17 @@ class ReactMapFragment : Fragment() { val charset = if (conn.contentEncoding == null) Charsets.UTF_8 else { Charset.forName(conn.contentEncoding) } - return WebResourceResponse(conn.contentType?.substringBefore(';'), conn.contentEncoding, conn.responseCode, - conn.responseMessage.let { if (it.isNullOrBlank()) "N/A" else it }, - conn.headerFields.mapValues { (_, value) -> value.joinToString() }, data(charset)) + return WebResourceResponse(conn.contentType?.substringBefore(';'), conn.contentEncoding, data(charset)).apply { + responseHeaders = conn.headerFields.mapValues { (_, value) -> value.joinToString() } + try { + UnblockCentral.mStatusCode.set(this, conn.responseCode) + UnblockCentral.mReasonPhrase.set(this, conn.responseMessage) + } catch (e: ReflectiveOperationException) { + Timber.w(e) + setStatusCodeAndReasonPhrase(conn.responseCode, + conn.responseMessage.let { if (it.isNullOrBlank()) "N/A" else it }) + } + } } private fun buildResponse(request: WebResourceRequest, transform: (Reader) -> String) = try { val url = request.url.toString() From 58273cd55688d62f92f04f2061df1d7670c0d9ef Mon Sep 17 00:00:00 2001 From: Mygod Date: Sun, 15 Sep 2024 00:43:00 -0700 Subject: [PATCH 3/7] Properly support more response hijacking with system API This reverts commit 39b87d923d228cfb7dd9ac65b237db2a248c50f4. --- .../be/mygod/reactmap/util/UnblockCentral.kt | 6 +----- .../mygod/reactmap/webkit/ReactMapFragment.kt | 20 ++++++++----------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/be/mygod/reactmap/util/UnblockCentral.kt b/app/src/main/java/be/mygod/reactmap/util/UnblockCentral.kt index 749ec9d..d13e860 100644 --- a/app/src/main/java/be/mygod/reactmap/util/UnblockCentral.kt +++ b/app/src/main/java/be/mygod/reactmap/util/UnblockCentral.kt @@ -3,12 +3,11 @@ package be.mygod.reactmap.util import android.annotation.SuppressLint import android.os.Build import android.system.Os -import android.webkit.WebResourceResponse import androidx.annotation.RequiresApi import org.lsposed.hiddenapibypass.HiddenApiBypass import java.io.FileDescriptor -@SuppressLint("BlockedPrivateApi", "DiscouragedPrivateApi", "SoonBlockedPrivateApi") +@SuppressLint("BlockedPrivateApi", "DiscouragedPrivateApi") object UnblockCentral { /** * Retrieve this property before doing dangerous shit. @@ -36,7 +35,4 @@ object UnblockCentral { Os::class.java.getDeclaredMethod("setsockoptLinger", FileDescriptor::class.java, Int::class.java, Int::class.java, classStructLinger) } - - val mStatusCode by lazy { init.let { WebResourceResponse::class.java.getDeclaredField("mStatusCode") } } - val mReasonPhrase by lazy { init.let { WebResourceResponse::class.java.getDeclaredField("mReasonPhrase") } } } diff --git a/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt b/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt index f5ac590..a37ec69 100644 --- a/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt +++ b/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt @@ -32,7 +32,6 @@ import be.mygod.reactmap.MainActivity import be.mygod.reactmap.R import be.mygod.reactmap.follower.BackgroundLocationReceiver import be.mygod.reactmap.util.CreateDynamicDocument -import be.mygod.reactmap.util.UnblockCentral import be.mygod.reactmap.util.findErrorStream import com.google.android.material.snackbar.Snackbar import com.google.firebase.analytics.FirebaseAnalytics @@ -61,6 +60,11 @@ class ReactMapFragment : Fragment() { private val mapHijacker = "(?<=[\\n\\r\\s,])this(?=.callInitHooks\\(\\)[,;][\\n\\r\\s]*this._zoomAnimated\\s*=)" .toPattern() private val supportedHosts = setOf("discordapp.com", "discord.com", "telegram.org", "oauth.telegram.org") + + private val newWebResourceResponse by lazy { + WebResourceResponse::class.java.getDeclaredConstructor(Boolean::class.java, String::class.java, + String::class.java, Int::class.java, String::class.java, Map::class.java, InputStream::class.java) + } } private lateinit var web: WebView @@ -249,17 +253,9 @@ class ReactMapFragment : Fragment() { val charset = if (conn.contentEncoding == null) Charsets.UTF_8 else { Charset.forName(conn.contentEncoding) } - return WebResourceResponse(conn.contentType?.substringBefore(';'), conn.contentEncoding, data(charset)).apply { - responseHeaders = conn.headerFields.mapValues { (_, value) -> value.joinToString() } - try { - UnblockCentral.mStatusCode.set(this, conn.responseCode) - UnblockCentral.mReasonPhrase.set(this, conn.responseMessage) - } catch (e: ReflectiveOperationException) { - Timber.w(e) - setStatusCodeAndReasonPhrase(conn.responseCode, - conn.responseMessage.let { if (it.isNullOrBlank()) "N/A" else it }) - } - } + return newWebResourceResponse.newInstance(false, conn.contentType?.substringBefore(';'), conn.contentEncoding, + conn.responseCode, conn.responseMessage, conn.headerFields.mapValues { (_, value) -> value.joinToString() }, + data(charset)) } private fun buildResponse(request: WebResourceRequest, transform: (Reader) -> String) = try { val url = request.url.toString() From 6423c15fdfa60353f1500caa65d47523147eb4a1 Mon Sep 17 00:00:00 2001 From: Mygod Date: Tue, 17 Sep 2024 22:29:08 -0700 Subject: [PATCH 4/7] More aggressive caching --- .../java/be/mygod/reactmap/webkit/ReactMapFragment.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt b/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt index a37ec69..5dc7de1 100644 --- a/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt +++ b/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt @@ -148,9 +148,7 @@ class ReactMapFragment : Fragment() { } } - private var isOffMain = false override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) { - isOffMain = Uri.parse(url).host != hostname glocation.clear() if (url.toUri().host == hostname) glocation.setupGeolocation() } @@ -178,9 +176,13 @@ class ReactMapFragment : Fragment() { } } - private val mediaExtensions = setOf("apng", "png", "avif", "gif", "jpg", "jpeg", "jfif", "pjpeg", "pjp", "png", "svg", "webp", "bmp", "ico", "cur", "wav") + private val mediaExtensions = setOf( + "apng", "png", "avif", "gif", "jpg", "jpeg", "jfif", "pjpeg", "pjp", "png", "svg", "webp", "bmp", "ico", "cur", + "wav", "mp3", "mp4", "aac", "ogg", "flac", + "css", "js", + "ttf", "otf", "woff", "woff2", + ) override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest): WebResourceResponse? { - if (request.isForMainFrame || isOffMain) return null val path = request.url.path ?: return null if (ReactMapHttpEngine.isCronet && path.substringAfterLast('.') .lowercase(Locale.ENGLISH) in mediaExtensions) return try { From d79f11b97334c44df5223df98908d5ffa99113bd Mon Sep 17 00:00:00 2001 From: Mygod Date: Tue, 17 Sep 2024 22:43:25 -0700 Subject: [PATCH 5/7] Fix intercepting requests --- .../mygod/reactmap/webkit/ReactMapFragment.kt | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt b/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt index 5dc7de1..0932f3a 100644 --- a/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt +++ b/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt @@ -184,21 +184,22 @@ class ReactMapFragment : Fragment() { ) override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest): WebResourceResponse? { val path = request.url.path ?: return null + if ("https".equals(request.url.scheme, true) && request.url.host == hostname) { + if (path == "/api/settings") return handleSettings(request) + if (path.startsWith("/locales/") && path.endsWith("/translation.json")) { + return handleTranslation(request) + } + if (vendorJsMatcher.matchEntire(path) != null) return handleVendorJs(request) + } if (ReactMapHttpEngine.isCronet && path.substringAfterLast('.') - .lowercase(Locale.ENGLISH) in mediaExtensions) return try { - val conn = ReactMapHttpEngine.engine.openConnection(URL(request.url.toString())) as HttpURLConnection + .lowercase(Locale.ENGLISH) in mediaExtensions) try { + val conn = ReactMapHttpEngine.engine.openConnection(URL( + request.url.toString())) as HttpURLConnection setupConnection(request, conn) - createResponse(conn) { conn.findErrorStream } + return createResponse(conn) { conn.findErrorStream } } catch (e: IOException) { Timber.d(e) - null - } - if (!"https".equals(request.url.scheme, true) || request.url.host != hostname) return null - if (path == "/api/settings") return handleSettings(request) - if (path.startsWith("/locales/") && path.endsWith("/translation.json")) { - return handleTranslation(request) } - if (vendorJsMatcher.matchEntire(path) != null) return handleVendorJs(request) return null } From 716c979007f868f43a0b180e9eb81cb9a2c37a3b Mon Sep 17 00:00:00 2001 From: Mygod Date: Wed, 18 Sep 2024 15:55:27 -0700 Subject: [PATCH 6/7] Even more aggressive caching --- .../mygod/reactmap/webkit/ReactMapFragment.kt | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt b/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt index 0932f3a..ddfc46c 100644 --- a/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt +++ b/app/src/main/java/be/mygod/reactmap/webkit/ReactMapFragment.kt @@ -60,6 +60,13 @@ class ReactMapFragment : Fragment() { private val mapHijacker = "(?<=[\\n\\r\\s,])this(?=.callInitHooks\\(\\)[,;][\\n\\r\\s]*this._zoomAnimated\\s*=)" .toPattern() private val supportedHosts = setOf("discordapp.com", "discord.com", "telegram.org", "oauth.telegram.org") + private val mediaExtensions = setOf( + "apng", "png", "avif", "gif", "jpg", "jpeg", "jfif", "pjpeg", "pjp", "png", "svg", "webp", "bmp", "ico", "cur", + "wav", "mp3", "mp4", "aac", "ogg", "flac", + "css", "js", + "ttf", "otf", "woff", "woff2", + ) + private val mediaAcceptMatcher = "image/.*|text/css(?:[,;].*)?".toRegex(RegexOption.IGNORE_CASE) private val newWebResourceResponse by lazy { WebResourceResponse::class.java.getDeclaredConstructor(Boolean::class.java, String::class.java, @@ -176,12 +183,6 @@ class ReactMapFragment : Fragment() { } } - private val mediaExtensions = setOf( - "apng", "png", "avif", "gif", "jpg", "jpeg", "jfif", "pjpeg", "pjp", "png", "svg", "webp", "bmp", "ico", "cur", - "wav", "mp3", "mp4", "aac", "ogg", "flac", - "css", "js", - "ttf", "otf", "woff", "woff2", - ) override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest): WebResourceResponse? { val path = request.url.path ?: return null if ("https".equals(request.url.scheme, true) && request.url.host == hostname) { @@ -191,8 +192,10 @@ class ReactMapFragment : Fragment() { } if (vendorJsMatcher.matchEntire(path) != null) return handleVendorJs(request) } - if (ReactMapHttpEngine.isCronet && path.substringAfterLast('.') - .lowercase(Locale.ENGLISH) in mediaExtensions) try { + if (ReactMapHttpEngine.isCronet && (path.substringAfterLast('.') + .lowercase(Locale.ENGLISH) in mediaExtensions || request.requestHeaders.any { (key, value) -> + "Accept".equals(key, true) && mediaAcceptMatcher.matches(value) + })) try { val conn = ReactMapHttpEngine.engine.openConnection(URL( request.url.toString())) as HttpURLConnection setupConnection(request, conn) From 5da9d57c6b0fd2d8c21f4ad780d6d360983d5b56 Mon Sep 17 00:00:00 2001 From: Mygod Date: Sun, 13 Oct 2024 10:35:01 -0700 Subject: [PATCH 7/7] Enlarge cache to 512MB --- .../main/java/be/mygod/reactmap/webkit/ReactMapHttpEngine.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/be/mygod/reactmap/webkit/ReactMapHttpEngine.kt b/app/src/main/java/be/mygod/reactmap/webkit/ReactMapHttpEngine.kt index 1693b6d..34dbb86 100644 --- a/app/src/main/java/be/mygod/reactmap/webkit/ReactMapHttpEngine.kt +++ b/app/src/main/java/be/mygod/reactmap/webkit/ReactMapHttpEngine.kt @@ -31,7 +31,7 @@ object ReactMapHttpEngine { HttpEngine.Builder(app.deviceStorage).apply { if (cache.mkdirs() || cache.isDirectory) { setStoragePath(cache.absolutePath) - setEnableHttpCache(HttpEngine.Builder.HTTP_CACHE_DISK, 256 * 1024 * 1024) + setEnableHttpCache(HttpEngine.Builder.HTTP_CACHE_DISK, 512 * 1024 * 1024) } setConnectionMigrationOptions(ConnectionMigrationOptions.Builder().apply { setDefaultNetworkMigration(ConnectionMigrationOptions.MIGRATION_OPTION_ENABLED)