Fixed the WebView using from more than one process at once with the same data directory is not supported.

This commit is contained in:
MohitMaliFtechiz 2024-03-18 20:20:54 +05:30
parent 2a0b392b13
commit 39930b844e

View File

@ -18,35 +18,27 @@
package org.kiwix.kiwixmobile.core package org.kiwix.kiwixmobile.core
import android.app.Application.getProcessName import android.util.Log
import android.content.Context
import android.os.Build
import android.webkit.WebResourceRequest import android.webkit.WebResourceRequest
import android.webkit.WebResourceResponse import android.webkit.WebResourceResponse
import android.webkit.WebView
import androidx.webkit.ServiceWorkerClientCompat import androidx.webkit.ServiceWorkerClientCompat
import androidx.webkit.ServiceWorkerControllerCompat import androidx.webkit.ServiceWorkerControllerCompat
import androidx.webkit.WebViewFeature import androidx.webkit.WebViewFeature
import org.kiwix.kiwixmobile.core.reader.ZimReaderContainer import org.kiwix.kiwixmobile.core.reader.ZimReaderContainer
import javax.inject.Inject import javax.inject.Inject
class ServiceWorkerInitialiser @Inject constructor( class ServiceWorkerInitialiser @Inject constructor(zimReaderContainer: ZimReaderContainer) {
zimReaderContainer: ZimReaderContainer,
context: Context
) {
init { init {
if (WebViewFeature.isFeatureSupported(WebViewFeature.SERVICE_WORKER_BASIC_USAGE)) { if (WebViewFeature.isFeatureSupported(WebViewFeature.SERVICE_WORKER_BASIC_USAGE)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { try {
val process = getProcessName() ServiceWorkerControllerCompat.getInstance()
if (context.packageName != process) { .setServiceWorkerClient(object : ServiceWorkerClientCompat() {
WebView.setDataDirectorySuffix(process) override fun shouldInterceptRequest(request: WebResourceRequest): WebResourceResponse? =
} zimReaderContainer.load(request.url.toString(), request.requestHeaders)
})
} catch (ignore: Exception) {
Log.e("ServiceWorkerInitialiser", "Error setting up ServiceWorkerClient", ignore)
} }
ServiceWorkerControllerCompat.getInstance()
.setServiceWorkerClient(object : ServiceWorkerClientCompat() {
override fun shouldInterceptRequest(request: WebResourceRequest): WebResourceResponse? =
zimReaderContainer.load(request.url.toString(), request.requestHeaders)
})
} }
} }
} }