diff --git a/CHANGELOG b/CHANGELOG
index e0cbe3f8a..193d1b1dd 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,11 @@
+3.4.3
+NEW: Updated translations
+BUGFIX: Video seek was not working
+BUGFIX: Back button in history and bookmarks toolbar always took to library
+BUGFIX: Books hosted from android client were not updating on browser dynamically
+BUGFIX: Creating multiple tabs was causing `loading` in previously opened tabs
+BUGFIX: Messages displayed when no books are present were inconsistent typographically
+
3.4.2
NEW: Service worker support for war2c zim files
NEW: Updated translations
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 2eb07601a..c29ebf0ff 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -11,7 +11,7 @@ apply(from = rootProject.file("jacoco.gradle"))
ext {
set("versionMajor", 3)
set("versionMinor", 4)
- set("versionPatch", 2)
+ set("versionPatch", 3)
}
fun generateVersionName() = "${ext["versionMajor"]}.${ext["versionMinor"]}.${ext["versionPatch"]}"
diff --git a/app/src/main/assets/credits.html b/app/src/main/assets/credits.html
index d4f7e78e2..5ccec14f4 100644
--- a/app/src/main/assets/credits.html
+++ b/app/src/main/assets/credits.html
@@ -24,9 +24,12 @@ Abdul Wadood
Adeel Zafar
Aditya Sood
Ayoub Dardory
+Ayush Shrivastava
Christian Pühringer
Elad Keyshawn
Emmanuel Engelhart
+Frans-Lukas Lövenvald
+Gourishankar Panda
Isaac Hutt
Joseph E. Reeve
Julian Harty
diff --git a/app/src/main/java/org/kiwix/kiwixmobile/di/modules/ServiceModule.kt b/app/src/main/java/org/kiwix/kiwixmobile/di/modules/ServiceModule.kt
index a61810662..79db87181 100644
--- a/app/src/main/java/org/kiwix/kiwixmobile/di/modules/ServiceModule.kt
+++ b/app/src/main/java/org/kiwix/kiwixmobile/di/modules/ServiceModule.kt
@@ -23,9 +23,8 @@ import android.app.Service
import android.content.Context
import dagger.Module
import dagger.Provides
-import org.kiwix.kiwixlib.JNIKiwixServer
-import org.kiwix.kiwixlib.Library
import org.kiwix.kiwixmobile.di.ServiceScope
+import org.kiwix.kiwixmobile.webserver.KiwixServer
import org.kiwix.kiwixmobile.webserver.WebServerHelper
import org.kiwix.kiwixmobile.webserver.wifi_hotspot.HotspotNotificationManager
import org.kiwix.kiwixmobile.webserver.wifi_hotspot.HotspotStateReceiver
@@ -38,25 +37,15 @@ class ServiceModule {
@Provides
@ServiceScope
fun providesWebServerHelper(
- jniKiwixLibrary: Library,
- kiwixServer: JNIKiwixServer,
+ kiwixServerFactory: KiwixServer.Factory,
ipAddressCallbacks: IpAddressCallbacks
- ): WebServerHelper = WebServerHelper(jniKiwixLibrary, kiwixServer, ipAddressCallbacks)
+ ): WebServerHelper = WebServerHelper(kiwixServerFactory, ipAddressCallbacks)
@Provides
@ServiceScope
fun providesIpAddressCallbacks(service: Service): IpAddressCallbacks =
service as IpAddressCallbacks
- @Provides
- @ServiceScope
- fun providesLibrary(): Library = Library()
-
- @Provides
- @ServiceScope
- fun providesJNIKiwixServer(jniKiwixLibrary: Library): JNIKiwixServer =
- JNIKiwixServer(jniKiwixLibrary)
-
@Provides
@ServiceScope
fun providesHotspotNotificationManager(
diff --git a/app/src/main/java/org/kiwix/kiwixmobile/intro/IntroFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/intro/IntroFragment.kt
index 861c17fc3..bce427ab1 100644
--- a/app/src/main/java/org/kiwix/kiwixmobile/intro/IntroFragment.kt
+++ b/app/src/main/java/org/kiwix/kiwixmobile/intro/IntroFragment.kt
@@ -23,8 +23,8 @@ import android.os.Looper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
+import androidx.navigation.fragment.findNavController
import androidx.viewpager.widget.ViewPager
import kotlinx.android.synthetic.main.fragment_intro.get_started
import kotlinx.android.synthetic.main.fragment_intro.tab_indicator
@@ -35,7 +35,6 @@ import org.kiwix.kiwixmobile.cachedComponent
import org.kiwix.kiwixmobile.core.base.BaseActivity
import org.kiwix.kiwixmobile.core.base.BaseFragment
import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions
-import org.kiwix.kiwixmobile.main.KiwixMainActivity
import org.kiwix.kiwixmobile.zim_manager.SimplePageChangeListener
import java.util.Timer
import java.util.TimerTask
@@ -103,15 +102,10 @@ class IntroFragment : BaseFragment(), IntroContract.View, FragmentActivityExtens
views = emptyArray()
}
- override fun onBackPressed(activity: AppCompatActivity): FragmentActivityExtensions.Super {
- activity.finish()
- return super.onBackPressed(activity)
- }
-
private fun navigateToLibrary() {
dismissAutoRotate()
presenter.setIntroShown()
- (requireActivity() as KiwixMainActivity).navController.popBackStack()
+ findNavController().navigate(IntroFragmentDirections.actionIntrofragmentToLibraryFragment())
}
private fun updateView(position: Int) {
diff --git a/app/src/main/java/org/kiwix/kiwixmobile/main/KiwixMainActivity.kt b/app/src/main/java/org/kiwix/kiwixmobile/main/KiwixMainActivity.kt
index 974851185..58e78da20 100644
--- a/app/src/main/java/org/kiwix/kiwixmobile/main/KiwixMainActivity.kt
+++ b/app/src/main/java/org/kiwix/kiwixmobile/main/KiwixMainActivity.kt
@@ -38,6 +38,7 @@ import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions
import org.kiwix.kiwixmobile.core.di.components.CoreComponent
import org.kiwix.kiwixmobile.core.main.CoreMainActivity
import org.kiwix.kiwixmobile.kiwixActivityComponent
+import org.kiwix.kiwixmobile.nav.destination.library.LocalLibraryFragmentDirections
const val NAVIGATE_TO_ZIM_HOST_FRAGMENT = "navigate_to_zim_host_fragment"
@@ -94,7 +95,7 @@ class KiwixMainActivity : CoreMainActivity() {
}
}
if (sharedPreferenceUtil.showIntro()) {
- navigate(R.id.introFragment)
+ navigate(LocalLibraryFragmentDirections.actionLibraryFragmentToIntrofragment())
}
}
diff --git a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/reader/KiwixReaderFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/reader/KiwixReaderFragment.kt
index 408dc7e76..550dd6290 100644
--- a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/reader/KiwixReaderFragment.kt
+++ b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/reader/KiwixReaderFragment.kt
@@ -251,7 +251,9 @@ class KiwixReaderFragment : CoreReaderFragment() {
val zimFile = settings.getString(TAG_CURRENT_FILE, null)
if (zimFile != null) {
- openZimFile(File(zimFile))
+ if (zimReaderContainer.zimFile == null) {
+ openZimFile(File(zimFile))
+ }
} else {
getCurrentWebView().snack(R.string.zim_not_opened)
}
diff --git a/app/src/main/java/org/kiwix/kiwixmobile/webserver/KiwixServer.kt b/app/src/main/java/org/kiwix/kiwixmobile/webserver/KiwixServer.kt
new file mode 100644
index 000000000..6457ddab6
--- /dev/null
+++ b/app/src/main/java/org/kiwix/kiwixmobile/webserver/KiwixServer.kt
@@ -0,0 +1,51 @@
+/*
+ * Kiwix Android
+ * Copyright (c) 2020 Kiwix
+ * 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 .
+ *
+ */
+
+package org.kiwix.kiwixmobile.webserver
+
+import android.util.Log
+import org.kiwix.kiwixlib.JNIKiwixException
+import org.kiwix.kiwixlib.JNIKiwixServer
+import org.kiwix.kiwixlib.Library
+import javax.inject.Inject
+
+private const val TAG = "KiwixServer"
+
+class KiwixServer @Inject constructor(private val jniKiwixServer: JNIKiwixServer) {
+
+ class Factory @Inject constructor() {
+ fun createKiwixServer(selectedBooksPath: ArrayList): KiwixServer {
+ val kiwixLibrary = Library()
+ selectedBooksPath.forEach { path ->
+ try {
+ kiwixLibrary.addBook(path)
+ } catch (e: JNIKiwixException) {
+ Log.v(TAG, "Couldn't add book with path:{ $path }")
+ }
+ }
+ return KiwixServer(JNIKiwixServer(kiwixLibrary))
+ }
+ }
+
+ fun startServer(port: Int): Boolean {
+ jniKiwixServer.setPort(port)
+ return jniKiwixServer.start()
+ }
+
+ fun stopServer() = jniKiwixServer.stop()
+}
diff --git a/app/src/main/java/org/kiwix/kiwixmobile/webserver/WebServerHelper.java b/app/src/main/java/org/kiwix/kiwixmobile/webserver/WebServerHelper.java
index e7a5e2463..319f31339 100644
--- a/app/src/main/java/org/kiwix/kiwixmobile/webserver/WebServerHelper.java
+++ b/app/src/main/java/org/kiwix/kiwixmobile/webserver/WebServerHelper.java
@@ -25,9 +25,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
-import org.kiwix.kiwixlib.JNIKiwixException;
import org.kiwix.kiwixlib.JNIKiwixServer;
-import org.kiwix.kiwixlib.Library;
import org.kiwix.kiwixmobile.core.utils.ServerUtils;
import org.kiwix.kiwixmobile.webserver.wifi_hotspot.IpAddressCallbacks;
@@ -41,15 +39,14 @@ import static org.kiwix.kiwixmobile.core.utils.ServerUtils.INVALID_IP;
public class WebServerHelper {
private static final String TAG = "WebServerHelper";
- private Library kiwixLibrary;
- private JNIKiwixServer kiwixServer;
+ private KiwixServer kiwixServer;
+ private KiwixServer.Factory kiwixServerFactory;
private IpAddressCallbacks ipAddressCallbacks;
private boolean isServerStarted;
- @Inject public WebServerHelper(@NonNull Library kiwixLibrary,
- @NonNull JNIKiwixServer kiwixServer, @NonNull IpAddressCallbacks ipAddressCallbacks) {
- this.kiwixLibrary = kiwixLibrary;
- this.kiwixServer = kiwixServer;
+ @Inject public WebServerHelper(@NonNull KiwixServer.Factory kiwixServerFactory,
+ @NonNull IpAddressCallbacks ipAddressCallbacks) {
+ this.kiwixServerFactory = kiwixServerFactory;
this.ipAddressCallbacks = ipAddressCallbacks;
}
@@ -65,7 +62,7 @@ public class WebServerHelper {
public void stopAndroidWebServer() {
if (isServerStarted) {
- kiwixServer.stop();
+ kiwixServer.stopServer();
updateServerState(false);
}
}
@@ -74,17 +71,9 @@ public class WebServerHelper {
if (!isServerStarted) {
int DEFAULT_PORT = 8080;
ServerUtils.port = DEFAULT_PORT;
- for (String path : selectedBooksPath) {
- try {
- boolean isBookAdded = kiwixLibrary.addBook(path);
- Log.v(TAG, "isBookAdded: " + isBookAdded + path);
- } catch (JNIKiwixException e) {
- Log.v(TAG, "Couldn't add book " + path);
- }
- }
- kiwixServer.setPort(ServerUtils.port);
- updateServerState(kiwixServer.start());
- Log.v(TAG, "Server status" + isServerStarted);
+ kiwixServer = kiwixServerFactory.createKiwixServer(selectedBooksPath);
+ updateServerState(kiwixServer.startServer(ServerUtils.port));
+ Log.d(TAG, "Server status" + isServerStarted);
}
return isServerStarted;
}
diff --git a/app/src/main/res/layout/fragment_destination_download.xml b/app/src/main/res/layout/fragment_destination_download.xml
index fbe9dd6f7..5e5958598 100644
--- a/app/src/main/res/layout/fragment_destination_download.xml
+++ b/app/src/main/res/layout/fragment_destination_download.xml
@@ -18,9 +18,9 @@
+ android:layout_height="match_parent">
+ app:layout_behavior="@string/appbar_scrolling_view_behavior"
+ tools:listitem="@layout/item_download" />
@@ -56,11 +56,12 @@
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_bias="0.45" />
diff --git a/app/src/main/res/layout/fragment_destination_library.xml b/app/src/main/res/layout/fragment_destination_library.xml
index b140a7e99..4cb7694fc 100644
--- a/app/src/main/res/layout/fragment_destination_library.xml
+++ b/app/src/main/res/layout/fragment_destination_library.xml
@@ -19,9 +19,10 @@
+ android:fitsSystemWindows="true">
+ android:layout_height="match_parent"
+ tools:listitem="@layout/item_book" />
-
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_bias="0.45" />
diff --git a/app/src/main/res/navigation/kiwix_nav_graph.xml b/app/src/main/res/navigation/kiwix_nav_graph.xml
index 18bf190b1..e51ca0ef7 100644
--- a/app/src/main/res/navigation/kiwix_nav_graph.xml
+++ b/app/src/main/res/navigation/kiwix_nav_graph.xml
@@ -69,6 +69,11 @@
+
+ tools:layout="@layout/fragment_intro">
+
+
8dp
8dp
8dp
+ 48dp
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 3860dc96a..ff4e1576d 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -18,14 +18,4 @@
-
diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/ServiceWorkerInitialiser.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/ServiceWorkerInitialiser.kt
index 707dd32d6..e2f801ca5 100644
--- a/core/src/main/java/org/kiwix/kiwixmobile/core/ServiceWorkerInitialiser.kt
+++ b/core/src/main/java/org/kiwix/kiwixmobile/core/ServiceWorkerInitialiser.kt
@@ -32,7 +32,7 @@ class ServiceWorkerInitialiser @Inject constructor(zimReaderContainer: ZimReader
ServiceWorkerControllerCompat.getInstance()
.setServiceWorkerClient(object : ServiceWorkerClientCompat() {
override fun shouldInterceptRequest(request: WebResourceRequest): WebResourceResponse? =
- zimReaderContainer.load(request.url.toString())
+ zimReaderContainer.load(request.url.toString(), request.requestHeaders)
})
}
}
diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.java b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.java
index ffbd4c4ab..58450f8d3 100644
--- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.java
+++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.java
@@ -778,7 +778,7 @@ public abstract class CoreReaderFragment extends BaseFragment
private KiwixWebView newTab(String url, boolean selectTab) {
KiwixWebView webView = initalizeWebView(url);
webViewList.add(webView);
- if(selectTab) {
+ if (selectTab) {
selectTab(webViewList.size() - 1);
}
tabsAdapter.notifyDataSetChanged();
@@ -964,7 +964,6 @@ public abstract class CoreReaderFragment extends BaseFragment
@SuppressWarnings("SameReturnValue")
@OnLongClick(R2.id.bottom_toolbar_bookmark)
boolean goToBookmarks() {
- saveTabStates();
CoreMainActivity parentActivity = (CoreMainActivity) requireActivity();
parentActivity.navigate(parentActivity.getBookmarksFragmentResId());
return true;
@@ -1205,7 +1204,6 @@ public abstract class CoreReaderFragment extends BaseFragment
}
private void goToSearch(boolean isVoice) {
- saveTabStates();
openSearch("", false, isVoice);
}
@@ -1235,7 +1233,6 @@ public abstract class CoreReaderFragment extends BaseFragment
break;
case Intent.ACTION_VIEW:
if (intent.getType() == null || !intent.getType().equals("application/octet-stream")) {
- saveTabStates();
String searchString =
intent.getData() == null ? "" : intent.getData().getLastPathSegment();
openSearch(searchString, false, false);
@@ -1249,7 +1246,6 @@ public abstract class CoreReaderFragment extends BaseFragment
}
private void goToSearchWithText(Intent intent) {
- saveTabStates();
String searchString = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
? intent.getStringExtra(Intent.EXTRA_PROCESS_TEXT)
: "";
@@ -1570,21 +1566,14 @@ public abstract class CoreReaderFragment extends BaseFragment
try {
JSONArray urls = new JSONArray(zimArticles);
JSONArray positions = new JSONArray(zimPositions);
- int i = 0;
- // tabs are already restored if the webViewList includes more tabs than the default
- if (webViewList.size() == 1) {
- getCurrentWebView().setScrollY(positions.getInt(0));
- i++;
- while (i < urls.length()) {
- newTab(UpdateUtils.reformatProviderUrl(urls.getString(i)));
- safelyGetWebView(i).setScrollY(positions.getInt(i));
- i++;
- }
+ webViewList.clear();
+ currentWebViewIndex=0;
+ tabsAdapter.notifyItemRemoved(0);
+ tabsAdapter.notifyDataSetChanged();
+ for (int i = 0; i < urls.length(); i++) {
+ newTab(UpdateUtils.reformatProviderUrl(urls.getString(i)), i == currentTab)
+ .setScrollY(positions.getInt(i));
}
- selectTab(currentTab);
- safelyGetWebView(currentTab)
- .loadUrl(UpdateUtils.reformatProviderUrl(urls.getString(currentTab)));
- getCurrentWebView().setScrollY(positions.getInt(currentTab));
} catch (JSONException e) {
Log.w(TAG_KIWIX, "Kiwix shared preferences corrupted", e);
ContextExtensionsKt.toast(getActivity(), "Could not restore tabs.", Toast.LENGTH_LONG);
diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreWebViewClient.java b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreWebViewClient.java
index ea42552fb..a2ca2a179 100644
--- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreWebViewClient.java
+++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreWebViewClient.java
@@ -139,13 +139,10 @@ public class CoreWebViewClient extends WebViewClient {
@Nullable
@Override
- public WebResourceResponse shouldInterceptRequest(
- WebView view,
- WebResourceRequest request)
- {
+ public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
String url = convertLegacyUrl(request.getUrl().toString());
if (url.startsWith(CONTENT_PREFIX)) {
- return zimReaderContainer.load(url);
+ return zimReaderContainer.load(url, request.getRequestHeaders());
} else {
return super.shouldInterceptRequest(view, request);
}
diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt
index f53124e95..c218bb1c9 100644
--- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt
+++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt
@@ -172,7 +172,7 @@ open class KiwixWebView @SuppressLint("SetJavaScriptEnabled") constructor(
}.first { !it.exists() }
val source = Uri.parse(src)
try {
- zimReaderContainer.load("$source").data.use { inputStream ->
+ zimReaderContainer.load("$source", emptyMap()).data.use { inputStream ->
fileToSave.outputStream().use { inputStream.copyTo(it) }
}
instance.toast(instance.getString(R.string.save_media_saved, fileToSave.name))
diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/page/PageFragment.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/page/PageFragment.kt
index 66bf9c984..0b5a8aaee 100644
--- a/core/src/main/java/org/kiwix/kiwixmobile/core/page/PageFragment.kt
+++ b/core/src/main/java/org/kiwix/kiwixmobile/core/page/PageFragment.kt
@@ -121,6 +121,7 @@ abstract class PageFragment : OnItemClickListener, BaseFragment(), FragmentActiv
recycler_view.layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL, false)
recycler_view.adapter = pageAdapter
activity.setSupportActionBar(toolbar)
+ toolbar.setNavigationOnClickListener { requireActivity().onBackPressed() }
activity.supportActionBar?.apply {
setDisplayHomeAsUpEnabled(true)
title = screenTitle
diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimReaderContainer.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimReaderContainer.kt
index f03c616e8..97814856c 100644
--- a/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimReaderContainer.kt
+++ b/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimReaderContainer.kt
@@ -20,6 +20,7 @@ package org.kiwix.kiwixmobile.core.reader
import android.webkit.WebResourceResponse
import org.kiwix.kiwixmobile.core.reader.ZimFileReader.Factory
import java.io.File
+import java.net.HttpURLConnection
import javax.inject.Inject
import javax.inject.Singleton
@@ -45,12 +46,26 @@ class ZimReaderContainer @Inject constructor(private val zimFileReaderFactory: F
fun getRandomArticleUrl() = zimFileReader?.getRandomArticleUrl()
fun isRedirect(url: String): Boolean = zimFileReader?.isRedirect(url) == true
fun getRedirect(url: String): String = zimFileReader?.getRedirect(url) ?: ""
- fun load(url: String) =
- WebResourceResponse(
- zimFileReader?.readMimeType(url),
- Charsets.UTF_8.name(),
- zimFileReader?.load(url)
- )
+ fun load(url: String, requestHeaders: Map): WebResourceResponse {
+ val data = zimFileReader?.load(url)
+ return WebResourceResponse(zimFileReader?.readMimeType(url), Charsets.UTF_8.name(), data)
+ .apply {
+ val headers = mutableMapOf("Accept-Ranges" to "bytes")
+ if ("Range" in requestHeaders.keys) {
+ setStatusCodeAndReasonPhrase(HttpURLConnection.HTTP_PARTIAL, "Partial Content")
+ val fullSize = data?.available()?.toLong() ?: 0L
+ val lastByte = fullSize - 1
+ val byteRanges = requestHeaders.getValue("Range").substringAfter("=").split("-")
+ headers["Content-Range"] = "bytes ${byteRanges[0]}-$lastByte/$fullSize"
+ if (byteRanges.size == 1) {
+ headers["Connection"] = "close"
+ }
+ } else {
+ setStatusCodeAndReasonPhrase(HttpURLConnection.HTTP_OK, "OK")
+ }
+ responseHeaders = headers
+ }
+ }
fun copyReader(): ZimFileReader? = zimFile?.let(zimFileReaderFactory::create)
diff --git a/core/src/main/res/layout/fragment_reader.xml b/core/src/main/res/layout/fragment_reader.xml
index 2729270f9..703248209 100644
--- a/core/src/main/res/layout/fragment_reader.xml
+++ b/core/src/main/res/layout/fragment_reader.xml
@@ -31,26 +31,25 @@
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_bias="0.45" />
+ app:layout_constraintEnd_toEndOf="@+id/no_open_book_text"
+ app:layout_constraintStart_toStartOf="@+id/no_open_book_text"
+ app:layout_constraintTop_toBottomOf="@id/no_open_book_text"/>
@@ -14,28 +14,25 @@
+ android:layout_height="match_parent"
+ tools:listitem="@layout/list_item_search" />
+ android:layout_gravity="center"
+ android:visibility="gone"
+ tools:visibility="visible" />
diff --git a/core/src/main/res/values-ar/strings.xml b/core/src/main/res/values-ar/strings.xml
index 9ae8c7488..5620fe0d8 100644
--- a/core/src/main/res/values-ar/strings.xml
+++ b/core/src/main/res/values-ar/strings.xml
@@ -33,6 +33,7 @@
فشل بدء الهوت-سبوت
يبدو أن الهوت-سبوت مفعلٌ بالفعل. يرجى تعطيل هوت-سبوت الواي فاي للمتابعة.
انتقل إلى إعدادات الواي فاي
+ الاتصال مرفوض.
تشغيل الهوت-سبوت
يُرجى اختيار الكتب أولًا
لا يمكن بدء الخادم. يُرجى تشغيل الهوت-سبوت الخاص بك
@@ -76,6 +77,7 @@
حذف هذا العنصر؟
إفراغ التاريخ
إفراغ عمليات البحث الحديثة وعلامات التبويب
+ ملاحظات
أُفرغ سجل التاريخ
حذف الإشارات المرجعية
مسح كل التاريخ
@@ -227,6 +229,7 @@
خطأ شديد! حاول تعطيل/إعادة تمكين الواي فاي P2P
فشل الاتصال
مطلوب إذن للموقع بواسطة أندرويد للسماح للتطبيق باكتشاف الأجهزة المقترنة
+ مطلوب إذن للموقع بواسطة أندرويد للسماح للتطبيق باكتشاف ملفات زيم (Zim) المستضافة
لا يمكن تحديد موقع الأجهزة المقترنة دون أذونات الموقع
لا يمكن الوصول إلى ملفات زيم (ZIM) دون إذن وحدة تخزين
تمكين الموقع للسماح باكتشاف الأجهزة المقترنة
diff --git a/core/src/main/res/values-bg/strings.xml b/core/src/main/res/values-bg/strings.xml
index 8e92ff1da..8af2ce78c 100644
--- a/core/src/main/res/values-bg/strings.xml
+++ b/core/src/main/res/values-bg/strings.xml
@@ -1,6 +1,7 @@
@@ -68,6 +69,7 @@
Διαγραφή αυτού του αντικειμένου;
Εκκαθάριση ιστορικού
Εκκαθάριση ιστορικού πρόσφατων αναζητήσεων και ετικετών
+ Σημειώσεις
Όλο το ιστορικό καθαρίστηκε
Εκκαθάριση όλου του ιστορικού
Διαγραφή
diff --git a/core/src/main/res/values-eo/strings.xml b/core/src/main/res/values-eo/strings.xml
index e89022f27..607f38ca5 100644
--- a/core/src/main/res/values-eo/strings.xml
+++ b/core/src/main/res/values-eo/strings.xml
@@ -3,6 +3,7 @@
* Abijeet Patro
* Blahma
* Fitoschido
+* Javiero
* Kelson
* KuboF
* Mirin
@@ -49,6 +50,7 @@
Forigi ĉi tiu eron?
Forviŝi hisorion
Forviŝi ĵusajn serĉojn kaj historion de langetoj
+ Notoj
Forviŝis Ĉiun Historion
Forviŝi Ĉiun da Historio
Diskonigi
diff --git a/core/src/main/res/values-es/strings.xml b/core/src/main/res/values-es/strings.xml
index e912cac3a..c4b174063 100644
--- a/core/src/main/res/values-es/strings.xml
+++ b/core/src/main/res/values-es/strings.xml
@@ -12,6 +12,7 @@
* MarcoAurelio
* Mpayansilva
* Ncr
+* Rodney Araujo
* VegaDark
-->
@@ -76,6 +77,7 @@
¿Borrar este elemento?
Limpiar el historial
Borrar las búsquedas recientes y el historial de pestañas
+ Notas
Borrado todo el historial
Borrar marcadores
Borrar todo el historial?
diff --git a/core/src/main/res/values-fr/strings.xml b/core/src/main/res/values-fr/strings.xml
index 0ffe4048a..afd411718 100644
--- a/core/src/main/res/values-fr/strings.xml
+++ b/core/src/main/res/values-fr/strings.xml
@@ -84,6 +84,7 @@
Supprimer cet élément ?
Effacer l’historique
Effacer les recherches récentes et l’historique des onglets
+ Notes
Tout l’historique est effacé
Supprimer les marque-pages
Effacer tout l’historique ?
diff --git a/core/src/main/res/values-it/strings.xml b/core/src/main/res/values-it/strings.xml
index f6dcb6c3b..4e24314e5 100644
--- a/core/src/main/res/values-it/strings.xml
+++ b/core/src/main/res/values-it/strings.xml
@@ -50,6 +50,7 @@
Sei sicuro di voler cancellare la tua cronologia di ricerca e resettare tutte le tab attive?
Elimina questo elemento?
Cancella la cronologia
+ Note
Tutta la cronologia è stata cancellata
Cancellare tutta la cronologia?
Cancella
diff --git a/core/src/main/res/values-iw/strings.xml b/core/src/main/res/values-iw/strings.xml
index eb7392998..bac72d0ae 100644
--- a/core/src/main/res/values-iw/strings.xml
+++ b/core/src/main/res/values-iw/strings.xml
@@ -9,6 +9,7 @@
* Tuvalevsku
* YaronSh
* יאיר מן
+* ישראל קלר
-->
עזרה
@@ -77,6 +78,7 @@
למחוק את הפריט הזה?
ניקוי ההיסטוריה
ניקוי מילות חיפוש קודמות והיסטוריית כרטיסיות
+ הערות
כל ההיסטוריה נמחקה
ניקוי סימניות
לנקות את כל ההיסטוריה?
diff --git a/core/src/main/res/values-ku/strings.xml b/core/src/main/res/values-ku/strings.xml
index d48301e3e..bd52efdff 100644
--- a/core/src/main/res/values-ku/strings.xml
+++ b/core/src/main/res/values-ku/strings.xml
@@ -52,7 +52,7 @@
Vê adresa IPyê di geroka xwe de binivîsîne ji bo ku xwe bigihînî servera %s
Çewtîː Peldanka ZIM\'ê ya bijartî nehate dîtin.
Nikare dosyeya zim-ê veke
- Çewtîː Peldanka bijartî ne peldankeke ZIM\'ê ya derbasdar e.
+ Çewtîː Peldanka bijartî ne peldankeke ZIMê ya derbasdar e.
Çewtîː Barkirina gotara (Url: %1$s) têk çû.
Nîşan bide
Agahî
@@ -73,6 +73,7 @@
Vê pelê jê bibe?
Raboriyê paqij bike
Lêgerînên dawî û raboriya hilpekînan paqij bike
+ Not
Hemû Raborî Hat Paqijkirin
Bijareyan paqij bike
Hemû Dîrokê Paqij Bike
diff --git a/core/src/main/res/values-lb/strings.xml b/core/src/main/res/values-lb/strings.xml
index 766af916a..c02d42649 100644
--- a/core/src/main/res/values-lb/strings.xml
+++ b/core/src/main/res/values-lb/strings.xml
@@ -39,6 +39,7 @@
Sicht eng Sprooch eraus
Auteuren a Lizenzen
Dëst Element läschen?
+ Notizen
Lieszeechen ewechhuelen
Läschen
Ofbriechen
diff --git a/core/src/main/res/values-mk/strings.xml b/core/src/main/res/values-mk/strings.xml
index a3c15faa1..e4006471f 100644
--- a/core/src/main/res/values-mk/strings.xml
+++ b/core/src/main/res/values-mk/strings.xml
@@ -70,6 +70,7 @@
Да ја избришам ставкава?
Исчисти историја
Исчисти скорешни пребарувања и јазичиња
+ Белешки
Сета историја е исчистена
Исчисти обележувачи
Да ја исчистам сета историја
diff --git a/core/src/main/res/values-pl/strings.xml b/core/src/main/res/values-pl/strings.xml
index c238306f7..059869591 100644
--- a/core/src/main/res/values-pl/strings.xml
+++ b/core/src/main/res/values-pl/strings.xml
@@ -4,6 +4,7 @@
* Alan ffm
* DeRudySoulStorm
* InternerowyGołąb
+* Kareyac
* Kelson
* Krzyz23
* Macofe
@@ -79,6 +80,7 @@
Usunąć ten obiekt?
Wyczyść historię
Wyczyść historię ostatnich wyszukiwań i kart
+ Uwagi
Usunięto całą historię
Wyczyść zakładki
Wyczyść całą historię?
diff --git a/core/src/main/res/values-pt-rBR/strings.xml b/core/src/main/res/values-pt-rBR/strings.xml
index 456487851..7d08cc343 100644
--- a/core/src/main/res/values-pt-rBR/strings.xml
+++ b/core/src/main/res/values-pt-rBR/strings.xml
@@ -76,6 +76,7 @@
Eliminar este item?
Apagar histórico
Limpar pesquisas recentes e histórico de guias
+ Notas
Eliminando todo o histórico
Limpar marcadores
Limpar todo o histórico?
diff --git a/core/src/main/res/values-pt/strings.xml b/core/src/main/res/values-pt/strings.xml
index 4faf32a47..a3e37edf5 100644
--- a/core/src/main/res/values-pt/strings.xml
+++ b/core/src/main/res/values-pt/strings.xml
@@ -7,6 +7,7 @@
* Hamilton Abreu
* Imperadeiro90
* Imperadeiro98
+* Kareyac
* Kelson
* Macofe
* Mansil alfalb
@@ -53,6 +54,7 @@
Apagar este elemento?
Limpar o histórico
Limpar as pesquisas recentes e o histórico de separadores
+ Notas
Todo o historial foi apagado
Apagar todo o historial
Apagar
diff --git a/core/src/main/res/values-qq/strings.xml b/core/src/main/res/values-qq/strings.xml
index 5d377f92d..085aaadf0 100644
--- a/core/src/main/res/values-qq/strings.xml
+++ b/core/src/main/res/values-qq/strings.xml
@@ -29,6 +29,7 @@
{{Identical|Back to top}}
{{Identical|Language}}
{{Identical|Choose language}}
+ {{Identical|Notes}}
{{Identical|Delete}}
{{identical|Cancel}}
{{Identical|Undo}}
@@ -45,6 +46,7 @@
{{Identical|Previous}}
This is the past participle of the verb “to leave” (meaning “quitted” or “exited”). This is used in a context of “X minutes left” to finish a download.
{{Identical|Yesterday}}
+ {{Identical|History}}
TODO: Unclear, must be documented. See https://github.com/kiwix/overview/issues/31
{{Identical|Save}}
Tell the user Location permission required for hosting zim file.
diff --git a/core/src/main/res/values-ru/strings.xml b/core/src/main/res/values-ru/strings.xml
index 66c24436f..ed1ec6b4a 100644
--- a/core/src/main/res/values-ru/strings.xml
+++ b/core/src/main/res/values-ru/strings.xml
@@ -85,6 +85,7 @@
Удалить этот элемент?
Очистить историю
Очистить недавние поисковые запросы и историю вкладок
+ Примечания
Вся история очищена
Очистить закладки
Очистить всю историю?
diff --git a/core/src/main/res/values-sl/strings.xml b/core/src/main/res/values-sl/strings.xml
index 49e16c90d..9eb57b554 100644
--- a/core/src/main/res/values-sl/strings.xml
+++ b/core/src/main/res/values-sl/strings.xml
@@ -156,7 +156,7 @@
Kazalo vsebine
Izberi jezike
Shrani jezike
- Sporoči svoje mnenje
+ Sporočite svoje mnenje
Razširi
Zgodovina
Zgodovina iz trenutne knjige
diff --git a/core/src/main/res/values-sv/strings.xml b/core/src/main/res/values-sv/strings.xml
index e92faa056..025389f35 100644
--- a/core/src/main/res/values-sv/strings.xml
+++ b/core/src/main/res/values-sv/strings.xml
@@ -75,6 +75,7 @@
Radera detta objekt?
Rensa historik
Rensa senaste sökningar och flikhistorik
+ Anteckningar
All historik rensades
Rensa bokmärken
Rensa all historik?
diff --git a/core/src/main/res/values-tr/strings.xml b/core/src/main/res/values-tr/strings.xml
index 8490f186e..dbe42042e 100644
--- a/core/src/main/res/values-tr/strings.xml
+++ b/core/src/main/res/values-tr/strings.xml
@@ -83,6 +83,7 @@
Bu öğe silinsin mi?
Geçmişi temizle
Son aramalar ve sekmeler geçmişini temizle
+ Notlar
Tüm geçmiş temizlendi
Yer imlerini temizle
Tüm Geçmişi Silinsin mi?
diff --git a/core/src/main/res/values-zh-rTW/strings.xml b/core/src/main/res/values-zh-rTW/strings.xml
index f9f33cbc8..baee4200d 100644
--- a/core/src/main/res/values-zh-rTW/strings.xml
+++ b/core/src/main/res/values-zh-rTW/strings.xml
@@ -75,6 +75,7 @@
刪除此項目?
清除歷史記錄
清除近期搜尋和分頁歷史記錄
+ 備註
所有歷史記錄已清除
清除書籤
清除所有歷史記錄?
diff --git a/core/src/main/res/values/dimens.xml b/core/src/main/res/values/dimens.xml
index d136e4c81..b81eed089 100644
--- a/core/src/main/res/values/dimens.xml
+++ b/core/src/main/res/values/dimens.xml
@@ -18,4 +18,6 @@
56dp
5dp
25dp
+
+ 48dp
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index 4895cfda0..fe2ef8176 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -66,6 +66,7 @@
Delete this item?
Clear history
Clear recent searches and tabs history
+ Notes
All History Cleared
Clear bookmarks
Clear All History?
diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml
index 60df19b1f..1508f90b2 100644
--- a/core/src/main/res/values/styles.xml
+++ b/core/src/main/res/values/styles.xml
@@ -62,7 +62,6 @@
- end
-
+
+
diff --git a/core/src/main/res/xml/preferences.xml b/core/src/main/res/xml/preferences.xml
index 4cd555c32..e8e0c52cb 100644
--- a/core/src/main/res/xml/preferences.xml
+++ b/core/src/main/res/xml/preferences.xml
@@ -74,7 +74,7 @@
Adeel Zafar
Aditya Sood
Ayoub Dardory
+Ayush Shrivastava
Christian Pühringer
Elad Keyshawn
Emmanuel Engelhart
+Frans-Lukas Lövenvald
+Gourishankar Panda
Isaac Hutt
Joseph E. Reeve
Julian Harty
diff --git a/custom/src/main/res/drawable-night-v23/launch_screen.xml b/custom/src/main/res/drawable-night-v23/launch_screen.xml
new file mode 100644
index 000000000..e34f35c7e
--- /dev/null
+++ b/custom/src/main/res/drawable-night-v23/launch_screen.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
diff --git a/custom/src/main/res/drawable-night/launch_screen.xml b/custom/src/main/res/drawable-night/launch_screen.xml
index b11ad6354..1e86cfc80 100644
--- a/custom/src/main/res/drawable-night/launch_screen.xml
+++ b/custom/src/main/res/drawable-night/launch_screen.xml
@@ -1,12 +1,11 @@
-
-
-
+ -
+
+
diff --git a/custom/src/main/res/drawable-v23/launch_screen.xml b/custom/src/main/res/drawable-v23/launch_screen.xml
new file mode 100644
index 000000000..e34f35c7e
--- /dev/null
+++ b/custom/src/main/res/drawable-v23/launch_screen.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
diff --git a/custom/src/main/res/drawable/launch_screen.xml b/custom/src/main/res/drawable/launch_screen.xml
index e4495189c..59d39c70e 100644
--- a/custom/src/main/res/drawable/launch_screen.xml
+++ b/custom/src/main/res/drawable/launch_screen.xml
@@ -21,11 +21,9 @@
android:opacity="opaque">
-
+ -
+
+