From c8b98cc5041df46ec184c93d0d4fce34c6645fbd Mon Sep 17 00:00:00 2001 From: MohitMali Date: Tue, 31 Oct 2023 11:55:21 +0530 Subject: [PATCH] Using `ParcelFileDescriptor` instead of `FileDescriptor`. * Telling android to not compress the `.zim` files in asset folder while building the apk/bundle. --- .../core/main/CoreReaderFragment.kt | 17 ++++++++++------- .../kiwixmobile/core/reader/ZimFileReader.kt | 9 +++++---- .../core/reader/ZimReaderContainer.kt | 7 ++++--- custom/build.gradle.kts | 4 ++++ .../custom/main/CustomFileValidator.kt | 18 +++++++++--------- .../custom/main/CustomReaderFragment.kt | 4 ++-- 6 files changed, 34 insertions(+), 25 deletions(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt index 363063a36..c419baf48 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt @@ -38,6 +38,7 @@ import android.os.CountDownTimer import android.os.Handler import android.os.IBinder import android.os.Looper +import android.os.ParcelFileDescriptor import android.provider.Settings import android.util.AttributeSet import android.util.Log @@ -154,7 +155,6 @@ import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog import org.kiwix.kiwixmobile.core.utils.files.FileUtils.deleteCachedFiles import org.kiwix.kiwixmobile.core.utils.files.FileUtils.readFile import java.io.File -import java.io.FileDescriptor import java.io.IOException import java.text.SimpleDateFormat import java.util.Date @@ -1390,14 +1390,14 @@ abstract class CoreReaderFragment : protected fun openZimFile( file: File?, isCustomApp: Boolean = false, - fileDescriptor: FileDescriptor? = null + parcelFileDescriptor: ParcelFileDescriptor? = null ) { if (hasPermission(Manifest.permission.READ_EXTERNAL_STORAGE) || isCustomApp) { if (file?.isFileExist() == true) { openAndSetInContainer(file = file) updateTitle() - } else if (fileDescriptor != null) { - openAndSetInContainer(fileDescriptor = fileDescriptor) + } else if (parcelFileDescriptor != null) { + openAndSetInContainer(parcelFileDescriptor = parcelFileDescriptor) updateTitle() } else { Log.w(TAG_KIWIX, "ZIM file doesn't exist at " + file?.absolutePath) @@ -1427,7 +1427,10 @@ abstract class CoreReaderFragment : ) } - private fun openAndSetInContainer(file: File? = null, fileDescriptor: FileDescriptor? = null) { + private fun openAndSetInContainer( + file: File? = null, + parcelFileDescriptor: ParcelFileDescriptor? = null + ) { try { if (isNotPreviouslyOpenZim(file?.canonicalPath)) { webViewList.clear() @@ -1436,8 +1439,8 @@ abstract class CoreReaderFragment : e.printStackTrace() } zimReaderContainer?.let { zimReaderContainer -> - if (fileDescriptor != null) { - zimReaderContainer.setZimFileDescriptor(fileDescriptor) + if (parcelFileDescriptor != null) { + zimReaderContainer.setZimFileDescriptor(parcelFileDescriptor) } else { zimReaderContainer.setZimFile(file) } 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 f536a7aac..438c1fa19 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 @@ -40,7 +40,6 @@ import org.kiwix.libzim.Item import org.kiwix.libzim.SuggestionSearch import org.kiwix.libzim.SuggestionSearcher import java.io.File -import java.io.FileDescriptor import java.io.FileInputStream import java.io.IOException import java.io.InputStream @@ -54,13 +53,14 @@ private const val TAG = "ZimFileReader" class ZimFileReader constructor( val zimFile: File?, + val parcelFileDescriptor: ParcelFileDescriptor? = null, private val jniKiwixReader: Archive, private val nightModeConfig: NightModeConfig, private val searcher: SuggestionSearcher = SuggestionSearcher(jniKiwixReader) ) { interface Factory { fun create(file: File): ZimFileReader? - fun create(fileDescriptor: FileDescriptor): ZimFileReader? + fun create(parcelFileDescriptor: ParcelFileDescriptor): ZimFileReader? class Impl @Inject constructor(private val nightModeConfig: NightModeConfig) : Factory { @@ -79,12 +79,13 @@ class ZimFileReader constructor( null } - override fun create(fileDescriptor: FileDescriptor): ZimFileReader? = + override fun create(parcelFileDescriptor: ParcelFileDescriptor): ZimFileReader? = try { ZimFileReader( null, + parcelFileDescriptor, nightModeConfig = nightModeConfig, - jniKiwixReader = Archive(fileDescriptor) + jniKiwixReader = Archive(parcelFileDescriptor.fileDescriptor) ).also { Log.e(TAG, "create: with fileDescriptor") } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimReaderContainer.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimReaderContainer.kt index c354df487..052d900b1 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimReaderContainer.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimReaderContainer.kt @@ -17,11 +17,11 @@ */ package org.kiwix.kiwixmobile.core.reader +import android.os.ParcelFileDescriptor import android.webkit.WebResourceResponse import org.kiwix.kiwixmobile.core.extensions.isFileExist import org.kiwix.kiwixmobile.core.reader.ZimFileReader.Factory import java.io.File -import java.io.FileDescriptor import java.net.HttpURLConnection import javax.inject.Inject import javax.inject.Singleton @@ -43,9 +43,10 @@ class ZimReaderContainer @Inject constructor(private val zimFileReaderFactory: F else null } - fun setZimFileDescriptor(fileDescriptor: FileDescriptor) { + fun setZimFileDescriptor(parcelFileDescriptor: ParcelFileDescriptor) { zimFileReader = - if (fileDescriptor.valid()) zimFileReaderFactory.create(fileDescriptor) + if (parcelFileDescriptor.fileDescriptor.valid()) + zimFileReaderFactory.create(parcelFileDescriptor) else null } diff --git a/custom/build.gradle.kts b/custom/build.gradle.kts index 7b042594b..e743c213a 100644 --- a/custom/build.gradle.kts +++ b/custom/build.gradle.kts @@ -49,6 +49,10 @@ android { } } assetPacks += ":install_time_asset" + androidResources { + // to not compress zim file in asset folder + noCompress.add("zim") + } } fun ProductFlavor.createDownloadTask(file: File): Task { diff --git a/custom/src/main/java/org/kiwix/kiwixmobile/custom/main/CustomFileValidator.kt b/custom/src/main/java/org/kiwix/kiwixmobile/custom/main/CustomFileValidator.kt index 0cf15ed0e..b0963ea27 100644 --- a/custom/src/main/java/org/kiwix/kiwixmobile/custom/main/CustomFileValidator.kt +++ b/custom/src/main/java/org/kiwix/kiwixmobile/custom/main/CustomFileValidator.kt @@ -20,6 +20,7 @@ package org.kiwix.kiwixmobile.custom.main import android.content.Context import android.content.pm.PackageManager +import android.os.ParcelFileDescriptor import android.util.Log import androidx.core.content.ContextCompat import org.kiwix.kiwixmobile.custom.BuildConfig @@ -27,7 +28,6 @@ import org.kiwix.kiwixmobile.custom.main.ValidationState.HasBothFiles import org.kiwix.kiwixmobile.custom.main.ValidationState.HasFile import org.kiwix.kiwixmobile.custom.main.ValidationState.HasNothing import java.io.File -import java.io.FileDescriptor import java.io.IOException import javax.inject.Inject @@ -43,24 +43,24 @@ class CustomFileValidator @Inject constructor(private val context: Context) { private fun detectInstallationState( obbFiles: List = obbFiles(), zimFiles: List = zimFiles(), - assetFileDescriptor: FileDescriptor? = getFileFromPlayAssetDelivery() + assetFileDescriptor: ParcelFileDescriptor? = getParcelFileDescriptorFromPlayAssetDelivery() ): ValidationState { return when { assetFileDescriptor != null -> HasFile(null, assetFileDescriptor) - obbFiles.isNotEmpty() && zimFiles().isNotEmpty() -> HasBothFiles(obbFiles[0], zimFiles[0]) - obbFiles.isNotEmpty() -> HasFile(obbFiles[0]) - zimFiles.isNotEmpty() -> HasFile(zimFiles[0]) + // obbFiles.isNotEmpty() && zimFiles().isNotEmpty() -> HasBothFiles(obbFiles[0], zimFiles[0]) + // obbFiles.isNotEmpty() -> HasFile(obbFiles[0]) + // zimFiles.isNotEmpty() -> HasFile(zimFiles[0]) else -> HasNothing } } @Suppress("NestedBlockDepth", "MagicNumber") - private fun getFileFromPlayAssetDelivery(): FileDescriptor? { + private fun getParcelFileDescriptorFromPlayAssetDelivery(): ParcelFileDescriptor? { try { val context = context.createPackageContext(context.packageName, 0) val assetManager = context.assets - val inputStream = assetManager.openFd(BuildConfig.PLAY_ASSET_FILE) - return inputStream.fileDescriptor + val assetFileDescriptor = assetManager.openFd(BuildConfig.PLAY_ASSET_FILE) + return assetFileDescriptor.parcelFileDescriptor } catch (packageNameNotFoundException: PackageManager.NameNotFoundException) { Log.w( "ASSET_PACKAGE_DELIVERY", @@ -105,7 +105,7 @@ class CustomFileValidator @Inject constructor(private val context: Context) { sealed class ValidationState { data class HasBothFiles(val obbFile: File, val zimFile: File) : ValidationState() - data class HasFile(val file: File?, val fileDescriptor: FileDescriptor? = null) : + data class HasFile(val file: File?, val parcelFileDescriptor: ParcelFileDescriptor? = null) : ValidationState() object HasNothing : ValidationState() 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 f9ba5d208..d0e28ee5a 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 @@ -144,8 +144,8 @@ class CustomReaderFragment : CoreReaderFragment() { onFilesFound = { when (it) { is ValidationState.HasFile -> { - if (it.fileDescriptor != null) { - openZimFile(null, true, it.fileDescriptor) + if (it.parcelFileDescriptor != null) { + openZimFile(null, true, it.parcelFileDescriptor) } else { openZimFile(it.file, true) }