diff --git a/libraries/androidtools/api/src/main/kotlin/io/element/android/libraries/androidtools/api/FileSizeFormatter.kt b/libraries/androidtools/api/src/main/kotlin/io/element/android/libraries/androidtools/api/FileSizeFormatter.kt index 6c67d9a588..261b7cbecc 100644 --- a/libraries/androidtools/api/src/main/kotlin/io/element/android/libraries/androidtools/api/FileSizeFormatter.kt +++ b/libraries/androidtools/api/src/main/kotlin/io/element/android/libraries/androidtools/api/FileSizeFormatter.kt @@ -20,5 +20,5 @@ interface FileSizeFormatter { /** * Formats a content size to be in the form of bytes, kilobytes, megabytes, etc. */ - fun format(fileSize: Long): String + fun format(fileSize: Long, useShortFormat: Boolean = true): String } diff --git a/libraries/androidtools/impl/src/main/kotlin/io/element/android/libraries/androidtools/impl/AndroidFileSizeFormatter.kt b/libraries/androidtools/impl/src/main/kotlin/io/element/android/libraries/androidtools/impl/AndroidFileSizeFormatter.kt index 5a57c1d904..fe156f1635 100644 --- a/libraries/androidtools/impl/src/main/kotlin/io/element/android/libraries/androidtools/impl/AndroidFileSizeFormatter.kt +++ b/libraries/androidtools/impl/src/main/kotlin/io/element/android/libraries/androidtools/impl/AndroidFileSizeFormatter.kt @@ -17,6 +17,7 @@ package io.element.android.libraries.androidtools.impl import android.content.Context +import android.os.Build import android.text.format.Formatter import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.androidtools.api.FileSizeFormatter @@ -26,7 +27,25 @@ import javax.inject.Inject @ContributesBinding(AppScope::class) class AndroidFileSizeFormatter @Inject constructor(@ApplicationContext private val context: Context) : FileSizeFormatter { - override fun format(fileSize: Long): String { - return Formatter.formatShortFileSize(context, fileSize) + override fun format(fileSize: Long, useShortFormat: Boolean): String { + // Since Android O, the system considers that 1ko = 1000 bytes instead of 1024 bytes. + // We want to avoid that. + val normalizedSize = if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N) { + fileSize + } else { + // First convert the size + when { + fileSize < 1024 -> fileSize + fileSize < 1024 * 1024 -> fileSize * 1000 / 1024 + fileSize < 1024 * 1024 * 1024 -> fileSize * 1000 / 1024 * 1000 / 1024 + else -> fileSize * 1000 / 1024 * 1000 / 1024 * 1000 / 1024 + } + } + + return if (useShortFormat) { + Formatter.formatShortFileSize(context, normalizedSize) + } else { + Formatter.formatFileSize(context, normalizedSize) + } } } diff --git a/libraries/androidtools/test/src/main/kotlin/io/element/android/libraries/androidtools/test/FakeFileSizeFormatter.kt b/libraries/androidtools/test/src/main/kotlin/io/element/android/libraries/androidtools/test/FakeFileSizeFormatter.kt index d316510ec8..183a78eaf1 100644 --- a/libraries/androidtools/test/src/main/kotlin/io/element/android/libraries/androidtools/test/FakeFileSizeFormatter.kt +++ b/libraries/androidtools/test/src/main/kotlin/io/element/android/libraries/androidtools/test/FakeFileSizeFormatter.kt @@ -19,7 +19,7 @@ package io.element.android.libraries.androidtools.test import io.element.android.libraries.androidtools.api.FileSizeFormatter class FakeFileSizeFormatter : FileSizeFormatter { - override fun format(fileSize: Long): String { + override fun format(fileSize: Long, useShortFormat: Boolean): String { return "$fileSize Bytes" } }