Skip to content

Commit

Permalink
Merge pull request #4158 from kiwix/Fixes#4157
Browse files Browse the repository at this point in the history
Fixed: `Item.getSize` sometimes throwing exception and application crashses.
  • Loading branch information
kelson42 authored Jan 3, 2025
2 parents eddb78c + 98f29b7 commit 061249a
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -293,7 +293,7 @@ class ZimFileReader constructor(
file: File,
infoPair: DirectAccessInfo
): InputStream? =
item?.size?.let {
item?.itemSize()?.let {
AssetFileDescriptor(
infoPair.parcelFileDescriptor(file),
infoPair.offset,
Expand Down Expand Up @@ -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
}
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down

0 comments on commit 061249a

Please sign in to comment.