Merge pull request #4158 from kiwix/Fixes#4157

Fixed: `Item.getSize` sometimes throwing exception and application crashses.
This commit is contained in:
Kelson 2025-01-03 14:08:02 +01:00 committed by GitHub
commit 061249ad5f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 14 additions and 3 deletions

View File

@ -199,7 +199,7 @@ class ZimFileReader constructor(
private fun loadContent(uri: String, extension: String): InputStream? {
val item = getItem(uri)
if (compressedExtensions.any { it != extension }) {
item?.size?.let {
item?.itemSize()?.let {
// Check if the item size exceeds 1 MB
if (it / Kb > 1024) {
// Retrieve direct access information for the item
@ -293,7 +293,7 @@ class ZimFileReader constructor(
file: File,
infoPair: DirectAccessInfo
): InputStream? =
item?.size?.let {
item?.itemSize()?.let {
AssetFileDescriptor(
infoPair.parcelFileDescriptor(file),
infoPair.offset,
@ -455,3 +455,14 @@ const val ILLUSTRATION_SIZE = 48
// add content prefix to url since searched items return the url inside of zim without content prefix.
val String.addContentPrefix: String
get() = if (startsWith(CONTENT_PREFIX)) this else CONTENT_PREFIX + this
/**
* Handles any error thrown by this method. Developers should handle the flow if this method
* returns null. For more details, see: https://github.com/kiwix/kiwix-android/issues/4157
*/
fun Item.itemSize(): Long? = try {
size
} catch (ignore: Exception) {
Log.e(TAG, "Could not retrieve the item size.\n Original exception: $ignore")
null
}

View File

@ -58,7 +58,7 @@ class ZimReaderContainer @Inject constructor(private val zimFileReaderFactory: F
val headers = mutableMapOf("Accept-Ranges" to "bytes")
if ("Range" in requestHeaders.keys) {
setStatusCodeAndReasonPhrase(HttpURLConnection.HTTP_PARTIAL, "Partial Content")
val fullSize = zimFileReader?.getItem(url)?.size ?: 0L
val fullSize = zimFileReader?.getItem(url)?.itemSize() ?: 0L
val lastByte = fullSize - 1
val byteRanges = requestHeaders.getValue("Range").substringAfter("=").split("-")
headers["Content-Range"] = "bytes ${byteRanges[0]}-$lastByte/$fullSize"