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:
parent
1e2acc9e7b
commit
888bb817f4
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue