diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
index ec88dfc8f..ad03fb40a 100644
--- a/.github/workflows/coverage.yml
+++ b/.github/workflows/coverage.yml
@@ -15,7 +15,7 @@ jobs:
coverageReport:
strategy:
matrix:
- api-level: [21, 29]
+ api-level: [21, 21]
fail-fast: false
runs-on: macOS-latest
steps:
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index cce791c36..7928f4b6d 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -10,7 +10,7 @@ jobs:
instrumentation_tests:
strategy:
matrix:
- api-level: [21, 22, 23, 24, 25, 27, 28, 29]
+ api-level: [21, 22, 23, 24, 25, 27, 28]
fail-fast: false
runs-on: macOS-latest
steps:
diff --git a/CHANGELOG b/CHANGELOG
index 119e0125e..7acadea76 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,27 @@
+3.3.4
+NEW: Updated translations
+BUGFIX: Fullscreen videos were not displaying
+BUGFIX: Urls containing "?" were not loading properly
+BUGFIX: Notifications were erroneously allowing the user to pause a download
+BUGFIX: Urls with "#" anchors now load to the correct portion of the page
+BUGFIX: Save Media on long click was not working
++ Lots More
+
+3.3.3
+BUGFIX: Crash on older devices due to OKHTTP
+
+3.3.2
+NEW: Better flow for hosting books
+NEW: Control text zoom for zim files
+NEW: Bookmarks/History internals rewrite
+NEW: Updated translations
+BUGFIX: Search results were inaccurate when typing too quickly
+BUGFIX: new zim scheme for addressing content
+BUGFIX: Native memory leaks fixed
+BUGFIX: fix crash on returning to webview from search result
+BUGFIX: some zim files could not be found after downloading
++ Lots More
+
3.3.1
NEW: Send Diagnostic Reports
BUGFIX: Loading older zim files could fail
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 872427730..a563ca547 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -54,6 +54,14 @@ All branches should have distinct history and should be visually easy to follow,
If you wish to rebase you should be following the [Golden Rule](https://www.atlassian.com/git/tutorials/merging-vs-rebasing#the-golden-rule-of-rebasing) and ahere to the advice in the heading [Aside: Rebase as cleanup is awesome in the coding lifecycle](https://www.atlassian.com/git/articles/git-team-workflows-merge-or-rebase).
+### Design and style
+
+For an overview of how to make design changes to Kiwix Android, check out [DESIGN.md](https://github.com/kiwix/kiwix-android/edit/develop/DESIGN.md).
+
+### Adding new string resources
+
+To add a new string resource see [STRING_RESOURCES.md](https://github.com/kiwix/kiwix-android/edit/develop/STRING_RESOURCES.md).
+
### Building
The Kiwix app is split into 3 modules
diff --git a/DESIGN.md b/DESIGN.md
new file mode 100644
index 000000000..0990f5950
--- /dev/null
+++ b/DESIGN.md
@@ -0,0 +1,72 @@
+# Design
+
+This file intends to provide information on how to work with design in the Kiwix android applicaiton.
+
+## Colors
+
+
+
+The Kiwix colors are black and white with different colored accents. For Kiwix Android, black is accented by different shades of blue:
+
+-  `#000000`/`black`
+-  `#1565c0`/`denim_blue800`
+-  `#42a5f5`/`denim_blue400`
+-  `#2196F3`/`dodger_blue`
+
+> Color indicates which elements are interactive, how they relate to other elements, and their level of prominence. Important elements should stand out the most [1].
+
+For a guide on how to apply colors to UI, see ["Applying color to UI - Material Design"](https://material.io/design/color/applying-color-to-ui.html#backdrop).
+
+## Themes
+Kiwix uses themes to apply styles to views. This means that instead of adding a specific color or style to each view in the application, a theme should be set.
+Themes are defined in `res/values/themes.xml` or `res/values-night/themes.xml` depending on night/day.
+The following steps should be followed to set a color or style of a view.
+1. Define the color or style:
+ * Define the color in `core/colors.xml`. Use good naming (`denim_blue`, `mine_shaft_gray` etc..). Our recommended tool for color naming is [Chirag Mehta - Name that color](http://chir.ag/projects/name-that-color/#6195ED).
+ * Define the style in `core/styles.xml`. For our default styles, applied with theme attributes, the naming convention is `Widget.KiwixTheme.*` and these should ideally inherit from their `Widget.MaterialComponent.*`, should no such parent exist, it is generally advisable to google "how to style [Component]". When there are two or more of a view that differ stylistically from our default styling, but are identical to each other visually, it is appropriate to extract a style to keep the XML DRY. A non-default style should use a descriptive name. e.x. `list_item_title`.
+2. Add the color or style to a specific theme attribute in `themes.xml`.
+3. Make sure that the color or style works in both day and night mode. If it does not, add the dark mode compatible attribute to `values-night/themes.xml`.
+
+For a video on how to work with themes, styles and colors, see [Developing Themes with Style (Android Dev Summit '19)](https://www.youtube.com/watch?v=Owkf8DhAOSo).
+
+## Night Mode / Dark Theme
+Night mode is a different theme that has many benefits such as saving battery and improving visibility in low light conditions [2]. When doing any design, make sure the new design works in dark mode. Night mode can be activated from the systems settings or from the kiwix app.
+
+Whenever a resource exists in both `res/*-night` and `res/*` it will be used as such. For example: `kiwix_icon_with_title.png` exists in both `res/drawable` and `res/drawable-night` which means that the image in `res/drawable-night` will be used automagically in night mode. For further reading on development with dark mode, see [Material Design - Dark Theme](https://developer.android.com/guide/topics/ui/look-and-feel/darktheme).
+
+## Typography
+Text should contrast well, use the correct weight and size to present content as clearly and efficiently as possible.
+
+Views using the same style often use different text style. Therefore text styles, and view styles are seperated and can be used simultaneously. To keep an android application consistent in style, thirteen text style attributes should be defined. These style attributes can be generated ([Material Design type scale generator](https://material.io/design/typography/the-type-system.html#type-scale)), or defined by editing `core/../values/type.xml`.
+
+All text should have a text style to simplifiy appearance changes. To set a text style, simply set the `textAppearance` property using one of the thirteen text style attributes from `core/../values/type.xml`. Text can also be grouped if they are related and uses the same text style. This grouping can be done by creating a style that inherits, or sets a specific text appearance. E.x. ``.
+
+Additional reading can be found at [Material Design - Type System](https://material.io/design/typography/the-type-system.html#type-scale).
+
+## Resources
+Following is a list of resources that can and should be used to support a design decision.
+
+1. [Material Design](https://material.io/) - Googles design guide that should be followed to keep Android applications consistent.
+2. [Design for Android](https://developer.android.com/design) - Another design guide by Google, this one is specifically for Android while Material Design is more general.
+3. [Figma](https://www.figma.com) - A tool that can be used to mock design ideas.
+
+## Accessibility
+Accessibility is an important part of Android applications. Especially applications that are as widely used as Kiwix. As such, accessibility should be part of design decisions. This can include choices such as:
+
+- Having text with a large font and good contrast ratio.
+- Large simple controls.
+- Consistent controls and navigation. (consistent to Kiwix, and other Android applications.)
+
+Kiwix does not yet contain content descriptions for its UI elements. This can prohibit users with for example poor eyesight to use Kiwix successfully. Therefore, newly introduced interactive elements should contain content descriptions (boy scout rule applies here too!).
+
+See ["Make apps more accessible"](https://developer.android.com/guide/topics/ui/accessibility/apps) for a more detailed guide on accessibility. [Firefox Fenix](https://github.com/mozilla-mobile/shared-docs/blob/master/android/accessibility_guide.md) also has a great concise description of accessibility. A third accessibility resource is googles [list of key steps](https://android-developers.googleblog.com/2012/04/accessibility-are-you-serving-all-your.html) for making sure an Android application is accessible.
+
+
+
+
+
+[1] https://material.io/design/color/the-color-system.html 2020-06-04
+
+[2] https://developer.android.com/guide/topics/ui/look-and-feel/darktheme 2020-07-02
+
+
diff --git a/STRING_RESOURCES.md b/STRING_RESOURCES.md
new file mode 100644
index 000000000..d6fead918
--- /dev/null
+++ b/STRING_RESOURCES.md
@@ -0,0 +1,20 @@
+# String resources
+All user visible strings in an Android application should be listed in strings.xml files to allow for easy translation, replacement and modification. Newly added string resources are imported by translatewiki and are then manually translated. After translations are complete the translations are merged with Kiwix Android.
+
+## How do I add a new string resource?
+Start by adding your new string resource `new_string` to `values/strings.xml` in English. That is:
+```
+...
+New String
+...
+```
+You will now have to describe the string in `values-qq/strings.xml` with where and how the new string is used. E.x. for the string `On`:
+
+`values-qq/strings.xml:`
+```
+...
+This is used in the settings screen to turn on the night mode.
+...
+```
+- The values in `values/strings.xml` are the strings that are going to be displayed in the Kiwix application to the user.
+- The values in `values-qq/strings.xml` are only visible to the translator and are only there to help them make a correct translation.
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 3a0f91671..363590732 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", 3)
- set("versionPatch", 1)
+ set("versionPatch", 4)
}
fun generateVersionName() = "${ext["versionMajor"]}.${ext["versionMinor"]}.${ext["versionPatch"]}"
diff --git a/app/detekt_baseline.xml b/app/detekt_baseline.xml
index 0b71972bd..b52cda4f5 100644
--- a/app/detekt_baseline.xml
+++ b/app/detekt_baseline.xml
@@ -7,6 +7,7 @@
EmptyFunctionBlock:ZimHostActivity.kt$ZimHostActivity.<no name provided>${}
ForbiddenComment:KiwixReaderFragment.kt$KiwixReaderFragment$// TODO: Show to user
LongParameterList:ZimManageViewModel.kt$ZimManageViewModel$( booksOnFileSystem: List<BookOnDisk>, activeDownloads: List<DownloadModel>, allLanguages: List<Language>, libraryNetworkEntity: LibraryNetworkEntity, filter: String, fileSystemState: FileSystemState )
+ LongParameterList:ZimManageViewModel.kt$ZimManageViewModel$( private val downloadDao: FetchDownloadDao, private val bookDao: NewBookDao, private val languageDao: NewLanguagesDao, private val storageObserver: StorageObserver, private val kiwixService: KiwixService, private val context: Application, private val connectivityBroadcastReceiver: ConnectivityBroadcastReceiver, private val bookUtils: BookUtils, private val fat32Checker: Fat32Checker, private val defaultLanguageProvider: DefaultLanguageProvider, private val dataSource: DataSource )
MagicNumber:LibraryListItem.kt$LibraryListItem.LibraryDownloadItem$1000L
MagicNumber:ShareFiles.kt$ShareFiles$24
MagicNumber:ZimManageViewModel.kt$ZimManageViewModel$5
diff --git a/app/src/main/res/layout/activity_intro.xml b/app/src/main/res/layout/activity_intro.xml
index f87159fa5..67d37b8d4 100644
--- a/app/src/main/res/layout/activity_intro.xml
+++ b/app/src/main/res/layout/activity_intro.xml
@@ -28,7 +28,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/activity_vertical_margin"
- app:ipi_currentPageIndicatorColor="@color/blue800"
+ app:ipi_currentPageIndicatorColor="@color/denim_blue800"
app:ipi_pageIndicatorColor="@color/blueTransparent"
app:layout_constraintBottom_toBottomOf="parent" />
diff --git a/app/src/main/res/layout/activity_local_file_transfer.xml b/app/src/main/res/layout/activity_local_file_transfer.xml
index aaefafe4f..8ba06a1b9 100644
--- a/app/src/main/res/layout/activity_local_file_transfer.xml
+++ b/app/src/main/res/layout/activity_local_file_transfer.xml
@@ -52,7 +52,7 @@
android:layout_height="2dp"
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
- android:background="@color/accent"
+ android:background="@color/dodger_blue"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/text_view_device_name" />
@@ -113,7 +113,7 @@
android:layout_marginStart="5dp"
android:layout_marginTop="200dp"
android:layout_marginEnd="5dp"
- android:background="@color/accent"
+ android:background="@color/dodger_blue"
app:layout_constraintBottom_toTopOf="@+id/text_view_files_for_transfer"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
diff --git a/app/src/main/res/layout/activity_zim_host.xml b/app/src/main/res/layout/activity_zim_host.xml
index 281d54d06..e5ef272f8 100644
--- a/app/src/main/res/layout/activity_zim_host.xml
+++ b/app/src/main/res/layout/activity_zim_host.xml
@@ -42,7 +42,7 @@
android:layout_marginBottom="8dp"
android:background="@color/greenTick"
android:text="@string/start_server_label"
- android:textColor="@color/white"
+ android:textColor="@color/alabaster_white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
diff --git a/app/src/main/res/layout/item_download.xml b/app/src/main/res/layout/item_download.xml
index fcdacaa39..acb99fccf 100644
--- a/app/src/main/res/layout/item_download.xml
+++ b/app/src/main/res/layout/item_download.xml
@@ -48,7 +48,7 @@
style="@style/list_item_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="@color/text_secondary"
+ android:textColor="?textSecondary"
android:layout_gravity="start"
tools:text="Description" />
@@ -71,7 +71,7 @@
style="@style/list_item_body"
android:layout_width="0dp"
android:layout_height="wrap_content"
- android:textColor="@color/text_tertiary"
+ android:textColor="?textTertiary"
android:layout_weight="1"
tools:text="In Progress" />
@@ -80,7 +80,7 @@
style="@style/list_item_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="@color/text_tertiary"
+ android:textColor="?textTertiary"
tools:text="1min 10secs" />
diff --git a/app/src/main/res/layout/item_library.xml b/app/src/main/res/layout/item_library.xml
index dce98c6a7..c2a1c09d3 100644
--- a/app/src/main/res/layout/item_library.xml
+++ b/app/src/main/res/layout/item_library.xml
@@ -47,7 +47,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/activity_horizontal_margin"
- android:textColor="@color/text_secondary"
+ android:textColor="?textSecondary"
android:maxLines="2"
android:ellipsize="end"
app:layout_constraintEnd_toEndOf="parent"
@@ -60,7 +60,7 @@
style="@style/list_item_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="@color/text_tertiary"
+ android:textColor="?textTertiary"
app:layout_constraintStart_toStartOf="@+id/libraryBookTitle"
app:layout_constraintTop_toBottomOf="@+id/libraryBookDescription"
tools:text="File Size" />
@@ -70,7 +70,7 @@
style="@style/list_item_body"
android:layout_width="0dp"
android:layout_height="wrap_content"
- android:textColor="@color/text_tertiary"
+ android:textColor="?textTertiary"
android:gravity="start"
android:layout_marginRight="10dp"
android:layout_marginEnd="10dp"
@@ -84,7 +84,7 @@
style="@style/list_item_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="@color/text_tertiary"
+ android:textColor="?textTertiary"
app:layout_constraintStart_toStartOf="@+id/libraryBookCreator"
app:layout_constraintTop_toBottomOf="@+id/libraryBookCreator"
tools:text="Publisher" />
@@ -95,7 +95,7 @@
style="@style/list_item_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="@color/text_tertiary"
+ android:textColor="?textTertiary"
android:layout_marginEnd="@dimen/activity_horizontal_margin"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/libraryBookSize"
@@ -106,7 +106,7 @@
style="@style/list_item_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="@color/text_tertiary"
+ android:textColor="?textTertiary"
android:layout_marginStart="50dp"
app:layout_constraintEnd_toEndOf="@+id/libraryBookDate"
app:layout_constraintTop_toBottomOf="@+id/libraryBookDate"
@@ -117,7 +117,7 @@
style="@style/list_item_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="@color/text_tertiary"
+ android:textColor="?textTertiary"
app:layout_constraintEnd_toEndOf="@+id/libraryBookLanguage"
app:layout_constraintTop_toBottomOf="@+id/libraryBookLanguage"
tools:text="File Name" />
diff --git a/app/src/main/res/values-b+roa+tara/strings.xml b/app/src/main/res/values-b+roa+tara/strings.xml
new file mode 100644
index 000000000..d4276516d
--- /dev/null
+++ b/app/src/main/res/values-b+roa+tara/strings.xml
@@ -0,0 +1,9 @@
+
+
+
+ \'U file system tune non ge supporte le file cchiù granne de 4GB
+ Stoche a condrolle ce \'u file system tune pò ccrejà le file cchiù granne de 4GB
+ Aprture d\‘u fail sciute a male\nPe piacere pruève arrete a cercà stu fail jndr\’à Schede d\'u despositive d\'a libbreria toje.
+
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
new file mode 100644
index 000000000..b1bd93d1a
--- /dev/null
+++ b/app/src/main/res/values-cs/strings.xml
@@ -0,0 +1,9 @@
+
+
+
+ Váš souborový systém nepodporuje soubory větší než 4GB
+ Zjišťování, zda souborový systém dokáže vytvořit 4GB soubory
+ Nepodařilo se otevřít soubor\nZkuste prosím tento soubor vyhledat na kartě Zařízení ve Vaší knihovně
+
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
new file mode 100644
index 000000000..817cf29d1
--- /dev/null
+++ b/app/src/main/res/values-de/strings.xml
@@ -0,0 +1,9 @@
+
+
+
+ Ihr Dateisystem unterstützt keine Dateien über 4GB
+ Untersuche, ob das Dateisystem Dateien mit 4GB erstellen kann
+ Konnte Datei nicht öffnen\nBitte versuchen Sie, in der Geräteregisterkarte Ihrer Bibliothek nach dieser Datei zu suchen
+
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
new file mode 100644
index 000000000..9943debd1
--- /dev/null
+++ b/app/src/main/res/values-ru/strings.xml
@@ -0,0 +1,9 @@
+
+
+
+ Ваша файловая система не поддерживает файлы больше 4GB
+ Проверка, поддерживает ли файловая система файлы больше 4GB
+ Невозможно открыть файл\nПожалуйста, попытайтесь найти этот файл во вкладке “Устройство” в вашей библиотеке
+
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
index de3e9fa56..d0297337d 100644
--- a/buildSrc/build.gradle.kts
+++ b/buildSrc/build.gradle.kts
@@ -16,7 +16,7 @@ dependencies {
implementation("com.hiya:jacoco-android:0.2")
implementation("org.jlleitschuh.gradle:ktlint-gradle:9.2.1")
implementation("com.google.apis:google-api-services-androidpublisher:v3-rev129-1.25.0")
- implementation("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.5.1")
+ implementation("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.9.1")
implementation(gradleApi())
implementation(localGroovy())
diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt
index 31067a7e0..09ca4b56b 100644
--- a/buildSrc/src/main/kotlin/Versions.kt
+++ b/buildSrc/src/main/kotlin/Versions.kt
@@ -12,13 +12,13 @@ import org.gradle.plugin.use.PluginDependencySpec
* YOU are responsible for updating manually the dependency version.
*/
object Versions {
- const val androidx_test_espresso: String = "3.1.1" // available: "3.2.0"
+ const val androidx_test_espresso: String = "3.2.0"
const val com_squareup_retrofit2: String = "2.5.0" // available: "2.9.0"
const val org_jetbrains_kotlin: String = "1.3.72"
- const val com_google_dagger: String = "2.26" // available: "2.28"
+ const val com_google_dagger: String = "2.26" // available: "2.28.1"
const val com_yahoo_squidb: String = "2.0.0" // available: "3.2.3"
@@ -26,11 +26,11 @@ object Versions {
const val androidx_test: String = "1.2.0"
- const val io_objectbox: String = "2.3.4" // available: "2.6.0"
+ const val io_objectbox: String = "2.6.0"
const val org_jacoco: String = "0.7.9"
- const val io_mockk: String = "1.9.2" // available: "1.10.0"
+ const val io_mockk: String = "1.10.0"
const val android_arch_lifecycle_extensions: String = "1.1.1"
@@ -38,17 +38,17 @@ object Versions {
const val de_fayard_buildsrcversions_gradle_plugin: String = "0.7.0"
- const val com_github_triplet_play_gradle_plugin: String = "2.6.2" // available: "2.8.0"
+ const val com_github_triplet_play_gradle_plugin: String = "2.8.0"
const val multidex_instrumentation: String = "2.0.0"
const val javax_annotation_api: String = "1.3.2"
- const val logging_interceptor: String = "3.12.1" // available: "4.7.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.2" // available: "2.3"
+ const val leakcanary_android: String = "2.4"
const val constraintlayout: String = "1.1.3"
@@ -56,23 +56,23 @@ object Versions {
const val preference_ktx: String = "1.1.1"
- const val junit_jupiter: String = "5.4.2" // available: "5.6.2"
+ 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.11.1" // available: "3.16.1"
+ const val assertj_core: String = "3.16.1"
const val core_testing: String = "2.1.0"
- const val fragment_ktx: String = "1.2.1" // available: "1.2.4"
+ const val fragment_ktx: String = "1.2.5"
const val lint_gradle: String = "27.0.0"
- const val testing_ktx: String = "1.1.1" // available: "1.1.2"
+ const val testing_ktx: String = "1.1.2"
- const val threetenabp: String = "1.1.1" // available: "1.2.4"
+ const val threetenabp: String = "1.2.4"
const val uiautomator: String = "2.2.0"
@@ -82,13 +82,13 @@ object Versions {
const val appcompat: String = "1.1.0"
- const val rxandroid: String = "2.1.0" // available: "2.1.1"
+ const val rxandroid: String = "2.1.1"
- const val core_ktx: String = "1.2.0" // available: "1.3.0"
+ const val core_ktx: String = "1.3.0"
- const val kiwixlib: String = "9.1.2"
+ const val kiwixlib: String = "9.2.3"
- const val material: String = "1.1.0-beta02" // available: "1.1.0"
+ const val material: String = "1.1.0"
const val multidex: String = "2.0.1"
@@ -98,22 +98,22 @@ object Versions {
const val jsr305: String = "3.0.2"
- const val ktlint: String = "0.36.0" // available: "0.37.1"
+ const val ktlint: String = "0.36.0" // available: "0.37.2"
- const val okhttp: String = "3.12.1" // available: "4.7.2"
+ const val okhttp: String = "3.6.0" // available: "4.7.2"
- const val rxjava: String = "2.2.5" // available: "2.2.19"
+ const val rxjava: String = "2.2.19"
const val aapt2: String = "4.0.0-6051327"
const val junit: String = "1.1.1"
/**
- * Current version: "5.6.1"
+ * Current version: "6.1.1"
* See issue 19: How to update Gradle itself?
* https://github.com/jmfayard/buildSrcVersions/issues/19
*/
- const val gradleLatestVersion: String = "6.5"
+ const val gradleLatestVersion: String = "6.5.1"
}
/**
diff --git a/core/detekt_baseline.xml b/core/detekt_baseline.xml
index 043c9f0fa..a3499b20b 100644
--- a/core/detekt_baseline.xml
+++ b/core/detekt_baseline.xml
@@ -5,12 +5,16 @@
EmptyFunctionBlock:BooksOnDiskViewHolder.kt$BookOnDiskViewHolder.BookViewHolder${ }
EmptyFunctionBlock:FetchDownloadMonitor.kt$FetchDownloadMonitor.<no name provided>${}
ForbiddenComment:JNIInitialiser.kt$JNIInitialiser$// TODO: Consider surfacing to user
+ LongParameterList:KiwixDialog.kt$KiwixDialog$( val title: Int?, val message: Int?, val positiveMessage: Int, val negativeMessage: Int?, val cancelable: Boolean = true, val icon: Int? = null, val neutralMessage: Int? = null, val getView: (() -> View)? = null )
+ LongParameterList:MainMenu.kt$MainMenu$( private val activity: Activity, zimFileReader: ZimFileReader?, menu: Menu, webViews: MutableList<KiwixWebView>, urlIsValid: Boolean, disableReadAloud: Boolean = false, disableTabs: Boolean = false, private val menuClickListener: MenuClickListener )
LongParameterList:MainMenu.kt$MainMenu.Factory$( menu: Menu, webViews: MutableList<KiwixWebView>, urlIsValid: Boolean, menuClickListener: MenuClickListener, disableReadAloud: Boolean, disableTabs: Boolean )
+ LongParameterList:Repository.kt$Repository$( @param:IO private val io: Scheduler, @param:MainThread private val mainThread: Scheduler, private val bookDao: NewBookDao, private val bookmarksDao: NewBookmarksDao, private val historyDao: HistoryDao, private val languageDao: NewLanguagesDao, private val recentSearchDao: NewRecentSearchDao, private val zimReaderContainer: ZimReaderContainer )
MagicNumber:ArticleCount.kt$ArticleCount$1000.0
MagicNumber:ArticleCount.kt$ArticleCount$3
MagicNumber:CoreSplashActivity.kt$CoreSplashActivity$10
MagicNumber:DownloadItem.kt$DownloadItem$1000L
MagicNumber:DownloaderModule.kt$DownloaderModule$5
+ MagicNumber:FetchDownloadNotificationManager.kt$FetchDownloadNotificationManager$100
MagicNumber:FetchDownloadRequester.kt$10
MagicNumber:FileUtils.kt$FileUtils$3
MagicNumber:JNIInitialiser.kt$JNIInitialiser$1024
diff --git a/core/objectbox-models/default.json b/core/objectbox-models/default.json
index 5d2e402e8..b1fa17d21 100644
--- a/core/objectbox-models/default.json
+++ b/core/objectbox-models/default.json
@@ -10,67 +10,84 @@
"properties": [
{
"id": "1:4248832782795400383",
- "name": "id"
+ "name": "id",
+ "type": 6,
+ "flags": 1
},
{
"id": "2:2644395282642821815",
- "name": "file"
+ "name": "file",
+ "type": 9
},
{
"id": "4:3145196313443812205",
- "name": "bookId"
+ "name": "bookId",
+ "type": 9
},
{
"id": "5:597997298666253723",
- "name": "title"
+ "name": "title",
+ "type": 9
},
{
"id": "6:8028706022307902131",
- "name": "description"
+ "name": "description",
+ "type": 9
},
{
"id": "7:4257578632233656657",
- "name": "language"
+ "name": "language",
+ "type": 9
},
{
"id": "8:7771231471515752814",
- "name": "creator"
+ "name": "creator",
+ "type": 9
},
{
"id": "9:892859866782486178",
- "name": "publisher"
+ "name": "publisher",
+ "type": 9
},
{
"id": "10:1925365063061602631",
- "name": "date"
+ "name": "date",
+ "type": 9
},
{
"id": "11:1111395522977944209",
- "name": "url"
+ "name": "url",
+ "type": 9
},
{
"id": "12:3765116904492031525",
- "name": "articleCount"
+ "name": "articleCount",
+ "type": 9
},
{
"id": "13:5901922417972273396",
- "name": "mediaCount"
+ "name": "mediaCount",
+ "type": 9
},
{
"id": "14:1229023184984372602",
- "name": "size"
+ "name": "size",
+ "type": 9
},
{
"id": "15:6851856791814492874",
- "name": "name"
+ "name": "name",
+ "type": 9
},
{
"id": "16:6142333908132117423",
- "name": "favIcon"
+ "name": "favIcon",
+ "type": 9
},
{
"id": "17:2701677664876214591",
- "name": "tags"
+ "name": "tags",
+ "type": 9
}
],
"relations": []
@@ -82,19 +99,26 @@
"properties": [
{
"id": "1:7795244654012809404",
- "name": "id"
+ "name": "id",
+ "type": 6,
+ "flags": 1
},
{
"id": "2:9116495537035444904",
- "name": "locale"
+ "name": "locale",
+ "type": 9
},
{
"id": "3:452531964346972307",
- "name": "active"
+ "name": "active",
+ "type": 1,
+ "flags": 4
},
{
"id": "4:8812214350305159407",
- "name": "occurencesOfLanguage"
+ "name": "occurencesOfLanguage",
+ "type": 5,
+ "flags": 4
}
],
"relations": []
@@ -106,39 +130,50 @@
"properties": [
{
"id": "1:4390013783965661495",
- "name": "id"
+ "name": "id",
+ "type": 6,
+ "flags": 1
},
{
"id": "2:6814436941523306636",
- "name": "zimId"
+ "name": "zimId",
+ "type": 9
},
{
"id": "3:3445023139891930306",
- "name": "zimName"
+ "name": "zimName",
+ "type": 9
},
{
"id": "4:1707638909668210783",
- "name": "zimFilePath"
+ "name": "zimFilePath",
+ "type": 9
},
{
"id": "5:7291321834337975178",
- "name": "favicon"
+ "name": "favicon",
+ "type": 9
},
{
"id": "6:8790316103579116510",
- "name": "historyUrl"
+ "name": "historyUrl",
+ "type": 9
},
{
"id": "7:6718164131929659510",
- "name": "historyTitle"
+ "name": "historyTitle",
+ "type": 9
},
{
"id": "9:6094002746638656105",
- "name": "timeStamp"
+ "name": "timeStamp",
+ "type": 6,
+ "flags": 4
},
{
"id": "10:8395372122440621469",
- "name": "dateString"
+ "name": "dateString",
+ "type": 9
}
],
"relations": []
@@ -150,31 +185,39 @@
"properties": [
{
"id": "1:6627309171741917147",
- "name": "id"
+ "name": "id",
+ "type": 6,
+ "flags": 1
},
{
"id": "2:6862771806221961183",
- "name": "zimId"
+ "name": "zimId",
+ "type": 9
},
{
"id": "3:4312769031500860715",
- "name": "zimName"
+ "name": "zimName",
+ "type": 9
},
{
"id": "4:8187716343071473669",
- "name": "zimFilePath"
+ "name": "zimFilePath",
+ "type": 9
},
{
"id": "5:5652763871458286201",
- "name": "bookmarkUrl"
+ "name": "bookmarkUrl",
+ "type": 9
},
{
"id": "6:4537799665712767375",
- "name": "bookmarkTitle"
+ "name": "bookmarkTitle",
+ "type": 9
},
{
"id": "7:3805929017981932900",
- "name": "favicon"
+ "name": "favicon",
+ "type": 9
}
],
"relations": []
@@ -186,15 +229,19 @@
"properties": [
{
"id": "1:7759655437795315973",
- "name": "id"
+ "name": "id",
+ "type": 6,
+ "flags": 1
},
{
"id": "2:3924214186055484853",
- "name": "searchTerm"
+ "name": "searchTerm",
+ "type": 9
},
{
"id": "3:3320858395373055542",
- "name": "zimId"
+ "name": "zimId",
+ "type": 9
}
],
"relations": []
@@ -206,95 +253,126 @@
"properties": [
{
"id": "1:7366957113003324901",
- "name": "id"
+ "name": "id",
+ "type": 6,
+ "flags": 1
},
{
"id": "3:3174500111130052488",
- "name": "bookId"
+ "name": "bookId",
+ "type": 9
},
{
"id": "4:3949362784963767166",
- "name": "title"
+ "name": "title",
+ "type": 9
},
{
"id": "5:812546090900770347",
- "name": "description"
+ "name": "description",
+ "type": 9
},
{
"id": "6:3129463483413863468",
- "name": "language"
+ "name": "language",
+ "type": 9
},
{
"id": "7:3402286918039853548",
- "name": "creator"
+ "name": "creator",
+ "type": 9
},
{
"id": "8:4732753967507809221",
- "name": "publisher"
+ "name": "publisher",
+ "type": 9
},
{
"id": "9:3239042532048399134",
- "name": "date"
+ "name": "date",
+ "type": 9
},
{
"id": "10:1136584919149973914",
- "name": "url"
+ "name": "url",
+ "type": 9
},
{
"id": "11:4252749008345744598",
- "name": "articleCount"
+ "name": "articleCount",
+ "type": 9
},
{
"id": "12:8625493380854102341",
- "name": "mediaCount"
+ "name": "mediaCount",
+ "type": 9
},
{
"id": "13:2787210837560254021",
- "name": "size"
+ "name": "size",
+ "type": 9
},
{
"id": "14:2052022387195277817",
- "name": "name"
+ "name": "name",
+ "type": 9
},
{
"id": "15:1976493094677983679",
- "name": "favIcon"
+ "name": "favIcon",
+ "type": 9
},
{
"id": "16:217454020763036675",
- "name": "etaInMilliSeconds"
+ "name": "etaInMilliSeconds",
+ "type": 6,
+ "flags": 4
},
{
"id": "17:1136630637198901642",
- "name": "bytesDownloaded"
+ "name": "bytesDownloaded",
+ "type": 6,
+ "flags": 4
},
{
"id": "18:8939019296899137627",
- "name": "totalSizeOfDownload"
+ "name": "totalSizeOfDownload",
+ "type": 6,
+ "flags": 4
},
{
"id": "19:3378789699620971394",
- "name": "status"
+ "name": "status",
+ "type": 5,
+ "flags": 2
},
{
"id": "20:6867355950440828062",
- "name": "error"
+ "name": "error",
+ "type": 5,
+ "flags": 2
},
{
"id": "21:5555873126720275555",
- "name": "file"
+ "name": "file",
+ "type": 9
},
{
"id": "22:2724607601244650879",
- "name": "downloadId"
+ "name": "downloadId",
+ "type": 6,
+ "flags": 4
},
{
"id": "23:5485468735259326535",
- "name": "progress"
+ "name": "progress",
+ "type": 5,
+ "flags": 4
},
{
"id": "24:4272820830206771469",
- "name": "tags"
+ "name": "tags",
+ "type": 9
}
],
"relations": []
@@ -304,8 +382,8 @@
"lastIndexId": "4:4868787482832538530",
"lastRelationId": "0:0",
"lastSequenceId": "0:0",
- "modelVersion": 4,
- "modelVersionParserMinimum": 4,
+ "modelVersion": 5,
+ "modelVersionParserMinimum": 5,
"retiredEntityUids": [
349148274283701276,
7257718270326155947
diff --git a/core/objectbox-models/default.json.bak b/core/objectbox-models/default.json.bak
index 5d2e402e8..b1fa17d21 100644
--- a/core/objectbox-models/default.json.bak
+++ b/core/objectbox-models/default.json.bak
@@ -10,67 +10,84 @@
"properties": [
{
"id": "1:4248832782795400383",
- "name": "id"
+ "name": "id",
+ "type": 6,
+ "flags": 1
},
{
"id": "2:2644395282642821815",
- "name": "file"
+ "name": "file",
+ "type": 9
},
{
"id": "4:3145196313443812205",
- "name": "bookId"
+ "name": "bookId",
+ "type": 9
},
{
"id": "5:597997298666253723",
- "name": "title"
+ "name": "title",
+ "type": 9
},
{
"id": "6:8028706022307902131",
- "name": "description"
+ "name": "description",
+ "type": 9
},
{
"id": "7:4257578632233656657",
- "name": "language"
+ "name": "language",
+ "type": 9
},
{
"id": "8:7771231471515752814",
- "name": "creator"
+ "name": "creator",
+ "type": 9
},
{
"id": "9:892859866782486178",
- "name": "publisher"
+ "name": "publisher",
+ "type": 9
},
{
"id": "10:1925365063061602631",
- "name": "date"
+ "name": "date",
+ "type": 9
},
{
"id": "11:1111395522977944209",
- "name": "url"
+ "name": "url",
+ "type": 9
},
{
"id": "12:3765116904492031525",
- "name": "articleCount"
+ "name": "articleCount",
+ "type": 9
},
{
"id": "13:5901922417972273396",
- "name": "mediaCount"
+ "name": "mediaCount",
+ "type": 9
},
{
"id": "14:1229023184984372602",
- "name": "size"
+ "name": "size",
+ "type": 9
},
{
"id": "15:6851856791814492874",
- "name": "name"
+ "name": "name",
+ "type": 9
},
{
"id": "16:6142333908132117423",
- "name": "favIcon"
+ "name": "favIcon",
+ "type": 9
},
{
"id": "17:2701677664876214591",
- "name": "tags"
+ "name": "tags",
+ "type": 9
}
],
"relations": []
@@ -82,19 +99,26 @@
"properties": [
{
"id": "1:7795244654012809404",
- "name": "id"
+ "name": "id",
+ "type": 6,
+ "flags": 1
},
{
"id": "2:9116495537035444904",
- "name": "locale"
+ "name": "locale",
+ "type": 9
},
{
"id": "3:452531964346972307",
- "name": "active"
+ "name": "active",
+ "type": 1,
+ "flags": 4
},
{
"id": "4:8812214350305159407",
- "name": "occurencesOfLanguage"
+ "name": "occurencesOfLanguage",
+ "type": 5,
+ "flags": 4
}
],
"relations": []
@@ -106,39 +130,50 @@
"properties": [
{
"id": "1:4390013783965661495",
- "name": "id"
+ "name": "id",
+ "type": 6,
+ "flags": 1
},
{
"id": "2:6814436941523306636",
- "name": "zimId"
+ "name": "zimId",
+ "type": 9
},
{
"id": "3:3445023139891930306",
- "name": "zimName"
+ "name": "zimName",
+ "type": 9
},
{
"id": "4:1707638909668210783",
- "name": "zimFilePath"
+ "name": "zimFilePath",
+ "type": 9
},
{
"id": "5:7291321834337975178",
- "name": "favicon"
+ "name": "favicon",
+ "type": 9
},
{
"id": "6:8790316103579116510",
- "name": "historyUrl"
+ "name": "historyUrl",
+ "type": 9
},
{
"id": "7:6718164131929659510",
- "name": "historyTitle"
+ "name": "historyTitle",
+ "type": 9
},
{
"id": "9:6094002746638656105",
- "name": "timeStamp"
+ "name": "timeStamp",
+ "type": 6,
+ "flags": 4
},
{
"id": "10:8395372122440621469",
- "name": "dateString"
+ "name": "dateString",
+ "type": 9
}
],
"relations": []
@@ -150,31 +185,39 @@
"properties": [
{
"id": "1:6627309171741917147",
- "name": "id"
+ "name": "id",
+ "type": 6,
+ "flags": 1
},
{
"id": "2:6862771806221961183",
- "name": "zimId"
+ "name": "zimId",
+ "type": 9
},
{
"id": "3:4312769031500860715",
- "name": "zimName"
+ "name": "zimName",
+ "type": 9
},
{
"id": "4:8187716343071473669",
- "name": "zimFilePath"
+ "name": "zimFilePath",
+ "type": 9
},
{
"id": "5:5652763871458286201",
- "name": "bookmarkUrl"
+ "name": "bookmarkUrl",
+ "type": 9
},
{
"id": "6:4537799665712767375",
- "name": "bookmarkTitle"
+ "name": "bookmarkTitle",
+ "type": 9
},
{
"id": "7:3805929017981932900",
- "name": "favicon"
+ "name": "favicon",
+ "type": 9
}
],
"relations": []
@@ -186,15 +229,19 @@
"properties": [
{
"id": "1:7759655437795315973",
- "name": "id"
+ "name": "id",
+ "type": 6,
+ "flags": 1
},
{
"id": "2:3924214186055484853",
- "name": "searchTerm"
+ "name": "searchTerm",
+ "type": 9
},
{
"id": "3:3320858395373055542",
- "name": "zimId"
+ "name": "zimId",
+ "type": 9
}
],
"relations": []
@@ -206,95 +253,126 @@
"properties": [
{
"id": "1:7366957113003324901",
- "name": "id"
+ "name": "id",
+ "type": 6,
+ "flags": 1
},
{
"id": "3:3174500111130052488",
- "name": "bookId"
+ "name": "bookId",
+ "type": 9
},
{
"id": "4:3949362784963767166",
- "name": "title"
+ "name": "title",
+ "type": 9
},
{
"id": "5:812546090900770347",
- "name": "description"
+ "name": "description",
+ "type": 9
},
{
"id": "6:3129463483413863468",
- "name": "language"
+ "name": "language",
+ "type": 9
},
{
"id": "7:3402286918039853548",
- "name": "creator"
+ "name": "creator",
+ "type": 9
},
{
"id": "8:4732753967507809221",
- "name": "publisher"
+ "name": "publisher",
+ "type": 9
},
{
"id": "9:3239042532048399134",
- "name": "date"
+ "name": "date",
+ "type": 9
},
{
"id": "10:1136584919149973914",
- "name": "url"
+ "name": "url",
+ "type": 9
},
{
"id": "11:4252749008345744598",
- "name": "articleCount"
+ "name": "articleCount",
+ "type": 9
},
{
"id": "12:8625493380854102341",
- "name": "mediaCount"
+ "name": "mediaCount",
+ "type": 9
},
{
"id": "13:2787210837560254021",
- "name": "size"
+ "name": "size",
+ "type": 9
},
{
"id": "14:2052022387195277817",
- "name": "name"
+ "name": "name",
+ "type": 9
},
{
"id": "15:1976493094677983679",
- "name": "favIcon"
+ "name": "favIcon",
+ "type": 9
},
{
"id": "16:217454020763036675",
- "name": "etaInMilliSeconds"
+ "name": "etaInMilliSeconds",
+ "type": 6,
+ "flags": 4
},
{
"id": "17:1136630637198901642",
- "name": "bytesDownloaded"
+ "name": "bytesDownloaded",
+ "type": 6,
+ "flags": 4
},
{
"id": "18:8939019296899137627",
- "name": "totalSizeOfDownload"
+ "name": "totalSizeOfDownload",
+ "type": 6,
+ "flags": 4
},
{
"id": "19:3378789699620971394",
- "name": "status"
+ "name": "status",
+ "type": 5,
+ "flags": 2
},
{
"id": "20:6867355950440828062",
- "name": "error"
+ "name": "error",
+ "type": 5,
+ "flags": 2
},
{
"id": "21:5555873126720275555",
- "name": "file"
+ "name": "file",
+ "type": 9
},
{
"id": "22:2724607601244650879",
- "name": "downloadId"
+ "name": "downloadId",
+ "type": 6,
+ "flags": 4
},
{
"id": "23:5485468735259326535",
- "name": "progress"
+ "name": "progress",
+ "type": 5,
+ "flags": 4
},
{
"id": "24:4272820830206771469",
- "name": "tags"
+ "name": "tags",
+ "type": 9
}
],
"relations": []
@@ -304,8 +382,8 @@
"lastIndexId": "4:4868787482832538530",
"lastRelationId": "0:0",
"lastSequenceId": "0:0",
- "modelVersion": 4,
- "modelVersionParserMinimum": 4,
+ "modelVersion": 5,
+ "modelVersionParserMinimum": 5,
"retiredEntityUids": [
349148274283701276,
7257718270326155947
diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/CoreApp.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/CoreApp.kt
index 0ced8db4c..39ab9b048 100644
--- a/core/src/main/java/org/kiwix/kiwixmobile/core/CoreApp.kt
+++ b/core/src/main/java/org/kiwix/kiwixmobile/core/CoreApp.kt
@@ -20,10 +20,10 @@ package org.kiwix.kiwixmobile.core
import android.app.Application
import android.content.Context
import android.os.Build
-import android.os.Environment
+import android.os.Environment.MEDIA_MOUNTED
+import android.os.Environment.getExternalStorageState
import android.os.StrictMode
import android.os.StrictMode.VmPolicy
-import android.util.Log
import androidx.appcompat.app.AppCompatDelegate
import androidx.multidex.MultiDex
import com.jakewharton.threetenabp.AndroidThreeTen
@@ -31,8 +31,7 @@ import org.kiwix.kiwixmobile.core.data.local.KiwixDatabase
import org.kiwix.kiwixmobile.core.di.components.CoreComponent
import org.kiwix.kiwixmobile.core.di.components.DaggerCoreComponent
import org.kiwix.kiwixmobile.core.downloader.DownloadMonitor
-import java.io.File
-import java.io.IOException
+import org.kiwix.kiwixmobile.core.utils.files.FileLogger
import javax.inject.Inject
abstract class CoreApp : Application() {
@@ -64,6 +63,9 @@ abstract class CoreApp : Application() {
@Inject
internal lateinit var jniInitialiser: JNIInitialiser
+ @Inject
+ lateinit var fileLogger: FileLogger
+
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
if (BuildConfig.DEBUG) {
@@ -78,11 +80,11 @@ abstract class CoreApp : Application() {
.context(this)
.build()
AndroidThreeTen.init(this)
- writeLogFile()
coreComponent.inject(this)
kiwixDatabase.forceMigration()
downloadMonitor.init()
nightModeConfig.init()
+ fileLogger.writeLogFile(this)
configureStrictMode()
}
@@ -128,31 +130,7 @@ abstract class CoreApp : Application() {
}
}
- private fun writeLogFile() {
- if (isExternalStorageWritable) {
- val appDirectory =
- File(Environment.getExternalStorageDirectory().toString() + "/Kiwix")
- val logFile = File(appDirectory, "logcat.txt")
- Log.d("KIWIX", "Writing all logs into [" + logFile.path + "]")
- // create app folder
- if (!appDirectory.exists()) {
- appDirectory.mkdir()
- }
- if (logFile.exists() && logFile.isFile) {
- logFile.delete()
- }
- // clear the previous logcat and then write the new one to the file
- try {
- logFile.createNewFile()
- Runtime.getRuntime().exec("logcat -c")
- Runtime.getRuntime().exec("logcat -f " + logFile.path + " -s kiwix")
- } catch (e: IOException) {
- Log.e("KIWIX", "Error while writing logcat.txt", e)
- }
- }
- }
-
/* Checks if external storage is available for read and write */
val isExternalStorageWritable: Boolean
- get() = Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()
+ get() = MEDIA_MOUNTED == getExternalStorageState()
}
diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/StorageObserver.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/StorageObserver.kt
index fb50615fd..a92a178aa 100644
--- a/core/src/main/java/org/kiwix/kiwixmobile/core/StorageObserver.kt
+++ b/core/src/main/java/org/kiwix/kiwixmobile/core/StorageObserver.kt
@@ -49,5 +49,6 @@ class StorageObserver @Inject constructor(
downloads.firstOrNull { file.absolutePath.endsWith(it.fileNameFromUrl) } == null
private fun convertToBookOnDisk(file: File) =
- zimReaderFactory.create(file)?.let { BookOnDisk(file, it) }
+ zimReaderFactory.create(file)
+ ?.let { zimFileReader -> BookOnDisk(file, zimFileReader).also { zimFileReader.dispose() } }
}
diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadNotificationManager.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadNotificationManager.kt
index 22cd1eff2..0a710eee0 100644
--- a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadNotificationManager.kt
+++ b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadNotificationManager.kt
@@ -30,6 +30,7 @@ import androidx.core.app.NotificationCompat
import com.tonyodev.fetch2.DefaultFetchNotificationManager
import com.tonyodev.fetch2.DownloadNotification
import com.tonyodev.fetch2.Fetch
+import com.tonyodev.fetch2.util.DEFAULT_NOTIFICATION_TIMEOUT_AFTER_RESET
import org.kiwix.kiwixmobile.core.Intents
import org.kiwix.kiwixmobile.core.R
import org.kiwix.kiwixmobile.core.R.string
@@ -58,7 +59,59 @@ class FetchDownloadNotificationManager(context: Context) :
downloadNotification: DownloadNotification,
context: Context
) {
- super.updateNotification(notificationBuilder, downloadNotification, context)
+ // super method but with pause button removed
+ val smallIcon = if (downloadNotification.isDownloading) {
+ android.R.drawable.stat_sys_download
+ } else {
+ android.R.drawable.stat_sys_download_done
+ }
+ notificationBuilder.setPriority(NotificationCompat.PRIORITY_DEFAULT)
+ .setSmallIcon(smallIcon)
+ .setContentTitle(downloadNotification.title)
+ .setContentText(getSubtitleText(context, downloadNotification))
+ .setOngoing(downloadNotification.isOnGoingNotification)
+ .setGroup(downloadNotification.groupId.toString())
+ .setGroupSummary(false)
+ if (downloadNotification.isFailed || downloadNotification.isCompleted) {
+ notificationBuilder.setProgress(0, 0, false)
+ } else {
+ val progressIndeterminate = downloadNotification.progressIndeterminate
+ val maxProgress = if (downloadNotification.progressIndeterminate) 0 else 100
+ val progress = if (downloadNotification.progress < 0) 0 else downloadNotification.progress
+ notificationBuilder.setProgress(maxProgress, progress, progressIndeterminate)
+ }
+ when {
+ downloadNotification.isDownloading ->
+ notificationBuilder.setTimeoutAfter(getNotificationTimeOutMillis())
+ .addAction(
+ R.drawable.fetch_notification_cancel,
+ context.getString(R.string.fetch_notification_download_cancel),
+ getActionPendingIntent(downloadNotification, DownloadNotification.ActionType.CANCEL)
+ )
+ downloadNotification.isPaused ->
+ notificationBuilder.setTimeoutAfter(getNotificationTimeOutMillis())
+ .addAction(
+ R.drawable.fetch_notification_resume,
+ context.getString(R.string.fetch_notification_download_resume),
+ getActionPendingIntent(downloadNotification, DownloadNotification.ActionType.RESUME)
+ )
+ .addAction(
+ R.drawable.fetch_notification_cancel,
+ context.getString(R.string.fetch_notification_download_cancel),
+ getActionPendingIntent(downloadNotification, DownloadNotification.ActionType.CANCEL)
+ )
+ downloadNotification.isQueued ->
+ notificationBuilder.setTimeoutAfter(getNotificationTimeOutMillis())
+ else -> notificationBuilder.setTimeoutAfter(DEFAULT_NOTIFICATION_TIMEOUT_AFTER_RESET)
+ }
+ notificationCustomisation(downloadNotification, notificationBuilder, context)
+ }
+
+ private fun notificationCustomisation(
+ downloadNotification: DownloadNotification,
+ notificationBuilder: NotificationCompat.Builder,
+ context: Context
+ ) {
if (downloadNotification.isCompleted) {
val internal = Intents.internal(CoreMainActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/error/ErrorActivity.java b/core/src/main/java/org/kiwix/kiwixmobile/core/error/ErrorActivity.java
index ab78f4529..c05613754 100644
--- a/core/src/main/java/org/kiwix/kiwixmobile/core/error/ErrorActivity.java
+++ b/core/src/main/java/org/kiwix/kiwixmobile/core/error/ErrorActivity.java
@@ -23,7 +23,7 @@ import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
-import android.os.Environment;
+import android.util.Log;
import android.widget.Button;
import android.widget.CheckBox;
import androidx.core.content.ContextCompat;
@@ -42,10 +42,12 @@ import org.kiwix.kiwixmobile.core.dao.NewBookDao;
import org.kiwix.kiwixmobile.core.di.components.CoreComponent;
import org.kiwix.kiwixmobile.core.entity.LibraryNetworkEntity;
import org.kiwix.kiwixmobile.core.reader.ZimReaderContainer;
+import org.kiwix.kiwixmobile.core.utils.files.FileLogger;
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskListItem.BookOnDisk;
import org.kiwix.kiwixmobile.zim_manager.MountInfo;
import org.kiwix.kiwixmobile.zim_manager.MountPointProducer;
+import static androidx.core.content.FileProvider.getUriForFile;
import static org.kiwix.kiwixmobile.core.utils.LanguageUtils.getCurrentLocale;
public class ErrorActivity extends BaseActivity {
@@ -58,6 +60,8 @@ public class ErrorActivity extends BaseActivity {
ZimReaderContainer zimReaderContainer;
@Inject
MountPointProducer mountPointProducer;
+ @Inject
+ FileLogger fileLogger;
@BindView(R2.id.reportButton)
Button reportButton;
@@ -112,16 +116,10 @@ public class ErrorActivity extends BaseActivity {
String body = getBody();
if (allowLogsCheckbox.isChecked()) {
- File appDirectory = new File(Environment.getExternalStorageDirectory() + "/Kiwix");
- File logFile = new File(appDirectory, "logcat.txt");
- if (logFile.exists()) {
- Uri path =
- FileProvider.getUriForFile(this,
- getApplicationContext().getPackageName() + ".fileprovider",
- logFile);
- emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- emailIntent.putExtra(Intent.EXTRA_STREAM, path);
- }
+ File file = fileLogger.writeLogFile(this);
+ Uri path = getUriForFile(this, getApplicationContext().getPackageName()+ ".fileprovider", file);
+ emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ emailIntent.putExtra(Intent.EXTRA_STREAM, path);
}
if (allowCrashCheckbox.isChecked() && exception != null) {
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 ecef36526..a33193121 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
@@ -204,8 +204,8 @@ public abstract class CoreReaderFragment extends BaseFragment
CoordinatorLayout snackbarRoot;
@BindView(R2.id.fullscreen_video_container)
ViewGroup videoView;
-
- View root;
+ @BindView(R2.id.activity_main_root)
+ View activityMainRoot;
@Inject
protected MainContract.Presenter presenter;
@@ -290,7 +290,7 @@ public abstract class CoreReaderFragment extends BaseFragment
}
};
private Disposable bookmarkingDisposable;
- private Boolean isBookmarked;
+ private boolean isBookmarked;
@NotNull @Override public Super onActionModeStarted(@NotNull ActionMode mode,
@NotNull AppCompatActivity activity) {
@@ -333,7 +333,7 @@ public abstract class CoreReaderFragment extends BaseFragment
@Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
- root = inflater.inflate(R.layout.fragment_main, container, false);
+ View root = inflater.inflate(R.layout.fragment_main, container, false);
ButterKnife.bind(this, root);
AppCompatActivity activity = (AppCompatActivity) getActivity();
presenter.attachView(this);
@@ -430,7 +430,8 @@ public abstract class CoreReaderFragment extends BaseFragment
private void handleIntentExtras(Intent intent) {
if (intent.hasExtra(TAG_FILE_SEARCHED)) {
- searchForTitle(intent.getStringExtra(TAG_FILE_SEARCHED), mainMenu.isInTabSwitcher());
+ searchForTitle(intent.getStringExtra(TAG_FILE_SEARCHED),
+ isInTabSwitcher());
selectTab(webViewList.size() - 1);
}
if (intent.hasExtra(EXTRA_CHOSE_X_URL)) {
@@ -444,6 +445,10 @@ public abstract class CoreReaderFragment extends BaseFragment
handleNotificationIntent(intent);
}
+ private boolean isInTabSwitcher() {
+ return mainMenu != null && mainMenu.isInTabSwitcher();
+ }
+
private void handleNotificationIntent(Intent intent) {
if (intent.hasExtra(DOWNLOAD_NOTIFICATION_TITLE)) {
new Handler().postDelayed(() -> {
@@ -461,20 +466,23 @@ public abstract class CoreReaderFragment extends BaseFragment
documentParser = new DocumentParser(new DocumentParser.SectionsListener() {
@Override
public void sectionsLoaded(String title, List sections) {
- for (TableDrawerAdapter.DocumentSection section : sections) {
- if (section.title.contains("REPLACE_")) {
- section.title = getResourceString(getActivity().getApplicationContext(), section.title);
+ if (isAdded()) {
+ for (TableDrawerAdapter.DocumentSection section : sections) {
+ if (section.title.contains("REPLACE_")) {
+ section.title =
+ getResourceString(getActivity().getApplicationContext(), section.title);
+ }
}
+ documentSections.addAll(sections);
+ if (title.contains("REPLACE_")) {
+ tableDrawerAdapter.setTitle(
+ getResourceString(getActivity().getApplicationContext(), title));
+ } else {
+ tableDrawerAdapter.setTitle(title);
+ }
+ tableDrawerAdapter.setSections(documentSections);
+ tableDrawerAdapter.notifyDataSetChanged();
}
- documentSections.addAll(sections);
- if (title.contains("REPLACE_")) {
- tableDrawerAdapter.setTitle(
- getResourceString(getActivity().getApplicationContext(), title));
- } else {
- tableDrawerAdapter.setTitle(title);
- }
- tableDrawerAdapter.setSections(documentSections);
- tableDrawerAdapter.notifyDataSetChanged();
}
@Override
@@ -706,13 +714,14 @@ public abstract class CoreReaderFragment extends BaseFragment
try {
startActivity(goToMarket);
} catch (ActivityNotFoundException e) {
- startActivity(new Intent(Intent.ACTION_VIEW,
- kiwixBrowserMarketUri));
+ startActivity(new Intent(Intent.ACTION_VIEW, kiwixBrowserMarketUri));
}
}
private void updateTitle() {
- actionBar.setTitle(getValidTitle(zimReaderContainer.getZimFileTitle()));
+ if (isAdded()) {
+ actionBar.setTitle(getValidTitle(zimReaderContainer.getZimFileTitle()));
+ }
}
private String getValidTitle(String zimFileTitle) {
@@ -827,12 +836,12 @@ public abstract class CoreReaderFragment extends BaseFragment
KiwixWebView webView;
if (!isHideToolbar) {
webView = new ToolbarScrollingKiwixWebView(
- getActivity(), this, attrs, (ViewGroup) root, videoView,
+ getActivity(), this, attrs, (ViewGroup) activityMainRoot, videoView,
createWebClient(this, zimReaderContainer),
toolbarContainer, bottomToolbar, sharedPreferenceUtil);
} else {
webView = new ToolbarStaticKiwixWebView(
- getActivity(), this, attrs, (ViewGroup) root, videoView,
+ getActivity(), this, attrs, (ViewGroup) activityMainRoot, videoView,
createWebClient(this, zimReaderContainer),
sharedPreferenceUtil);
}
@@ -919,7 +928,7 @@ public abstract class CoreReaderFragment extends BaseFragment
@NotNull @Override public KiwixWebView getCurrentWebView() {
if (webViewList.size() == 0) return newMainPageTab();
- if (currentWebViewIndex < webViewList.size()) {
+ if (currentWebViewIndex < webViewList.size() && currentWebViewIndex > 0) {
return webViewList.get(currentWebViewIndex);
} else {
return webViewList.get(0);
@@ -1288,7 +1297,7 @@ public abstract class CoreReaderFragment extends BaseFragment
goToBookmarks();
return Unit.INSTANCE;
},
- getResources().getColor(R.color.white)
+ getResources().getColor(R.color.alabaster_white)
);
} else {
ContextExtensionsKt.toast(getActivity(), R.string.unable_to_add_to_bookmarks,
@@ -1485,7 +1494,7 @@ public abstract class CoreReaderFragment extends BaseFragment
switch (requestCode) {
case MainMenuKt.REQUEST_FILE_SEARCH:
if (resultCode == RESULT_OK) {
- boolean wasFromTabSwitcher = mainMenu != null && mainMenu.isInTabSwitcher();
+ boolean wasFromTabSwitcher = isInTabSwitcher();
hideTabSwitcher();
String title =
data.getStringExtra(TAG_FILE_SEARCHED).replace("", "").replace("", "");
@@ -1648,28 +1657,30 @@ public abstract class CoreReaderFragment extends BaseFragment
@Override
public void webViewUrlFinishedLoading() {
- updateTableOfContents();
- tabsAdapter.notifyDataSetChanged();
- updateUrlProcessor();
- updateBottomToolbarArrowsAlpha();
- String url = getCurrentWebView().getUrl();
- final ZimFileReader zimFileReader = zimReaderContainer.getZimFileReader();
- if (hasValidFileAndUrl(url, zimFileReader)) {
- final long timeStamp = System.currentTimeMillis();
- SimpleDateFormat sdf =
- new SimpleDateFormat("d MMM yyyy", LanguageUtils.getCurrentLocale(getActivity()));
- HistoryItem history = new HistoryItem(
- getCurrentWebView().getUrl(),
- getCurrentWebView().getTitle(),
- sdf.format(new Date(timeStamp)),
- timeStamp,
- zimFileReader
- );
- presenter.saveHistory(history);
+ if (isAdded()) {
+ updateTableOfContents();
+ tabsAdapter.notifyDataSetChanged();
+ updateUrlProcessor();
+ updateBottomToolbarArrowsAlpha();
+ String url = getCurrentWebView().getUrl();
+ final ZimFileReader zimFileReader = zimReaderContainer.getZimFileReader();
+ if (hasValidFileAndUrl(url, zimFileReader)) {
+ final long timeStamp = System.currentTimeMillis();
+ SimpleDateFormat sdf =
+ new SimpleDateFormat("d MMM yyyy", LanguageUtils.getCurrentLocale(getActivity()));
+ HistoryItem history = new HistoryItem(
+ getCurrentWebView().getUrl(),
+ getCurrentWebView().getTitle(),
+ sdf.format(new Date(timeStamp)),
+ timeStamp,
+ zimFileReader
+ );
+ presenter.saveHistory(history);
+ }
+ updateBottomToolbarVisibility();
+ openFullScreenIfEnabled();
+ updateNightMode();
}
- updateBottomToolbarVisibility();
- openFullScreenIfEnabled();
- updateNightMode();
}
protected boolean hasValidFileAndUrl(String url, ZimFileReader zimFileReader) {
@@ -1745,7 +1756,7 @@ public abstract class CoreReaderFragment extends BaseFragment
.setAction(getString(R.string.open), v -> {
if (webViewList.size() > 1) selectTab(webViewList.size() - 1);
})
- .setActionTextColor(getResources().getColor(R.color.white))
+ .setActionTextColor(getResources().getColor(R.color.alabaster_white))
.show();
} else {
newTab(url);
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 8636b1056..7ef46e884 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
@@ -49,6 +49,7 @@ public abstract class CoreWebViewClient extends WebViewClient {
private View home;
private static String LEGACY_CONTENT_PREFIX =
Uri.parse("content://" + CoreApp.getInstance().getPackageName() + ".zim.base/").toString();
+ private String urlWithAnchor;
public CoreWebViewClient(
WebViewCallback callback, ZimReaderContainer zimReaderContainer) {
@@ -60,6 +61,7 @@ public abstract class CoreWebViewClient extends WebViewClient {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
callback.webViewUrlLoading();
url = convertLegacyUrl(url);
+ urlWithAnchor = url.contains("#") ? url : null;
if (zimReaderContainer.isRedirect(url)) {
if (handleEpubAndPdf(url)) {
return true;
@@ -131,9 +133,22 @@ public abstract class CoreWebViewClient extends WebViewClient {
} else {
view.removeView(home);
}
+
+ jumpToAnchor(view, url);
callback.webViewUrlFinishedLoading();
}
+ /*
+ * 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);
+ urlWithAnchor = null;
+ }
+ }
+
protected abstract void onUrlEqualToHome(WebView view);
protected abstract void onInvalidUrl(WebView view);
diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.java b/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.java
index 3f0bfa48d..0b9589b6f 100644
--- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.java
+++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.java
@@ -116,7 +116,7 @@ public class KiwixWebView extends VideoEnabledWebView {
|| result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
MenuItem saveMenu = menu.add(0, 1, 0, getResources().getString(R.string.save_media));
saveMenu.setOnMenuItemClickListener(item -> {
- Message msg = new SaveHandler().obtainMessage();
+ Message msg = new SaveHandler(zimReaderContainer).obtainMessage();
requestFocusNodeHref(msg);
return true;
});
@@ -152,6 +152,12 @@ public class KiwixWebView extends VideoEnabledWebView {
}
static class SaveHandler extends Handler {
+ private final ZimReaderContainer zimReaderContainer;
+
+ public SaveHandler(ZimReaderContainer zimReaderContainer) {
+ this.zimReaderContainer = zimReaderContainer;
+ }
+
private String getDecodedFileName(String url, String src) {
String fileName = "";
if (url != null) {
@@ -164,7 +170,7 @@ public class KiwixWebView extends VideoEnabledWebView {
return fileName.substring(fileName.indexOf("%3A") + 1);
}
- @SuppressLint("StringFormatInvalid") @Override
+ @Override
public void handleMessage(Message msg) {
String url = (String) msg.getData().get("url");
String src = (String) msg.getData().get("src");
@@ -192,7 +198,7 @@ public class KiwixWebView extends VideoEnabledWebView {
try {
InputStream input =
- CoreApp.getInstance().getContentResolver().openInputStream(source);
+ zimReaderContainer.load(source.toString()).getData();
OutputStream output = new FileOutputStream(storageDir);
byte[] buffer = new byte[1024];
diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimFileReader.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimFileReader.kt
index da97d7837..9471cfaec 100644
--- a/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimFileReader.kt
+++ b/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimFileReader.kt
@@ -49,7 +49,7 @@ private const val TAG = "ZimFileReader"
class ZimFileReader constructor(
val zimFile: File,
- val jniKiwixReader: JNIKiwixReader = JNIKiwixReader(zimFile.canonicalPath),
+ private val jniKiwixReader: JNIKiwixReader = JNIKiwixReader(zimFile.canonicalPath),
private val nightModeConfig: NightModeConfig
) {
interface Factory {
@@ -125,7 +125,7 @@ class ZimFileReader constructor(
return loadContent(uri)
}
- fun readMimeType(uri: String) = uri.removeArguments().let {
+ fun readMimeType(uri: String) = uri.filePath.let {
it.mimeType?.takeIf(String::isNotEmpty) ?: mimeTypeFromReader(it) ?: DEFAULT_MIME_TYPE
}.also { Log.d(TAG, "getting mimetype for $uri = $it") }
@@ -192,7 +192,7 @@ class ZimFileReader constructor(
}
private fun getContentAndMimeType(uri: String) = with(JNIKiwixString()) {
- getContent(url = JNIKiwixString(uri.filePath.removeArguments()), mime = this) to value
+ getContent(url = JNIKiwixString(uri.filePath), mime = this) to value
}
private fun getContent(
@@ -224,6 +224,10 @@ class ZimFileReader constructor(
tags = this@ZimFileReader.tags
}
+ fun dispose() {
+ jniKiwixReader.dispose()
+ }
+
companion object {
/*
* these uris aren't actually nullable but unit tests fail to compile as
@@ -254,11 +258,10 @@ class ZimFileReader constructor(
}
}
-private fun String.removeArguments() = substringBefore("?")
private val Uri.filePath: String
get() = toString().filePath
private val String.filePath: String
- get() = substringAfter(CONTENT_PREFIX).substringBefore("#")
+ get() = substringAfter(CONTENT_PREFIX).substringBefore("#").substringBefore("?")
private val String.mimeType: String?
get() = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
MimeTypeMap.getFileExtensionFromUrl(this)
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 c550a94e7..5b47c52a6 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
@@ -18,7 +18,6 @@
package org.kiwix.kiwixmobile.core.reader
import android.webkit.WebResourceResponse
-import org.kiwix.kiwixlib.JNIKiwixSearcher
import org.kiwix.kiwixmobile.core.reader.ZimFileReader.Factory
import java.io.File
import javax.inject.Inject
@@ -26,17 +25,12 @@ import javax.inject.Singleton
@Singleton
class ZimReaderContainer @Inject constructor(
- private val zimFileReaderFactory: Factory,
- private val jniKiwixSearcher: JNIKiwixSearcher?
+ private val zimFileReaderFactory: Factory
) {
- private val listOfAddedReaderIds = mutableListOf()
var zimFileReader: ZimFileReader? = null
set(value) {
+ field?.dispose()
field = value
- if (value != null && !listOfAddedReaderIds.contains(value.id)) {
- listOfAddedReaderIds.add(value.id)
- jniKiwixSearcher?.addKiwixReader(value.jniKiwixReader)
- }
}
fun setZimFile(file: File?) {
@@ -48,19 +42,9 @@ class ZimReaderContainer @Inject constructor(
else null
}
- fun searchSuggestions(prefix: String, count: Int) =
- zimFileReader?.searchSuggestions(prefix, count) ?: false
-
- fun getNextSuggestion() = zimFileReader?.getNextSuggestion()
-
fun getPageUrlFromTitle(title: String) = zimFileReader?.getPageUrlFrom(title)
fun getRandomArticleUrl() = zimFileReader?.getRandomArticleUrl()
- fun search(query: String, count: Int) {
- jniKiwixSearcher?.search(query, count)
- }
-
- fun getNextResult() = jniKiwixSearcher?.nextResult?.let { SearchResult(it.title) }
fun isRedirect(url: String): Boolean = zimFileReader?.isRedirect(url) == true
fun getRedirect(url: String): String = zimFileReader?.getRedirect(url) ?: ""
fun load(url: String) =
diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchResultGenerator.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchResultGenerator.kt
index 7bd361cb7..dbf9a59f3 100644
--- a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchResultGenerator.kt
+++ b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchResultGenerator.kt
@@ -22,7 +22,6 @@ import org.kiwix.kiwixmobile.core.reader.ZimFileReader
import org.kiwix.kiwixmobile.core.reader.ZimReaderContainer
import org.kiwix.kiwixmobile.core.search.adapter.SearchListItem
import org.kiwix.kiwixmobile.core.search.adapter.SearchListItem.ZimSearchResultListItem
-import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
import javax.inject.Inject
interface SearchResultGenerator {
@@ -30,7 +29,6 @@ interface SearchResultGenerator {
}
class ZimSearchResultGenerator @Inject constructor(
- private val sharedPreferenceUtil: SharedPreferenceUtil,
private val zimReaderContainer: ZimReaderContainer
) : SearchResultGenerator {
override fun generateSearchResults(searchTerm: String) =
@@ -41,19 +39,12 @@ class ZimSearchResultGenerator @Inject constructor(
it: String,
reader: ZimFileReader?
) =
- if (sharedPreferenceUtil.prefFullTextSearch)
- zimReaderContainer.search(it, 200).run { fullTextResults() }
- else
- reader?.searchSuggestions(it, 200).run { suggestionResults(reader) }
-
- private fun fullTextResults() = generateSequence {
- zimReaderContainer.getNextResult()?.title?.let(::ZimSearchResultListItem)
- }.filter { it.value.isNotBlank() }
- .toList()
+ reader?.searchSuggestions(it, 200).run { suggestionResults(reader) }
private fun suggestionResults(reader: ZimFileReader?) = generateSequence {
reader?.getNextSuggestion()?.let { ZimSearchResultListItem(it.title) }
}
.distinct()
.toList()
+ .also { reader?.dispose() }
}
diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.java b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.java
index ae4bd1859..d4fd58add 100644
--- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.java
+++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.java
@@ -124,11 +124,6 @@ public class SharedPreferenceUtil {
return sharedPreferences.getString(PREF_STORAGE_TITLE, defaultTitle);
}
- public boolean getPrefFullTextSearch() {
- return false; // Temporarily disable multizim for 2.4
- //return sharedPreferences.getBoolean(PREF_FULL_TEXT_SEARCH, false);
- }
-
public void putPrefLanguage(String language) {
sharedPreferences.edit().putString(PREF_LANG, language).apply();
}
diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileLogger.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileLogger.kt
new file mode 100644
index 000000000..4b31a3914
--- /dev/null
+++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileLogger.kt
@@ -0,0 +1,66 @@
+/*
+ * 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.core.utils.files
+
+import android.content.Context
+import android.util.Log
+import java.io.File
+import java.io.IOException
+import java.lang.System.currentTimeMillis
+import javax.inject.Inject
+import javax.inject.Singleton
+
+/** Authored by s-ayush2903 on 19 June 2020 */
+
+/** A class for writing logs to the file in the device */
+@Singleton
+class FileLogger @Inject constructor() {
+
+ fun writeLogFile(context: Context): File {
+ // Create a new folder in private storage with name: logs
+ val logDir = File(context.filesDir, "logs")
+ val logFile = File(logDir, fileName)
+
+ Log.d("KIWIX", "Writing all logs into [" + logDir.path + "]")
+
+ if (!logDir.exists()) {
+ logDir.mkdir()
+ }
+ // Delete the pre-existing file
+ if (logDir.exists() && logFile.isFile) {
+ Log.d(TAG, "writeLogFile: Deleting preExistingFile")
+ logFile.delete()
+ }
+
+ try {
+ logDir.createNewFile()
+ Runtime.getRuntime().exec("logcat -f $logFile")
+ Runtime.getRuntime().exec("logcat -b all -d")
+ } catch (e: IOException) {
+ Log.e("KIWIX", "Error while writing $fileName! ", e)
+ }
+ return logFile
+ }
+
+ companion object {
+ private const val TAG = "FileLogger"
+ private val fileName: String
+ get() = "logs" + currentTimeMillis() + ".txt"
+ }
+}
diff --git a/core/src/main/res/drawable-night/launch_screen.xml b/core/src/main/res/drawable-night/launch_screen.xml
new file mode 100644
index 000000000..e9df7bff5
--- /dev/null
+++ b/core/src/main/res/drawable-night/launch_screen.xml
@@ -0,0 +1,11 @@
+
+
+
+
+ -
+
+
+
diff --git a/core/src/main/res/drawable/launch_screen.xml b/core/src/main/res/drawable/launch_screen.xml
index ae7b61922..6021eeb72 100644
--- a/core/src/main/res/drawable/launch_screen.xml
+++ b/core/src/main/res/drawable/launch_screen.xml
@@ -2,7 +2,7 @@
-
+
-
-
+
+ android:textColor="@color/alabaster_white" />
+ android:textColor="@color/alabaster_white" />
+ android:textColor="@color/alabaster_white" />
+ android:textColor="@color/alabaster_white" />
+ android:textColor="@color/alabaster_white" />
+ android:textColor="@color/alabaster_white" />
diff --git a/core/src/main/res/layout/item_book.xml b/core/src/main/res/layout/item_book.xml
index 21034e92d..975616f41 100644
--- a/core/src/main/res/layout/item_book.xml
+++ b/core/src/main/res/layout/item_book.xml
@@ -65,7 +65,7 @@
android:layout_marginEnd="8dp"
android:ellipsize="end"
android:maxLines="2"
- android:textColor="@color/text_secondary"
+ android:textColor="?textSecondary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@id/item_book_title"
app:layout_constraintTop_toBottomOf="@id/item_book_title"
@@ -76,7 +76,7 @@
style="@style/list_item_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="@color/text_tertiary"
+ android:textColor="?textTertiary"
app:layout_constraintStart_toStartOf="@id/item_book_title"
app:layout_constraintTop_toBottomOf="@id/item_book_description"
tools:text="1 Jan 2018" />
@@ -88,7 +88,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_horizontal_margin"
android:layout_marginEnd="@dimen/activity_horizontal_margin"
- android:textColor="@color/text_tertiary"
+ android:textColor="?textTertiary"
app:layout_constraintStart_toEndOf="@id/item_book_date"
app:layout_constraintTop_toTopOf="@id/item_book_date"
tools:text="20 GB" />
@@ -100,7 +100,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_horizontal_margin"
android:layout_marginEnd="@dimen/activity_horizontal_margin"
- android:textColor="@color/text_tertiary"
+ android:textColor="?textTertiary"
app:layout_constraintStart_toEndOf="@id/item_book_size"
app:layout_constraintTop_toTopOf="@id/item_book_size"
tools:text="10.1 K articles" />
diff --git a/core/src/main/res/layout/item_help.xml b/core/src/main/res/layout/item_help.xml
index 223aa5400..12cc0e52b 100644
--- a/core/src/main/res/layout/item_help.xml
+++ b/core/src/main/res/layout/item_help.xml
@@ -33,8 +33,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/activity_vertical_margin"
+ android:textColor="?textSecondary"
android:visibility="gone"
- android:textColor="@color/text_secondary"
app:layout_constraintTop_toBottomOf="@id/item_help_title"
tools:text="@string/help_3"
tools:visibility="visible" />
diff --git a/core/src/main/res/layout/kiwix_search_widget.xml b/core/src/main/res/layout/kiwix_search_widget.xml
index 332de33a5..666440178 100644
--- a/core/src/main/res/layout/kiwix_search_widget.xml
+++ b/core/src/main/res/layout/kiwix_search_widget.xml
@@ -23,7 +23,7 @@
android:layout_height="wrap_content"
android:layout_weight="0.7"
android:text="@string/search_widget_text"
- android:textColor="@color/gray" />
+ android:textColor="@color/scorpion_gray" />
لا توجد إشارات مرجعية!
لا تاريخ
الجهاز الافتراضي
- حذف التاريخ؟
- أزل العلامات المرجعية؟
+ حذف التاريخ؟
+ أزل العلامات المرجعية؟
تشغيل
تعطيل
تلقائي
تفاصيل نظام الملفات
+ تصفح تجريبي
diff --git a/core/src/main/res/values-ast/strings.xml b/core/src/main/res/values-ast/strings.xml
index dfdb0565d..e799400a4 100644
--- a/core/src/main/res/values-ast/strings.xml
+++ b/core/src/main/res/values-ast/strings.xml
@@ -253,8 +253,8 @@
Nun hai marcadores
Nun hai Historial
Predeterminao del preséu
- ¿Desaniciar l\'Historial?
- ¿Desaniciar los Marcadores?
+ ¿Desaniciar l\'Historial?
+ ¿Desaniciar los Marcadores?
Activáu
Desactiváu
Auto
diff --git a/core/src/main/res/values-b+be+tarask/strings.xml b/core/src/main/res/values-b+be+tarask/strings.xml
new file mode 100644
index 000000000..d5ad69ff3
--- /dev/null
+++ b/core/src/main/res/values-b+be+tarask/strings.xml
@@ -0,0 +1,84 @@
+
+
+
+ Дапамога
+ Галоўная
+ Налады
+ Знайсьці на старонцы
+ Закладкі
+ Выпадковы артыкул
+ На ўвесь экран
+ Выйсьці з рэжыму поўнага экрану
+ Чытаць уголас
+ Спыніць чытаньне ўголас
+ Падтрымаць Kiwix
+ Узьнікла памылка пры захаваньні мэдыяфайлу!
+ Мэдыя-файл захаваны як %s у Android/media/org.kiwix…/
+ Абярыце файл зьместу (*.zim)
+ Адкрыць спасылку ў новай укладцы?
+ Памылка: абраны ZIM-файл ня знойдзены.
+ Памылка: абраны файл не зьяўляецца слушным ZIM-файлам.
+ Памылка: загрузка артыкула (Url: %1$s) не атрымалася.
+ Інфармацыя
+ Вэрсія
+ Начны рэжым
+ Паказваць артыкулы ў інвэртаваных колерах
+ Вярнуцца ўгару
+ Паказваць кнопку ў канцы старонкі для пракручваньня ўверх
+ Мова
+ Абярыце мову
+ Мова гэтай старонкі не падтрымліваецца або адпаведныя зьвесткі мовы не былі ўсталяваныя. Артыкул можа быць няправільна прачытаны.
+ Ня знойдзеныя ўсталяваныя праграмы для гэтага тыпу файлу
+ Ня знойдзеныя загалоўкі зьместу
+ Каб атрымаць доступ да зьместу оф-лайн, нам трэба мець доступ да вашага сховішча
+ Вы сапраўды хочаце выдаліць гісторыю пошуку і скінуць усе актыўныя закладкі?
+ Выдаліць гэты элемэнт?
+ Уся гісторыя ачышчаная
+ Ачысьціць усю гісторыю?
+ Выдаліць
+ Нядаўні пошук выдалены
+ Зразумела
+ Ці ведалі вы?
+ Закладка дададзеная
+ Калі ласка, ацаніце нас
+ Калі вам падабаецца карыстацца
+ , калі ласка, знайдзіце час, каб ацаніць. Дзякуем за вашую падтрымку!
+ Ацаніць!
+ Не, дзякуй
+ Пазьней
+ Закладка выдаленая
+ Адкрыць новую ўкладку на фоне
+ Пры адкрыцьці новай укладкі, яна будзе адкрытая на заднім пляне
+ Дадаткова
+ Прылада
+ Што робіць Kiwix?
+ Дзе зьмест?
+ Выбачайце, мы не змаглі выдаліць некаторыя файлы. Паспрабуйце скарыстацца файлавым кіраўніком.
+ Спыніць загрузку?
+ Вы ўпэўненыя, што хочаце спыніць гэтую загрузку?
+ Вы ўводзіце вонкавую спасылку. Гэта можа прывесьці да зьняцьця грошай мабільным апэратарам ці проста не спрацаваць, калі вы знаходзіцеся ў офлайне. Хочаце працягнуць?
+ Болей не пытаць
+ Выбраныя мовы:
+ Іншыя мовы:
+ Падобна, што мы паламаліся.\n\nЦі можаце дапамагчы нам выправіць гэтую праблему, адаслаўшы наступную інфармацыю?
+ Вашыя моўныя налады
+ Сьпіс вашых zim-файлаў
+ Падрабязнасьці аварыі
+ Журналы праграмы
+ Падрабязнасьці прылады
+ Скарот недаступны
+ Новая ўкладка
+ Атрымаць зьмест
+ Любімая іконка
+ %s артыкулаў
+ Пачаць
+ Скачвайце кнігі
+ Веды чалавецтва ў вашым тэлефоне.
+ Вітаем у сям’і
+ Нататкамі нельга карыстацца бяз доступу да сховішча
+ Android вымагае лякальнага дазволу на доступ праграмы да вызначэньня прыладаў
+ Няма закладак
+
diff --git a/core/src/main/res/values-ckb/strings.xml b/core/src/main/res/values-ckb/strings.xml
index dc9e4b858..67427115c 100644
--- a/core/src/main/res/values-ckb/strings.xml
+++ b/core/src/main/res/values-ckb/strings.xml
@@ -1,6 +1,7 @@
@@ -17,25 +19,49 @@
Vollbild beenden
Vorlesen
Mit dem Vorlesen aufhören
+ Spenden
Medium speichern
Beim Versuch, das Medium zu speichern, ist ein Fehler aufgetreten!
Medium als %s nach Android/media/org.kiwix…/ gespeichert
Suchen
Wähle eine Inhaltsdatei aus (*.zim)
Link in neuer Registerkarte öffnen?
+ Hotspot Servicekanal
+ Hotspot konnte nicht gestartet werden
+ Es scheint, Ihr Hotspot ist bereits aktiviert. Bitte deaktivieren Sie Ihren Wi-Fi Hotspot, um weiterzumachen.
+ Gehen Sie zu den Wi-Fi Einstellungen
+ Aktiver Hotspot
+ Bitte zuerst Bücher aussuchen
+ Konnte den Server nicht starten. Bitte aktivieren Sie Ihren Hotspot
+ Konnte den Server nicht starten.
+ Server erfolgreich gestartet.
Server erfolgreich gestoppt.
+ Hotspot aktiviert
+ Angaben zu Ihrem lokalen Hotspot.\nSSID : %1$s \nPass : %2$s
+ Wählen Sie die Dateien aus, die Sie auf dem Server hosten möchten
+ Starte den Server
+ Wi-Fi-Verbindung festgestellt
+ Um Bücher auf anderen Einheiten anzusehen, stellen Sie bitte sicher, dass alle Einheiten mit dem gleichen WiFi-Netzwerk verbunden sind.
+ Damit diese Funktion läuft, müssen Sie zuerst den Hotspot manuell aktivieren oder sicherstellen, dass Host und Empfangsgerät im gleichen Wi-Fi-Netzwerk angemeldet sind
+ WEITER
+ Updates zum Status Ihres Hotspots/Servers.
+ Kiwix-Hotspot
+ Server starten
+ Server anhalten
+ Geben Sie diese IP-Adresse in Ihren Browser ein, um auf den Server %s zuzugreifen
Fehler: Die ausgewählte ZIM-Datei konnte nicht gefunden werden.
+ Konnte die ZIM-Datei nicht öffnen
Fehler: Die ausgewählte Datei ist keine gültige ZIM-Datei.
Fehler: Das Laden des Artikels (URL: %1$s) ist fehlgeschlagen.
Anzeige
Information
Version
Nachtmodus
- Artikel mit umgekehrten Farben ansehen
+ Artikel mit umgekehrten Farben anzeigen
Zurück nach oben
Zeigt einen Button am Seitenende an, um zum Anfang hochzuscrollen.
- Werkzeugleiste beim Scrollen ausblenden
- Werkzeugleiste ausblenden, wenn auf der Seite heruntergescrollt wird.
+ Werkzeugleiste weiterhin anzeigen
+ Verhindert, dass die Werkzeugleiste verschwindet, wenn auf der Seite im Inhalt gebrowst wird
Sprache
Eine Sprache auswählen
Autoren und Lizenzen
@@ -44,25 +70,28 @@
Es konnte keine installierte Anwendung für diesen Dateityp gefunden werden
Keine Inhaltsheader gefunden
Um auf Offlineinhalt zuzugreifen, müssen wir auf Ihren Speicher zugreifen.
- Sind Sie sicher, dass Sie Ihren Suchverlauf löschen und alle aktiven Reiter zurücksetzen möchten?
+ Sind Sie sicher, dass Sie Ihren Suchverlauf löschen und alle aktiven Registerkarten zurücksetzen möchten?
Dieses Element löschen?
Verlauf löschen
- Letzte Suchanfragen und Reiterverlauf löschen
+ Letzte Suchanfragen und Registerkartenverlauf löschen
Gesamter Verlauf gelöscht
+ Lesezeichen löschen
Gesamten Verlauf löschen?
+ Teilen
+ Teile ZIM-Dateien mit:
Löschen
Abbrechen
Letzte Suche entfernt
Sie können nach links wischen, um die Inhalte dieses Artikels anzusehen.
Verstanden
Schon gewusst?
- Rückgängig
- Reiter geschlossen
+ Rückgängig machen
+ Registerkarte geschlossen
Lesezeichen hinzugefügt
- Bitte bewerte uns
- Wenn du
- magst, nimm dir zur Bewertung einen Moment Zeit. Vielen Dank für deine Unterstützung!
- Bewerten!
+ Bitte bewerten Sie uns
+ Wenn Sie
+ mögen, nehmen Sie sich zur Bewertung einen Moment Zeit. Vielen Dank für Ihre Unterstützung!
+ Bewerten Sie!
Nein danke
Später
Öffnen
@@ -70,16 +99,17 @@
Neue Registerkarte im Hintergrund öffnen
Beim Öffnen einer neuen Registerkarte wird sie im Hintergrund geöffnet
Extras
- Artikel in neuem Reiter geöffnet
+ Artikel in neuer Registerkarte geöffnet
Kiwix durchsuchen
Sprechen, um %s zu suchen
Leider unterstützt Ihr Gerät keine Spracheingabe!
Gerät
Online
Bibliothek
- Datei gelöscht
+ Die folgende(n) ZIM-Datei(en) werden gelöscht werden: %s
+ Dateien erfolgreich gelöscht
Hier gibt es keine Dateien
- Nicht ausreichender Speicher um herunterzuladen.
+ Unzureichender Speicherplatz für einen Download.
Verfügbarer Speicher:
Einfach
Keine Bilder
@@ -87,17 +117,17 @@
Keine Netzwerkverbindung
Was macht Kiwix?
Kiwix ist eine Lesesoftware für Offlineinhalte. Sie funktioniert wie ein Browser, aber anstatt auf Webseiten online zuzugreifen, liest sie Inhalte von einer Datei im ZIM-Format.
- Obwohl Kiwix ursprünglich entwickelt wurde, um Wikipedia offline zur Verfügung zu stellen, liest es auch andere Inhalte.
+ Obwohl Kiwix ursprünglich entwickelt wurde, um Wikipedia offline zur Verfügung zu stellen, liest es auch andere Inhalte.
Wo ist der Inhalt?
Unser Inhalt wird auf der Kiwix-Website zur Verfügung gestellt.
Sie sind verfügbar als ZIM-Dateien. Es gibt viele von ihnen:
• Wikipedia ist für jede Sprache getrennt verfügbar
• Andere Inhalte wie Wikileaks oder Wikisource sind ebenfalls verfügbar
- Sie können entweder Ihre ausgewählten ZIM-Dateien in der App herunterladen oder die gewünschten Datei(en) sorgsam auf einem Desktopcomputer auswählen und herunterladen, bevor Sie die ZIM-Dateien auf Ihre SD-Karte übertragen.
+ Sie können entweder Ihre ausgewählten ZIM-Dateien in der App herunterladen oder die gewünschten Datei(en) sorgsam auf einem Desktopcomputer auswählen und herunterladen, bevor Sie die ZIM-Dateien auf Ihre SD-Karte übertragen.
Heruntergeladene ZIM-Dateien in der App befinden sich im Verzeichnis des externen Speichers in einem Ordner namens Kiwix.
Speicher
Aktueller Ordner
- Leider können wir diese Datei nicht löschen. Sie sollten versuchen, stattdessen einen Dateimanager zu verwenden.
+ Leider können wir diese Datei nicht löschen. Sie sollten versuchen, stattdessen einen Dateimanager zu verwenden.
pausieren
fortfahren
abbrechen
@@ -109,6 +139,9 @@
Sind Sie sicher, dass Sie diesen Download abbrechen möchten?
Speichergeräteauswahl
Text-to-Speech ist für diese ZIM-Datei nicht aktiviert
+ Die Initialisierung von Text-to-Speech ist fehlgeschlagen. Bitte versuchen Sie es noch einmal
+ Unerwarteter Fehler bei Text-to-Speech. Bitte versuchen Sie es noch einmal
+ Unerwarteter Fehler beim Suchen. Bitte versuchen Sie es noch einmal
Nächste
Vorherige
Herunterladen des Inhalts über das mobile Netzwerk erlauben?
@@ -119,6 +152,8 @@
Minuten
Sekunden
verbleibend
+ Heute
+ Gestern
Beim Einfügen von externen Links warnen
Popups für Warnungen über zusätzliche Kosten oder das Nichtfunktionieren von Offlinelinks anzeigen.
Externen Link einfügen!
@@ -126,12 +161,115 @@
Nicht mehr fragen
Ausgewählte Sprachen:
Weitere Sprachen:
+ Keine Objekte verfügbar
+ Also… Das ist peinlich.
+ Es sieht aus, als wären wir abgestürzt.\n\nWürde es Ihnen etwas ausmachen, uns bei der Behebung dieses Problems zu helfen, indem Sie uns die folgenden Informationen schicken?
+ Ihre Spracheinstellungen
+ Eine Liste Ihrer ZIM-Dateien
+ Einzelheiten zum Absturz
+ Anwendungsprotokolle
+ Geräte-Details
+ DETAILS SCHICKEN
+ Abkürzung nicht verfügbar
+ Neue Registerkarte
+ Inhalte abrufen
+ Favicon
+ %s Artikel
+ Anfangen
+ Bücher herunterladen
+ Das Wissen der Menschheit, auf Ihrem Handy.
+ Willkommen in der Familie
+ Bücher offline speichern
+ Bücher herunterladen und lesen wo immer man ist
+ Konnte kein Lesezeichen hinzufügen
+ Zur vorherigen Seite gehen
+ Zur nächsten Seite gehen
+ Inhaltsverzeichnis
+ Sprachen auswählen
+ Sprachen speichern
+ Rückmeldung senden
+ Ausklappen
+ Verlauf
+ Zeige die Verlaufsgeschichte aller Bücher
+ Suchverlauf
+ %1$d ausgewählt
+ Zeige die Lesezeichen aller Bücher
+ Lesezeichen durchsuchen
+ Registerkarten wechseln
+ Alle Registerkarten schließen
+ Ausstehend
+ In Bearbeitung
+ Vervollständigt
+ Pausiert
+ Fehlgeschlagen: %s
+ Speichern
+ Notiz
+ Wiki-Artikel-Titel
+ Speicherzugriff ist für Notizen erforderlich
+ Notizen können ohne Zugriff auf den Speicher nicht verwendet werden
+ Notiz Speichern erfolglos
+ Notiz erfolgreich gelöscht
+ Notiz wurde nicht gelöscht
+ Notiz gespeichert
+ Fehler beim Speichern der Notiz: Speicher nicht beschreibbar
+ Notizdatei existiert nicht
+ Teile Notizdatei mit:
+ Nicht gespeicherte Änderungen verwerfen?
+ Alle Notizen löschen?
+ Fehler: Speicherberechtigungen nicht gewährt
+ Gesamter Notizen-Ordner gelöscht
+ Einige Dateien nicht gelöscht
+ %d Buch/Bücher
+ Erkennung eingeleitet
+ Erkennung fehlgeschlagen
+ Schwerer Fehler! Versuchen Sie, Wi-Fi P2P auszuschalten und wieder einzuschalten
+ Verbindung fehlgeschlagen
+ Android benötigt eine Standorterlaubnis, damit die App Peer-Geräte erkennen kann.
+ Ohne Standortberechtigungen können Peer-Geräte nicht lokalisiert werden
+ Ohne Speichererlaubnis ist kein Zugriff auf ZIM-Dateien möglich
+ Standort aktivieren, um Peer-Geräte zu finden
+ Ohne standortbezogene Dienste können keine Peer-Geräte gefunden werden
+ Aktivieren Sie Wi-Fi P2P in den Systemeinstellungen
+ Kann ohne Wi-Fi ON keine Peer-Geräte finden
+ Dateien an %s übertragen?
+ Das gewählte Gerät kooperiert nicht bei der Übertragung
+ Dateiübertragung abgeschlossen
+ Bei der Übertragung wurde ein Fehler festgestellt
+ Fehler beim Übertragen der Datei %s
+ Inhalte von einem Gerät in der Nähe abrufen
+ Nach Peer-Geräten suchen
+ Ihr Gerät:
+ GERÄTE IN DER NÄHE
+ Keine Geräte erkannt. Tippen Sie auf die Schaltfläche Suchen, um es erneut zu versuchen.
+ DATEIEN ZUR ÜBERTRAGUNG
+ Dateien für die Übertragung werden vorbereitet....
+ Führe Handshake durch....
+ Status
+ Löscht alle Notizen zu allen Artikeln
+ Alle Notizen löschen
+ Bild
+ Video
+ Nur Text
+ Kurzer Text
+ Speichergenehmigung verweigert
+ Diese Anwendung erfordert die Fähigkeit, Speicher zu lesen, um zu funktionieren. Bitte erteilen Sie die Erlaubnis in Ihren Einstellungen
+ Gehen Sie zu den Hotspot-Einstellungen
Keine Ergebnisse
Keine Lesezeichen
- Verlauf löschen?
- Lesezeichen löschen?
+ Kein Verlauf
+ Gerätevoreinstellung
+ Gesamten Verlauf löschen?
+ Ausgewählter Verlauf löschen?
+ Alle Lesezeichen löschen?
+ Ausgewählte Lesezeichen löschen?
+ An
+ Aus
+ Automatisch
Übermittle das Untersuchungsergebnis
Speichere System Details
Untersuchungsergebnis
Bitte übermittle alle nachfolgend aufgeführte Details, damit wir das Problem feststellen können
+ %d%%
+ Text Zoom
+ Experimentelle Navigation
diff --git a/core/src/main/res/values-diq/strings.xml b/core/src/main/res/values-diq/strings.xml
index 87b758f86..25f540fdb 100644
--- a/core/src/main/res/values-diq/strings.xml
+++ b/core/src/main/res/values-diq/strings.xml
@@ -197,8 +197,8 @@
Nişani çıniyê
Veror Çıniyo
Hesabyayey Cihazi
- Veror wa Bıesterneyo?
- Bookmarki wa Bıesterneyo?
+ Veror wa Bıesterneyo?
+ Bookmarki wa Bıesterneyo?
Akerde
Racınaye
Otomatik
diff --git a/core/src/main/res/values-el/strings.xml b/core/src/main/res/values-el/strings.xml
index bcdb1784f..9d0d21c41 100644
--- a/core/src/main/res/values-el/strings.xml
+++ b/core/src/main/res/values-el/strings.xml
@@ -138,5 +138,9 @@
Επιλεγμένες γλώσσες:
Άλλες γλώσσες:
Χωρίς σελιδοδείκτες
+ Διαγραφή όλου του ιστορικού;
+ Διαγραφή επιλεγμένου ιστορικού;
+ Διαγραφή όλων των σελιδοδεικτών;
+ Διαγραφή επιλεγμένων σελιδοδεικτών;
Μεγέθυνση κειμένου
diff --git a/core/src/main/res/values-es/strings.xml b/core/src/main/res/values-es/strings.xml
index 9f759fb99..3c53ec47b 100644
--- a/core/src/main/res/values-es/strings.xml
+++ b/core/src/main/res/values-es/strings.xml
@@ -216,4 +216,5 @@
Datos del sistema operativo
Informe de diagnóstico
Envíe todos los detalles siguientes para que podamos diagnosticar el problema.
+ Navegación experimental
diff --git a/core/src/main/res/values-fa/strings.xml b/core/src/main/res/values-fa/strings.xml
index 0d40e680b..461d4eae5 100644
--- a/core/src/main/res/values-fa/strings.xml
+++ b/core/src/main/res/values-fa/strings.xml
@@ -155,8 +155,8 @@
بدون نتیجه
نشانکی نیست
تاریخچهای نیست
- تاریخچه حذف شود؟
- نشانکها حذف شوند؟
+ تاریخچه حذف شود؟
+ نشانکها حذف شوند؟
روشن
خاموش
خودکار
diff --git a/core/src/main/res/values-fr/strings.xml b/core/src/main/res/values-fr/strings.xml
index 29dbff0d0..844b692fa 100644
--- a/core/src/main/res/values-fr/strings.xml
+++ b/core/src/main/res/values-fr/strings.xml
@@ -28,7 +28,7 @@
Lire à haute voix
Arrêter de lire à haute voix
Soutenir Kiwix
- Héberger des livres
+ Diffuser des contenus
Enregistrer le média
Une erreur s’est produite en essayant d’enregistrer le média !
Média enregistré sous %s dans le dossier Android/media/org.kiwix…/
@@ -172,7 +172,7 @@
Langues sélectionnées :
Autres langues :
Aucun élément disponible
- Et bien… c’est embarrassant
+ Eh bien… c’est embarrassant
Il semble que nous ayons planté.\n\nPourriez-vous nous aider à corriger ce problème en envoyant l’information suivante ?
Vos paramètres de langue
Une liste de vos fichiers ZIM
@@ -268,8 +268,10 @@
Aucun marque-page
Aucun historique
Appareil par défaut
- Supprimer l’historique ?
- Supprimer les marque-pages ?
+ Supprimer tout l’historique ?
+ Supprimer l’historique sélectionné ?
+ Supprimer tous les signets ?
+ Supprimer les marque-pages sélectionnés ?
Activé
Désactivé
Automatique
@@ -278,5 +280,6 @@
Rapport de diagnostic
Veuillez envoyer tous les détails suivants afin que nous puissions diagnostiquer le problème
%d%%
- Zoom du texte
+ Zoomer le texte
+ Navigation expérimentale
diff --git a/core/src/main/res/values-gsw/strings.xml b/core/src/main/res/values-gsw/strings.xml
new file mode 100644
index 000000000..86d7cae4b
--- /dev/null
+++ b/core/src/main/res/values-gsw/strings.xml
@@ -0,0 +1,122 @@
+
+
+
+ Hilf
+ Yystellige
+ I de Syte finde
+ Läsezeiche
+ Zuefälligi Syte
+ Vollbildschirm
+ Vollbildmodus beende
+ Vorläse
+ Ufhöre vorläse
+ Kiwix unterstützä
+ Medie spychere
+ Bim Spychere vo de Medie isch ä Fähler passiert!
+ Medie als %s nach Android/media/org.kiwix…/ gspycheret
+ Sueche
+ Inhaltedatei (*.zim) uswähle
+ Bitte zersch Büecher uswähle
+ Server het nid chönne gschtartät wärde.
+ Server erfolgriich gschtartät.
+ Server erfolgriich gschtopped.
+ Server am Schtartä
+ Inschtruktionä um Büecher bereit z\'stellä
+ WIITERMACHE
+ Server schtartä
+ Server schtoppe
+ Fehler: Di usgwählti ZIM-Datei isch nit gfunde worde.
+ Cha zim Datei nid uftue
+ Fehler: Di usgwählti Datei isch chei gültigi ZIM-Datei.
+ Fehler: S\' Lade vom Artikel (URL: %1$s) het nit gchlappt.
+ Azeig
+ Information
+ Version
+ Nachtmodus
+ Zeig d\'Artikel mit umcherte Farbe
+ Zruck nach obe
+ Zeig e Chnopf am End vo dr Syte zuem uffe rolle
+ Wärchzüglischte sichtbar bhaute
+ Sprach
+ E Sprach uswähle
+ Das Elemänt löschä?
+ Verlouf lösche
+ Ganzä Verlouf glöscht
+ Ganzä Verlouf lösche?
+ Teile
+ ZIM Dateiä teilä mit:
+ Lösche
+ Abbräche
+ Letschti Suech entfärnt
+ Nach linggs wüsche um dr Inhaut vo däm Artikel aazluege
+ Verschtande
+ Scho gwüsst?
+ Rückgängig machä
+ Tuä üs bewärte
+ Bewärte!
+ Nei danke
+ Spääter
+ Ufmache
+ Äxtras
+ Kiwix dürsuechä
+ Grät
+ Bibliothek
+ Dateiä erfolgriich glöscht
+ Hie hets ke Dateiä
+ Nid gnüegend Spiicherplatz um abezladä.
+ Verfüegbaare Spiicherplatz:
+ Eifach
+ Ke Bilder
+ Ke Videos
+ Keni Netzwärkverbindig
+ Wo isch der Inhaut?
+ Spiicher
+ Aktuelle Ordnär
+ pousiere
+ wiitermache
+ schtoppe
+ Ja
+ Nei
+ Abeladä schtoppä?
+ Nächschti
+ Vorhärigi
+ Hüt
+ Geschter
+ Nümme fraagä
+ Zur vorherigä Syte gah
+ Zur nächschtä Syte gah
+ Spraach uswähle
+ Ufklappe
+ Suechverläuf
+ %1$d usgwählt
+ Fertig
+ Pousiert
+ Fählgschlage: %s
+ Spychere
+ Notiz
+ Notiz spychere fählgschlage
+ Notiz erfolgriich glöscht
+ Notiz isch nid glöscht worde
+ Notiz gspycheret
+ Diä Notiz Datei gits nid
+ Aui Notizä lösche?
+ Gwüssi Dateiä si nid glöscht worde
+ Verbindig fählgschlagä
+ Dateiübertragig abgschlossä
+ Es isch ä Fähler passiert während dr Übertragig
+ Fähler bim Übertrage vor Datei %s
+ Dateiä am Vorbereitä für d\'Übertragig…
+ Status
+ Alli Notizä lösche
+ Numä Texscht
+ Churzä Texscht
+ Ke Ergäbnis
+ Ke Verlouf
+ Verlouf lösche?
+ Aa
+ Uus
+ %d%%
+
diff --git a/core/src/main/res/values-in/strings.xml b/core/src/main/res/values-in/strings.xml
index cbfc54e67..71d7a9bc6 100644
--- a/core/src/main/res/values-in/strings.xml
+++ b/core/src/main/res/values-in/strings.xml
@@ -3,6 +3,7 @@
* Abijeet Patro
* Arifin.wijaya
* Arifpedia
+* Esiahaan
* Iwan Novirion
* Kenrick95
* Relly Komaruzaman
@@ -19,13 +20,28 @@
Keluar dari modus layar penuh
Bacakan
Hentikan pembacaan
+ Dukung Kiwix
Simpan Media
Terjadi kesalahan saat menyimpan media!
Simpan media sebagai %s pada Android/media/org.kiwix…/
Cari
Pilih Berkas Konten (*.zim)
Buka pranala di tab baru?
+ Saluran Servis Hotspot
+ Hotspot gagal dihidupkan
+ Tampaknya hotspot Anda telah hidup. Silakan memutuskan koneksi hotspot wifi Anda untuk lanjut.
+ Ke pengaturan WIFI
+ Server tidak dapat dihidupkan. Silakan menyalakan hotspot Anda.
+ Server tidak dapat dinyalakan.
+ Server berhasil dinyalakan.
+ Server berhasil dimatikan.
+ Hotspot sudah menyala.
+ Berikut adalah detil hotspot lokal Anda.\nSSID : %1$s\nPass : %2$s
+ Menyalakan server
+ LANJUT
+ Masukkan alamat IP ini ke browser Anda untuk mengakses server %s
Galat: Berkas ZIM yang dipilih tidak ditemukan.
+ Zim file tidak dapat dibuka
Galat: Berkas yang dipilih bukan berkas ZIM yang sah.
Galat: Pemuatan artikel (Url: %1$s) gagal.
Tampilan
@@ -51,7 +67,10 @@
Hapus riwayat penelusuran dan tab terakhir
Semua Markah Telah Dibersihkan
Bersihkan Semua Markah
+ Bagikan
+ Bagikan ZIM file dengan:
Hapus
+ Batalkan
Penelusuran terakhir telah dihapus
Anda bisa menggulir ke kiri untuk melihat isi artikel ini
Mengerti
@@ -77,9 +96,10 @@
Perangkat
Daring
Perpustakaan
+ Zim file berikut akan dihapus:\n\n%s
Berkas telah dihapus
Tidak ada berkas disini
- Ruang tidak mencukupi untuk mengunduh berkas ini.
+ Tidak tersedia cukup ruang data untuk mengunduh.
Ruang yang Tersedia:
Sederhana
Tanpa Gambar
@@ -87,7 +107,7 @@
Tidak ada sambungan jaringan
Apa yang Kiwix lakukan?
Kiwix adalah pembaca konten luring. Ini sangat mirip peramban tapi bukannya mengakses halaman web daring, Kiwix membaca konten dari sebuah berkas dalam format ZIM.
- Pada awalnya Kiwix dirancang untuk menyediakan Wikipedia luring, namun juga dapat membaca konten lainnya.
+ Meskipun Kiwix awalnya dirancang untuk menyediakan Wikipedia secara offline, Kiwix juga dapat membaca konten lainnya.
Dimana kontennya?
Konten kami disimpan di situs web Kiwix.
Mereka tersedia sebagai berkas ZIM. Ada banyak dari mereka:
@@ -127,6 +147,13 @@
Bahasa terpilih:
Bahasa lain:
Humankind\'s knowledge, on your phone.
+ Ke halaman sebelumnya
+ Ke halaman berikutnya
+ Pilih bahasa
+ Simpan bahasa
+ Kirim masukan
+ Tutup semua tab
+ Selesai
Notes can\'t be used without access to storage
Note file doesn\'t exist
Tidak Ada Markah
diff --git a/core/src/main/res/values-it/strings.xml b/core/src/main/res/values-it/strings.xml
index 6a064952f..d927e7274 100644
--- a/core/src/main/res/values-it/strings.xml
+++ b/core/src/main/res/values-it/strings.xml
@@ -4,6 +4,7 @@
* CloeRiva
* Einreiher
* G.garatti
+* Gianfranco
* Matteocng
* Nivit
* Purodha
@@ -100,6 +101,7 @@
Vai alle impostazioni hotspot
Nessun risultato
Nessun segnalibro
- Cancellare la cronologia?
- Cancellare i segnalibri?
+ Cancellare tutta la cronologia?
+ Cancellare tutti i segnalibri?
+ Navigazione sperimentale
diff --git a/core/src/main/res/values-iw/strings.xml b/core/src/main/res/values-iw/strings.xml
index 2ce2ef247..bbfc65cae 100644
--- a/core/src/main/res/values-iw/strings.xml
+++ b/core/src/main/res/values-iw/strings.xml
@@ -260,8 +260,10 @@
אין סימניות
אין היסטוריה
ברירת המחדל של המכשיר
- למחוק היסטוריה?
- למחוק מועדפים?
+ למחוק את כל ההיסטוריה?
+ למחוק את ההיסטוריה שנבחרה?
+ למחוק את כל המועדפים?
+ למחוק את המועדפים שנבחרו?
מופעל
כבוי
אוטומטי
@@ -269,4 +271,5 @@
פרטי מערכת קבצים
דוח אבחון
נא לשלוח את כל הפרטים הבאים כדי שנוכל לאבחן את התקלה
+ ניווט ניסיוני
diff --git a/core/src/main/res/values-ko/strings.xml b/core/src/main/res/values-ko/strings.xml
index 51b90b0a1..cf24558ea 100644
--- a/core/src/main/res/values-ko/strings.xml
+++ b/core/src/main/res/values-ko/strings.xml
@@ -4,6 +4,7 @@
* Alex00728
* CYAN
* Codenstory
+* Ellif
* Gongsoonyee
* Jerrykim306
* Macofe
@@ -41,7 +42,7 @@
서버를 시작하지 못했습니다.
서버가 성공적으로 시작되었습니다.
서버가 성공적으로 중단되었습니다.
- 핫스팟이 켜져있습니다
+ 핫스팟이 켜져 있습니다
다음은 로컬 핫스팟의 상세 정보입니다.\nSSID : %1$s \nPass : %2$s
서버에 호스팅할 파일을 선택하십시오
서버 시작 중
@@ -264,7 +265,9 @@
역사 없음
장치 기본값
역사를 삭제할까요?
+ 선택한 역사를 지울까요?
북마크를 삭제할까요?
+ 선택한 북마크를 지울까요?
켜기
끄기
자동
@@ -272,4 +275,6 @@
파일 시스템 세부 정보
진단 보고서
저희가 문제를 진단할 수 있도록 다음의 자세한 정보를 모두 보내 주세요
+ %d%%
+ 글자 크기 조정
diff --git a/core/src/main/res/values-lb/strings.xml b/core/src/main/res/values-lb/strings.xml
index a5fda61de..3e0f0d404 100644
--- a/core/src/main/res/values-lb/strings.xml
+++ b/core/src/main/res/values-lb/strings.xml
@@ -114,9 +114,10 @@
Keng Resultater
Keng Lieszeechen!
Keen Historique
- Versioune läschen?
- Lieszeeche läschen?
+ Versioune läschen?
+ Lieszeeche läschen?
Un
Aus
Automatesch
+ Experimentell Naavigatioun
diff --git a/core/src/main/res/values-mk/strings.xml b/core/src/main/res/values-mk/strings.xml
index 7dc73427c..a31cce3b5 100644
--- a/core/src/main/res/values-mk/strings.xml
+++ b/core/src/main/res/values-mk/strings.xml
@@ -255,8 +255,10 @@
Нема обележувачи
Нема историја
Основно на уредот
- Да ја избришам историјата?
- Да ги избришам обележувачите?
+ Да ја избришам сета историја?
+ Да ја избришам избраната историја?
+ Да ги избришам сите обележувачи?
+ Да ги избришам избраните обележувачи?
Вкл.
Искл.
Авто
@@ -266,4 +268,5 @@
Испратете ги сите следни поединости за да можеме да го дијагностицираме проблемот
%d%%
Приближување на текст
+ Опитен прегледник
diff --git a/core/src/main/res/values-ml/strings.xml b/core/src/main/res/values-ml/strings.xml
index e3e6d328e..92d32c5a9 100644
--- a/core/src/main/res/values-ml/strings.xml
+++ b/core/src/main/res/values-ml/strings.xml
@@ -130,5 +130,5 @@
സജ്ജീകരണങ്ങളിലേക്ക് പോവുക
ഫലങ്ങൾ ഒന്നുമില്ല
നാൾവഴിയില്ല
- നാൾവഴി ഒഴിവാക്കട്ടെ?
+ നാൾവഴി ഒഴിവാക്കട്ടെ?
diff --git a/core/src/main/res/values-ne/strings.xml b/core/src/main/res/values-ne/strings.xml
index 22a09da40..cb03b4f68 100644
--- a/core/src/main/res/values-ne/strings.xml
+++ b/core/src/main/res/values-ne/strings.xml
@@ -2,6 +2,7 @@
-
-
-
- @color/blue400
-
- @color/gray900
- @color/pink300
-
- @color/white
- @color/white
- @color/white
-
- @color/gray350
- @color/gray500
- @color/gray850
-
diff --git a/core/src/main/res/values-night/themes.xml b/core/src/main/res/values-night/themes.xml
index 31d077d1e..4569086d5 100644
--- a/core/src/main/res/values-night/themes.xml
+++ b/core/src/main/res/values-night/themes.xml
@@ -1,9 +1,19 @@
-
+ - @color/denim_blue400
+ - @color/mine_shaft_gray900
+ - @color/froly_pink300
+
+ - @color/alabaster_white
+ - @color/alabaster_white
+ - @color/alabaster_white
+
+ - @color/mine_shaft_gray350
+ - @color/mine_shaft_gray500
+ - @color/mine_shaft_gray850
+
diff --git a/core/src/main/res/values-nl/strings.xml b/core/src/main/res/values-nl/strings.xml
index 9895f4794..384680e32 100644
--- a/core/src/main/res/values-nl/strings.xml
+++ b/core/src/main/res/values-nl/strings.xml
@@ -1,4 +1,13 @@
-
+
+
Hulp
Startpagina
@@ -11,10 +20,10 @@
Voorlezen
Stoppen met voorlezen
Media opslaan als…
- Er is een fout opgetreden bij het opslaan van de media!
- Het bestand is opgeslagen als %1$s in uw afbeeldingenmap
+ Er is een fout opgetreden bij het opslaan van de media!
+ Het bestand is opgeslagen als %1$s in uw afbeeldingenmap
Zoeken
- Selecteer een ZIM inhoudsbestand (*.zim)
+ Selecteer een ZIM inhoudsbestand (*.zim)
Koppeling openen in nieuw tabblad?
Fout: het geselecteerde ZIM-bestand kon niet gevonden worden.
Fout: het geselecteerde bestand is geen geldig ZIM-bestand.
@@ -30,29 +39,68 @@
Taal kiezen
De taak van deze pagina wordt niet ondersteund, of de juiste taalgegevens zijn niet geïnstalleerd. De pagina kan niet correct gelezen worden.
Kon geen geïnstalleerde applicatie vinden voor dit type bestand
- Geen inhoudsheaders gevonden
- Om toegang te krijgen tot ZIM-bestanden is toegang tot uw opslag nodig
+ Geen inhoudsheaders gevonden
+ Om toegang te krijgen tot ZIM-bestanden is toegang tot uw opslag nodig
+ Dit item verwijderen?
+ Verwijderen
+ Annuleren
+ Wist u dat?
+ Ongedaan maken
Bladwijzer toegevoegd
Beoordeel ons alstublieft
Als u geniet van het gebruik van
, geef dan even een beoordeling. Dank u wel voor uw steun!
Beoordelen!
Nee, bedankt
+ Later
Nieuw tabblab in de achtergrond openen
Nieuwe tabbladen worden niet actief gemaakt
+ Apparaat
Bibliotheek
+ Eenvoudig
+ Geen afbeeldingen
Geen video\'s
Onze inhoud is ondergebracht op de Kiwix website
-
- - @string/help_3
- - @string/help_4
-
-
- - @string/help_6
- - @string/help_7
- - @string/help_8
- - @string/help_9
- - @string/help_10
- - @string/help_11
-
+ Opslag
+ Huidige map
+ pauzeren
+ hervatten
+ Intern
+ Extern
+ Ja
+ Nee
+ Volgende
+ Vorige
+ dag
+ u
+ min
+ s
+ te gaan
+ Vandaag
+ Gisteren
+ Geselecteerde talen:
+ Andere talen:
+ Nieuw tabblad
+ Aan de slag
+ Inhoudsopgave
+ Talen opslaan
+ Geschiedenis
+ Zoekgeschiedenis
+ Alle tabbladen sluiten
+ In afwachting
+ In behandeling
+ Afgerond
+ Gepauzeerd
+ Mislukt: %s
+ Opslaan
+ Opmerking
+ Bestandsoverdracht compleet
+ Uw apparaat:
+ Alleen text
+ Geen resultaten
+ Geen bladwijzers
+ Geen geschiedenis
+ Aan
+ Uit
+ Automatisch
diff --git a/core/src/main/res/values-pl/strings.xml b/core/src/main/res/values-pl/strings.xml
index c6ce0ba3f..785d38008 100644
--- a/core/src/main/res/values-pl/strings.xml
+++ b/core/src/main/res/values-pl/strings.xml
@@ -265,8 +265,8 @@
Brak zakładek
Nie ma Historii
Domyślne urządzenie
- Usunąć historię?
- Usunąć zakładki?
+ Usunąć historię?
+ Usunąć zakładki?
Włącz
Wyłącz
Automatycznie
diff --git a/core/src/main/res/values-pt-rBR/strings.xml b/core/src/main/res/values-pt-rBR/strings.xml
index 90456fe09..931dda5c5 100644
--- a/core/src/main/res/values-pt-rBR/strings.xml
+++ b/core/src/main/res/values-pt-rBR/strings.xml
@@ -261,8 +261,10 @@
Sem Favoritos
Sem histórico
Padrão do dispositivo
- Apagar histórico?
- Excluir marcadores?
+ Excluir todo o histórico?
+ Excluir histórico selecionado?
+ Excluir todos os favoritos?
+ Excluir favoritos selecionados?
Lig
Des
Auto
@@ -272,4 +274,5 @@
Envie todos os detalhes a seguir para que possamos diagnosticar o problema
%d%%
Zoom de texto
+ Navegação experimental
diff --git a/core/src/main/res/values-qq/strings.xml b/core/src/main/res/values-qq/strings.xml
index 8c3b1a4ed..eb77d37ab 100644
--- a/core/src/main/res/values-qq/strings.xml
+++ b/core/src/main/res/values-qq/strings.xml
@@ -1,10 +1,12 @@
-
@@ -15,6 +17,7 @@
{{Identical|Bookmark}}
{{Identical|Random article}}
{{Identical|Full screen}}
+ Il s\'agit de la fonctionnalité hotspot - l\'anglais \"host books\" n\'est pas particulièrement satisfaisant à la base.
{{Identical|Search}}
Do not change:\n* <code>%1$s</code> (replaced by the “SSID” value identifying the WiFi hotspot identity for users)\n* <code>%2$s</code> (replaced by the password or code configured in the hotspot to authorize the association and network connection)
This the title displayed when a user clicks wants to start the server in the host books section
@@ -28,8 +31,8 @@
{{Identical|Choose language}}
{{Identical|Delete}}
Ask if the user wants to delete all history items.
- Ask if the user wants to delete all bookmarks.
Ask if the user wants to delete a number of selected history items.
+ Ask if the user wants to delete all bookmarks.
Ask if the user wants to delete a number of selected bookmarks.
{{identical|Cancel}}
{{Identical|Undo}}
@@ -49,8 +52,8 @@
{{Identical|Save}}
This is used in the start server dialog and leads the user to mobile hotspot settings when pressed
This means \"there are no bookmarks\"
- This is a menu item that opens the applicaiton in a new experimental mode that uses different navigation.
This is used in the settings screen to turn on the night mode.
This is used in the settings screen to turn off the night mode.
This is used in the settings screen to turn the night mode on or off automatically depending upon the system settings of the phone.
+ This is a menu item that opens the applicaiton in a new experimental mode that uses different navigation.
diff --git a/core/src/main/res/values-ro/strings.xml b/core/src/main/res/values-ro/strings.xml
index a2d287d66..ff11b01ea 100644
--- a/core/src/main/res/values-ro/strings.xml
+++ b/core/src/main/res/values-ro/strings.xml
@@ -258,8 +258,8 @@
Nici un semn de carte
Fără Istorie
Dispozitiv prestabilit
- Șterge istoricul?
- Ștergeți semnele de carte?
+ Șterge istoricul?
+ Ștergeți semnele de carte?
Pornit
Oprit
Auto
@@ -267,4 +267,6 @@
Detalii Sistem Fișiere
Raport Diagnostic
Vă rugăm să trimiteți toate următoarele detalii, astfel încât să putem diagnostica problema
+ %d%%
+ Mărește text
diff --git a/core/src/main/res/values-ru/strings.xml b/core/src/main/res/values-ru/strings.xml
index 0fc94dbea..1dc0ff0c2 100644
--- a/core/src/main/res/values-ru/strings.xml
+++ b/core/src/main/res/values-ru/strings.xml
@@ -15,6 +15,8 @@
* Okras
* Pacha Tchernof
* Putnik
+* Smavrina
+* Teretalexev
-->
Помощь
@@ -24,18 +26,43 @@
Закладки
Случайная статья
Полный экран
- Выйти из режима полного экрана
+ Выйти из полноэкранного режима
Читать вслух
Остановить чтение вслух
+ Поддержать Kiwix
+ Разместить книги
Сохранить Медиа-файлы
Произошла ошибка при сохранении медиафайла!
Медиафайл сохранён как %s в Android/media/org.kiwix…/
Поиск
Выберите файл содержимого (*.zim)
Открыть ссылку в новой вкладке?
+ Сервисный канал Точки доступа
+ Не удалось запустить точку доступа
+ Кажется, ваша точка доступа уже включена. Пожалуйста, выключите точку доступа, чтобы продолжить.
+ Перейти к настройкам WIFI
+ Точка доступа работает
+ Пожалуйста, сначала выберете книги
+ Невозможно запустить сервер. Пожалуйста, включите вашу точку доступа
+ Невозможно запустить сервер.
+ Сервер успешно запущен
Сервер успешно остановлен.
+ Точка доступа включена
+ Детали вашей точки доступа:\nSSID: %1$s \nПароль: %2$s
+ Выберете файлы, которые вы хотите разместить на сервере
+ Запуск сервера
+ Инструкции по размещению книг
Обнаружено Wi-Fi подключение
+ Чтобы просматривать книги, размещённые на других устройствах, проверьте, что все устройства подсоединены к одной и той же сети WiFi.
+ Чтобы данная функция работала, вам нужно включить точку доступа WiFi или подключить устройства отправителя и получателя к одной и той же сети WiFi.
+ ПРОДОЛЖИТЬ
+ Обновления о состоянии вашей точки доступа/сервера.
+ Точка Доступа Kiwix
+ Запустить сервер
+ Остановить сервер
+ Введите этот IP адрес в ваш браузер чтобы получить доступ к серверу %s
Ошибка: выбранный ZIM-файл не найден.
+ Невозможно открыть файл zim
Ошибка: Выбранный файл не является пригодным ZIM-файлом.
Ошибка: Загрузка статьи (Url: %1$s) не удалась.
Экран
@@ -60,8 +87,12 @@
Очистить историю
Очистить недавние поисковые запросы и историю вкладок
Вся история очищена
- Очистить всю историю
+ Очистить закладки
+ Очистить всю историю?
+ Поделиться
+ Поделиться файлами ZIM с:
Удалить
+ Отменить
Последний поиск удалён
Вы можете пролистнуть влево, чтобы увидеть содержание статьи
Понятно
@@ -87,17 +118,18 @@
Устройство
Онлайн
Библиотека
+ Следующие файлы zim будут удалены:\n\n%s
Файл успешно удалён
Файлы отсутствуют
- Недостаточно места для загрузки этого файла.
+ Недостаточно места для загрузки.
Доступно Места:
Простой
Без картинок
- Нет видео
+ Без видео
Отсутствует сетевое подключение
Что делает Kiwix?
Kiwix - это автономный контент-ридер. Он действует схоже с браузером, но вместо обращения к онлайн страницам, он считывает содержимое из файла в формате ZIM.
- Хотя Kiwix и был изначально разработан, чтобы просматривать Wikipedia офлайн, он также пригоден и для другого содержимого.
+ Хотя Kiwix и был изначально разработан, чтобы просматривать Wikipedia оффлайн, он также пригоден и для другого содержимого.
Где содержимое?
Наш контент размещён на сайте Kiwix.
Они доступны как ZIM файлы. Их существует много:
@@ -120,43 +152,136 @@
Выбор носителя информации
Перевод текста в речь не доступен для этого ZIM файла
Не удалось инициализировать текст в речь. Пожалуйста, попробуйте еще раз
+ Непредвиденная ошибка при переводе текста в речь. Пожалуйста, попробуйте ещё раз.
Неожиданная ошибка при поиске. Пожалуйста, попробуйте еще раз
Далее
Предыдущий
Разрешить загрузку контента через мобильную сеть?
При выборе “Да”, вы не будете предупреждаться в будущем. Однако, вы всегда можете поменять это в Настройках.
- Загрузить контент только через WiFi
+ Загружать контент только через WiFi
день
ч
м
с
осталось
+ Сегодня
+ Вчера
Предупреждать когда происходит ввод внешних ссылок
Показать всплывающее сообщение про снятие дополнительных средств мобильным оператором или невозможности работы ссылок в офлайне.
- Ввод внешней ссылки
+ Ввод Внешней Ссылки!
Вы указали внешнюю ссылку. Её открытие может привести к снятию средств мобильным оператором или может не сработать, если вы офлайн. Хотите продолжить?
- Больше не спрашивай
+ Больше не спрашивать
Выбранные языки:
Другие языки:
+ Нет доступных элементов
+ Хммм… Как неловко
Похоже, приложение вылетело.\n\nНе могли бы вы помочь нам исправить эту проблему, предоставив следующую информацию?
Ваши Языковые Настройки
Список Ваших Zim Файлов
+ Детали ошибки
Журнал Действий Приложения
Подробности об Устройстве
ОТПРАВИТЬ ПОДРОБНОСТИ
- Скачивайте книги
+ Ярлык недоступен
+ Новая вкладка
+ Получить содержимое
+ Иконка
+ %s статей
+ Начать
+ Скачать книги
+ Знания человечества, на вашем телефоне.
+ Добро пожаловать в семью
+ Сохранить книги в автономный режим
Скачивайте книги и читайте, где бы вы ни были.
+ Не удалось добавить в закладки
+ Перейти к предыдущей странице
+ Перейти к следующей странице
+ Содержание
+ Выбрать языки
+ Сохранить языки
+ Отправить отзыв
Развернуть
- Закладки в текущей книге
+ История
+ Посмотреть историю из всех книг
+ Поиск в истории
+ %1$d выбрано
+ Показать Закладки Во Всех Книгах
+ Искать в закладках
+ Переключить вкладки
Закрыть все вкладки
+ В ожидании
+ В процессе
+ Завершено
+ Приостановлено
Ошибка: %s
+ Сохранить
+ Заметка
+ Заголовок Статьи Wiki
Разрешение на хранение необходимо для Заметок
Заметки не могут быть использованы без разрешения на хранение
+ Заметка не сохранена
+ Заметка успешно удалена
+ Заметка не была удалена
+ Заметка сохранена
+ Ошибка при сохранении заметки: запись в хранилище не разрешена
+ Файл заметок не существует
+ Поделиться файлом заметок с:
Отменить несохранённые изменения?
Удалить все заметки?
Ошибка: Отсутствует разрешение на хранение
- Очистить Все Заметки
+ Папка с заметками полностью удалена
+ Некоторые файлы не были удалены
+ %d книг
+ Обнаружение начато
+ Обнаружение не удалось
+ Серьёзная ошибка! Попробуйте выключить и снова включить WiFi P2P
+ Не удалось установить соединение
+ Доступ к местонахождению требуется Android для поиска близлежащих устройств
+ Невозможно обнаружить устройства без доступа к местоположению
+ Невозможно получить доступ к файлам zim без разрешения на доступ к хранилищу
+ Разрешите доступ к местоположению, чтобы позволить поиск устройств
+ Поиск близлежащих устройств невозможен без доступа к местоположению
+ Включите WiFi P2P в настройках системы
+ Поиск устройств невозможен без включённого WiFi
+ Передать файлы на %s?
+ Выбранное устройство отказало в передаче
+ Передача файла завершена
+ Произошла ошибка во время передачи файла
+ Ошибка при передаче файла %s
+ Получить контент с устройства рядом
+ Поиск устройств
+ Ваше устройство:
+ УСТРОЙСТВА РЯДОМ
+ Устройства не найдены. Нажмите кнопку Поиск чтобы попробовать ещё раз.
+ ФАЙЛЫ ДЛЯ ПЕРЕДАЧИ
+ Подготовка файлов для передачи…
+ Производим “рукопожатие”…
+ Статус
+ Очистить все заметки во всех статьях
+ Очистить все заметки
+ Изображение
+ Видео
+ Только текст
+ Короткий текст
+ Доступ к хранилищу запрещён
+ Для работы этому приложению необходим доступ к хранилищу на чтение. Пожалуйста, разрешите доступ в ваших настройках
+ Перейти к Настройкам Точки Доступа
+ Нет результатов
Нет Закладок
- Удалить историю?
- Удалить закладки?
+ История пуста
+ Настройки устройства по умолчанию
+ Удалить всю историю?
+ Очистить Выбранную историю?
+ Удалить все закладки?
+ Удалить Выбранные Закладки?
+ Вкл
+ Выкл
+ Авто
+ Отправить отчёт диагностики
+ Информация о файловой системе
+ Отчёт диагностики
+ Пожалуйста, пришлите нам всю информацию ниже, чтобы мы смогли обнаружить проблему
+ %d%%
+ Масштаб Текста
+ Экспериментальная навигация
diff --git a/core/src/main/res/values-sc/strings.xml b/core/src/main/res/values-sc/strings.xml
index c79f3552e..c4a79bc59 100644
--- a/core/src/main/res/values-sc/strings.xml
+++ b/core/src/main/res/values-sc/strings.xml
@@ -254,8 +254,8 @@
Perunu sinnalibru!
Peruna cronologia
Valore predefinidu de su dispositivu
- Iscantzellare sa cronologia?
- Iscantzellare sos sinnalibros?
+ Iscantzellare sa cronologia?
+ Iscantzellare sos sinnalibros?
Alluta
Istudada
Automàtica
diff --git a/core/src/main/res/values-sr/strings.xml b/core/src/main/res/values-sr/strings.xml
index 88724c186..18cdb0c20 100644
--- a/core/src/main/res/values-sr/strings.xml
+++ b/core/src/main/res/values-sr/strings.xml
@@ -82,8 +82,10 @@
Нема обележивача
Нема историјата
Подразумеване вредности уређаја
- Избрисати историјат?
- Избрисати обележиваче?
+ Избрисати целу историју?
+ Избрисати изабрану историју?
+ Избрисати све обележиваче?
+ Избрисати изабране обележиваче?
Укљ.
Искљ.
Ауто
@@ -91,4 +93,5 @@
Детаљи о систему датотека
Дијагностички извештај
Пошаљите све детаље како бисмо могли да дијагностикујемо проблем
+ Експериментална навигација
diff --git a/core/src/main/res/values-sv/strings.xml b/core/src/main/res/values-sv/strings.xml
index 926ad88c0..6d73ab452 100644
--- a/core/src/main/res/values-sv/strings.xml
+++ b/core/src/main/res/values-sv/strings.xml
@@ -3,6 +3,7 @@
* Abijeet Patro
* Jopparn
* Skalman
+* Susann Schweden
* Technic2
* WikiPhoenix
-->
@@ -40,6 +41,8 @@
Välj filerna du vill vara värd för på servern
Startar server
Aktivera din WiFi-surfpunkt
+ WiFi-förbindelse upptäckt
+ För att kunna se böcker på andra enheter, måste säkerställas att alla enheter är anslutna till samma WiFi-nätverk.
För att denna funktion ska fungera måste du först aktivera din WiFi-surfpunkt manuellt eller se till att värdens enhet och mottagarens enhet är på samma nätverk.
FORTSÄTT
Uppdateringar om tillståndet för din surfpunkt/server.
@@ -58,8 +61,8 @@
Visa artiklar med inverterade färger
Tillbaka till toppen
Visar en knapp i slutet på sidan för att rulla upp till toppen
- Dölj verktygsfält vid rullning
- Dölj verktygsfältet när sidan rullar nedåt
+ Fortsätt visa verktygsfältet
+ Skyddar verktygsfältet från att försvinna när du bläddrar i innehållet
Språk
Välj ett språk
Bidragsgivare och licenser
@@ -220,6 +223,7 @@
%d bok/böcker
Anslutning misslyckades
Kan inte komma åt zim-filer utan lagringsbehörighet
+ Aktivera WiFi P2P i systeminställningar
Överför filer till %s?
Filöverföring slutfördes
Ett fel uppstod under överförning
@@ -245,10 +249,14 @@
Inga bokmärken
Ingen historik
Enhetsstandard
- Radera historik?
- Radera bokmärken?
+ Radera all historik?
+ Radera vald historik?
+ Radera alla bokmärken?
+ Radera valda bokmärken?
På
Av
Auto
+ Skicka diagnostisk rapport
Filsystemsdetaljer
+ Diagnostisk rapport
diff --git a/core/src/main/res/values-tr/strings.xml b/core/src/main/res/values-tr/strings.xml
index 4c50e86f8..35b7e6227 100644
--- a/core/src/main/res/values-tr/strings.xml
+++ b/core/src/main/res/values-tr/strings.xml
@@ -257,7 +257,7 @@
Tüm notları temizle
Resim
Video
- Sadece Metin
+ Yalnızca Metin
Kısa Metin
Depolama İzni Reddedildi
Bu uygulama çalışması için depolama okuma yeteneği gerektirir. Lütfen ayarlarınızda izin verin
@@ -266,8 +266,10 @@
Yer İmi Yok
Geçmiş Yok
Cihaz Varsayılanı
- Geçmiş Silinsin mi?
- Yer İşaretleri Silinsin mi?
+ Tüm Geçmişi Silinsin mi?
+ Seçilmiş Geçmişi Silinsin mi?
+ Tüm Yer İşaretleri Silinsin mi?
+ Seçilmiş Yer İşaretleri Silinsin mi?
Açık
Kapalı
Otomatik
@@ -275,4 +277,7 @@
Dosya Sistemi Ayrıntıları
Teşhis Raporu
Sorunu teşhis edebilmemiz için lütfen aşağıdaki tüm ayrıntıları gönderin
+ %d%%
+ Metin Yakınlığı
+ Deneysel Gezintisi
diff --git a/core/src/main/res/values-zh-rTW/strings.xml b/core/src/main/res/values-zh-rTW/strings.xml
index b1337d684..cce87f124 100644
--- a/core/src/main/res/values-zh-rTW/strings.xml
+++ b/core/src/main/res/values-zh-rTW/strings.xml
@@ -260,8 +260,10 @@
沒有書籤!
沒有歷史
設備預設
- 刪除歷史?
- 刪除書籤?
+ 刪除所有歷史?
+ 刪除所選的歷史?
+ 刪除所有書籤?
+ 刪除所選的書籤?
開啟
關閉
自動
@@ -271,4 +273,5 @@
請傳送所有以下詳細資訊,以讓我們可以方便診斷問題
%d%%
文字縮放
+ 實現性導覽
diff --git a/core/src/main/res/values-zh/strings.xml b/core/src/main/res/values-zh/strings.xml
index aad89a977..6cafcb7e4 100644
--- a/core/src/main/res/values-zh/strings.xml
+++ b/core/src/main/res/values-zh/strings.xml
@@ -3,6 +3,7 @@
* A Chinese Wikipedian
* Abijeet Patro
* Akagisoy
+* Arthur2e5
* Josephine W.
* Liuxinyu970226
* SomeyaMako
@@ -24,15 +25,38 @@
退出全屏
朗读
停止朗读
+ 支持Kiwix
+ 成为服务器共享书籍
保存媒体
尝试保存该媒体时出错!
已将媒体作为%s保存至Android/media/org.kiwix…/
搜索
选择一个内容文件(*.zim)
在新标签页打开链接?
+ 热点服务频段
+ 未能启动热点
+ 你的热点好像已经打开了。请先关闭 Wi-Fi 热点再继续。
转到WIFI设置
+ 运行热点
+ 请先选择书籍
+ 未能启动服务器。请打开热点。
+ 未能启动服务器。
+ 成功启动服务器。
+ 成功停止服务器。
+ 热点已开启
+ 以下为您的本地热点的信息。\nSSID:%1$s \n密码:%2$s
+ 选择你想在服务器上共享的文件
+ 正在启动服务器
+ 书籍共享说明
检测到Wi-Fi连接
+ 要在其他设备上看书,就先要确认所有设备都连接到同一个 WiFi 网络。
+ 要让此功能运作,你需要先手动启动 Wi-Fi 热点,或者确定主机和接受设备在同一个 Wi-Fi 网络上。
+ 继续
+ Kiwix 热点
+ 启动服务器
+ 中止服务器
错误:找不到选定的ZIM文件。
+ 无法打开 zim 文件
错误:选定的文件不是有效ZIM文件。
错误:加载条目(网址:%1$s)失败。
显示
@@ -57,9 +81,11 @@
清空历史
清空最近搜索及标签历史
已清空所有历史
- 清空所有历史
+ 清除书签
+ 清空所有历史?
分享
删除
+ 取消
已移除最近搜索
您可以向左滑动来查看此条目的内容
明白了
@@ -87,7 +113,7 @@
图书馆
文件已删除
没有文件
- 缺少下载此文件所需的空间。
+ 缺少下载所需的空间。
可用空间:
简单
没有图片
@@ -95,17 +121,17 @@
没有网络连接
Kiwix可以做什么?
Kiwix是一个离线内容阅读器。它的功能就好像一个浏览器,但它不需要访问在线网页,而是从ZIM格式文件中读取内容。
- 尽管Kiwix原本设计用于提供维基百科离线内容,但它也可以阅读其他内容。
+ 尽管Kiwix原本设计用于提供维基百科离线内容,但它也可以阅读其他内容。
内容在哪里?
我们的内容存储在Kiwix网站中。
它们以ZIM格式的文件存在。这里是其中一些:
u2022维基百科分别提供每种语言版本
u2022同样可用于例如维基解密或维基文库等其他内容
- 您可以在应用中下载您选择的ZIM文件,也可以在电脑端下载您想要的文件,并在稍后将其转移至您的SD卡中。
+ 您可以在应用中下载您选择的ZIM文件,也可以在电脑端下载您想要的文件,并在稍后将其转移至您的SD卡中。
在应用中下载的ZIM文件被存放于外部存储中一个名为Kiwix的文件夹内。
存储
当前文件夹
- 对不起,我们无法删除此文件。您应尝试改用文件管理器。
+ 对不起,我们无法删除一些文件。您应尝试改用文件管理器。
暂停
恢复
停止
@@ -131,7 +157,7 @@
昨天
访问外部链接时警告
对额外费用或离线时链接不可用弹出警告
- 正在进入外部链接
+ 正在进入外部链接!
您正在输入外部链接。这可能导致额外数据转移费用,或当您离线时不能工作。您是否要继续?
不要再次询问
选择的语言:
@@ -143,6 +169,7 @@
应用程序日志
设备细节
发送详情
+ 新建标签页
获取内容
%s个条目
入门
diff --git a/core/src/main/res/values/attrs.xml b/core/src/main/res/values/attrs.xml
index 21b933f1e..2d8f75c76 100644
--- a/core/src/main/res/values/attrs.xml
+++ b/core/src/main/res/values/attrs.xml
@@ -4,5 +4,8 @@
+
+
+
diff --git a/core/src/main/res/values/colors.xml b/core/src/main/res/values/colors.xml
index 5b57d8896..1f2437afb 100644
--- a/core/src/main/res/values/colors.xml
+++ b/core/src/main/res/values/colors.xml
@@ -1,32 +1,18 @@
+ #ffffff
+ #fafafa
+ #FFD6D6D6
+ #9E9E9E
+ #5a5a5a
+ #616161
+ #303030
+ #212121
#000000
-
- #2196F3
- #fafafa
- #5a5a5a
- #212121
- #42a5f5
- #1565c0
- #f06292
- #4285F4
- #FFD6D6D6
- #9E9E9E
- #616161
- #303030
- @color/white
- @color/gray700
- @color/gray500
-
-
-
- @color/blue800
-
- @color/white
- #b00020
-
- #ffffff
- @color/black
- @color/white
-
+ #42a5f5
+ #2196F3
+ #4285F4
+ #1565c0
+ #f06292
+ #b00020
diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml
index 580cd7a15..28c9b95f6 100644
--- a/core/src/main/res/values/styles.xml
+++ b/core/src/main/res/values/styles.xml
@@ -34,7 +34,7 @@
diff --git a/core/src/main/res/values/themes.xml b/core/src/main/res/values/themes.xml
index 9aa52cb15..223db9848 100644
--- a/core/src/main/res/values/themes.xml
+++ b/core/src/main/res/values/themes.xml
@@ -2,38 +2,50 @@
-
+