Fix file size formatter output on API 26+
This commit is contained in:
parent
1b4cf477c7
commit
9e00ca323d
2 changed files with 37 additions and 20 deletions
|
|
@ -24,12 +24,15 @@ class AndroidFileSizeFormatter(
|
||||||
override fun format(fileSize: Long, useShortFormat: Boolean): String {
|
override fun format(fileSize: Long, useShortFormat: Boolean): String {
|
||||||
// Since Android O, the system considers that 1kB = 1000 bytes instead of 1024 bytes.
|
// Since Android O, the system considers that 1kB = 1000 bytes instead of 1024 bytes.
|
||||||
// We want to avoid that.
|
// We want to avoid that.
|
||||||
|
// Sadly we do not have access to the flags values Formatter.FLAG_IEC_UNITS and Formatter.FLAG_SHORTER
|
||||||
|
// nor the method Formatter.formatFileSize with the flags parameter.
|
||||||
|
// So for Android 0 and more, first convert the fileSize to MB/GB/TB ourselves
|
||||||
val normalizedSize = if (sdkIntProvider.get() <= Build.VERSION_CODES.N) {
|
val normalizedSize = if (sdkIntProvider.get() <= Build.VERSION_CODES.N) {
|
||||||
fileSize
|
fileSize
|
||||||
} else {
|
} else {
|
||||||
// First convert the size
|
// First convert the size
|
||||||
when {
|
when {
|
||||||
fileSize < 1024 -> fileSize
|
fileSize <= 1 -> fileSize
|
||||||
fileSize < 1024 * 1024 -> fileSize * 1000 / 1024
|
fileSize < 1024 * 1024 -> fileSize * 1000 / 1024
|
||||||
fileSize < 1024 * 1024 * 1024 -> fileSize * 1000 / 1024 * 1000 / 1024
|
fileSize < 1024 * 1024 * 1024 -> fileSize * 1000 / 1024 * 1000 / 1024
|
||||||
else -> fileSize * 1000 / 1024 * 1000 / 1024 * 1000 / 1024
|
else -> fileSize * 1000 / 1024 * 1000 / 1024 * 1000 / 1024
|
||||||
|
|
@ -40,6 +43,6 @@ class AndroidFileSizeFormatter(
|
||||||
Formatter.formatShortFileSize(context, normalizedSize)
|
Formatter.formatShortFileSize(context, normalizedSize)
|
||||||
} else {
|
} else {
|
||||||
Formatter.formatFileSize(context, normalizedSize)
|
Formatter.formatFileSize(context, normalizedSize)
|
||||||
}
|
}.replace("kB", "KB")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,45 +15,59 @@ import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
import org.robolectric.RobolectricTestRunner
|
import org.robolectric.RobolectricTestRunner
|
||||||
import org.robolectric.RuntimeEnvironment
|
import org.robolectric.RuntimeEnvironment
|
||||||
|
import org.robolectric.annotation.Config
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner::class)
|
@RunWith(RobolectricTestRunner::class)
|
||||||
class AndroidFileSizeFormatterTest {
|
class AndroidFileSizeFormatterTest {
|
||||||
|
@Config(sdk = [Build.VERSION_CODES.N])
|
||||||
@Test
|
@Test
|
||||||
fun `test api 24 long format`() {
|
fun `test api 24 long format`() {
|
||||||
val sut = createAndroidFileSizeFormatter(sdkLevel = Build.VERSION_CODES.N)
|
val sut = createAndroidFileSizeFormatter(sdkLevel = Build.VERSION_CODES.N)
|
||||||
assertThat(sut.format(1, useShortFormat = false)).isEqualTo("1.00B")
|
assertThat(sut.format(1, useShortFormat = false)).isEqualTo("1 B")
|
||||||
assertThat(sut.format(1000, useShortFormat = false)).isEqualTo("0.98KB")
|
assertThat(sut.format(1000, useShortFormat = false)).isEqualTo("0.98 KB")
|
||||||
assertThat(sut.format(1024, useShortFormat = false)).isEqualTo("1.00KB")
|
assertThat(sut.format(1024, useShortFormat = false)).isEqualTo("1.00 KB")
|
||||||
assertThat(sut.format(1024 * 1024, useShortFormat = false)).isEqualTo("1.00MB")
|
assertThat(sut.format(1024 * 500, useShortFormat = false)).isEqualTo("500 KB")
|
||||||
assertThat(sut.format(1024 * 1024 * 1024, useShortFormat = false)).isEqualTo("1.00GB")
|
assertThat(sut.format(1024 * 1024, useShortFormat = false)).isEqualTo("1.00 MB")
|
||||||
|
assertThat(sut.format(1024 * 1024 * 500, useShortFormat = false)).isEqualTo("500 MB")
|
||||||
|
assertThat(sut.format(1024 * 1024 * 1024, useShortFormat = false)).isEqualTo("1.00 GB")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Config(sdk = [Build.VERSION_CODES.O])
|
||||||
@Test
|
@Test
|
||||||
fun `test api 26 long format`() {
|
fun `test api 26 long format`() {
|
||||||
val sut = createAndroidFileSizeFormatter(sdkLevel = Build.VERSION_CODES.O)
|
val sut = createAndroidFileSizeFormatter(sdkLevel = Build.VERSION_CODES.O)
|
||||||
assertThat(sut.format(1, useShortFormat = false)).isEqualTo("1.00B")
|
assertThat(sut.format(1, useShortFormat = false)).isEqualTo("1 B")
|
||||||
assertThat(sut.format(1000, useShortFormat = false)).isEqualTo("0.98KB")
|
assertThat(sut.format(1000, useShortFormat = false)).isEqualTo("0.98 KB")
|
||||||
assertThat(sut.format(1024 * 1024, useShortFormat = false)).isEqualTo("0.95MB")
|
assertThat(sut.format(1024, useShortFormat = false)).isEqualTo("1.00 KB")
|
||||||
assertThat(sut.format(1024 * 1024 * 1024, useShortFormat = false)).isEqualTo("0.93GB")
|
assertThat(sut.format(1024 * 500, useShortFormat = false)).isEqualTo("500 KB")
|
||||||
|
assertThat(sut.format(1024 * 1024, useShortFormat = false)).isEqualTo("1.00 MB")
|
||||||
|
assertThat(sut.format(1024 * 1024 * 500, useShortFormat = false)).isEqualTo("500 MB")
|
||||||
|
assertThat(sut.format(1024 * 1024 * 1024, useShortFormat = false)).isEqualTo("1.00 GB")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Config(sdk = [Build.VERSION_CODES.N])
|
||||||
@Test
|
@Test
|
||||||
fun `test api 24 short format`() {
|
fun `test api 24 short format`() {
|
||||||
val sut = createAndroidFileSizeFormatter(sdkLevel = Build.VERSION_CODES.N)
|
val sut = createAndroidFileSizeFormatter(sdkLevel = Build.VERSION_CODES.N)
|
||||||
assertThat(sut.format(1, useShortFormat = true)).isEqualTo("1.0B")
|
assertThat(sut.format(1, useShortFormat = true)).isEqualTo("1 B")
|
||||||
assertThat(sut.format(1000, useShortFormat = true)).isEqualTo("0.98KB")
|
assertThat(sut.format(1000, useShortFormat = true)).isEqualTo("0.98 KB")
|
||||||
assertThat(sut.format(1024, useShortFormat = true)).isEqualTo("1.0KB")
|
assertThat(sut.format(1024, useShortFormat = true)).isEqualTo("1.0 KB")
|
||||||
assertThat(sut.format(1024 * 1024, useShortFormat = true)).isEqualTo("1.0MB")
|
assertThat(sut.format(1024 * 500, useShortFormat = true)).isEqualTo("500 KB")
|
||||||
assertThat(sut.format(1024 * 1024 * 1024, useShortFormat = true)).isEqualTo("1.0GB")
|
assertThat(sut.format(1024 * 1024, useShortFormat = true)).isEqualTo("1.0 MB")
|
||||||
|
assertThat(sut.format(1024 * 1024 * 500, useShortFormat = true)).isEqualTo("500 MB")
|
||||||
|
assertThat(sut.format(1024 * 1024 * 1024, useShortFormat = true)).isEqualTo("1.0 GB")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Config(sdk = [Build.VERSION_CODES.O])
|
||||||
@Test
|
@Test
|
||||||
fun `test api 26 short format`() {
|
fun `test api 26 short format`() {
|
||||||
val sut = createAndroidFileSizeFormatter(sdkLevel = Build.VERSION_CODES.O)
|
val sut = createAndroidFileSizeFormatter(sdkLevel = Build.VERSION_CODES.O)
|
||||||
assertThat(sut.format(1, useShortFormat = true)).isEqualTo("1.0B")
|
assertThat(sut.format(1, useShortFormat = true)).isEqualTo("1 B")
|
||||||
assertThat(sut.format(1000, useShortFormat = true)).isEqualTo("0.98KB")
|
assertThat(sut.format(1000, useShortFormat = true)).isEqualTo("0.98 KB")
|
||||||
assertThat(sut.format(1024 * 1024, useShortFormat = true)).isEqualTo("0.95MB")
|
assertThat(sut.format(1024, useShortFormat = true)).isEqualTo("1.0 KB")
|
||||||
assertThat(sut.format(1024 * 1024 * 1024, useShortFormat = true)).isEqualTo("0.93GB")
|
assertThat(sut.format(1024 * 500, useShortFormat = true)).isEqualTo("500 KB")
|
||||||
|
assertThat(sut.format(1024 * 1024, useShortFormat = true)).isEqualTo("1.0 MB")
|
||||||
|
assertThat(sut.format(1024 * 1024 * 1024, useShortFormat = true)).isEqualTo("1.0 GB")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createAndroidFileSizeFormatter(sdkLevel: Int) = AndroidFileSizeFormatter(
|
private fun createAndroidFileSizeFormatter(sdkLevel: Int) = AndroidFileSizeFormatter(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue