diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 51df46d36..f9e09cc3c 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -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 diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 0c0e37525..09d723e92 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -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 diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 4e5ac2485..184d11048 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -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 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5fd5ff3a4..208e2b3c5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,7 +12,7 @@ on: jobs: publish: - runs-on: ubuntu-latest + runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v1 diff --git a/CHANGELOG b/CHANGELOG index 193d1b1dd..7bacc0048 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -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 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c29ebf0ff..055666067 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,7 +11,7 @@ apply(from = rootProject.file("jacoco.gradle")) ext { set("versionMajor", 3) set("versionMinor", 4) - set("versionPatch", 3) + set("versionPatch", 4) } fun generateVersionName() = "${ext["versionMajor"]}.${ext["versionMinor"]}.${ext["versionPatch"]}" diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/help/HelpFragmentTest.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/help/HelpFragmentTest.kt index 903077390..ec528006d 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/help/HelpFragmentTest.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/help/HelpFragmentTest.kt @@ -34,6 +34,9 @@ class HelpFragmentTest : BaseActivityTest() { clickOnWhereIsContent() assertWhereIsContentIsExpanded() clickOnWhereIsContent() + clickOnHowToUpdateContent() + assertHowToUpdateContentIsExpanded() + clickOnHowToUpdateContent() clickOnSendFeedback() } } diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/help/HelpRobot.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/help/HelpRobot.kt index f610925f8..7ccc07291 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/help/HelpRobot.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/help/HelpRobot.kt @@ -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)) } diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/main/TopLevelDestinationRobot.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/main/TopLevelDestinationRobot.kt index 34ef604c3..d12d6ac34 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/main/TopLevelDestinationRobot.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/main/TopLevelDestinationRobot.kt @@ -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) } } diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/search/SearchFragmentTest.java b/app/src/androidTest/java/org/kiwix/kiwixmobile/search/SearchFragmentTest.java deleted file mode 100644 index 1a4dd792a..000000000 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/search/SearchFragmentTest.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Kiwix Android - * Copyright (c) 2019 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.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 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)); - } -} diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/FileReader.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/search/SearchFragmentTest.kt similarity index 55% rename from core/src/main/java/org/kiwix/kiwixmobile/core/main/FileReader.kt rename to app/src/androidTest/java/org/kiwix/kiwixmobile/search/SearchFragmentTest.kt index a472fdb3a..bfeccded1 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/FileReader.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/search/SearchFragmentTest.kt @@ -15,18 +15,21 @@ * along with this program. If not, see . * */ -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) } } diff --git a/app/src/androidTest/java/org/kiwix/kiwixmobile/webserver/ZimHostRobot.kt b/app/src/androidTest/java/org/kiwix/kiwixmobile/webserver/ZimHostRobot.kt index 683c195fb..f6cb9184f 100644 --- a/app/src/androidTest/java/org/kiwix/kiwixmobile/webserver/ZimHostRobot.kt +++ b/app/src/androidTest/java/org/kiwix/kiwixmobile/webserver/ZimHostRobot.kt @@ -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)) } } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/main/KiwixMainActivity.kt b/app/src/main/java/org/kiwix/kiwixmobile/main/KiwixMainActivity.kt index 58e78da20..5e5004d5a 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/main/KiwixMainActivity.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/main/KiwixMainActivity.kt @@ -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()) } } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/reader/KiwixReaderFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/reader/KiwixReaderFragment.kt index 550dd6290..559c6aebe 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/reader/KiwixReaderFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/reader/KiwixReaderFragment.kt @@ -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) diff --git a/app/src/main/java/org/kiwix/kiwixmobile/webserver/ZimHostFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/webserver/ZimHostFragment.kt index 1cc344973..44bc75eaf 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/webserver/ZimHostFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/webserver/ZimHostFragment.kt @@ -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 diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ConnectivityBroadcastReceiver.kt b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ConnectivityBroadcastReceiver.kt index 43f8f0b8a..adde7f166 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ConnectivityBroadcastReceiver.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ConnectivityBroadcastReceiver.kt @@ -43,4 +43,8 @@ class ConnectivityBroadcastReceiver @Inject constructor( ) { _networkStates.onNext(connectivityManager.networkState) } + + fun stopNetworkState() { + _networkStates.onComplete() + } } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ZimManageViewModel.kt b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ZimManageViewModel.kt index 89a157fee..fb4fefc82 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ZimManageViewModel.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ZimManageViewModel.kt @@ -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() } diff --git a/app/src/main/res/navigation/kiwix_nav_graph.xml b/app/src/main/res/navigation/kiwix_nav_graph.xml index e51ca0ef7..c88915bc3 100644 --- a/app/src/main/res/navigation/kiwix_nav_graph.xml +++ b/app/src/main/res/navigation/kiwix_nav_graph.xml @@ -19,7 +19,7 @@ + app:startDestination="@id/readerFragment"> + - + + + Sendado de Dosierojn + Ricevado de Dosierojn + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 2a5d0353d..f2d1d2d7a 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -2,11 +2,12 @@ Votre système de fichiers ne prend pas en charge les fichiers de 4 Go ou plus. Détecte si le système de fichiers peut créer des fichiers de 4 Go ou plus - Échec de l\'ouverture du fichier\nEssayez de chercher ce fichier dans l\'onglet Appareils de votre Bibliothèque + Échec de l’ouverture du fichier.\nEssayez de chercher ce fichier dans l’onglet Appareils de votre Bibliothèque. Envoyer des fichiers Recevoir des fichiers diff --git a/app/src/main/res/values-qq/strings.xml b/app/src/main/res/values-qq/strings.xml index 76e186049..c7b432311 100644 --- a/app/src/main/res/values-qq/strings.xml +++ b/app/src/main/res/values-qq/strings.xml @@ -1,5 +1,5 @@ - + The title of an activity used for sending files. The titles of an activity used for receiving files. diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index edbd9d1bb..360f7c747 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -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" diff --git a/buildSrc/src/main/kotlin/plugin/AllProjectConfigurer.kt b/buildSrc/src/main/kotlin/plugin/AllProjectConfigurer.kt index e814f7886..a6cbbe0d2 100644 --- a/buildSrc/src/main/kotlin/plugin/AllProjectConfigurer.kt +++ b/buildSrc/src/main/kotlin/plugin/AllProjectConfigurer.kt @@ -48,7 +48,7 @@ class AllProjectConfigurer { fun configureBaseExtension(target: Project, path: String) { target.configureExtension { setCompileSdkVersion(Config.compileSdk) - ndkVersion = "21.3.6528147" + ndkVersion = "21.4.7075529" defaultConfig { setMinSdkVersion(Config.minSdk) setTargetSdkVersion(Config.targetSdk) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CompatFindActionModeCallback.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CompatFindActionModeCallback.kt index 6a0713911..eaa8876d4 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CompatFindActionModeCallback.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CompatFindActionModeCallback.kt @@ -158,6 +158,7 @@ class CompatFindActionModeCallback internal constructor(context: Context) : actionMode = null isActive = false webView?.clearMatches() + webView = null input.hideSoftInputFromWindow(webView?.windowToken, 0) } 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 58450f8d3..a1bd2d32d 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 @@ -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 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,24 +741,33 @@ public abstract class CoreReaderFragment extends BaseFragment } private KiwixWebView initalizeWebView(String url) { - AttributeSet attrs = StyleUtils.getAttributes(requireActivity(), R.xml.webview); - KiwixWebView webView = createWebView(attrs); - loadUrl(url, webView); - setUpWithTextToSpeech(webView); - documentParser.initInterface(webView); - new ServiceWorkerUninitialiser(() -> { - openMainPage(); - return Unit.INSTANCE; - }).initInterface(webView); - return webView; + 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); + new ServiceWorkerUninitialiser(() -> { + openMainPage(); + return Unit.INSTANCE; + }).initInterface(webView); + } + return webView; + } + return null; } @NotNull protected ToolbarScrollingKiwixWebView createWebView(AttributeSet attrs) { - return new ToolbarScrollingKiwixWebView( - getActivity(), this, attrs, (ViewGroup) activityMainRoot, videoView, - new CoreWebViewClient(this, zimReaderContainer), - toolbarContainer, bottomToolbar, - sharedPreferenceUtil); + 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,18 +833,20 @@ public abstract class CoreReaderFragment extends BaseFragment protected void selectTab(int position) { currentWebViewIndex = position; - contentFrame.removeAllViews(); - KiwixWebView webView = safelyGetWebView(position); - if (webView.getParent() != null) { - ((ViewGroup) webView.getParent()).removeView(webView); + if (contentFrame != null) { + contentFrame.removeAllViews(); + KiwixWebView webView = safelyGetWebView(position); + if (webView.getParent() != null) { + ((ViewGroup) webView.getParent()).removeView(webView); + } + contentFrame.addView(webView); + tabsAdapter.setSelected(currentWebViewIndex); + updateBottomToolbarVisibility(); + loadPrefs(); + updateUrlProcessor(); + updateTableOfContents(); + updateTitle(); } - contentFrame.addView(webView); - tabsAdapter.setSelected(currentWebViewIndex); - updateBottomToolbarVisibility(); - loadPrefs(); - updateUrlProcessor(); - updateTableOfContents(); - updateTitle(); } protected KiwixWebView safelyGetWebView(int 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() { - return getCurrentWebView().getUrl() != null; + 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.getUrl() == null) continue; - urls.put(view.getUrl()); - positions.put(view.getScrollY()); + 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; + 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); 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 c6afb6923..83e806e36 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 @@ -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)}" diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/search/SearchFragment.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/search/SearchFragment.kt index 79951beeb..1518ee9ff 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/search/SearchFragment.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/search/SearchFragment.kt @@ -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 { - searchViewModel.actions.offer(Filter(it)) + 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) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt index fcf6098ab..dadb75e95 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt @@ -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() } + } } diff --git a/core/src/main/res/layout/reader_fragment_content.xml b/core/src/main/res/layout/reader_fragment_content.xml index 88ddf1c17..a92acbe34 100644 --- a/core/src/main/res/layout/reader_fragment_content.xml +++ b/core/src/main/res/layout/reader_fragment_content.xml @@ -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" /> diff --git a/core/src/main/res/menu/menu_drawer_main.xml b/core/src/main/res/menu/menu_drawer_main.xml index ee9b4dffe..00c284e0f 100644 --- a/core/src/main/res/menu/menu_drawer_main.xml +++ b/core/src/main/res/menu/menu_drawer_main.xml @@ -20,7 +20,7 @@ diff --git a/core/src/main/res/values-ar/strings.xml b/core/src/main/res/values-ar/strings.xml index 5620fe0d8..2c9199555 100644 --- a/core/src/main/res/values-ar/strings.xml +++ b/core/src/main/res/values-ar/strings.xml @@ -22,7 +22,7 @@ اقرأ بصوت عالٍ توقف عن القراءة بصوت عالٍ دعم كيويكس - كتب المضيف + كتب المضيف حفظ الوسائط حدث خطأ عند محاولة حفظ الوسائط! حفظ الوسائط كـ%s إلى Android/media/org.kiwix…/ diff --git a/core/src/main/res/values-ckb/strings.xml b/core/src/main/res/values-ckb/strings.xml index 88e6595ec..a7b1a3c3a 100644 --- a/core/src/main/res/values-ckb/strings.xml +++ b/core/src/main/res/values-ckb/strings.xml @@ -20,7 +20,7 @@ بە بەرزی بیخوێنەوە بوەستە لە خوێندنەوە پشتگیریی کیویکس بکە - خانەخوێی کتێبەکان + خانەخوێی کتێبەکان میدیا پاشەکەوت بکە ھەڵەیەک ڕوویدا لەکاتی ھەوڵدان لە خەزێنەکردنی میدیاکە! میدیا پاشەکەوتکرا وەکو %s بۆ ئەندرۆید/میدیا/org.kiwix…/ diff --git a/core/src/main/res/values-cs/strings.xml b/core/src/main/res/values-cs/strings.xml index 58cbf4e86..1c987bbff 100644 --- a/core/src/main/res/values-cs/strings.xml +++ b/core/src/main/res/values-cs/strings.xml @@ -25,7 +25,7 @@ Číst nahlas Zastavit čtení nahlas Podpořte Kiwix - Hostujte Knihy + Hostujte Knihy Uložit médium jako… Došlo k chybě při pokusu o uložení média! Multimediální soubory uložené jako %s ve složce Android/media/org.kiwix…/ diff --git a/core/src/main/res/values-diq/strings.xml b/core/src/main/res/values-diq/strings.xml index 27108c119..3d4b30327 100644 --- a/core/src/main/res/values-diq/strings.xml +++ b/core/src/main/res/values-diq/strings.xml @@ -20,7 +20,7 @@ Be veng ra bıwane Bevengrawendış caverde Kiwix\'i desteg - Kıtabê esasi + Kıtabê esasi Medyay bışevekne Medya qeyd kerdış de yew xeta ameyê meydan! Medyay gorey %s\'i tiya dı qeyd kerê Android/media/org.kiwix…/ @@ -81,7 +81,7 @@ Verori pêro wa pak kerê? Vıla ke Dosyayanê ZIM\'i pê : - Bestere + Bıesternê Bıtexelne Cıgeyrayışo peyên wedariya Zerrey nê meqaley vinayışi rê peta hetê çepiya xuz kerê diff --git a/core/src/main/res/values-eo/strings.xml b/core/src/main/res/values-eo/strings.xml index 607f38ca5..aed6134b5 100644 --- a/core/src/main/res/values-eo/strings.xml +++ b/core/src/main/res/values-eo/strings.xml @@ -3,6 +3,7 @@ * Abijeet Patro * Blahma * Fitoschido +* Jakub Fabijan * Javiero * Kelson * KuboF @@ -52,10 +53,11 @@ Forviŝi ĵusajn serĉojn kaj historion de langetoj Notoj Forviŝis Ĉiun Historion - Forviŝi Ĉiun da Historio + Forviŝi Ĉiun da Historio? Diskonigi Diskonigi ZIM-dosierojn al: Forigi + Nuligi Forigis lastatempajn serĉojn Vi povas ŝovumi maldekstren por vidi la enhavon de ĉi tiu artikolo Komprenite @@ -84,6 +86,7 @@ Forigis dosieron Neniu dosiero ĉi tie Ne estas sufiĉa spaco por elŝuti ĉi tiun dosieron. + Elŝuti Havebla Spaco: Simpla Neniu Bildo @@ -127,7 +130,7 @@ Hieraŭ Averti pri aliro al eksteraj ligiloj Montri averton pri plia kosto aŭ nefunkciado pri eksteraj ligiloj. - Enigi Eksteran Ligilon + Enigi Eksteran Ligilon! 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? Ne demandu plu Elektitaj lingvoj: @@ -164,7 +167,7 @@ Historio el la aktuala libro Serĉi historion %1$d elektita(j) - Legosignoj en la aktuala libro + Montri legosignoj de ĉiuj libroj Serĉi legosignojn Ŝanĝi langetojn Fermi ĉiujn langetojn @@ -188,6 +191,14 @@ Eraro: Permeso pri konservejo mankas La tuta dosierujo da notoj foriĝis Iuj dosieroj ne foriĝis + %d libro(j) + Konektado fiaskis + Via Aparato: + PROKSIMAJ APARATOJ Forviŝi Ĉiujn Notojn Neniu Legosigno + Neniu Historio + Ŝaltita + Malŝaltita + Teksta Zomo diff --git a/core/src/main/res/values-fa/strings.xml b/core/src/main/res/values-fa/strings.xml index 7a9d5af13..24bee55f5 100644 --- a/core/src/main/res/values-fa/strings.xml +++ b/core/src/main/res/values-fa/strings.xml @@ -19,7 +19,7 @@ با صدای بلند بخوان خواندن با صدای بلند را متوقف کن پشتیبانی از کیویکس - کتاب‌های میزبان + کتاب‌های میزبان ذخیرهٔ رسانه خطایی در حین ذخیره‌سازی این رسانه رخ داد! رسانه با نام %s در Android/media/org.kiwix…/ ذخیره شد diff --git a/core/src/main/res/values-fi/strings.xml b/core/src/main/res/values-fi/strings.xml index 2fe3a0627..0027f9532 100644 --- a/core/src/main/res/values-fi/strings.xml +++ b/core/src/main/res/values-fi/strings.xml @@ -19,7 +19,7 @@ Lue ääneen Lopeta ääneen lukeminen Tue Kiwixiä - Hostaa kirjoja + Hostaa kirjoja Tallenna media Virhe mediaa tallennettaessa! Tallennettu media %s muodossa hakemistoon Android/media/org.kiwix…/ diff --git a/core/src/main/res/values-fr/strings.xml b/core/src/main/res/values-fr/strings.xml index afd411718..eb697d7e9 100644 --- a/core/src/main/res/values-fr/strings.xml +++ b/core/src/main/res/values-fr/strings.xml @@ -29,7 +29,7 @@ Lire à haute voix Arrêter de lire à haute voix Soutenir Kiwix - Diffuser des contenus + 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…/ @@ -43,7 +43,7 @@ Connexion refusée. Point d’accès WiFi actif Veuillez d’abord choisir les livres - Impossible de démarrer le serveur. Veuillez activer votre point d’accès WiFi + Impossible de démarrer le serveur. Veuillez activer votre point d’accès WiFi. Impossible de démarrer le serveur. Serveur démarré avec succès. Le serveur a été arrêté avec succès. @@ -51,11 +51,11 @@ Voici les détails de votre point d’accès local.\nSSID : %1$s\nPasse : %2$s Sélectionnez les fichiers que vous voulez héberger sur le serveur Démarrage du serveur - Instructions pour les livres hébergeurs + Instructions pour héberger des livres Connexion WiFi détectée Afin de pouvoir lire les livres sur d’autres appareils, veuillez vous assurer que tous ceux-ci sont connectés au même réseau WiFi. - Pour que cette fonctionnalité fonctionne, vous devez d’abord activer manuellement votre point d’accès WiFi ou vous assurer que l\'appareil hôte et l\'appareil récepteur appartiennent au même réseau WiFi - PROCEDER + Pour que cette fonctionnalité fonctionne, vous devez d’abord activer manuellement votre point d’accès WiFi ou vous assurer que l’appareil hôte et l’appareil récepteur appartiennent au même réseau WiFi. + PROCÉDER Mises à jour concernant l’état de votre point d’accès/serveur. Point d’accès Kiwix Démarrer le serveur @@ -87,7 +87,7 @@ Notes Tout l’historique est effacé Supprimer les marque-pages - Effacer tout l’historique ? + Effacer tout l’historique ? Partager Partager des fichiers ZIM avec : Supprimer @@ -102,7 +102,7 @@ Merci de nous évaluer Si vous aimez utiliser , veuillez prendre un moment pour l’évaluer. Merci pour votre soutien ! - Donnez nous une note! + Donnez nous une note ! Non merci Plus tard Ouvrir @@ -117,7 +117,7 @@ Appareil En ligne Bibliothèque - Les fichiers zim suivants seront supprimés :\n\n%s + Le ou les fichiers zim suivants seront supprimés :\n\n%s Les fichiers ont bien été supprimés Aucun fichier ici Espace insuffisant pour le téléchargement. @@ -139,7 +139,7 @@ Les fichiers ZIM téléchargés dans l’application sont situés dans le répertoire de stockage externe dans un répertoire appelé Kiwix. Stockage Dossier actuel - Désolé, nous n\'avons pas pu supprimer certains fichiers. Vous devriez essayer d’utiliser un gestionnaire de fichiers à la place. + Désolé, nous n’avons pas pu supprimer certains fichiers. Vous devriez essayer d’utiliser un gestionnaire de fichiers à la place. pause reprendre arrêter @@ -151,12 +151,12 @@ Êtes-vous sûr de vouloir arrêter ce téléchargement ? Sélecteur de périphérique de stockage La synthèse vocale n’est pas activée pour ce fichier ZIM - L’initialisation de Texte en Paroles a échoué. Veuillez réessayer - Erreur inattendue dans Texte en Paroles. Veuillez réessayer + L’initialisation de Texte en Paroles a échoué. Veuillez réessayer. + Erreur inattendue dans Texte en Paroles. Veuillez réessayer. Suivant Précédent Permettre le téléchargement de contenu via le réseau mobile ? - Si vous choisissez « Oui », vous ne serez plus averti à l’avenir. Cependant, vous pouvez toujours modifier cela dans les paramètres. + Si vous choisissez « Oui », vous ne serez plus averti à l’avenir. Cependant, vous pouvez toujours modifier cela dans les paramètres. Télécharger le contenu uniquement via WiFi jour  h @@ -167,13 +167,13 @@ Hier Avertir lors de l’accès à des liens externes Afficher un dialogue pour avertir à propos de coûts supplémentaires ou de liens ne fonctionnant pas hors connexion. - Accès au lien externe ! + Accès au lien externe ! 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 ? Ne plus demander Langues sélectionnées : Autres langues : Aucun élément disponible - Eh bien… c’est embarrassant + Hé 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 @@ -188,7 +188,7 @@ %s articles Commencer Télécharger des livres - Connaissances de l’espèce humaine, sur votre téléphone. + La connaissance de l’humanité, sur votre téléphone. Bienvenue dans la famille Enregistrer des livres hors connexion Téléchargez et lisez des livres où que vous soyez. @@ -219,8 +219,8 @@ L’accès au stockage est nécessaire pour Notes. Notes ne peut être utilisé sans accès au stockage Note enregistrée avec succès - La note a bien été supprimée - La note n’a pas été supprimée + La note a bien été supprimée. + La note n’a pas été supprimée. Note enregistrée Erreur lors de la sauvegarde de la note : le stockage n’autorise pas l’écriture Le fichier de note est inexistant @@ -259,21 +259,21 @@ État Effacer toutes les notes sur tous les articles Effacer toutes les notes - Modifier la taille du texte par incrément de 25%. + Modifier la taille du texte par incrément de 25 %. Image Vidéo Texte seulement Texte bref - Autorisation de stockage refusée + Autorisation de stockage refusée. Cette application a besoin de la possibilité de lire le stockage pour pouvoir fonctionner. Veuillez accorder le droit dans vos paramètres. - Aller aux paramètres de Hotspot - Aucun résultat + Aller aux paramètres du point d’accès + Aucun résultat. Aucun marque-page - Aucun historique + Aucun historique. Appareil par défaut - Supprimer tout l’historique ? + Supprimer tout l’historique ? Supprimer l’historique sélectionné ? - Supprimer tous les signets  ? + Supprimer tous les signets ? Supprimer les marque-pages sélectionnés ? Activé Désactivé @@ -282,15 +282,15 @@ Détails du système de fichiers Rapport de diagnostic Veuillez envoyer tous les détails suivants afin que nous puissions diagnostiquer le problème - %d%% + %d %% Zoomer le texte Ouvrir dans un nouvel onglet Lecteur - Pas de livre ouvert + Aucun livre ouvert Ouvrir la bibliothèque Onglet restauré Ouvrir le tiroir Fermer le tiroir - Comment actualiser le contenu ? - 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. + Comment actualiser le contenu ? + 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. diff --git a/core/src/main/res/values-gl/strings.xml b/core/src/main/res/values-gl/strings.xml index 4b008e89f..e165381b1 100644 --- a/core/src/main/res/values-gl/strings.xml +++ b/core/src/main/res/values-gl/strings.xml @@ -1,5 +1,6 @@ - + {{Identical|Help}} {{Identical|Home}} {{Identical|Settings}} {{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. + * English : it maps to some \"hotspot\" feature in order to serve collections of contents (aka books) over a local network area.\n* French : 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 diff --git a/core/src/main/res/values-ro/strings.xml b/core/src/main/res/values-ro/strings.xml index 39088c2c4..f487c4a88 100644 --- a/core/src/main/res/values-ro/strings.xml +++ b/core/src/main/res/values-ro/strings.xml @@ -18,7 +18,7 @@ Citește cu voce tare Oprește citirea cu voce tare Susține Kiwix - Găzduiește Cărți + Găzduiește Cărți Salvează Media A apărut o eroare în încercarea de a salva fișierul media! Media salvată %s în Android/media/org.kiwix…/ diff --git a/core/src/main/res/values-ru/strings.xml b/core/src/main/res/values-ru/strings.xml index ed1ec6b4a..369dceebd 100644 --- a/core/src/main/res/values-ru/strings.xml +++ b/core/src/main/res/values-ru/strings.xml @@ -30,7 +30,7 @@ Читать вслух Остановить чтение вслух Поддержать Kiwix - Разместить книги + Разместить книги Сохранить Медиа-файлы Произошла ошибка при сохранении медиафайла! Медиафайл сохранён как %s в Android/media/org.kiwix…/ diff --git a/core/src/main/res/values-sc/strings.xml b/core/src/main/res/values-sc/strings.xml index ee81ce66c..c0090eb93 100644 --- a/core/src/main/res/values-sc/strings.xml +++ b/core/src/main/res/values-sc/strings.xml @@ -16,7 +16,7 @@ Leghe a boghe arta Firma sa leghidura a boghe arta Suporta Kiwix - Istràngia libros + Istràngia libros Sarba su mèdia B\'est istadu un\'errore durante su tentativu de sarvamentu de su mèdia! Mèdia sarvadu comente %s in Android/media/org.kiwix…/ diff --git a/core/src/main/res/values-sl/strings.xml b/core/src/main/res/values-sl/strings.xml index 9eb57b554..07bde8e34 100644 --- a/core/src/main/res/values-sl/strings.xml +++ b/core/src/main/res/values-sl/strings.xml @@ -13,7 +13,7 @@ Pomoč Domov Nastavitve - Najdi na strani + Poišči na strani Zaznamki Naključni članek Celozaslonski način @@ -54,7 +54,7 @@ Deli Deli ZIM datoteke z: Odstrani - Nedavno iskanje je bilo odstranjeno + Zadnje iskanje je bilo odstranjeno Za ogled vsebine tega članka lahko povlecite v levo Razumem Ali ste vedeli? @@ -83,7 +83,7 @@ Ni datotek tukaj Premalo prostora za prenos te datoteke. Prostor na voljo: - Enostavno + Preprosto Ni slik Ni videoposnetkov Ni omrežne povezave @@ -130,7 +130,7 @@ Ne sprašuj več Izbrani jeziki: Drugi jeziki: - Ni na voljo nobenih elementov + Na voljo ni noben predmet No… To je neprijetno Izgleda, da smo se zrušili. Jezikovne nastavitve @@ -144,7 +144,7 @@ Pridobi vsebino Zaznamka %s člankov - Prični + Začni Prenesi knjige Znanje človeške vrste, na vašem telefonu. Dobrodošli v družini @@ -154,7 +154,7 @@ Pojdi na prejšnjo stran Pojdi na naslednjo stran Kazalo vsebine - Izberi jezike + Izberite jezike Shrani jezike Sporočite svoje mnenje Razširi @@ -174,7 +174,7 @@ Shrani Beležka Naslov članka Wiki - Dostop za shranjevanje se zahteva za Beležke + Za Beležke se zahteva dostop do pomnilnika Beležke ni mogoče uporabiti brez dostopa do prostora za shranjevanje Shranjevanje beležke ni uspelo Beležka je shranjena diff --git a/core/src/main/res/values-sv/strings.xml b/core/src/main/res/values-sv/strings.xml index 025389f35..81c90961e 100644 --- a/core/src/main/res/values-sv/strings.xml +++ b/core/src/main/res/values-sv/strings.xml @@ -20,7 +20,7 @@ Läs upp Sluta läsa upp Stöd Kiwix - Värdböcker + Värdböcker Spara media Ett fel uppstod när media skulle sparas! Sparade media som %s i Android/media/org.kiwix…/ diff --git a/core/src/main/res/values-tr/strings.xml b/core/src/main/res/values-tr/strings.xml index dbe42042e..40955151e 100644 --- a/core/src/main/res/values-tr/strings.xml +++ b/core/src/main/res/values-tr/strings.xml @@ -28,7 +28,7 @@ Yüksek sesle oku Yüksek sesle okumayı sonlandır Kiwix\'i destekle - Ana Kitaplar + Ana Kitaplar Ortam dosyasını kaydet Medya kaydedilmeye çalışılırken bir hata oluştu! Medyayı %s olarak şuraya kaydet Android/media/org.kiwix…/ @@ -127,7 +127,7 @@ Video Yok Ağ bağlantısı yok Kiwix ne yapar? - 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. + 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. Kiwix orijinalde Vikipedi\'yi çevrimdışı olarak okuması için tasarlanmış olsa da diğer içerikleri de okuyabilir. İçerik nerededir? İçeriğimiz Kiwix web sayfasındadır. diff --git a/core/src/main/res/values-uk/strings.xml b/core/src/main/res/values-uk/strings.xml index 5c29886dd..07b1feeae 100644 --- a/core/src/main/res/values-uk/strings.xml +++ b/core/src/main/res/values-uk/strings.xml @@ -21,7 +21,7 @@ Читати вголос Зупинити читання вголос Підтримати Kiwix - Розташувати книги + Розташувати книги Зберегти медіафайл Сталася помилка при спробі зберегти медіафайл! Медіафайл збережено як %s до Android/media/org.kiwix…/ diff --git a/core/src/main/res/values-zh-rTW/strings.xml b/core/src/main/res/values-zh-rTW/strings.xml index baee4200d..306c9c947 100644 --- a/core/src/main/res/values-zh-rTW/strings.xml +++ b/core/src/main/res/values-zh-rTW/strings.xml @@ -20,7 +20,7 @@ 朗讀 停止朗讀 支持 Kiwix - 託管書籍 + 託管書籍 儲存媒體 嘗試儲存該媒體時出錯! 已將媒體以 %1$s 儲存到 Android/media/org.kiwix…/ diff --git a/core/src/main/res/values-zh/strings.xml b/core/src/main/res/values-zh/strings.xml index bc4d652bb..7141b0d85 100644 --- a/core/src/main/res/values-zh/strings.xml +++ b/core/src/main/res/values-zh/strings.xml @@ -5,6 +5,7 @@ * Akagisoy * Arthur2e5 * Josephine W. +* LClightcat * Liuxinyu970226 * Shuiwater * SomeyaMako @@ -27,7 +28,7 @@ 朗读 停止朗读 支持Kiwix - 成为服务器共享书籍 + 成为服务器共享书籍 保存媒体 尝试保存该媒体时出错! 已将媒体作为%s保存至Android/media/org.kiwix…/ @@ -114,6 +115,7 @@ 文件已删除 没有文件 缺少下载所需的空间。 + 下载 可用空间: 简单 没有图片 @@ -143,6 +145,8 @@ 您确定要停止此次下载么? 存储设备选择器 文字转换语音功能未对该ZIM文件启用 + 文字到语音的初始化失败。请再试一次 + 文本到语音的转换过程中出现了未知错误。请再试一次 下一页 上一页 允许通过移动网络下载内容? @@ -162,32 +166,48 @@ 不要再次询问 选择的语言: 其他语言: + 没有可用的项目 这太尴尬了 看起来我们崩溃了。\n\n您是否介意通过发送以下信息帮助我们解决此问题? 您的语言设置 + Zim文件列表 崩溃详情 应用程序日志 设备细节 发送详情 + 快捷方式不可用 新建标签页 获取内容 + 网站图像 %s个条目 入门 下载书籍 欢迎到来 + 保存供离线使用 随时随地下载书籍并阅读。 + 无法添加到书签 楼上 下一楼 + 目录 选择的语言 发送反馈 展开 历史 + 查看所有书籍的历史记录 + 搜索历史 + %1$d已选择 + 查看所有书籍中的标签 + 搜索书签 + 切换选项卡 关闭所有标签 + 待处理 进行中 完成 暂停 + 失败:%s 保存 请注意 + Wiki文章标题 丢弃没保存的更改? 删除所有笔记? 附近的设备 diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index fe2ef8176..57ebb3db8 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -11,7 +11,7 @@ Read aloud Stop reading aloud Support Kiwix - Host Books + WiFi Hotspot Save Media An error occurred when trying to save the media! Saved media as %s to Android/media/org.kiwix…/ diff --git a/custom/.gitignore b/custom/.gitignore index 796b96d1c..c00d922bb 100644 --- a/custom/.gitignore +++ b/custom/.gitignore @@ -1 +1,2 @@ /build +jacoco.exec diff --git a/custom/detekt_baseline.xml b/custom/detekt_baseline.xml index d14ae3a4d..1c9b44536 100644 --- a/custom/detekt_baseline.xml +++ b/custom/detekt_baseline.xml @@ -3,7 +3,7 @@ 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 = "" ) - MagicNumber:CustomDownloadActivity.kt$CustomDownloadActivity$3 + MagicNumber:CustomDownloadFragment.kt$CustomDownloadFragment$3 TooGenericExceptionThrown:ActivityExtensions.kt$throw RuntimeException( """ applicationContext is ${applicationContext::class.java.simpleName} application is ${application::class.java.simpleName} """.trimIndent() ) diff --git a/custom/src/main/AndroidManifest.xml b/custom/src/main/AndroidManifest.xml index 593d70fd7..0724e2a4d 100644 --- a/custom/src/main/AndroidManifest.xml +++ b/custom/src/main/AndroidManifest.xml @@ -52,7 +52,6 @@ - diff --git a/custom/src/main/java/org/kiwix/kiwixmobile/custom/di/CustomActivityComponent.kt b/custom/src/main/java/org/kiwix/kiwixmobile/custom/di/CustomActivityComponent.kt index 56e494bf5..9456ac62d 100644 --- a/custom/src/main/java/org/kiwix/kiwixmobile/custom/di/CustomActivityComponent.kt +++ b/custom/src/main/java/org/kiwix/kiwixmobile/custom/di/CustomActivityComponent.kt @@ -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 diff --git a/custom/src/main/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadActivity.kt b/custom/src/main/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadFragment.kt similarity index 72% rename from custom/src/main/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadActivity.kt rename to custom/src/main/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadFragment.kt index 241b59745..bbfd063ec 100644 --- a/custom/src/main/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadActivity.kt +++ b/custom/src/main/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadFragment.kt @@ -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(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) } } diff --git a/custom/src/main/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadViewModel.kt b/custom/src/main/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadViewModel.kt index bd7150476..5920ec6bc 100644 --- a/custom/src/main/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadViewModel.kt +++ b/custom/src/main/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadViewModel.kt @@ -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().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 } } diff --git a/custom/src/main/java/org/kiwix/kiwixmobile/custom/download/effects/FinishAndStartMain.kt b/custom/src/main/java/org/kiwix/kiwixmobile/custom/download/effects/NavigateToCustomReader.kt similarity index 94% rename from custom/src/main/java/org/kiwix/kiwixmobile/custom/download/effects/FinishAndStartMain.kt rename to custom/src/main/java/org/kiwix/kiwixmobile/custom/download/effects/NavigateToCustomReader.kt index 719ac8094..449cdb490 100644 --- a/custom/src/main/java/org/kiwix/kiwixmobile/custom/download/effects/FinishAndStartMain.kt +++ b/custom/src/main/java/org/kiwix/kiwixmobile/custom/download/effects/NavigateToCustomReader.kt @@ -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 { +class NavigateToCustomReader @Inject constructor() : SideEffect { override fun invokeWith(activity: AppCompatActivity) { activity.finish() activity.start() diff --git a/custom/src/main/java/org/kiwix/kiwixmobile/custom/main/CustomReaderFragment.kt b/custom/src/main/java/org/kiwix/kiwixmobile/custom/main/CustomReaderFragment.kt index 69ace5c6c..d55b71ea0 100644 --- a/custom/src/main/java/org/kiwix/kiwixmobile/custom/main/CustomReaderFragment.kt +++ b/custom/src/main/java/org/kiwix/kiwixmobile/custom/main/CustomReaderFragment.kt @@ -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,34 +66,40 @@ 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 } - setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED) - if (BuildConfig.DISABLE_SIDEBAR) { - val toolbarToc = activity?.findViewById(R.id.bottom_toolbar_toc) - toolbarToc?.isEnabled = false - } - with(activity as AppCompatActivity) { - supportActionBar!!.setDisplayHomeAsUpEnabled(true) - setupDrawerToggle(toolbar) - } - loadPageFromNavigationArguments() + if (isAdded) { + setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED) + if (BuildConfig.DISABLE_SIDEBAR) { + val toolbarToc = activity?.findViewById(R.id.bottom_toolbar_toc) + toolbarToc?.isEnabled = false + } + with(activity as AppCompatActivity) { + supportActionBar!!.setDisplayHomeAsUpEnabled(true) + setupDrawerToggle(toolbar) + } + loadPageFromNavigationArguments() - requireActivity().observeNavigationResult( - FIND_IN_PAGE_SEARCH_STRING, - viewLifecycleOwner, - Observer(this::findInPage) - ) - requireActivity().observeNavigationResult( - TAG_FILE_SEARCHED, - viewLifecycleOwner, - Observer(::openSearchItem) - ) + requireActivity().observeNavigationResult( + FIND_IN_PAGE_SEARCH_STRING, + viewLifecycleOwner, + Observer(this::findInPage) + ) + requireActivity().observeNavigationResult( + TAG_FILE_SEARCHED, + viewLifecycleOwner, + Observer(::openSearchItem) + ) + } + } + + override fun onBackPressed(activity: AppCompatActivity): FragmentActivityExtensions.Super { + requireActivity().finish() + return super.onBackPressed(activity) } private fun openSearchItem(item: SearchItemToOpen) { @@ -157,8 +161,7 @@ class CustomReaderFragment : CoreReaderFragment() { ) { requestPermissions(arrayOf(READ_EXTERNAL_STORAGE), REQUEST_READ_FOR_OBB) } else { - activity?.finish() - activity?.start() + findNavController().navigate(R.id.customDownloadFragment) } } ) diff --git a/custom/src/main/res/layout/activity_custom_download.xml b/custom/src/main/res/layout/fragment_custom_download.xml similarity index 100% rename from custom/src/main/res/layout/activity_custom_download.xml rename to custom/src/main/res/layout/fragment_custom_download.xml diff --git a/custom/src/main/res/layout/layout_custom_download_complete.xml b/custom/src/main/res/layout/layout_custom_download_complete.xml index a0a8572ae..649ec1c97 100644 --- a/custom/src/main/res/layout/layout_custom_download_complete.xml +++ b/custom/src/main/res/layout/layout_custom_download_complete.xml @@ -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"> + tools:showIn="@layout/fragment_custom_download"> + tools:showIn="@layout/fragment_custom_download"> + + + + + + + + Elŝuti + diff --git a/custom/src/main/res/values-qq/strings.xml b/custom/src/main/res/values-qq/strings.xml index 457cfe1f9..d9cdfe621 100644 --- a/custom/src/main/res/values-qq/strings.xml +++ b/custom/src/main/res/values-qq/strings.xml @@ -2,6 +2,6 @@ - + The title of the fragment/place where books are downloaded. diff --git a/custom/src/main/res/values-zh/strings.xml b/custom/src/main/res/values-zh/strings.xml new file mode 100644 index 000000000..27d6604ef --- /dev/null +++ b/custom/src/main/res/values-zh/strings.xml @@ -0,0 +1,7 @@ + + + + 下载 + diff --git a/custom/src/test/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadViewModelTest.kt b/custom/src/test/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadViewModelTest.kt index 21ab0734a..749a72db4 100644 --- a/custom/src/test/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadViewModelTest.kt +++ b/custom/src/test/java/org/kiwix/kiwixmobile/custom/download/CustomDownloadViewModelTest.kt @@ -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> = 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 diff --git a/custom/src/test/java/org/kiwix/kiwixmobile/custom/download/effects/FinishAndStartMainTest.kt b/custom/src/test/java/org/kiwix/kiwixmobile/custom/download/effects/NavigateToCustomReaderTest.kt similarity index 93% rename from custom/src/test/java/org/kiwix/kiwixmobile/custom/download/effects/FinishAndStartMainTest.kt rename to custom/src/test/java/org/kiwix/kiwixmobile/custom/download/effects/NavigateToCustomReaderTest.kt index 11df21e98..44b12a1b7 100644 --- a/custom/src/test/java/org/kiwix/kiwixmobile/custom/download/effects/FinishAndStartMainTest.kt +++ b/custom/src/test/java/org/kiwix/kiwixmobile/custom/download/effects/NavigateToCustomReaderTest.kt @@ -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(null) } just Runs issues with inline extension functions - FinishAndStartMain().invokeWith(activity) + NavigateToCustomReader().invokeWith(activity) verify { activity.finish() activity.startActivity(any())