Просмотр исходного кода

fix: the error caused by too large value of subscription information

metacubex 2 лет назад
Родитель
Сommit
86e94da6a6

+ 6 - 0
design/src/main/java/com/github/kr328/clash/design/util/I18n.kt

@@ -56,6 +56,12 @@ fun Date.format(
 
 fun Long.toBytesString(): String {
     return when {
+        this > 1024.0 * 1024 * 1024 * 1024 * 1024 * 1024 ->
+            String.format("%.2f EiB", (this.toDouble() / 1024 / 1024 / 1024 / 1024 / 1024 / 1024))
+        this > 1024.0 * 1024 * 1024 * 1024 * 1024 ->
+            String.format("%.2f PiB", (this.toDouble() / 1024 / 1024 / 1024 / 1024 / 1024))
+        this > 1024.0 * 1024 * 1024 * 1024 ->
+            String.format("%.2f TiB", (this.toDouble() / 1024 / 1024 / 1024 / 1024))
         this > 1024 * 1024 * 1024 ->
             String.format("%.2f GiB", (this.toDouble() / 1024 / 1024 / 1024))
         this > 1024 * 1024 ->

+ 5 - 4
service/src/main/java/com/github/kr328/clash/service/ProfileManager.kt

@@ -22,6 +22,7 @@ import kotlinx.coroutines.withContext
 import okhttp3.OkHttpClient
 import okhttp3.Request
 import java.io.FileNotFoundException
+import java.math.BigDecimal
 import java.util.*
 
 class ProfileManager(private val context: Context) : IProfileManager,
@@ -159,13 +160,13 @@ class ProfileManager(private val context: Context) : IProfileManager,
                         val info = flag.split("=")
                         when {
                             info[0].contains("upload") -> upload =
-                                info[1].toLong()
+                                BigDecimal(info[1]).longValueExact()
 
                             info[0].contains("download") -> download =
-                                info[1].toLong()
+                                BigDecimal(info[1]).longValueExact()
 
-                            info[0].contains("total") -> total =
-                                info[1].toLong()
+                            info[0].contains("total") ->  total =
+                                BigDecimal(info[1]).longValueExact()
 
                             info[0].contains("expire") -> {
                                 if (info[1].isNotEmpty()) {