Merge pull request #2631 from gouri-panda/release/3.4.4

Release/3.4.4
This commit is contained in:
Kelson 2021-04-28 21:34:05 +02:00 committed by GitHub
commit e288e58771
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
75 changed files with 436 additions and 305 deletions

View File

@ -25,11 +25,11 @@ jobs:
fetch-depth: 1
- name: create instrumentation coverage
uses: ReactiveCircus/android-emulator-runner@v2.12.0
uses: ReactiveCircus/android-emulator-runner@v2.14.3
with:
api-level: ${{ matrix.api-level }}
arch: x86_64
ndk: 21.3.6528147
ndk: 21.4.7075529
script: bash contrib/instrumentation.sh
- name: Upload screenshot result

View File

@ -21,11 +21,11 @@ jobs:
fetch-depth: 1
- name: run instrumentation tests
uses: ReactiveCircus/android-emulator-runner@v2.12.0
uses: ReactiveCircus/android-emulator-runner@v2.14.3
with:
api-level: ${{ matrix.api-level }}
arch: x86_64
ndk: 21.3.6528147
ndk: 21.4.7075529
script: bash contrib/instrumentation_nightly.sh
- name: Upload screenshot result
@ -36,7 +36,7 @@ jobs:
path: screencap.png
unit_test_and_release:
runs-on: ubuntu-latest
runs-on: ubuntu-18.04
steps:
- name: checkout
@ -44,6 +44,9 @@ jobs:
with:
fetch-depth: 1
- name: Install NDK
run: echo "y" | sudo ${ANDROID_HOME}/tools/bin/sdkmanager --install "ndk;22.0.7026061" --sdk_root=${ANDROID_SDK_ROOT}
- name: run unit tests
run: ./gradlew testDebugUnitTest testCustomExampleDebugUnitTest

View File

@ -6,7 +6,7 @@ jobs:
staticAnalysis:
runs-on: ubuntu-latest
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v1
@ -27,13 +27,16 @@ jobs:
build:
runs-on: ubuntu-latest
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v1
with:
fetch-depth: 1
- name: Install NDK
run: echo "y" | sudo ${ANDROID_HOME}/tools/bin/sdkmanager --install "ndk;22.0.7026061" --sdk_root=${ANDROID_SDK_ROOT}
- name: Build all configurations
run: ./gradlew assemble

View File

@ -12,7 +12,7 @@ on:
jobs:
publish:
runs-on: ubuntu-latest
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v1

View File

@ -1,3 +1,12 @@
3.4.4
NEW: The Download of Zim in now more stable
NEW: Updated translations
BUGFIX: In Search menu item recreates multiple times
BUGFIX: Clicking the search result doesn't go anywhere
BUGFIX: Search text don't appear in the search field
BUGFIX: Back Press doesn't work in SearchFragment
BUGFIX: Memory leaks patched
3.4.3
NEW: Updated translations
BUGFIX: Video seek was not working

View File

@ -11,7 +11,7 @@ apply(from = rootProject.file("jacoco.gradle"))
ext {
set("versionMajor", 3)
set("versionMinor", 4)
set("versionPatch", 3)
set("versionPatch", 4)
}
fun generateVersionName() = "${ext["versionMajor"]}.${ext["versionMinor"]}.${ext["versionPatch"]}"

View File

@ -34,6 +34,9 @@ class HelpFragmentTest : BaseActivityTest() {
clickOnWhereIsContent()
assertWhereIsContentIsExpanded()
clickOnWhereIsContent()
clickOnHowToUpdateContent()
assertHowToUpdateContentIsExpanded()
clickOnHowToUpdateContent()
clickOnSendFeedback()
}
}

View File

@ -66,6 +66,14 @@ class HelpRobot : BaseRobot() {
)
}
fun clickOnHowToUpdateContent() {
clickOn(TextId(string.how_to_update_content))
}
fun assertHowToUpdateContentIsExpanded() {
isVisible(TextId(string.update_content_description))
}
fun clickOnSendFeedback() {
clickOn(ViewId(id.activity_help_feedback_text_view))
}

View File

@ -90,7 +90,7 @@ class TopLevelDestinationRobot : BaseRobot() {
fun clickHostBooksOnSideNav(func: ZimHostRobot.() -> Unit) {
inNavDrawer {
clickOn(TextId(R.string.menu_host_books))
clickOn(TextId(R.string.menu_wifi_hotspot))
zimHost(func)
}
}

View File

@ -1,60 +0,0 @@
/*
* Kiwix Android
* Copyright (c) 2019 Kiwix <android.kiwix.org>
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.kiwix.kiwixmobile.search;
import android.Manifest;
import androidx.test.espresso.matcher.ViewMatchers;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
import androidx.test.rule.GrantPermissionRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kiwix.kiwixmobile.R;
import org.kiwix.kiwixmobile.main.KiwixMainActivity;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.CoreMatchers.allOf;
@LargeTest
@RunWith(AndroidJUnit4.class)
public class SearchFragmentTest {
@Rule
public ActivityTestRule<KiwixMainActivity> mActivityTestRule = new ActivityTestRule<>(
KiwixMainActivity.class);
@Rule
public GrantPermissionRule readPermissionRule =
GrantPermissionRule.grant(Manifest.permission.READ_EXTERNAL_STORAGE);
@Rule
public GrantPermissionRule writePermissionRule =
GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE);
@Test
public void SearchFragmentSimple() {
onView(allOf(withText(R.string.reader),
withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))).perform(click());
onView(withId(R.id.menu_search));
}
}

View File

@ -15,18 +15,21 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.kiwix.kiwixmobile.core.main
package org.kiwix.kiwixmobile.search
import android.content.Context
import java.io.BufferedReader
import java.io.IOException
import androidx.test.internal.runner.junit4.statement.UiThreadStatement
import com.schibsted.spain.barista.assertion.BaristaVisibilityAssertions.assertDisplayed
import org.junit.Before
import org.junit.Test
import org.kiwix.kiwixmobile.BaseActivityTest
import org.kiwix.kiwixmobile.R
class FileReader {
fun readFile(filePath: String, context: Context): String = try {
context.assets.open(filePath)
.bufferedReader()
.use(BufferedReader::readText)
} catch (e: IOException) {
"".also { e.printStackTrace() }
class SearchFragmentTest : BaseActivityTest() {
@Before fun setUp() {
UiThreadStatement.runOnUiThread { activityRule.activity.navigate(R.id.searchFragment) }
}
@Test fun searchFragmentSimple() {
assertDisplayed(R.string.menu_search_in_text)
}
}

View File

@ -27,6 +27,6 @@ fun zimHost(func: ZimHostRobot.() -> Unit) = ZimHostRobot().applyWithViewHierarc
class ZimHostRobot : BaseRobot() {
init {
isVisible(TextId(R.string.menu_host_books))
isVisible(TextId(R.string.menu_wifi_hotspot))
}
}

View File

@ -38,7 +38,7 @@ import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions
import org.kiwix.kiwixmobile.core.di.components.CoreComponent
import org.kiwix.kiwixmobile.core.main.CoreMainActivity
import org.kiwix.kiwixmobile.kiwixActivityComponent
import org.kiwix.kiwixmobile.nav.destination.library.LocalLibraryFragmentDirections
import org.kiwix.kiwixmobile.nav.destination.reader.KiwixReaderFragmentDirections
const val NAVIGATE_TO_ZIM_HOST_FRAGMENT = "navigate_to_zim_host_fragment"
@ -95,7 +95,7 @@ class KiwixMainActivity : CoreMainActivity() {
}
}
if (sharedPreferenceUtil.showIntro()) {
navigate(LocalLibraryFragmentDirections.actionLibraryFragmentToIntrofragment())
navigate(KiwixReaderFragmentDirections.actionReaderFragmentToIntroFragment())
}
}

View File

@ -111,6 +111,7 @@ class KiwixReaderFragment : CoreReaderFragment() {
private fun openPageInBookFromNavigationArguments() {
val args = KiwixReaderFragmentArgs.fromBundle(requireArguments())
if (args.pageUrl.isNotEmpty()) {
if (args.zimFileUri.isNotEmpty()) {
tryOpeningZimFile(args.zimFileUri)
@ -250,9 +251,13 @@ class KiwixReaderFragment : CoreReaderFragment() {
val settings = requireActivity().getSharedPreferences(SharedPreferenceUtil.PREF_KIWIX_MOBILE, 0)
val zimFile = settings.getString(TAG_CURRENT_FILE, null)
if (zimFile != null) {
if (zimFile != null && File(zimFile).exists()) {
if (zimReaderContainer.zimFile == null) {
openZimFile(File(zimFile))
Log.d(
TAG_KIWIX,
"Kiwix normal start, Opened last used zimFile: -> $zimFile"
)
}
} else {
getCurrentWebView().snack(R.string.zim_not_opened)

View File

@ -293,9 +293,11 @@ class ZimHostFragment : BaseFragment(), ZimHostCallbacks, ZimHostContract.View {
private fun setUpToolbar(view: View) {
val activity = requireActivity() as AppCompatActivity
activity.setSupportActionBar(view.findViewById(R.id.toolbar))
activity.supportActionBar!!.title = getString(R.string.menu_host_books)
activity.supportActionBar!!.setHomeButtonEnabled(true)
activity.supportActionBar!!.setDisplayHomeAsUpEnabled(true)
activity.supportActionBar?.apply {
title = getString(R.string.menu_wifi_hotspot)
setHomeButtonEnabled(true)
setDisplayHomeAsUpEnabled(true)
}
}
// Advice user to turn on hotspot manually for API<26

View File

@ -43,4 +43,8 @@ class ConnectivityBroadcastReceiver @Inject constructor(
) {
_networkStates.onNext(connectivityManager.networkState)
}
fun stopNetworkState() {
_networkStates.onComplete()
}
}

View File

@ -116,10 +116,10 @@ class ZimManageViewModel @Inject constructor(
val requestDownloadLibrary = BehaviorProcessor.createDefault(Unit)
val requestFiltering = BehaviorProcessor.createDefault("")
private val compositeDisposable = CompositeDisposable()
private var compositeDisposable: CompositeDisposable? = CompositeDisposable()
init {
compositeDisposable.addAll(*disposables())
compositeDisposable?.addAll(*disposables())
context.registerReceiver(connectivityBroadcastReceiver)
}
@ -129,8 +129,13 @@ class ZimManageViewModel @Inject constructor(
}
override fun onCleared() {
compositeDisposable.clear()
compositeDisposable?.clear()
context.unregisterReceiver(connectivityBroadcastReceiver)
connectivityBroadcastReceiver.stopNetworkState()
requestFileSystemCheck.onComplete()
fileSelectActions.onComplete()
requestDownloadLibrary.onComplete()
compositeDisposable = null
super.onCleared()
}

View File

@ -19,7 +19,7 @@
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
app:startDestination="@id/libraryFragment">
app:startDestination="@id/readerFragment">
<fragment
android:id="@+id/readerFragment"
android:name="org.kiwix.kiwixmobile.nav.destination.reader.KiwixReaderFragment"
@ -52,6 +52,11 @@
<action
android:id="@+id/action_readerFragment_to_searchFragment"
app:destination="@id/searchFragment" />
<action
android:id="@+id/action_readerFragment_to_introFragment"
app:destination="@id/introFragment"
app:popUpTo="@id/readerFragment"
app:popUpToInclusive="true" />
</fragment>
<fragment
@ -69,11 +74,6 @@
<action
android:id="@+id/action_libraryFragment_to_localFileTransferFragment"
app:destination="@id/localFileTransferFragment" />
<action
android:id="@+id/action_libraryFragment_to_introfragment"
app:destination="@id/introFragment"
app:popUpTo="@id/libraryFragment"
app:popUpToInclusive="true" />
</fragment>
<fragment

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* Jakub Fabijan
-->
<resources>
<string name="send_files_title">Sendado de Dosierojn</string>
<string name="receive_files_title">Ricevado de Dosierojn</string>
</resources>

View File

@ -2,11 +2,12 @@
<!-- Authors:
* Gomoko
* Thibaut120094
* Verdy p
-->
<resources>
<string name="file_system_does_not_support_4gb">Votre système de fichiers ne prend pas en charge les fichiers de 4 Go ou plus.</string>
<string name="detecting_file_system">Détecte si le système de fichiers peut créer des fichiers de 4 Go ou plus</string>
<string name="cannot_open_file">Échec de l\'ouverture du fichier\nEssayez de chercher ce fichier dans l\'onglet Appareils de votre Bibliothèque</string>
<string name="cannot_open_file">Échec de louverture du fichier.\nEssayez de chercher ce fichier dans longlet Appareils de votre Bibliothèque.</string>
<string name="send_files_title">Envoyer des fichiers</string>
<string name="receive_files_title">Recevoir des fichiers</string>
</resources>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="all">
<string name="send_files_title">The title of an activity used for sending files.</string>
<string name="receive_files_title">The titles of an activity used for receiving files.</string>
</resources>

View File

@ -59,7 +59,7 @@ object Versions {
const val junit_jupiter: String = "5.7.0"
const val xfetch2okhttp: String = "3.1.5"
const val xfetch2okhttp: String = "3.1.6"
const val assertj_core: String = "3.18.1"
@ -93,7 +93,7 @@ object Versions {
const val barista: String = "2.7.1" // available: "3.7.0"
const val xfetch2: String = "3.1.5"
const val xfetch2: String = "3.1.6"
const val jsr305: String = "3.0.2"

View File

@ -48,7 +48,7 @@ class AllProjectConfigurer {
fun configureBaseExtension(target: Project, path: String) {
target.configureExtension<BaseExtension> {
setCompileSdkVersion(Config.compileSdk)
ndkVersion = "21.3.6528147"
ndkVersion = "21.4.7075529"
defaultConfig {
setMinSdkVersion(Config.minSdk)
setTargetSdkVersion(Config.targetSdk)

View File

@ -158,6 +158,7 @@ class CompatFindActionModeCallback internal constructor(context: Context) :
actionMode = null
isActive = false
webView?.clearMatches()
webView = null
input.hideSoftInputFromWindow(webView?.windowToken, 0)
}

View File

@ -145,20 +145,10 @@ public abstract class CoreReaderFragment extends BaseFragment
@BindView(R2.id.toolbar)
protected Toolbar toolbar;
@BindView(R2.id.activity_main_back_to_top_fab)
FloatingActionButton backToTopButton;
@BindView(R2.id.activity_main_button_stop_tts)
Button stopTTSButton;
@BindView(R2.id.activity_main_button_pause_tts)
Button pauseTTSButton;
@BindView(R2.id.activity_main_tts_controls)
Group TTSControls;
@BindView(R2.id.fragment_main_app_bar)
protected AppBarLayout toolbarContainer;
@BindView(R2.id.main_fragment_progress_view)
protected ContentLoadingProgressBar progressBar;
@BindView(R2.id.activity_main_fullscreen_button)
ImageButton exitFullscreenButton;
@BindView(R2.id.navigation_fragment_main_drawer_layout)
protected DrawerLayout drawerLayout;
protected NavigationView tableDrawerRightContainer;
@ -166,31 +156,16 @@ public abstract class CoreReaderFragment extends BaseFragment
protected FrameLayout contentFrame;
@BindView(R2.id.bottom_toolbar)
protected BottomAppBar bottomToolbar;
@BindView(R2.id.bottom_toolbar_bookmark)
ImageView bottomToolbarBookmark;
@BindView(R2.id.bottom_toolbar_arrow_back)
ImageView bottomToolbarArrowBack;
@BindView(R2.id.bottom_toolbar_arrow_forward)
ImageView bottomToolbarArrowForward;
@BindView(R2.id.tab_switcher_recycler_view)
RecyclerView tabRecyclerView;
@BindView(R2.id.activity_main_tab_switcher)
protected View tabSwitcherRoot;
@BindView(R2.id.tab_switcher_close_all_tabs)
protected FloatingActionButton closeAllTabsButton;
@BindView(R2.id.snackbar_root)
CoordinatorLayout snackbarRoot;
@BindView(R2.id.fullscreen_video_container)
protected ViewGroup videoView;
@BindView(R2.id.go_to_library_button_no_open_book)
protected Button noOpenBookButton;
@BindView(R2.id.no_open_book_text)
TextView noOpenBookText;
@BindView(R2.id.activity_main_root)
protected View activityMainRoot;
@Inject
StorageObserver storageObserver;
@Inject
protected SharedPreferenceUtil sharedPreferenceUtil;
@Inject
@ -207,11 +182,37 @@ public abstract class CoreReaderFragment extends BaseFragment
protected DialogShower alertDialogShower;
@Inject
protected NightModeViewPainter painter;
protected int currentWebViewIndex = 0;
protected ActionBar actionBar;
protected MainMenu mainMenu;
@BindView(R2.id.activity_main_back_to_top_fab)
FloatingActionButton backToTopButton;
@BindView(R2.id.activity_main_button_stop_tts)
Button stopTTSButton;
@BindView(R2.id.activity_main_button_pause_tts)
Button pauseTTSButton;
@BindView(R2.id.activity_main_tts_controls)
Group TTSControls;
@BindView(R2.id.activity_main_fullscreen_button)
ImageButton exitFullscreenButton;
@BindView(R2.id.bottom_toolbar_bookmark)
ImageView bottomToolbarBookmark;
@BindView(R2.id.bottom_toolbar_arrow_back)
ImageView bottomToolbarArrowBack;
@BindView(R2.id.bottom_toolbar_arrow_forward)
ImageView bottomToolbarArrowForward;
@BindView(R2.id.tab_switcher_recycler_view)
RecyclerView tabRecyclerView;
@BindView(R2.id.snackbar_root)
CoordinatorLayout snackbarRoot;
@BindView(R2.id.no_open_book_text)
TextView noOpenBookText;
@Inject
StorageObserver storageObserver;
@Inject
MainRepositoryActions repositoryActions;
@Inject
ExternalLinkOpener externalLinkOpener;
private CountDownTimer hideBackToTopTimer;
private List<TableDrawerAdapter.DocumentSection> documentSections;
private boolean isBackToTopEnabled = false;
@ -221,16 +222,13 @@ public abstract class CoreReaderFragment extends BaseFragment
private KiwixTextToSpeech tts;
private CompatFindActionModeCallback compatCallback;
private TabsAdapter tabsAdapter;
protected int currentWebViewIndex = 0;
private File file;
private ActionMode actionMode = null;
private KiwixWebView tempWebViewForUndo;
private File tempZimFileForUndo;
private boolean isFirstRun;
protected ActionBar actionBar;
private TableDrawerAdapter tableDrawerAdapter;
private RecyclerView tableDrawerRight;
protected MainMenu mainMenu;
private ItemTouchHelper.Callback tabCallback;
private Disposable bookmarkingDisposable;
private boolean isBookmarked;
@ -488,7 +486,7 @@ public abstract class CoreReaderFragment extends BaseFragment
}
private void addFileReader() {
documentParserJs = new FileReader().readFile("js/documentParser.js", getActivity());
documentParserJs = FileUtils.readFile(getActivity(), "js/documentParser.js");
documentSections = new ArrayList<>();
}
@ -538,7 +536,7 @@ public abstract class CoreReaderFragment extends BaseFragment
}
protected void hideTabSwitcher() {
if (actionBar != null) {
if (actionBar != null && toolbar != null) {
actionBar.setDisplayShowTitleEnabled(true);
((CoreMainActivity) requireActivity()).setupDrawerToggle(toolbar);
@ -601,7 +599,7 @@ public abstract class CoreReaderFragment extends BaseFragment
}
@NotNull @Override public Super onBackPressed(@NotNull AppCompatActivity activity) {
if (tabSwitcherRoot.getVisibility() == View.VISIBLE) {
if (tabSwitcherRoot != null && tabSwitcherRoot.getVisibility() == View.VISIBLE) {
selectTab(currentWebViewIndex < webViewList.size() ? currentWebViewIndex
: webViewList.size() - 1);
hideTabSwitcher();
@ -612,10 +610,10 @@ public abstract class CoreReaderFragment extends BaseFragment
} else if (compatCallback.isActive) {
compatCallback.finish();
return ShouldNotCall;
} else if (drawerLayout.isDrawerOpen(GravityCompat.END)) {
} else if (drawerLayout != null && drawerLayout.isDrawerOpen(GravityCompat.END)) {
drawerLayout.closeDrawers();
return ShouldNotCall;
} else if (getCurrentWebView().canGoBack()) {
} else if (getCurrentWebView() != null && getCurrentWebView().canGoBack()) {
getCurrentWebView().goBack();
return ShouldNotCall;
}
@ -743,8 +741,10 @@ public abstract class CoreReaderFragment extends BaseFragment
}
private KiwixWebView initalizeWebView(String url) {
if (isAdded()) {
AttributeSet attrs = StyleUtils.getAttributes(requireActivity(), R.xml.webview);
KiwixWebView webView = createWebView(attrs);
if (webView != null) {
loadUrl(url, webView);
setUpWithTextToSpeech(webView);
documentParser.initInterface(webView);
@ -752,15 +752,22 @@ public abstract class CoreReaderFragment extends BaseFragment
openMainPage();
return Unit.INSTANCE;
}).initInterface(webView);
}
return webView;
}
return null;
}
@NotNull protected ToolbarScrollingKiwixWebView createWebView(AttributeSet attrs) {
if (activityMainRoot != null) {
return new ToolbarScrollingKiwixWebView(
getActivity(), this, attrs, (ViewGroup) activityMainRoot, videoView,
new CoreWebViewClient(this, zimReaderContainer),
toolbarContainer, bottomToolbar,
sharedPreferenceUtil);
} else {
return null;
}
}
protected KiwixWebView newMainPageTab() {
@ -826,6 +833,7 @@ public abstract class CoreReaderFragment extends BaseFragment
protected void selectTab(int position) {
currentWebViewIndex = position;
if (contentFrame != null) {
contentFrame.removeAllViews();
KiwixWebView webView = safelyGetWebView(position);
if (webView.getParent() != null) {
@ -839,6 +847,7 @@ public abstract class CoreReaderFragment extends BaseFragment
updateTableOfContents();
updateTitle();
}
}
protected KiwixWebView safelyGetWebView(int position) {
return webViewList.size() == 0 ? newMainPageTab() : webViewList.get(safePosition(position));
@ -1220,6 +1229,7 @@ public abstract class CoreReaderFragment extends BaseFragment
switch (intent.getAction()) {
case Intent.ACTION_PROCESS_TEXT: {
goToSearchWithText(intent);
intent.setAction(null); // see https://github.com/kiwix/kiwix-android/issues/2607
break;
}
case CoreSearchWidget.TEXT_CLICKED:
@ -1303,7 +1313,7 @@ public abstract class CoreReaderFragment extends BaseFragment
}
private void setUpWithTextToSpeech(KiwixWebView kiwixWebView) {
tts.initWebView(kiwixWebView);
if (kiwixWebView != null) tts.initWebView(kiwixWebView);
}
@OnClick(R2.id.activity_main_back_to_top_fab)
@ -1355,7 +1365,11 @@ public abstract class CoreReaderFragment extends BaseFragment
}
protected boolean urlIsValid() {
if (getCurrentWebView() != null) {
return getCurrentWebView().getUrl() != null;
} else {
return false;
}
}
private void updateUrlProcessor() {
@ -1396,11 +1410,12 @@ public abstract class CoreReaderFragment extends BaseFragment
JSONArray urls = new JSONArray();
JSONArray positions = new JSONArray();
for (KiwixWebView view : webViewList) {
if (view != null) {
if (view.getUrl() == null) continue;
urls.put(view.getUrl());
positions.put(view.getScrollY());
}
}
editor.putString(TAG_CURRENT_FILE, zimReaderContainer.getZimCanonicalPath());
editor.putString(TAG_CURRENT_ARTICLES, urls.toString());
editor.putString(TAG_CURRENT_POSITIONS, positions.toString());
@ -1467,6 +1482,7 @@ public abstract class CoreReaderFragment extends BaseFragment
@Override
public void webViewProgressChanged(int progress) {
if (checkNull(progressBar) && isAdded()) {
progressBar.setVisibility(View.VISIBLE);
progressBar.show();
progressBar.setProgress(progress);
if (progress == 100) {
@ -1561,19 +1577,26 @@ public abstract class CoreReaderFragment extends BaseFragment
return Math.max(settings.getInt(TAG_CURRENT_TAB, 0), 0);
}
/* This method restores tabs state in new launches, do not modify it
unless it is explicitly mentioned in the issue you're fixing */
protected void restoreTabs(@Nullable String zimArticles, @Nullable String zimPositions,
int currentTab) {
try {
JSONArray urls = new JSONArray(zimArticles);
JSONArray positions = new JSONArray(zimPositions);
webViewList.clear();
currentWebViewIndex = 0;
tabsAdapter.notifyItemRemoved(0);
tabsAdapter.notifyDataSetChanged();
for (int i = 0; i < urls.length(); i++) {
newTab(UpdateUtils.reformatProviderUrl(urls.getString(i)), i == currentTab)
.setScrollY(positions.getInt(i));
int cursor = 0;
getCurrentWebView().loadUrl(UpdateUtils.reformatProviderUrl(urls.getString(cursor)));
getCurrentWebView().setScrollY(positions.getInt(cursor));
cursor++;
while (cursor < urls.length()) {
newTab(UpdateUtils.reformatProviderUrl(urls.getString(cursor)));
getCurrentWebView().setScrollY(positions.getInt(cursor));
cursor++;
}
selectTab(currentTab);
} catch (JSONException e) {
Log.w(TAG_KIWIX, "Kiwix shared preferences corrupted", e);
ContextExtensionsKt.toast(getActivity(), "Could not restore tabs.", Toast.LENGTH_LONG);

View File

@ -132,8 +132,8 @@ class ZimFileReader constructor(
}.also { Log.d(TAG, "getting mimetype for $uri = $it") }
private fun mimeTypeFromReader(it: String) =
// Truncate mime-type (everything after the first space
jniKiwixReader.getMimeType(it.filePath)?.replace("^([^ ]+).*$", "$1")
// Truncate mime-type (everything after the first space and semi-colon(if exists)
jniKiwixReader.getMimeType(it.filePath)?.replace("^([^ ]+).*$", "$1")?.substringBefore(";")
fun getRedirect(url: String) = "${toRedirect(url)}"

View File

@ -26,11 +26,13 @@ import android.view.MenuItem
import android.view.MenuItem.OnActionExpandListener
import android.view.View
import android.view.ViewGroup
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.widget.SearchView
import androidx.core.view.isVisible
import androidx.core.widget.ContentLoadingProgressBar
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.fragment_search.searchLoadingIndicator
@ -107,6 +109,17 @@ class SearchFragment : BaseFragment() {
lifecycleScope.launchWhenCreated {
searchViewModel.effects.collect { it.invokeWith(this@SearchFragment.coreMainActivity) }
}
handleBackPress()
}
private fun handleBackPress() {
activity?.onBackPressedDispatcher?.addCallback(
viewLifecycleOwner,
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
goBack()
}
})
}
private fun setupToolbar(view: View) {
@ -122,6 +135,12 @@ class SearchFragment : BaseFragment() {
override fun onDestroyView() {
super.onDestroyView()
closeKeyboard()
activity?.intent?.action = null
}
private fun goBack() {
val readerFragmentResId = (activity as CoreMainActivity).readerFragmentResId
findNavController().popBackStack(readerFragmentResId, false)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
@ -131,7 +150,9 @@ class SearchFragment : BaseFragment() {
searchMenuItem.expandActionView()
searchView = searchMenuItem.actionView as SearchView
searchView.setOnQueryTextListener(SimpleTextListener {
if (it.isNotEmpty()) {
searchViewModel.actions.offer(Filter(it))
}
})
searchMenuItem.setOnActionExpandListener(object : OnActionExpandListener {
override fun onMenuItemActionExpand(item: MenuItem) = false
@ -153,6 +174,7 @@ class SearchFragment : BaseFragment() {
}
private fun render(state: SearchState) {
searchView.setQuery(state.searchTerm, false)
searchInTextMenuItem.isVisible = state.searchOrigin == FromWebView
searchInTextMenuItem.isEnabled = state.searchTerm.isNotBlank()
searchLoadingIndicator.isShowing(state.isLoading)

View File

@ -26,6 +26,7 @@ import android.util.Log
import org.kiwix.kiwixmobile.core.downloader.ChunkUtils
import org.kiwix.kiwixmobile.core.entity.LibraryNetworkEntity.Book
import org.kiwix.kiwixmobile.core.extensions.get
import java.io.BufferedReader
import java.io.File
import java.io.IOException
import java.util.ArrayList
@ -219,4 +220,12 @@ object FileUtils {
File("$fileName.part").exists() -> "$fileName.part"
else -> "${fileName}aa"
}
@JvmStatic fun Context.readFile(filePath: String): String = try {
assets.open(filePath)
.bufferedReader()
.use(BufferedReader::readText)
} catch (e: IOException) {
"".also { e.printStackTrace() }
}
}

View File

@ -54,7 +54,7 @@
android:indeterminate="false"
android:max="100"
android:theme="@style/ThemeOverlay.KiwixTheme.ProgressBar"
android:visibility="visible"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@+id/toolbar"
tools:progress="70" />
</com.google.android.material.appbar.AppBarLayout>

View File

@ -20,7 +20,7 @@
<item
android:id="@+id/menu_host_books"
android:icon="@drawable/ic_mobile_screen_share_24px"
android:title="@string/menu_host_books"
android:title="@string/menu_wifi_hotspot"
app:showAsAction="never" />
</group>

View File

@ -22,7 +22,7 @@
<string name="menu_read_aloud">اقرأ بصوت عالٍ</string>
<string name="menu_read_aloud_stop">توقف عن القراءة بصوت عالٍ</string>
<string name="menu_support_kiwix">دعم كيويكس</string>
<string name="menu_host_books">كتب المضيف</string>
<string name="menu_wifi_hotspot">كتب المضيف</string>
<string name="save_media">حفظ الوسائط</string>
<string name="save_media_error">حدث خطأ عند محاولة حفظ الوسائط!</string>
<string name="save_media_saved">حفظ الوسائط كـ%s إلى Android/media/org.kiwix…/</string>

View File

@ -20,7 +20,7 @@
<string name="menu_read_aloud">بە بەرزی بیخوێنەوە</string>
<string name="menu_read_aloud_stop">بوەستە لە خوێندنەوە</string>
<string name="menu_support_kiwix">پشتگیریی کیویکس بکە</string>
<string name="menu_host_books">خانەخوێی کتێبەکان</string>
<string name="menu_wifi_hotspot">خانەخوێی کتێبەکان</string>
<string name="save_media">میدیا پاشەکەوت بکە</string>
<string name="save_media_error">ھەڵەیەک ڕوویدا لەکاتی ھەوڵدان لە خەزێنەکردنی میدیاکە!</string>
<string name="save_media_saved">میدیا پاشەکەوتکرا وەکو %s بۆ ئەندرۆید/میدیا/org.kiwix…/</string>

View File

@ -25,7 +25,7 @@
<string name="menu_read_aloud">Číst nahlas</string>
<string name="menu_read_aloud_stop">Zastavit čtení nahlas</string>
<string name="menu_support_kiwix">Podpořte Kiwix</string>
<string name="menu_host_books">Hostujte Knihy</string>
<string name="menu_wifi_hotspot">Hostujte Knihy</string>
<string name="save_media">Uložit médium jako…</string>
<string name="save_media_error">Došlo k chybě při pokusu o uložení média!</string>
<string name="save_media_saved">Multimediální soubory uložené jako %s ve složce Android/media/org.kiwix…/</string>

View File

@ -20,7 +20,7 @@
<string name="menu_read_aloud">Be veng ra bıwane</string>
<string name="menu_read_aloud_stop">Bevengrawendış caverde</string>
<string name="menu_support_kiwix">Kiwix\'i desteg</string>
<string name="menu_host_books">Kıtabê esasi</string>
<string name="menu_wifi_hotspot">Kıtabê esasi</string>
<string name="save_media">Medyay bışevekne</string>
<string name="save_media_error">Medya qeyd kerdış de yew xeta ameyê meydan!</string>
<string name="save_media_saved">Medyay gorey %s\'i tiya dı qeyd kerê Android/media/org.kiwix…/</string>
@ -81,7 +81,7 @@
<string name="clear_all_history_dialog_title">Verori pêro wa pak kerê?</string>
<string name="share">Vıla ke</string>
<string name="selected_file_cab_app_chooser_title">Dosyayanê ZIM\'i pê :</string>
<string name="delete">Bestere</string>
<string name="delete">Bıesternê</string>
<string name="cancel">Bıtexelne</string>
<string name="delete_specific_search_toast">Cıgeyrayışo peyên wedariya</string>
<string name="hint_contents_drawer_message">Zerrey nê meqaley vinayışi rê peta hetê çepiya xuz kerê</string>

View File

@ -3,6 +3,7 @@
* Abijeet Patro
* Blahma
* Fitoschido
* Jakub Fabijan
* Javiero
* Kelson
* KuboF
@ -52,10 +53,11 @@
<string name="pref_clear_all_history_summary">Forviŝi ĵusajn serĉojn kaj historion de langetoj</string>
<string name="pref_notes">Notoj</string>
<string name="all_history_cleared">Forviŝis Ĉiun Historion</string>
<string name="clear_all_history_dialog_title" fuzzy="true">Forviŝi Ĉiun da Historio</string>
<string name="clear_all_history_dialog_title">Forviŝi Ĉiun da Historio?</string>
<string name="share">Diskonigi</string>
<string name="selected_file_cab_app_chooser_title">Diskonigi ZIM-dosierojn al:</string>
<string name="delete">Forigi</string>
<string name="cancel">Nuligi</string>
<string name="delete_specific_search_toast">Forigis lastatempajn serĉojn</string>
<string name="hint_contents_drawer_message">Vi povas ŝovumi maldekstren por vidi la enhavon de ĉi tiu artikolo</string>
<string name="got_it">Komprenite</string>
@ -84,6 +86,7 @@
<string name="delete_zims_toast">Forigis dosieron</string>
<string name="no_files_here">Neniu dosiero ĉi tie</string>
<string name="download_no_space" fuzzy="true">Ne estas sufiĉa spaco por elŝuti ĉi tiun dosieron.</string>
<string name="download">Elŝuti</string>
<string name="space_available">Havebla Spaco:</string>
<string name="zim_simple">Simpla</string>
<string name="zim_no_pic">Neniu Bildo</string>
@ -127,7 +130,7 @@
<string name="time_yesterday">Hieraŭ</string>
<string name="pref_external_link_popup_title">Averti pri aliro al eksteraj ligiloj</string>
<string name="pref_external_link_popup_summary">Montri averton pri plia kosto aŭ nefunkciado pri eksteraj ligiloj.</string>
<string name="external_link_popup_dialog_title" fuzzy="true">Enigi Eksteran Ligilon</string>
<string name="external_link_popup_dialog_title">Enigi Eksteran Ligilon!</string>
<string name="external_link_popup_dialog_message">Vi estas ironta al celo de ekstera ligilo. Tio eble plie kostos por datentransigo, aŭ simple ne funkcios se vi ne estas konektita. Ĉu daŭrigi?</string>
<string name="do_not_ask_anymore">Ne demandu plu</string>
<string name="your_languages">Elektitaj lingvoj:</string>
@ -164,7 +167,7 @@
<string name="history_from_current_book" fuzzy="true">Historio el la aktuala libro</string>
<string name="search_history">Serĉi historion</string>
<string name="selected_items">%1$d elektita(j)</string>
<string name="bookmarks_from_current_book" fuzzy="true">Legosignoj en la aktuala libro</string>
<string name="bookmarks_from_current_book">Montri legosignoj de ĉiuj libroj</string>
<string name="search_bookmarks">Serĉi legosignojn</string>
<string name="switch_tabs">Ŝanĝi langetojn</string>
<string name="close_all_tabs">Fermi ĉiujn langetojn</string>
@ -188,6 +191,14 @@
<string name="ext_storage_permission_not_granted">Eraro: Permeso pri konservejo mankas</string>
<string name="notes_deletion_successful">La tuta dosierujo da notoj foriĝis</string>
<string name="notes_deletion_unsuccessful">Iuj dosieroj ne foriĝis</string>
<string name="books_count">%d libro(j)</string>
<string name="connection_failed">Konektado fiaskis</string>
<string name="your_device">Via Aparato:</string>
<string name="nearby_devices">PROKSIMAJ APARATOJ</string>
<string name="pref_clear_all_notes_title" fuzzy="true">Forviŝi Ĉiujn Notojn</string>
<string name="no_bookmarks">Neniu Legosigno</string>
<string name="no_history">Neniu Historio</string>
<string name="on">Ŝaltita</string>
<string name="off">Malŝaltita</string>
<string name="pref_text_zoom_title">Teksta Zomo</string>
</resources>

View File

@ -19,7 +19,7 @@
<string name="menu_read_aloud">با صدای بلند بخوان</string>
<string name="menu_read_aloud_stop">خواندن با صدای بلند را متوقف کن</string>
<string name="menu_support_kiwix">پشتیبانی از کیویکس</string>
<string name="menu_host_books">کتاب‌های میزبان</string>
<string name="menu_wifi_hotspot">کتاب‌های میزبان</string>
<string name="save_media">ذخیرهٔ رسانه</string>
<string name="save_media_error">خطایی در حین ذخیره‌سازی این رسانه رخ داد!</string>
<string name="save_media_saved">رسانه با نام %s در Android/media/org.kiwix…/ ذخیره شد</string>

View File

@ -19,7 +19,7 @@
<string name="menu_read_aloud">Lue ääneen</string>
<string name="menu_read_aloud_stop">Lopeta ääneen lukeminen</string>
<string name="menu_support_kiwix">Tue Kiwixiä</string>
<string name="menu_host_books">Hostaa kirjoja</string>
<string name="menu_wifi_hotspot">Hostaa kirjoja</string>
<string name="save_media">Tallenna media</string>
<string name="save_media_error">Virhe mediaa tallennettaessa!</string>
<string name="save_media_saved">Tallennettu media %s muodossa hakemistoon Android/media/org.kiwix…/</string>

View File

@ -29,7 +29,7 @@
<string name="menu_read_aloud">Lire à haute voix</string>
<string name="menu_read_aloud_stop">Arrêter de lire à haute voix</string>
<string name="menu_support_kiwix">Soutenir Kiwix</string>
<string name="menu_host_books">Diffuser des contenus</string>
<string name="menu_wifi_hotspot">Diffuser des contenus</string>
<string name="save_media">Enregistrer le média</string>
<string name="save_media_error">Une erreur sest produite en essayant denregistrer le média!</string>
<string name="save_media_saved">Média enregistré sous %s dans le dossier Android/media/org.kiwix…/</string>
@ -43,7 +43,7 @@
<string name="connection_refused">Connexion refusée.</string>
<string name="hotspot_running">Point daccès WiFi actif</string>
<string name="no_books_selected_toast_message">Veuillez dabord choisir les livres</string>
<string name="server_failed_message">Impossible de démarrer le serveur. Veuillez activer votre point daccès WiFi</string>
<string name="server_failed_message">Impossible de démarrer le serveur. Veuillez activer votre point daccès WiFi.</string>
<string name="server_failed_toast_message">Impossible de démarrer le serveur.</string>
<string name="server_started_successfully_toast_message">Serveur démarré avec succès.</string>
<string name="server_stopped_successfully_toast_message">Le serveur a été arrêté avec succès.</string>
@ -51,11 +51,11 @@
<string name="hotspot_details_message">Voici les détails de votre point daccès local.\nSSID: %1$s\nPasse: %2$s</string>
<string name="server_textview_default_message">Sélectionnez les fichiers que vous voulez héberger sur le serveur</string>
<string name="progress_dialog_starting_server">Démarrage du serveur</string>
<string name="hotspot_dialog_title">Instructions pour les livres hébergeurs</string>
<string name="hotspot_dialog_title">Instructions pour héberger des livres</string>
<string name="wifi_dialog_title">Connexion WiFi détectée</string>
<string name="wifi_dialog_body">Afin de pouvoir lire les livres sur dautres appareils, veuillez vous assurer que tous ceux-ci sont connectés au même réseau WiFi.</string>
<string name="hotspot_dialog_message">Pour que cette fonctionnalité fonctionne, vous devez dabord activer manuellement votre point daccès WiFi ou vous assurer que l\'appareil hôte et l\'appareil récepteur appartiennent au même réseau WiFi</string>
<string name="hotspot_dialog_neutral_button">PROCEDER</string>
<string name="hotspot_dialog_message">Pour que cette fonctionnalité fonctionne, vous devez dabord activer manuellement votre point daccès WiFi ou vous assurer que lappareil hôte et lappareil récepteur appartiennent au même réseau WiFi.</string>
<string name="hotspot_dialog_neutral_button">PROCÉDER</string>
<string name="hotspot_channel_description">Mises à jour concernant létat de votre point daccès/serveur.</string>
<string name="hotspot_notification_content_title">Point daccès Kiwix</string>
<string name="start_server_label">Démarrer le serveur</string>
@ -87,7 +87,7 @@
<string name="pref_notes">Notes</string>
<string name="all_history_cleared">Tout lhistorique est effacé</string>
<string name="pref_clear_all_bookmarks_title">Supprimer les marque-pages</string>
<string name="clear_all_history_dialog_title">Effacer tout lhistorique ?</string>
<string name="clear_all_history_dialog_title">Effacer tout lhistorique?</string>
<string name="share">Partager</string>
<string name="selected_file_cab_app_chooser_title">Partager des fichiers ZIM avec:</string>
<string name="delete">Supprimer</string>
@ -102,7 +102,7 @@
<string name="rate_dialog_title">Merci de nous évaluer</string>
<string name="rate_dialog_msg_1">Si vous aimez utiliser</string>
<string name="rate_dialog_msg_2">, veuillez prendre un moment pour lévaluer. Merci pour votre soutien!</string>
<string name="rate_dialog_positive">Donnez nous une note!</string>
<string name="rate_dialog_positive">Donnez nous une note!</string>
<string name="no_thanks">Non merci</string>
<string name="rate_dialog_neutral">Plus tard</string>
<string name="open">Ouvrir</string>
@ -117,7 +117,7 @@
<string name="local_zims">Appareil</string>
<string name="remote_zims">En ligne</string>
<string name="library">Bibliothèque</string>
<string name="delete_zim_body">Les fichiers zim suivants seront supprimés :\n\n%s</string>
<string name="delete_zim_body">Le ou les fichiers zim suivants seront supprimés:\n\n%s</string>
<string name="delete_zims_toast">Les fichiers ont bien été supprimés</string>
<string name="no_files_here">Aucun fichier ici</string>
<string name="download_no_space">Espace insuffisant pour le téléchargement.</string>
@ -139,7 +139,7 @@
<string name="help_11">Les fichiers ZIM téléchargés dans lapplication sont situés dans le répertoire de stockage externe dans un répertoire appelé Kiwix.</string>
<string name="pref_storage">Stockage</string>
<string name="pref_current_folder">Dossier actuel</string>
<string name="delete_zim_failed">Désolé, nous n\'avons pas pu supprimer certains fichiers. Vous devriez essayer dutiliser un gestionnaire de fichiers à la place.</string>
<string name="delete_zim_failed">Désolé, nous navons pas pu supprimer certains fichiers. Vous devriez essayer dutiliser un gestionnaire de fichiers à la place.</string>
<string name="tts_pause">pause</string>
<string name="tts_resume">reprendre</string>
<string name="stop">arrêter</string>
@ -151,12 +151,12 @@
<string name="confirm_stop_download_msg">Êtes-vous sûr de vouloir arrêter ce téléchargement?</string>
<string name="download_change_storage">Sélecteur de périphérique de stockage</string>
<string name="tts_not_enabled">La synthèse vocale nest pas activée pour ce fichier ZIM</string>
<string name="texttospeech_initialization_failed">Linitialisation de Texte en Paroles a échoué. Veuillez réessayer</string>
<string name="texttospeech_error">Erreur inattendue dans Texte en Paroles. Veuillez réessayer</string>
<string name="texttospeech_initialization_failed">Linitialisation de Texte en Paroles a échoué. Veuillez réessayer.</string>
<string name="texttospeech_error">Erreur inattendue dans Texte en Paroles. Veuillez réessayer.</string>
<string name="next">Suivant</string>
<string name="previous">Précédent</string>
<string name="wifi_only_title">Permettre le téléchargement de contenu via le réseau mobile?</string>
<string name="wifi_only_msg">Si vous choisissez « Oui », vous ne serez plus averti à lavenir. Cependant, vous pouvez toujours modifier cela dans les paramètres.</string>
<string name="wifi_only_msg">Si vous choisissez «Oui», vous ne serez plus averti à lavenir. Cependant, vous pouvez toujours modifier cela dans les paramètres.</string>
<string name="pref_wifi_only">Télécharger le contenu uniquement via WiFi</string>
<string name="time_day">jour</string>
<string name="time_hour">h</string>
@ -167,13 +167,13 @@
<string name="time_yesterday">Hier</string>
<string name="pref_external_link_popup_title">Avertir lors de laccès à des liens externes</string>
<string name="pref_external_link_popup_summary">Afficher un dialogue pour avertir à propos de coûts supplémentaires ou de liens ne fonctionnant pas hors connexion.</string>
<string name="external_link_popup_dialog_title">Accès au lien externe !</string>
<string name="external_link_popup_dialog_title">Accès au lien externe!</string>
<string name="external_link_popup_dialog_message">Vous accédez à un lien externe. Cela peut engendrer des coûts supplémentaires pour le transfert de données ou ne fonctionnera tout simplement pas lorsque vous serez hors ligne. Voulez-vous continuer?</string>
<string name="do_not_ask_anymore">Ne plus demander</string>
<string name="your_languages">Langues sélectionnées:</string>
<string name="other_languages">Autres langues:</string>
<string name="no_items_msg">Aucun élément disponible</string>
<string name="crash_title">Eh bien… cest embarrassant</string>
<string name="crash_title">Hé bien… cest embarrassant.</string>
<string name="crash_description">Il semble que nous ayons planté.\n\nPourriez-vous nous aider à corriger ce problème en envoyant linformation suivante?</string>
<string name="crash_checkbox_language">Vos paramètres de langue</string>
<string name="crash_checkbox_zimfiles">Une liste de vos fichiers ZIM</string>
@ -188,7 +188,7 @@
<string name="articleCount">%s articles</string>
<string name="get_started">Commencer</string>
<string name="download_books">Télécharger des livres</string>
<string name="humankind_knowledge">Connaissances de lespèce humaine, sur votre téléphone.</string>
<string name="humankind_knowledge">La connaissance de lhumanité, sur votre téléphone.</string>
<string name="welcome_to_the_family">Bienvenue dans la famille</string>
<string name="save_books_offline">Enregistrer des livres hors connexion</string>
<string name="download_books_message">Téléchargez et lisez des livres où que vous soyez.</string>
@ -219,8 +219,8 @@
<string name="ext_storage_permission_rationale_add_note">Laccès au stockage est nécessaire pour Notes.</string>
<string name="ext_storage_write_permission_denied_add_note">Notes ne peut être utilisé sans accès au stockage</string>
<string name="note_save_unsuccessful">Note enregistrée avec succès</string>
<string name="note_delete_successful">La note a bien été supprimée</string>
<string name="note_delete_unsuccessful">La note na pas été supprimée</string>
<string name="note_delete_successful">La note a bien été supprimée.</string>
<string name="note_delete_unsuccessful">La note na pas été supprimée.</string>
<string name="note_save_successful">Note enregistrée</string>
<string name="note_save_error_storage_not_writable">Erreur lors de la sauvegarde de la note: le stockage nautorise pas lécriture</string>
<string name="note_share_error_file_missing">Le fichier de note est inexistant</string>
@ -259,19 +259,19 @@
<string name="status">État</string>
<string name="pref_clear_all_notes_summary">Effacer toutes les notes sur tous les articles</string>
<string name="pref_clear_all_notes_title">Effacer toutes les notes</string>
<string name="pref_text_zoom_summary">Modifier la taille du texte par incrément de 25%.</string>
<string name="pref_text_zoom_summary">Modifier la taille du texte par incrément de 25%.</string>
<string name="tag_pic">Image</string>
<string name="tag_vid">Vidéo</string>
<string name="tag_text_only">Texte seulement</string>
<string name="tag_short_text">Texte bref</string>
<string name="storage_permission_denied">Autorisation de stockage refusée</string>
<string name="storage_permission_denied">Autorisation de stockage refusée.</string>
<string name="grant_read_storage_permission">Cette application a besoin de la possibilité de lire le stockage pour pouvoir fonctionner. Veuillez accorder le droit dans vos paramètres.</string>
<string name="go_to_settings">Aller aux paramètres de Hotspot</string>
<string name="no_results">Aucun résultat</string>
<string name="go_to_settings">Aller aux paramètres du point daccès</string>
<string name="no_results">Aucun résultat.</string>
<string name="no_bookmarks">Aucun marque-page</string>
<string name="no_history">Aucun historique</string>
<string name="no_history">Aucun historique.</string>
<string name="device_default">Appareil par défaut</string>
<string name="delete_history">Supprimer tout lhistorique ?</string>
<string name="delete_history">Supprimer tout lhistorique?</string>
<string name="delete_selected_history">Supprimer lhistorique sélectionné?</string>
<string name="delete_bookmarks">Supprimer tous les signets?</string>
<string name="delete_selected_bookmarks">Supprimer les marque-pages sélectionnés?</string>
@ -282,15 +282,15 @@
<string name="crash_checkbox_file_system">Détails du système de fichiers</string>
<string name="diagnostic_report">Rapport de diagnostic</string>
<string name="diagnostic_report_message">Veuillez envoyer tous les détails suivants afin que nous puissions diagnostiquer le problème</string>
<string name="percentage">%d%%</string>
<string name="percentage">%d%%</string>
<string name="pref_text_zoom_title">Zoomer le texte</string>
<string name="search_open_in_new_tab">Ouvrir dans un nouvel onglet</string>
<string name="reader">Lecteur</string>
<string name="no_open_book">Pas de livre ouvert</string>
<string name="no_open_book">Aucun livre ouvert</string>
<string name="open_library">Ouvrir la bibliothèque</string>
<string name="tab_restored">Onglet restauré</string>
<string name="open_drawer">Ouvrir le tiroir</string>
<string name="close_drawer">Fermer le tiroir</string>
<string name="how_to_update_content">Comment actualiser le contenu ?</string>
<string name="update_content_description">Pour mettre à jour un contenu (un fichier zim), vous devez télécharger la dernière version complète de ce même contenu. Vous pouvez le faire via la section téléchargement.</string>
<string name="how_to_update_content">Comment actualiser le contenu?</string>
<string name="update_content_description">Pour mettre à jour un contenu (un fichier zim), vous devez télécharger la dernière version complète de ce même contenu. Vous pouvez le faire via la section de téléchargement.</string>
</resources>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* ArenaL5
* Athena in Wonderland
* Elisardojm
* Fitoschido
@ -45,7 +46,7 @@
<string name="pref_clear_all_history_title">Limpar o historial</string>
<string name="pref_clear_all_history_summary">Borrar as procuras recentes e o historial de lapelas</string>
<string name="all_history_cleared">Borrado todo o historial</string>
<string name="clear_all_history_dialog_title" fuzzy="true">Borrar todo o historial</string>
<string name="clear_all_history_dialog_title">Borrar todo o historial?</string>
<string name="delete">Borrar</string>
<string name="delete_specific_search_toast">Procuras recentes eliminadas</string>
<string name="hint_contents_drawer_message">Podes deslizar á esquerda para ver os contidos deste artigo</string>
@ -74,7 +75,7 @@
<string name="library">Biblioteca</string>
<string name="delete_zims_toast">Ficheiro eliminado</string>
<string name="no_files_here">Ningún ficheiro aquí</string>
<string name="download_no_space" fuzzy="true">Espacio insuficiente para descargar este ficheiro.</string>
<string name="download_no_space">Espacio insuficiente para descargar.</string>
<string name="space_available">Espazo dispoñible:</string>
<string name="zim_simple">Simple</string>
<string name="zim_no_pic">Sen imaxes</string>
@ -82,17 +83,17 @@
<string name="no_network_connection">Ningunha conexión de rede</string>
<string name="help_2">Que fai Kiwix?</string>
<string name="help_3">Kiwix é un lector de contido desconectado. Actúa como un navegador web, pero en vez de acceder a páxinas web en liña, le o contido dun ficheiro en formato ZIM.</string>
<string name="help_4" fuzzy="true">Se ben Kiwix deseñouse orixinalmente para proporcionar Wikipedia sen conexión, tamén pode ler outros contidos.</string>
<string name="help_4">Se ben Kiwix deseñouse orixinalmente para proporcionar Wikipedia sen conexión, tamén pode ler outros contidos.</string>
<string name="help_5">Onde esta o contido?</string>
<string name="help_6">O noso contido está aloxado no sitio web de Kiwix.</string>
<string name="help_7">Están dispoñibles como ficheiros ZIM. Hai unha chea deles:</string>
<string name="help_8">• Wikipedia está dispoñible para cada lingua por separado</string>
<string name="help_9">• Outros contidos, como Wikileaks ou Wikisource tamén están dispoñibles</string>
<string name="help_10" fuzzy="true">Pode descargar os ficheiros ZIM elixidos na aplicación, ou ben seleccionar coidadosamente os que queira, descargalos dende un ordenador e transferilos á súa tarxeta SD.</string>
<string name="help_10">Pode descargar os ficheiros ZIM elixidos na aplicación, ou ben seleccionar coidadosamente os que queira, descargalos dende un ordenador e transferilos á súa tarxeta SD.</string>
<string name="help_11">Os ficheiros ZIM descargados na aplicación atópanse no directorio de almacenamento externo, nunha carpeta chamada Kiwix.</string>
<string name="pref_storage">Almacenamento</string>
<string name="pref_current_folder">Carpeta actual</string>
<string name="delete_zim_failed" fuzzy="true">Non podemos eliminar este ficheiro. Debería probar cun administrador de ficheiros.</string>
<string name="delete_zim_failed">Sentímolo pero non podemos eliminar algúns ficheiros. Debería probar cun administrador de ficheiros.</string>
<string name="tts_pause">pausa</string>
<string name="tts_resume">continuar</string>
<string name="stop">deter</string>
@ -116,7 +117,7 @@
<string name="time_left">esquerda</string>
<string name="pref_external_link_popup_title">Avisar cando introducir ligazóns externas</string>
<string name="pref_external_link_popup_summary">Mostra as previsualizacións de páxinas para avisar sobre os custos adicionais ou cando non funciona en ligazóns desconectadas.</string>
<string name="external_link_popup_dialog_title" fuzzy="true">Introducindo ligazón externa</string>
<string name="external_link_popup_dialog_title">Introducindo ligazón externa!</string>
<string name="external_link_popup_dialog_message">Estás introducindo unha ligazón externa. Isto pode xerar gastos por transferencia de datos ou simplemente non funcionará cando está desconectado. Aínda quere continuar?</string>
<string name="do_not_ask_anymore">Non preguntar máis</string>
<string name="your_languages">Linguas escollidas:</string>

View File

@ -23,7 +23,7 @@
<string name="menu_read_aloud">להקריא בקול</string>
<string name="menu_read_aloud_stop">להפסיק להקריא בקול</string>
<string name="menu_support_kiwix">לתמוך בקיוויקס</string>
<string name="menu_host_books">לארח ספרים</string>
<string name="menu_wifi_hotspot">לארח ספרים</string>
<string name="save_media">שמירת מדיה</string>
<string name="save_media_error">אירעה שגיאה בעת ניסיון לשמור את המדיה!</string>
<string name="save_media_saved">המדיה נשמרה בתור %s אל Android/media/org.kiwix…/</string>

View File

@ -25,7 +25,7 @@
<string name="menu_read_aloud">소리내어 읽기</string>
<string name="menu_read_aloud_stop">그만 소리내어 읽기</string>
<string name="menu_support_kiwix">Kiwix 지원하기</string>
<string name="menu_host_books">호스트북</string>
<string name="menu_wifi_hotspot">호스트북</string>
<string name="save_media">미디어 저장</string>
<string name="save_media_error">미디어 저장을 시도할 때 오류가 발생하였습니다!</string>
<string name="save_media_saved">미디어(%s)를 Android/media/org.kiwix…/에 저장했습니다</string>

View File

@ -18,7 +18,7 @@
<string name="menu_read_aloud">Bi dengê bilind bixwîne</string>
<string name="menu_read_aloud_stop">Xwendina dengê bilind rawestîne</string>
<string name="menu_support_kiwix">Piştgiriya Kiwix-ê Bike</string>
<string name="menu_host_books">Kitêban Bihewîne</string>
<string name="menu_wifi_hotspot">Kitêban Bihewîne</string>
<string name="save_media">Medyayê Tomar Bike</string>
<string name="save_media_error">Gava ku medya dihat tomarkirin çewtiyek derket holêǃ</string>
<string name="save_media_saved">Medya wek %s ji Android/media/org.kiwix…/ re hate qeydkirin</string>

View File

@ -15,7 +15,7 @@
<string name="menu_read_aloud">Прочитај на глас</string>
<string name="menu_read_aloud_stop">Запри читање на глас</string>
<string name="menu_support_kiwix">Поддржете го Кивикс</string>
<string name="menu_host_books">Книги на домаќинот</string>
<string name="menu_wifi_hotspot">Книги на домаќинот</string>
<string name="save_media">Зачувај медиум</string>
<string name="save_media_error">Настана грешка при зачувувањето на податотеката!</string>
<string name="save_media_saved">Податотеката е зачувана како %s во Android/media/org.kiwix…/</string>

View File

@ -38,6 +38,7 @@
<string name="tts_lang_not_supported">ဤစာမျက်နှာ၏ ဘာသာစကားကို မထောက်ပံ့ထားပါ၊ သို့မဟုတ် သင့်လျော်သော ဘာသာစကားဒေတာကို သွင်းမထားပါ။ ဆောင်းပါးကို မှန်ကန်စွာ ဖတ်နိုင်မည်မဟုတ်ပါ။</string>
<string name="delete_recent_search_item">ဤဟာကို ဖျက်မည်လား</string>
<string name="pref_clear_all_history_title">မှတ်တမ်းအားရှင်းမည်</string>
<string name="pref_notes">မှတ်စုများ</string>
<string name="all_history_cleared">ရာဇဝင်အားလုံး ရှင်းလင်းပြီး</string>
<string name="pref_clear_all_bookmarks_title">မှတ်သားထားသော စာအုပ်များကိုဖျက်ပါ</string>
<string name="clear_all_history_dialog_title" fuzzy="true">မှတ်တမ်းများအားလုံး ရှင်းလင်းရန်</string>

View File

@ -26,7 +26,7 @@
<string name="menu_read_aloud">Czytaj na głos</string>
<string name="menu_read_aloud_stop">Zatrzymaj czytanie na głos</string>
<string name="menu_support_kiwix">Wspieraj Kiwix</string>
<string name="menu_host_books">Host Książek</string>
<string name="menu_wifi_hotspot">Host Książek</string>
<string name="save_media">Zapisz plik multimedialny jako…</string>
<string name="save_media_error">Wystąpił błąd podczas próby zapisania multimediów!</string>
<string name="save_media_saved">Zapisano plik multimedialny jako %s w folderze Android/media/org.kiwix…/</string>

View File

@ -21,7 +21,7 @@
<string name="menu_read_aloud">Ler em voz alta</string>
<string name="menu_read_aloud_stop">Parar de ler em voz alta</string>
<string name="menu_support_kiwix">Suporte Kiwix</string>
<string name="menu_host_books">Hospedagem de livro</string>
<string name="menu_wifi_hotspot">Hospedagem de livro</string>
<string name="save_media">Salvar mídia</string>
<string name="save_media_error">Ocorreu um erro ao tentar salvar a mídia!</string>
<string name="save_media_saved">Midia salva como %s para Android/media/org.kiwix…/</string>

View File

@ -10,14 +10,14 @@
* The RedBurn
* Verdy p
-->
<resources>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="all">
<string name="menu_help">{{Identical|Help}}</string>
<string name="menu_home">{{Identical|Home}}</string>
<string name="menu_settings">{{Identical|Settings}}</string>
<string name="bookmarks">{{Identical|Bookmark}}</string>
<string name="menu_random_article">{{Identical|Random article}}</string>
<string name="menu_full_screen">{{Identical|Full screen}}</string>
<string name="menu_host_books">Il s\'agit de la fonctionnalité hotspot - l\'anglais \"host books\" n\'est pas particulièrement satisfaisant à la base.</string>
<string name="menu_wifi_hotspot">* English : it maps to some \"hotspot\" feature in order to serve collections of contents (aka books) over a local network area.\n* French : il sagit de la fonctionnalité \'\'hotspot\'\': langlais \'\'host books\'\' nest pas particulièrement satisfaisant à la base.</string>
<string name="search_label">{{Identical|Search}}</string>
<string name="hotspot_details_message">Do not change:\n* &lt;code&gt;%1$s&lt;/code&gt; (replaced by the “SSID” value identifying the WiFi hotspot identity for users)\n* &lt;code&gt;%2$s&lt;/code&gt; (replaced by the password or code configured in the hotspot to authorize the association and network connection)</string>
<string name="hotspot_dialog_title">This the title displayed when a user clicks wants to start the server in the host books section</string>

View File

@ -18,7 +18,7 @@
<string name="menu_read_aloud">Citește cu voce tare</string>
<string name="menu_read_aloud_stop">Oprește citirea cu voce tare</string>
<string name="menu_support_kiwix">Susține Kiwix</string>
<string name="menu_host_books">Găzduiește Cărți</string>
<string name="menu_wifi_hotspot">Găzduiește Cărți</string>
<string name="save_media">Salvează Media</string>
<string name="save_media_error">A apărut o eroare în încercarea de a salva fișierul media!</string>
<string name="save_media_saved">Media salvată %s în Android/media/org.kiwix…/</string>

View File

@ -30,7 +30,7 @@
<string name="menu_read_aloud">Читать вслух</string>
<string name="menu_read_aloud_stop">Остановить чтение вслух</string>
<string name="menu_support_kiwix">Поддержать Kiwix</string>
<string name="menu_host_books">Разместить книги</string>
<string name="menu_wifi_hotspot">Разместить книги</string>
<string name="save_media">Сохранить Медиа-файлы</string>
<string name="save_media_error">Произошла ошибка при сохранении медиафайла!</string>
<string name="save_media_saved">Медиафайл сохранён как %s в Android/media/org.kiwix…/</string>

View File

@ -16,7 +16,7 @@
<string name="menu_read_aloud">Leghe a boghe arta</string>
<string name="menu_read_aloud_stop">Firma sa leghidura a boghe arta</string>
<string name="menu_support_kiwix">Suporta Kiwix</string>
<string name="menu_host_books">Istràngia libros</string>
<string name="menu_wifi_hotspot">Istràngia libros</string>
<string name="save_media">Sarba su mèdia</string>
<string name="save_media_error">B\'est istadu un\'errore durante su tentativu de sarvamentu de su mèdia!</string>
<string name="save_media_saved">Mèdia sarvadu comente %s in Android/media/org.kiwix…/</string>

View File

@ -13,7 +13,7 @@
<string name="menu_help">Pomoč</string>
<string name="menu_home">Domov</string>
<string name="menu_settings">Nastavitve</string>
<string name="menu_search_in_text">Najdi na strani</string>
<string name="menu_search_in_text">Poišči na strani</string>
<string name="bookmarks">Zaznamki</string>
<string name="menu_random_article">Naključni članek</string>
<string name="menu_full_screen">Celozaslonski način</string>
@ -54,7 +54,7 @@
<string name="share">Deli</string>
<string name="selected_file_cab_app_chooser_title">Deli ZIM datoteke z:</string>
<string name="delete">Odstrani</string>
<string name="delete_specific_search_toast">Nedavno iskanje je bilo odstranjeno</string>
<string name="delete_specific_search_toast">Zadnje iskanje je bilo odstranjeno</string>
<string name="hint_contents_drawer_message">Za ogled vsebine tega članka lahko povlecite v levo</string>
<string name="got_it">Razumem</string>
<string name="did_you_know">Ali ste vedeli?</string>
@ -83,7 +83,7 @@
<string name="no_files_here">Ni datotek tukaj</string>
<string name="download_no_space" fuzzy="true">Premalo prostora za prenos te datoteke.</string>
<string name="space_available">Prostor na voljo:</string>
<string name="zim_simple">Enostavno</string>
<string name="zim_simple">Preprosto</string>
<string name="zim_no_pic">Ni slik</string>
<string name="zim_no_vid">Ni videoposnetkov</string>
<string name="no_network_connection">Ni omrežne povezave</string>
@ -130,7 +130,7 @@
<string name="do_not_ask_anymore">Ne sprašuj več</string>
<string name="your_languages">Izbrani jeziki:</string>
<string name="other_languages">Drugi jeziki:</string>
<string name="no_items_msg">Ni na voljo nobenih elementov</string>
<string name="no_items_msg">Na voljo ni noben predmet</string>
<string name="crash_title">No… To je neprijetno</string>
<string name="crash_description">Izgleda, da smo se zrušili.</string>
<string name="crash_checkbox_language">Jezikovne nastavitve</string>
@ -144,7 +144,7 @@
<string name="get_content_shortcut_label">Pridobi vsebino</string>
<string name="fav_icon">Zaznamka</string>
<string name="articleCount">%s člankov</string>
<string name="get_started">Prični</string>
<string name="get_started">Začni</string>
<string name="download_books">Prenesi knjige</string>
<string name="humankind_knowledge">Znanje človeške vrste, na vašem telefonu.</string>
<string name="welcome_to_the_family">Dobrodošli v družini</string>
@ -154,7 +154,7 @@
<string name="go_to_previous_page">Pojdi na prejšnjo stran</string>
<string name="go_to_next_page">Pojdi na naslednjo stran</string>
<string name="table_of_contents">Kazalo vsebine</string>
<string name="select_languages">Izberi jezike</string>
<string name="select_languages">Izberite jezike</string>
<string name="save_languages">Shrani jezike</string>
<string name="send_feedback">Sporočite svoje mnenje</string>
<string name="expand">Razširi</string>
@ -174,7 +174,7 @@
<string name="save">Shrani</string>
<string name="note">Beležka</string>
<string name="wiki_article_title">Naslov članka Wiki</string>
<string name="ext_storage_permission_rationale_add_note">Dostop za shranjevanje se zahteva za Beležke</string>
<string name="ext_storage_permission_rationale_add_note">Za Beležke se zahteva dostop do pomnilnika</string>
<string name="ext_storage_write_permission_denied_add_note">Beležke ni mogoče uporabiti brez dostopa do prostora za shranjevanje</string>
<string name="note_save_unsuccessful">Shranjevanje beležke ni uspelo</string>
<string name="note_save_successful">Beležka je shranjena</string>

View File

@ -20,7 +20,7 @@
<string name="menu_read_aloud">Läs upp</string>
<string name="menu_read_aloud_stop">Sluta läsa upp</string>
<string name="menu_support_kiwix">Stöd Kiwix</string>
<string name="menu_host_books">Värdböcker</string>
<string name="menu_wifi_hotspot">Värdböcker</string>
<string name="save_media">Spara media</string>
<string name="save_media_error">Ett fel uppstod när media skulle sparas!</string>
<string name="save_media_saved">Sparade media som %s i Android/media/org.kiwix…/</string>

View File

@ -28,7 +28,7 @@
<string name="menu_read_aloud">Yüksek sesle oku</string>
<string name="menu_read_aloud_stop">Yüksek sesle okumayı sonlandır</string>
<string name="menu_support_kiwix">Kiwix\'i destekle</string>
<string name="menu_host_books">Ana Kitaplar</string>
<string name="menu_wifi_hotspot">Ana Kitaplar</string>
<string name="save_media">Ortam dosyasını kaydet</string>
<string name="save_media_error">Medya kaydedilmeye çalışılırken bir hata oluştu!</string>
<string name="save_media_saved">Medyayı %s olarak şuraya kaydet Android/media/org.kiwix…/</string>
@ -127,7 +127,7 @@
<string name="zim_no_vid">Video Yok</string>
<string name="no_network_connection">Ağ bağlantısı yok</string>
<string name="help_2">Kiwix ne yapar?</string>
<string name="help_3">Kiwix bir çevrimdışı içerik okuyucusudur. Aynı bir ağ tarayıcısı gibi çalışır ama web sayfalarına çevrimiçi erişmek yerine içeriği ZIM formatındaki bir dosyadan okur.</string>
<string name="help_3">Kiwix bir çevrimdışı içerik okuyucusudur. Bir tarayıcı gibi davranır, ancak çevrimiçi web sayfalarına erişmek yerine, içeriği ZIM formatında bir dosyadan okur.</string>
<string name="help_4">Kiwix orijinalde Vikipedi\'yi çevrimdışı olarak okuması için tasarlanmış olsa da diğer içerikleri de okuyabilir.</string>
<string name="help_5">İçerik nerededir?</string>
<string name="help_6">İçeriğimiz Kiwix web sayfasındadır.</string>

View File

@ -21,7 +21,7 @@
<string name="menu_read_aloud">Читати вголос</string>
<string name="menu_read_aloud_stop">Зупинити читання вголос</string>
<string name="menu_support_kiwix">Підтримати Kiwix</string>
<string name="menu_host_books">Розташувати книги</string>
<string name="menu_wifi_hotspot">Розташувати книги</string>
<string name="save_media">Зберегти медіафайл</string>
<string name="save_media_error">Сталася помилка при спробі зберегти медіафайл!</string>
<string name="save_media_saved">Медіафайл збережено як %s до Android/media/org.kiwix…/</string>

View File

@ -20,7 +20,7 @@
<string name="menu_read_aloud">朗讀</string>
<string name="menu_read_aloud_stop">停止朗讀</string>
<string name="menu_support_kiwix">支持 Kiwix</string>
<string name="menu_host_books">託管書籍</string>
<string name="menu_wifi_hotspot">託管書籍</string>
<string name="save_media">儲存媒體</string>
<string name="save_media_error">嘗試儲存該媒體時出錯!</string>
<string name="save_media_saved">已將媒體以 %1$s 儲存到 Android/media/org.kiwix…/</string>

View File

@ -5,6 +5,7 @@
* Akagisoy
* Arthur2e5
* Josephine W.
* LClightcat
* Liuxinyu970226
* Shuiwater
* SomeyaMako
@ -27,7 +28,7 @@
<string name="menu_read_aloud">朗读</string>
<string name="menu_read_aloud_stop">停止朗读</string>
<string name="menu_support_kiwix">支持Kiwix</string>
<string name="menu_host_books">成为服务器共享书籍</string>
<string name="menu_wifi_hotspot">成为服务器共享书籍</string>
<string name="save_media">保存媒体</string>
<string name="save_media_error">尝试保存该媒体时出错!</string>
<string name="save_media_saved">已将媒体作为%s保存至Android/media/org.kiwix…/</string>
@ -114,6 +115,7 @@
<string name="delete_zims_toast">文件已删除</string>
<string name="no_files_here">没有文件</string>
<string name="download_no_space">缺少下载所需的空间。</string>
<string name="download">下载</string>
<string name="space_available">可用空间:</string>
<string name="zim_simple">简单</string>
<string name="zim_no_pic">没有图片</string>
@ -143,6 +145,8 @@
<string name="confirm_stop_download_msg">您确定要停止此次下载么?</string>
<string name="download_change_storage">存储设备选择器</string>
<string name="tts_not_enabled">文字转换语音功能未对该ZIM文件启用</string>
<string name="texttospeech_initialization_failed">文字到语音的初始化失败。请再试一次</string>
<string name="texttospeech_error">文本到语音的转换过程中出现了未知错误。请再试一次</string>
<string name="next">下一页</string>
<string name="previous">上一页</string>
<string name="wifi_only_title">允许通过移动网络下载内容?</string>
@ -162,32 +166,48 @@
<string name="do_not_ask_anymore">不要再次询问</string>
<string name="your_languages">选择的语言:</string>
<string name="other_languages">其他语言:</string>
<string name="no_items_msg">没有可用的项目</string>
<string name="crash_title">这太尴尬了</string>
<string name="crash_description">看起来我们崩溃了。\n\n您是否介意通过发送以下信息帮助我们解决此问题</string>
<string name="crash_checkbox_language">您的语言设置</string>
<string name="crash_checkbox_zimfiles">Zim文件列表</string>
<string name="crash_checkbox_exception">崩溃详情</string>
<string name="crash_checkbox_logs">应用程序日志</string>
<string name="crash_checkbox_device">设备细节</string>
<string name="crash_button_confirm">发送详情</string>
<string name="shortcut_disabled_message">快捷方式不可用</string>
<string name="new_tab_shortcut_label">新建标签页</string>
<string name="get_content_shortcut_label">获取内容</string>
<string name="fav_icon">网站图像</string>
<string name="articleCount">%s个条目</string>
<string name="get_started">入门</string>
<string name="download_books">下载书籍</string>
<string name="welcome_to_the_family">欢迎到来</string>
<string name="save_books_offline">保存供离线使用</string>
<string name="download_books_message">随时随地下载书籍并阅读。</string>
<string name="unable_to_add_to_bookmarks">无法添加到书签</string>
<string name="go_to_previous_page">楼上</string>
<string name="go_to_next_page">下一楼</string>
<string name="table_of_contents">目录</string>
<string name="select_languages">选择的语言</string>
<string name="send_feedback">发送反馈</string>
<string name="expand">展开</string>
<string name="history">历史</string>
<string name="history_from_current_book">查看所有书籍的历史记录</string>
<string name="search_history">搜索历史</string>
<string name="selected_items">%1$d已选择</string>
<string name="bookmarks_from_current_book">查看所有书籍中的标签</string>
<string name="search_bookmarks">搜索书签</string>
<string name="switch_tabs">切换选项卡</string>
<string name="close_all_tabs">关闭所有标签</string>
<string name="pending_state">待处理</string>
<string name="running_state">进行中</string>
<string name="complete">完成</string>
<string name="paused_state">暂停</string>
<string name="failed_state">失败:%s</string>
<string name="save">保存</string>
<string name="note">请注意</string>
<string name="wiki_article_title">Wiki文章标题</string>
<string name="confirmation_alert_dialog_message">丢弃没保存的更改?</string>
<string name="delete_notes_confirmation_msg">删除所有笔记?</string>
<string name="nearby_devices">附近的设备</string>

View File

@ -11,7 +11,7 @@
<string name="menu_read_aloud">Read aloud</string>
<string name="menu_read_aloud_stop">Stop reading aloud</string>
<string name="menu_support_kiwix">Support Kiwix</string>
<string name="menu_host_books">Host Books</string>
<string name="menu_wifi_hotspot">WiFi Hotspot</string>
<string name="save_media">Save Media</string>
<string name="save_media_error">An error occurred when trying to save the media!</string>
<string name="save_media_saved">Saved media as %s to Android/media/org.kiwix…/</string>

1
custom/.gitignore vendored
View File

@ -1 +1,2 @@
/build
jacoco.exec

View File

@ -3,7 +3,7 @@
<Blacklist></Blacklist>
<Whitelist>
<ID>LongParameterList:DownloadCustom.kt$DownloadCustom$( id: String = "", title: String = "", description: String = "", language: String = "", creator: String = "", publisher: String = "", date: String = "", url: String = "", articleCount: String = "", mediaCount: String = "", size: String = "", name: String = "", favIcon: String = "" )</ID>
<ID>MagicNumber:CustomDownloadActivity.kt$CustomDownloadActivity$3</ID>
<ID>MagicNumber:CustomDownloadFragment.kt$CustomDownloadFragment$3</ID>
<ID>TooGenericExceptionThrown:ActivityExtensions.kt$throw RuntimeException( """ applicationContext is ${applicationContext::class.java.simpleName} application is ${application::class.java.simpleName} """.trimIndent() )</ID>
</Whitelist>
</SmellBaseline>

View File

@ -52,7 +52,6 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name=".download.CustomDownloadActivity" />
<receiver android:name=".main.CustomSearchWidget">
<intent-filter>

View File

@ -23,7 +23,7 @@ import dagger.BindsInstance
import dagger.Subcomponent
import org.kiwix.kiwixmobile.core.di.ActivityScope
import org.kiwix.kiwixmobile.core.di.components.CoreActivityComponent
import org.kiwix.kiwixmobile.custom.download.CustomDownloadActivity
import org.kiwix.kiwixmobile.custom.download.CustomDownloadFragment
import org.kiwix.kiwixmobile.custom.main.CustomMainActivity
import org.kiwix.kiwixmobile.custom.main.CustomReaderFragment
import org.kiwix.kiwixmobile.custom.settings.CustomSettingsFragment
@ -33,7 +33,7 @@ import org.kiwix.kiwixmobile.custom.settings.CustomSettingsFragment
interface CustomActivityComponent : CoreActivityComponent {
fun inject(customMainActivity: CustomMainActivity)
fun inject(customSettingsFragment: CustomSettingsFragment)
fun inject(customDownloadActivity: CustomDownloadActivity)
fun inject(customDownloadFragment: CustomDownloadFragment)
fun inject(customReaderFragment: CustomReaderFragment)
@Subcomponent.Builder

View File

@ -19,10 +19,13 @@
package org.kiwix.kiwixmobile.custom.download
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import io.reactivex.disposables.CompositeDisposable
import kotlinx.android.synthetic.main.activity_custom_download.cd_view_animator
import kotlinx.android.synthetic.main.fragment_custom_download.cd_view_animator
import kotlinx.android.synthetic.main.layout_custom_download_error.cd_error_text
import kotlinx.android.synthetic.main.layout_custom_download_error.cd_retry_button
import kotlinx.android.synthetic.main.layout_custom_download_in_progress.cd_download_state
@ -30,10 +33,12 @@ import kotlinx.android.synthetic.main.layout_custom_download_in_progress.cd_eta
import kotlinx.android.synthetic.main.layout_custom_download_in_progress.cd_progress
import kotlinx.android.synthetic.main.layout_custom_download_required.cd_download_button
import org.kiwix.kiwixmobile.core.base.BaseActivity
import org.kiwix.kiwixmobile.core.di.components.CoreComponent
import org.kiwix.kiwixmobile.core.base.BaseFragment
import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions
import org.kiwix.kiwixmobile.core.downloader.model.DownloadItem
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.viewModel
import org.kiwix.kiwixmobile.core.extensions.setDistinctDisplayedChild
import org.kiwix.kiwixmobile.core.extensions.viewModel
import org.kiwix.kiwixmobile.core.main.CoreMainActivity
import org.kiwix.kiwixmobile.custom.R
import org.kiwix.kiwixmobile.custom.customActivityComponent
import org.kiwix.kiwixmobile.custom.download.Action.ClickedDownload
@ -44,10 +49,7 @@ import org.kiwix.kiwixmobile.custom.download.State.DownloadInProgress
import org.kiwix.kiwixmobile.custom.download.State.DownloadRequired
import javax.inject.Inject
class CustomDownloadActivity : BaseActivity() {
override fun injection(coreComponent: CoreComponent) {
customActivityComponent.inject(this)
}
class CustomDownloadFragment : BaseFragment(), FragmentActivityExtensions {
private val downloadViewModel by lazy {
viewModel<CustomDownloadViewModel>(viewModelFactory)
@ -56,17 +58,30 @@ class CustomDownloadActivity : BaseActivity() {
@Inject lateinit var viewModelFactory: ViewModelProvider.Factory
private val compositeDisposable = CompositeDisposable()
override fun inject(baseActivity: BaseActivity) {
baseActivity.customActivityComponent.inject(this)
}
override fun onCreate(savedInstanceState: Bundle?) {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_custom_download)
downloadViewModel.state.observe(this, Observer(::render))
val root = inflater.inflate(R.layout.fragment_custom_download, container, false)
val activity = requireActivity() as CoreMainActivity
downloadViewModel.state.observe(viewLifecycleOwner, Observer(::render))
compositeDisposable.add(
downloadViewModel.effects.subscribe(
{ it.invokeWith(this) },
{ it.invokeWith(activity) },
Throwable::printStackTrace
)
)
return root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
cd_download_button.setOnClickListener { downloadViewModel.actions.offer(ClickedDownload) }
cd_retry_button.setOnClickListener { downloadViewModel.actions.offer(ClickedRetry) }
}
@ -74,6 +89,7 @@ class CustomDownloadActivity : BaseActivity() {
override fun onDestroy() {
super.onDestroy()
compositeDisposable.clear()
activity?.finish()
}
private fun render(state: State) {
@ -85,7 +101,7 @@ class CustomDownloadActivity : BaseActivity() {
}
is DownloadFailed -> {
cd_view_animator.setDistinctDisplayedChild(2)
cd_error_text.text = state.downloadState.toReadableState(this)
cd_error_text.text = context?.let(state.downloadState::toReadableState)
}
DownloadComplete -> cd_view_animator.setDistinctDisplayedChild(3)
}
@ -94,6 +110,6 @@ class CustomDownloadActivity : BaseActivity() {
private fun render(downloadItem: DownloadItem) {
cd_progress.progress = downloadItem.progress
cd_eta.text = downloadItem.readableEta
cd_download_state.text = downloadItem.downloadState.toReadableState(this)
cd_download_state.text = context?.let(downloadItem.downloadState::toReadableState)
}
}

View File

@ -34,7 +34,7 @@ import org.kiwix.kiwixmobile.custom.download.State.DownloadFailed
import org.kiwix.kiwixmobile.custom.download.State.DownloadInProgress
import org.kiwix.kiwixmobile.custom.download.State.DownloadRequired
import org.kiwix.kiwixmobile.custom.download.effects.DownloadCustom
import org.kiwix.kiwixmobile.custom.download.effects.FinishAndStartMain
import org.kiwix.kiwixmobile.custom.download.effects.NavigateToCustomReader
import org.kiwix.kiwixmobile.custom.download.effects.SetPreferredStorageWithMostSpace
import javax.inject.Inject
@ -42,7 +42,7 @@ class CustomDownloadViewModel @Inject constructor(
downloadDao: FetchDownloadDao,
setPreferredStorageWithMostSpace: SetPreferredStorageWithMostSpace,
private val downloadCustom: DownloadCustom,
private val finishAndStartMain: FinishAndStartMain
private val navigateToCustomReader: NavigateToCustomReader
) : ViewModel() {
val state = MutableLiveData<State>().apply { value = DownloadRequired }
@ -91,7 +91,7 @@ class CustomDownloadViewModel @Inject constructor(
else
DownloadInProgress(action.downloads)
else
DownloadComplete.also { _effects.offer(finishAndStartMain) }
DownloadComplete.also { _effects.offer(navigateToCustomReader) }
DownloadComplete -> state
}
}

View File

@ -24,7 +24,7 @@ import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.start
import org.kiwix.kiwixmobile.custom.main.CustomMainActivity
import javax.inject.Inject
class FinishAndStartMain @Inject constructor() : SideEffect<Unit> {
class NavigateToCustomReader @Inject constructor() : SideEffect<Unit> {
override fun invokeWith(activity: AppCompatActivity) {
activity.finish()
activity.start<CustomMainActivity>()

View File

@ -37,10 +37,11 @@ import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.lifecycle.Observer
import androidx.navigation.fragment.findNavController
import org.kiwix.kiwixmobile.core.base.BaseActivity
import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.observeNavigationResult
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.setupDrawerToggle
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.start
import org.kiwix.kiwixmobile.core.main.CoreReaderFragment
import org.kiwix.kiwixmobile.core.main.FIND_IN_PAGE_SEARCH_STRING
import org.kiwix.kiwixmobile.core.main.MainMenu
@ -54,12 +55,9 @@ import org.kiwix.kiwixmobile.core.utils.urlSuffixToParsableUrl
import org.kiwix.kiwixmobile.custom.BuildConfig
import org.kiwix.kiwixmobile.custom.R
import org.kiwix.kiwixmobile.custom.customActivityComponent
import org.kiwix.kiwixmobile.custom.download.CustomDownloadActivity
import java.util.Locale
import javax.inject.Inject
const val PAGE_URL_KEY = "pageUrl"
class CustomReaderFragment : CoreReaderFragment() {
override fun inject(baseActivity: BaseActivity) {
@ -68,13 +66,13 @@ class CustomReaderFragment : CoreReaderFragment() {
@Inject lateinit var customFileValidator: CustomFileValidator
@Inject lateinit var dialogShower: DialogShower
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (enforcedLanguage()) {
return
}
if (isAdded) {
setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
if (BuildConfig.DISABLE_SIDEBAR) {
val toolbarToc = activity?.findViewById<ImageView>(R.id.bottom_toolbar_toc)
@ -97,6 +95,12 @@ class CustomReaderFragment : CoreReaderFragment() {
Observer(::openSearchItem)
)
}
}
override fun onBackPressed(activity: AppCompatActivity): FragmentActivityExtensions.Super {
requireActivity().finish()
return super.onBackPressed(activity)
}
private fun openSearchItem(item: SearchItemToOpen) {
zimReaderContainer.titleToUrl(item.pageTitle)?.apply {
@ -157,8 +161,7 @@ class CustomReaderFragment : CoreReaderFragment() {
) {
requestPermissions(arrayOf(READ_EXTERNAL_STORAGE), REQUEST_READ_FOR_OBB)
} else {
activity?.finish()
activity?.start<CustomDownloadActivity>()
findNavController().navigate(R.id.customDownloadFragment)
}
}
)

View File

@ -5,7 +5,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:showIn="@layout/activity_custom_download">
tools:showIn="@layout/fragment_custom_download">
<TextView
android:layout_width="wrap_content"

View File

@ -5,7 +5,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:showIn="@layout/activity_custom_download">
tools:showIn="@layout/fragment_custom_download">
<TextView
android:id="@+id/cd_error_text"

View File

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:showIn="@layout/activity_custom_download">
tools:showIn="@layout/fragment_custom_download">
<TextView
android:id="@+id/cd_text"

View File

@ -24,6 +24,7 @@
android:id="@+id/customReaderFragment"
android:name="org.kiwix.kiwixmobile.custom.main.CustomReaderFragment"
android:label="CustomReaderFragment">
<argument
android:name="pageUrl"
android:defaultValue=""
@ -36,6 +37,11 @@
android:name="shouldOpenInNewTab"
android:defaultValue="false"
app:argType="boolean" />
<action
android:id="@+id/action_customReader_to_customDownload"
app:destination="@id/customDownloadFragment"
app:popUpTo="@id/customReaderFragment"
app:popUpToInclusive="true" />
</fragment>
<fragment
android:id="@+id/historyFragment"
@ -53,6 +59,16 @@
android:id="@+id/customSettingsFragment"
android:name="org.kiwix.kiwixmobile.custom.settings.CustomSettingsFragment"
android:label="CustomSettingsFragment" />
<fragment
android:id="@+id/customDownloadFragment"
android:name="org.kiwix.kiwixmobile.custom.download.CustomDownloadFragment"
android:label="CustomDownloadFragment">
<action
android:id="@+id/action_customDownload_to_customReader"
app:destination="@id/customReaderFragment"
app:popUpTo="@id/customDownloadFragment"
app:popUpToInclusive="true" />
</fragment>
<fragment
android:id="@+id/searchFragment"
android:name="org.kiwix.kiwixmobile.core.search.SearchFragment"

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* Jakub Fabijan
-->
<resources>
<string name="download">Elŝuti</string>
</resources>

View File

@ -2,6 +2,6 @@
<!-- Authors:
* Robby
-->
<resources>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="all">
<string name="download">The title of the fragment/place where books are downloaded.</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Authors:
* LClightcat
-->
<resources>
<string name="download">下载</string>
</resources>

View File

@ -40,7 +40,7 @@ import org.kiwix.kiwixmobile.custom.download.State.DownloadFailed
import org.kiwix.kiwixmobile.custom.download.State.DownloadInProgress
import org.kiwix.kiwixmobile.custom.download.State.DownloadRequired
import org.kiwix.kiwixmobile.custom.download.effects.DownloadCustom
import org.kiwix.kiwixmobile.custom.download.effects.FinishAndStartMain
import org.kiwix.kiwixmobile.custom.download.effects.NavigateToCustomReader
import org.kiwix.kiwixmobile.custom.download.effects.SetPreferredStorageWithMostSpace
import org.kiwix.sharedFunctions.InstantExecutorExtension
import org.kiwix.sharedFunctions.downloadItem
@ -50,7 +50,7 @@ internal class CustomDownloadViewModelTest {
private val fetchDownloadDao: FetchDownloadDao = mockk()
private val setPreferredStorageWithMostSpace: SetPreferredStorageWithMostSpace = mockk()
private val downloadCustom: DownloadCustom = mockk()
private val finishAndStartMain: FinishAndStartMain = mockk()
private val navigateToCustomReader: NavigateToCustomReader = mockk()
private val downloads: PublishProcessor<List<DownloadModel>> = PublishProcessor.create()
private lateinit var customDownloadViewModel: CustomDownloadViewModel
@ -63,7 +63,7 @@ internal class CustomDownloadViewModelTest {
fetchDownloadDao,
setPreferredStorageWithMostSpace,
downloadCustom,
finishAndStartMain
navigateToCustomReader
)
}
@ -137,7 +137,7 @@ internal class CustomDownloadViewModelTest {
DatabaseEmission(listOf()),
DownloadComplete
)
sideEffects.assertValues(setPreferredStorageWithMostSpace, finishAndStartMain)
sideEffects.assertValues(setPreferredStorageWithMostSpace, navigateToCustomReader)
}
@Test

View File

@ -23,7 +23,7 @@ import io.mockk.mockk
import io.mockk.verify
import org.junit.jupiter.api.Test
internal class FinishAndStartMainTest {
internal class NavigateToCustomReaderTest {
@Test
fun `invokeWith finishes activity and starts main`() {
@ -31,7 +31,7 @@ internal class FinishAndStartMainTest {
// Inline functions cannot be mocked
// mockkObject(ActivityExtensions)
// every { start<CustomMainActivity>(null) } just Runs issues with inline extension functions
FinishAndStartMain().invokeWith(activity)
NavigateToCustomReader().invokeWith(activity)
verify {
activity.finish()
activity.startActivity(any())