3
3
* SPDX-License-Identifier: Apache-2.0
4
4
*/
5
5
6
- package com.wireguard.android.util
6
+ package com.wireguard.android.util
7
7
8
- import android.icu.text.ListFormatter
9
- import android.icu.text.MeasureFormat
10
- import android.icu.text.RelativeDateTimeFormatter
11
- import android.icu.util.Measure
12
- import android.icu.util.MeasureUnit
13
- import android.os.Build
14
- import com.wireguard.android.Application
15
- import com.wireguard.android.R
16
- import java.util.Locale
17
- import kotlin.time.Duration.Companion.seconds
18
-
19
- object QuantityFormatter {
20
- fun formatBytes (bytes : Long ): String {
21
- val context = Application .get().applicationContext
22
- return when {
23
- bytes < 1024 -> context.getString(R .string.transfer_bytes, bytes)
24
- bytes < 1024 * 1024 -> context.getString(R .string.transfer_kibibytes, bytes / 1024.0 )
25
- bytes < 1024 * 1024 * 1024 -> context.getString(R .string.transfer_mibibytes, bytes / (1024.0 * 1024.0 ))
26
- bytes < 1024 * 1024 * 1024 * 1024L -> context.getString(R .string.transfer_gibibytes, bytes / (1024.0 * 1024.0 * 1024.0 ))
27
- else -> context.getString(R .string.transfer_tibibytes, bytes / (1024.0 * 1024.0 * 1024.0 ) / 1024.0 )
28
- }
29
- }
30
-
31
- fun formatEpochAgo (epochMillis : Long ): String {
32
- var span = (System .currentTimeMillis() - epochMillis) / 1000
33
-
34
- if (Build .VERSION .SDK_INT < Build .VERSION_CODES .N )
35
- return Application .get().applicationContext.getString(R .string.latest_handshake_ago, span.seconds.toString())
36
-
37
- if (span <= 0L )
38
- return RelativeDateTimeFormatter .getInstance().format(RelativeDateTimeFormatter .Direction .PLAIN , RelativeDateTimeFormatter .AbsoluteUnit .NOW )
39
- val measureFormat = MeasureFormat .getInstance(Locale .getDefault(), MeasureFormat .FormatWidth .WIDE )
40
- val parts = ArrayList <CharSequence >(4 )
41
- if (span >= 24 * 60 * 60L ) {
42
- val v = span / (24 * 60 * 60L )
43
- parts.add(measureFormat.format(Measure (v, MeasureUnit .DAY )))
44
- span - = v * (24 * 60 * 60L )
45
- }
46
- if (span >= 60 * 60L ) {
47
- val v = span / (60 * 60L )
48
- parts.add(measureFormat.format(Measure (v, MeasureUnit .HOUR )))
49
- span - = v * (60 * 60L )
50
- }
51
- if (span >= 60L ) {
52
- val v = span / 60L
53
- parts.add(measureFormat.format(Measure (v, MeasureUnit .MINUTE )))
54
- span - = v * 60L
55
- }
56
- if (span > 0L )
57
- parts.add(measureFormat.format(Measure (span, MeasureUnit .SECOND )))
58
-
59
- val joined = if (Build .VERSION .SDK_INT < Build .VERSION_CODES .TIRAMISU )
60
- parts.joinToString()
61
- else
62
- ListFormatter .getInstance(Locale .getDefault(), ListFormatter .Type .UNITS , ListFormatter .Width .SHORT ).format(parts)
63
-
64
- return Application .get().applicationContext.getString(R .string.latest_handshake_ago, joined)
65
- }
66
- }
8
+ import android.icu.text.ListFormatter
9
+ import android.icu.text.MeasureFormat
10
+ import android.icu.text.RelativeDateTimeFormatter
11
+ import android.icu.util.Measure
12
+ import android.icu.util.MeasureUnit
13
+ import android.os.Build
14
+ import com.wireguard.android.Application
15
+ import com.wireguard.android.R
16
+ import java.util.Locale
17
+ import kotlin.time.Duration.Companion.seconds
18
+
19
+ object QuantityFormatter {
20
+ fun formatBytes (bytes : Long ): String {
21
+ val context = Application .get().applicationContext
22
+ return when {
23
+ bytes < 1024 -> context.getString(R .string.transfer_bytes, bytes)
24
+ bytes < 1024 * 1024 -> context.getString(R .string.transfer_kibibytes, bytes / 1024.0 )
25
+ bytes < 1024 * 1024 * 1024 -> context.getString(R .string.transfer_mibibytes, bytes / (1024.0 * 1024.0 ))
26
+ bytes < 1024 * 1024 * 1024 * 1024L -> context.getString(R .string.transfer_gibibytes, bytes / (1024.0 * 1024.0 * 1024.0 ))
27
+ else -> context.getString(R .string.transfer_tibibytes, bytes / (1024.0 * 1024.0 * 1024.0 ) / 1024.0 )
28
+ }
29
+ }
30
+
31
+ fun formatEpochAgo (epochMillis : Long ): String {
32
+ var span = (System .currentTimeMillis() - epochMillis) / 1000
33
+
34
+ if (Build .VERSION .SDK_INT < Build .VERSION_CODES .N )
35
+ return Application .get().applicationContext.getString(R .string.latest_handshake_ago, span.seconds.toString())
36
+
37
+ if (span <= 0L )
38
+ return RelativeDateTimeFormatter .getInstance().format(RelativeDateTimeFormatter .Direction .PLAIN , RelativeDateTimeFormatter .AbsoluteUnit .NOW )
39
+ val measureFormat = MeasureFormat .getInstance(Locale .getDefault(), MeasureFormat .FormatWidth .WIDE )
40
+ val parts = ArrayList <CharSequence >(4 )
41
+ if (span >= 24 * 60 * 60L ) {
42
+ val v = span / (24 * 60 * 60L )
43
+ parts.add(measureFormat.format(Measure (v, MeasureUnit .DAY )))
44
+ span - = v * (24 * 60 * 60L )
45
+ }
46
+ if (span >= 60 * 60L ) {
47
+ val v = span / (60 * 60L )
48
+ parts.add(measureFormat.format(Measure (v, MeasureUnit .HOUR )))
49
+ span - = v * (60 * 60L )
50
+ }
51
+ if (span >= 60L ) {
52
+ val v = span / 60L
53
+ parts.add(measureFormat.format(Measure (v, MeasureUnit .MINUTE )))
54
+ span - = v * 60L
55
+ }
56
+ if (span > 0L )
57
+ parts.add(measureFormat.format(Measure (span, MeasureUnit .SECOND )))
58
+
59
+ val joined = if (Build .VERSION .SDK_INT < Build .VERSION_CODES .TIRAMISU )
60
+ parts.joinToString()
61
+ else
62
+ ListFormatter .getInstance(Locale .getDefault(), ListFormatter .Type .UNITS , ListFormatter .Width .SHORT ).format(parts)
63
+
64
+ return Application .get().applicationContext.getString(R .string.latest_handshake_ago, joined)
65
+ }
66
+ }
0 commit comments