From 4e16102bc47b0c5138f94eb14d3751e20c3eba80 Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Thu, 9 Jan 2025 12:34:55 +0530 Subject: [PATCH] Improved the copying/moving of ZIM chunks. * Now all the ZIM chunks are copying/moving correctly. * Improved the warning message to inform user what should they do after copying/moving all the ZIM chunks. * Implement a feature to directly view the copied/moved ZIM chunks by clicking on the button in warning dialog. --- .../library/CopyMoveFileHandler.kt | 6 ++++- .../library/LocalLibraryFragment.kt | 27 +++++++++++++++++-- .../core/utils/dialog/KiwixDialog.kt | 2 +- core/src/main/res/values/strings.xml | 3 ++- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/CopyMoveFileHandler.kt b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/CopyMoveFileHandler.kt index 4b118dd79..0f9e9d5ff 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/CopyMoveFileHandler.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/CopyMoveFileHandler.kt @@ -52,6 +52,7 @@ import org.kiwix.kiwixmobile.core.utils.INTERNAL_SELECT_POSITION import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import org.kiwix.kiwixmobile.core.utils.dialog.AlertDialogShower import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog +import org.kiwix.kiwixmobile.core.utils.files.FileUtils import org.kiwix.kiwixmobile.main.KiwixMainActivity import org.kiwix.kiwixmobile.zimManager.Fat32Checker import org.kiwix.kiwixmobile.zimManager.Fat32Checker.Companion.FOUR_GIGABYTES_IN_KILOBYTES @@ -405,6 +406,9 @@ class CopyMoveFileHandler @Inject constructor( } } + suspend fun isValidZimFile(destinationFile: File): Boolean = + FileUtils.isSplittedZimFile(destinationFile.name) || validateZimFileValid(destinationFile) + fun handleInvalidZimFile(destinationFile: File, sourceUri: Uri) { val errorMessage = activity.getString(R.string.error_file_invalid) if (isMoveOperation) { @@ -428,7 +432,7 @@ class CopyMoveFileHandler @Inject constructor( } } - suspend fun isValidZimFile(destinationFile: File): Boolean { + private suspend fun validateZimFileValid(destinationFile: File): Boolean { var archive: Archive? = null return try { // create archive object, and check if it has the mainEntry or not to validate the ZIM file. diff --git a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/LocalLibraryFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/LocalLibraryFragment.kt index bc505d1e9..ea200e5e8 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/LocalLibraryFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/LocalLibraryFragment.kt @@ -44,6 +44,7 @@ import androidx.appcompat.widget.Toolbar import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat +import androidx.core.content.FileProvider import androidx.core.net.toUri import androidx.core.view.MenuHost import androidx.core.view.MenuProvider @@ -423,7 +424,7 @@ class LocalLibraryFragment : BaseFragment(), CopyMoveFileHandler.FileCopyMoveCal // If the file name is not found, then let them to copy the file // and we will handle this later. val fileName = documentFile?.name - if (fileName != null && !FileUtils.isValidZimFile(fileName)) { + if (fileName != null && !isValidZimFile(fileName)) { activity.toast(string.error_file_invalid) return@launch } @@ -440,6 +441,9 @@ class LocalLibraryFragment : BaseFragment(), CopyMoveFileHandler.FileCopyMoveCal } } + private fun isValidZimFile(fileName: String): Boolean = + FileUtils.isValidZimFile(fileName) || FileUtils.isSplittedZimFile(fileName) + private suspend fun getZimFileFromUri( uri: Uri ): File? { @@ -707,7 +711,26 @@ class LocalLibraryFragment : BaseFragment(), CopyMoveFileHandler.FileCopyMoveCal private fun showWarningDialogForSplittedZimFile() { dialogShower.show( KiwixDialog.ShowWarningAboutSplittedZimFile, - {} + ::openCopiedMovedDirectory ) } + + private fun openCopiedMovedDirectory() { + val downloadedDirectoryPath = FileProvider.getUriForFile( + requireActivity(), + requireActivity().applicationContext.packageName + ".fileprovider", + File(sharedPreferenceUtil.prefStorage) + ) + val intent = Intent(Intent.ACTION_VIEW).apply { + setDataAndType(downloadedDirectoryPath, "*/*") + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + try { + requireActivity().startActivity(intent) + } catch (ignore: Exception) { + // TODO change the message + activity.toast(org.kiwix.kiwixmobile.core.R.string.no_reader_application_installed) + } + } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/dialog/KiwixDialog.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/dialog/KiwixDialog.kt index ac6c71798..5cde30ef2 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/dialog/KiwixDialog.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/dialog/KiwixDialog.kt @@ -121,7 +121,7 @@ sealed class KiwixDialog( data object ShowWarningAboutSplittedZimFile : KiwixDialog( null, R.string.verify_zim_chunk_copied_moved_properly, - android.R.string.ok, + R.string.view, android.R.string.ok, cancelable = false ) diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 9eba4713c..b8c39f203 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -334,7 +334,8 @@ Moving ZIM file… Kiwix requires the ZIM file to be in its own data directory. Do you want to copy or move it there? Error in copying the ZIM file: %s. - Be cautious: verify that all the ZIM chunks have been moved/copied properly! + Be cautious: verify that all the ZIM chunks have been moved/copied properly! \nAfter copying/moving all the ZIM chunks please refresh the library screen by swipe down. The Split ZIM file will add in library. + View Why copy/move files to app public directory? Due to Google Play policies on Android 11 and above, our app can no longer directly access files stored elsewhere on your device. To let you view your selected files, we need to move or copy them into a special folder within our application directory. This allows us to access and open the files. Choose storage to copy/move ZIM file