#2222 Impossible to read warc2zim generated ZIM files - support service workers - load war2c as asset

This commit is contained in:
Sean Mac Gillicuddy 2020-08-05 11:05:06 +01:00
parent 5d4d767880
commit 03f97027a2
7 changed files with 114 additions and 42 deletions

View File

@ -48,6 +48,23 @@ object Libs {
*/
const val retrofit: String = "com.squareup.retrofit2:retrofit:" + Versions.com_squareup_retrofit2
/**
* https://square.github.io/okhttp/
*/
const val logging_interceptor: String = "com.squareup.okhttp3:logging-interceptor:" +
Versions.com_squareup_okhttp3
/**
* https://square.github.io/okhttp/
*/
const val mockwebserver: String = "com.squareup.okhttp3:mockwebserver:" +
Versions.com_squareup_okhttp3
/**
* https://square.github.io/okhttp/
*/
const val okhttp: String = "com.squareup.okhttp3:okhttp:" + Versions.com_squareup_okhttp3
/**
* https://kotlinlang.org/
*/
@ -166,6 +183,11 @@ object Libs {
const val objectbox_gradle_plugin: String = "io.objectbox:objectbox-gradle-plugin:" +
Versions.io_objectbox
/**
* https://objectbox.io
*/
const val objectbox_java: String = "io.objectbox:objectbox-java:" + Versions.io_objectbox
/**
* https://objectbox.io
*/
@ -236,12 +258,6 @@ object Libs {
const val javax_annotation_api: String = "javax.annotation:javax.annotation-api:" +
Versions.javax_annotation_api
/**
* https://square.github.io/okhttp/
*/
const val logging_interceptor: String = "com.squareup.okhttp3:logging-interceptor:" +
Versions.logging_interceptor
const val ink_page_indicator: String = "com.pacioianu.david:ink-page-indicator:" +
Versions.ink_page_indicator
@ -272,11 +288,6 @@ object Libs {
*/
const val junit_jupiter: String = "org.junit.jupiter:junit-jupiter:" + Versions.junit_jupiter
/**
* https://square.github.io/okhttp/
*/
const val mockwebserver: String = "com.squareup.okhttp3:mockwebserver:" + Versions.mockwebserver
const val xfetch2okhttp: String = "androidx.tonyodev.fetch2okhttp:xfetch2okhttp:" +
Versions.xfetch2okhttp
@ -346,7 +357,7 @@ object Libs {
const val kiwixlib: String = "org.kiwix.kiwixlib:kiwixlib:" + Versions.kiwixlib
/**
* http://developer.android.com/tools/extras/support-library.html
* https://github.com/material-components/material-components-android
*/
const val material: String = "com.google.android.material:material:" + Versions.material
@ -366,16 +377,16 @@ object Libs {
*/
const val ktlint: String = "com.pinterest:ktlint:" + Versions.ktlint
/**
* https://square.github.io/okhttp/
*/
const val okhttp: String = "com.squareup.okhttp3:okhttp:" + Versions.okhttp
/**
* https://github.com/ReactiveX/RxJava
*/
const val rxjava: String = "io.reactivex.rxjava2:rxjava:" + Versions.rxjava
/**
* https://developer.android.com/jetpack/androidx
*/
const val webkit: String = "androidx.webkit:webkit:" + Versions.webkit
/**
* https://developer.android.com/studio
*/

View File

@ -16,17 +16,19 @@ object Versions {
const val com_squareup_retrofit2: String = "2.5.0" // available: "2.9.0"
const val com_squareup_okhttp3: String = "3.6.0" // available: "4.8.0"
const val org_jetbrains_kotlin: String = "1.3.72"
const val com_google_dagger: String = "2.26" // available: "2.28.1"
const val com_google_dagger: String = "2.26" // available: "2.28.3"
const val com_yahoo_squidb: String = "2.0.0" // available: "3.2.3"
const val com_jakewharton: String = "10.2.1"
const val com_jakewharton: String = "10.2.1" // available: "10.2.2"
const val androidx_test: String = "1.2.0"
const val io_objectbox: String = "2.6.0"
const val io_objectbox: String = "2.6.0" // available: "2.7.0"
const val org_jacoco: String = "0.7.9"
@ -44,8 +46,6 @@ object Versions {
const val javax_annotation_api: String = "1.3.2"
const val logging_interceptor: String = "3.6.0" // available: "4.7.2"
const val ink_page_indicator: String = "1.3.0"
const val leakcanary_android: String = "2.4"
@ -58,8 +58,6 @@ object Versions {
const val junit_jupiter: String = "5.6.2"
const val mockwebserver: String = "3.6.0" // available: "4.7.2"
const val xfetch2okhttp: String = "3.1.4"
const val assertj_core: String = "3.16.1"
@ -68,7 +66,7 @@ object Versions {
const val fragment_ktx: String = "1.2.5"
const val lint_gradle: String = "27.0.0"
const val lint_gradle: String = "27.0.1"
const val testing_ktx: String = "1.1.2"
@ -84,11 +82,11 @@ object Versions {
const val rxandroid: String = "2.1.1"
const val core_ktx: String = "1.3.0"
const val core_ktx: String = "1.3.0" // available: "1.3.1"
const val kiwixlib: String = "9.2.3"
const val kiwixlib: String = "9.2.3" // available: "9.3.1"
const val material: String = "1.1.0"
const val material: String = "1.1.0" // available: "1.2.0"
const val multidex: String = "2.0.1"
@ -100,16 +98,16 @@ object Versions {
const val ktlint: String = "0.36.0" // available: "0.37.2"
const val okhttp: String = "3.6.0" // available: "4.7.2"
const val rxjava: String = "2.2.19"
const val aapt2: String = "4.0.0-6051327"
const val webkit: String = "1.2.0"
const val aapt2: String = "4.0.1-6197926"
const val junit: String = "1.1.1"
/**
* Current version: "6.1.1"
* Current version: "6.2"
* See issue 19: How to update Gradle itself?
* https://github.com/jmfayard/buildSrcVersions/issues/19
*/

View File

@ -60,4 +60,5 @@ dependencies {
implementation(Libs.android_arch_lifecycle_extensions)
implementation(Libs.objectbox_kotlin)
implementation(Libs.objectbox_rxjava)
implementation(Libs.webkit)
}

View File

@ -66,6 +66,13 @@ abstract class CoreApp : Application() {
@Inject
lateinit var fileLogger: FileLogger
/**
* The init of this class does the work of initializing,
* simply injecting it is all that there is to be done
*/
@Inject
lateinit var serviceWorkerInitialiser: ServiceWorkerInitialiser
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
if (BuildConfig.DEBUG) {

View File

@ -0,0 +1,49 @@
/*
* Kiwix Android
* Copyright (c) 2020 Kiwix <android.kiwix.org>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.kiwix.kiwixmobile.core
import android.content.Context
import android.os.Build
import android.webkit.WebResourceRequest
import android.webkit.WebResourceResponse
import androidx.webkit.ServiceWorkerClientCompat
import androidx.webkit.ServiceWorkerControllerCompat
import androidx.webkit.WebViewFeature
import org.kiwix.kiwixmobile.core.reader.ZimReaderContainer
import javax.inject.Inject
class ServiceWorkerInitialiser @Inject constructor(
context: Context,
zimReaderContainer: ZimReaderContainer
) {
init {
if (WebViewFeature.isFeatureSupported(WebViewFeature.SERVICE_WORKER_BASIC_USAGE)) {
ServiceWorkerControllerCompat.getInstance()
.setServiceWorkerClient(object : ServiceWorkerClientCompat() {
override fun shouldInterceptRequest(request: WebResourceRequest): WebResourceResponse? {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
zimReaderContainer.load(request.url.toString())
} else {
null
}
}
})
}
}
}

View File

@ -47,8 +47,10 @@ public abstract class CoreWebViewClient extends WebViewClient {
protected final WebViewCallback callback;
protected final ZimReaderContainer zimReaderContainer;
private View home;
private static String LEGACY_CONTENT_PREFIX =
Uri.parse("content://" + CoreApp.getInstance().getPackageName() + ".zim.base/").toString();
private static String[] LEGACY_CONTENT_PREFIXES = new String[] {
"zim://content/",
Uri.parse("content://" + CoreApp.getInstance().getPackageName() + ".zim.base/").toString()
};
private String urlWithAnchor;
public CoreWebViewClient(
@ -94,9 +96,12 @@ public abstract class CoreWebViewClient extends WebViewClient {
}
private String convertLegacyUrl(String url) {
return url.startsWith(LEGACY_CONTENT_PREFIX)
? url.replace(LEGACY_CONTENT_PREFIX, CONTENT_PREFIX)
: url;
for (String legacyContentPrefix : LEGACY_CONTENT_PREFIXES) {
if (url.startsWith(legacyContentPrefix)) {
return url.replace(legacyContentPrefix, CONTENT_PREFIX);
}
}
return url;
}
private boolean handleEpubAndPdf(String url) {
@ -139,9 +144,9 @@ public abstract class CoreWebViewClient extends WebViewClient {
}
/*
* If 2 urls are the same aside from the `#` component then calling load
* does not trigger our loading code and the webview will go to the anchor
* */
* If 2 urls are the same aside from the `#` component then calling load
* does not trigger our loading code and the webview will go to the anchor
* */
private void jumpToAnchor(WebView view, String loadedUrl) {
if (urlWithAnchor != null && urlWithAnchor.startsWith(loadedUrl)) {
view.loadUrl(urlWithAnchor);

View File

@ -236,7 +236,7 @@ class ZimFileReader constructor(
@JvmField
val UI_URI: Uri? = Uri.parse("content://org.kiwix.ui/")
const val CONTENT_PREFIX = "zim://content/"
const val CONTENT_PREFIX = "https://kiwix.app/"
private val INVERT_IMAGES_VIDEO =
"""
@ -253,7 +253,8 @@ class ZimFileReader constructor(
filter: invert(0);
}
""".trimIndent()
private val assetExtensions = listOf("3gp", "mp4", "m4a", "webm", "mkv", "ogg", "ogv", "svg")
private val assetExtensions =
listOf("3gp", "mp4", "m4a", "webm", "mkv", "ogg", "ogv", "svg", "warc")
private const val DEFAULT_MIME_TYPE = "application/octet-stream"
}
}