wip: use icu class for resolving byte measurements

Dunno if I'll complete this. Doesn't seem worth the bloat.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Jason A. Donenfeld 2023-04-25 14:00:44 +02:00
parent 1e2acc9e7b
commit 888bb817f4
1 changed files with 30 additions and 5 deletions

View File

@ -11,6 +11,7 @@ import android.icu.text.RelativeDateTimeFormatter
import android.icu.util.Measure
import android.icu.util.MeasureUnit
import android.os.Build
import androidx.annotation.RequiresApi
import com.wireguard.android.Application
import com.wireguard.android.R
import java.util.Locale
@ -18,14 +19,38 @@ import kotlin.time.DurationUnit
import kotlin.time.toDuration
object QuantityFormatter {
@RequiresApi(Build.VERSION_CODES.N)
private fun resolveDigitalMeasureUnit(identifier: String): MeasureUnit {
return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
MeasureUnit::class.java.getMethod("internalGetInstance", String::class.java, String::class.java).invoke(null, "digital", identifier) as MeasureUnit
} else {
MeasureUnit.forIdentifier(identifier)
}
}
private lateinit var KIBIBYTE : MeasureUnit
private lateinit var MEBIBYTE : MeasureUnit
private lateinit var GIBIBYTE : MeasureUnit
private lateinit var TEBIBYTE : MeasureUnit
init {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
KIBIBYTE = resolveDigitalMeasureUnit("kibibyte")
MEBIBYTE = resolveDigitalMeasureUnit("mebibyte")
GIBIBYTE = resolveDigitalMeasureUnit("gibibyte")
TEBIBYTE = resolveDigitalMeasureUnit("tebibyte")
}
}
fun formatBytes(bytes: Long): String {
val context = Application.get().applicationContext
val measureFormat = MeasureFormat.getInstance(Locale.getDefault(), MeasureFormat.FormatWidth.NARROW)
return when {
bytes < 1024 -> context.getString(R.string.transfer_bytes, bytes)
bytes < 1024 * 1024 -> context.getString(R.string.transfer_kibibytes, bytes / 1024.0)
bytes < 1024 * 1024 * 1024 -> context.getString(R.string.transfer_mibibytes, bytes / (1024.0 * 1024.0))
bytes < 1024 * 1024 * 1024 * 1024L -> context.getString(R.string.transfer_gibibytes, bytes / (1024.0 * 1024.0 * 1024.0))
else -> context.getString(R.string.transfer_tibibytes, bytes / (1024.0 * 1024.0 * 1024.0) / 1024.0)
bytes < 1024 -> measureFormat.format(Measure(bytes, MeasureUnit.BYTE))
bytes < 1024 * 1024 -> measureFormat.format(Measure(bytes / 1024.0, KIBIBYTE))
bytes < 1024 * 1024 * 1024 -> measureFormat.format(Measure(bytes / (1024.0 * 1024.0), MEBIBYTE))
bytes < 1024 * 1024 * 1024 * 1024L -> measureFormat.format(Measure(bytes / (1024.0 * 1024.0 * 1024.0), GIBIBYTE))
else -> measureFormat.format(Measure(bytes / (1024.0 * 1024.0 * 1024.0) / 1024.0, TEBIBYTE))
}
}