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 7329cf1e3..63c45e9a8 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 @@ -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 +} 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 c0bdefc03..88e43562a 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 @@ -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"