mirror of
https://github.com/kiwix/kiwix-android.git
synced 2025-09-17 19:35:36 -04:00
Using ParcelFileDescriptor
instead of FileDescriptor
.
* Telling android to not compress the `.zim` files in asset folder while building the apk/bundle.
This commit is contained in:
parent
99614ed88f
commit
c8b98cc504
@ -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)
|
||||
}
|
||||
|
@ -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")
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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<File> = obbFiles(),
|
||||
zimFiles: List<File> = 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()
|
||||
|
@ -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)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user