diff --git a/app/src/main/java/net/megaproxy487/MainActivity.kt b/app/src/main/java/net/megaproxy487/MainActivity.kt
index f8ca0f6..bdcf686 100644
--- a/app/src/main/java/net/megaproxy487/MainActivity.kt
+++ b/app/src/main/java/net/megaproxy487/MainActivity.kt
@@ -697,8 +697,8 @@ private fun ConnectionStatsCard(stats: DisplayedConnectionStats) {
value = if (latency <= 0) "—" else stringResource(
R.string.latency_milliseconds,
latency.toInt(),
- formatAge(ageMillis),
),
+ supportingValue = if (latency <= 0) null else formatAge(ageMillis).ifEmpty { null },
modifier = Modifier.weight(1f),
)
}
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 73e2bf6..77a50df 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -227,25 +227,25 @@
Двоичные IEC (KiB, MiB, GiB · 1024)
Десятичные SI (KB, MB, GB · 1000)
Задержка прокси
- %1$d мс%2$s
+ %1$d мс
Ошибки соединения: нет данных
Ошибки соединения: %1$.1f%% · %2$s
- - %1$d попытка
- - %1$d попытки
- - %1$d попыток
- - %1$d попытки
+ - %1$d сэмпл
+ - %1$d сэмпла
+ - %1$d сэмплов
+ - %1$d сэмпла
- - · %1$d секунду назад
- - · %1$d секунды назад
- - · %1$d секунд назад
- - · %1$d секунды назад
+ - %1$d секунду назад
+ - %1$d секунды назад
+ - %1$d секунд назад
+ - %1$d секунды назад
- - · %1$d минуту назад
- - · %1$d минуты назад
- - · %1$d минут назад
- - · %1$d минуты назад
+ - %1$d минуту назад
+ - %1$d минуты назад
+ - %1$d минут назад
+ - %1$d минуты назад
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d3ab426..5851dbb 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -228,7 +228,7 @@
IEC binary (KiB, MiB, GiB · 1024)
SI decimal (KB, MB, GB · 1000)
Proxy latency
- %1$d ms%2$s
+ %1$d ms
Connection errors: no samples
Connection errors: %1$.1f%% · %2$s
@@ -236,11 +236,11 @@
- %1$d samples
- - · %1$d sec ago
- - · %1$d sec ago
+ - %1$d sec ago
+ - %1$d sec ago
- - · %1$d min ago
- - · %1$d min ago
+ - %1$d min ago
+ - %1$d min ago
diff --git a/fastlane/Fastfile b/fastlane/Fastfile
index dedaecf..74759ba 100644
--- a/fastlane/Fastfile
+++ b/fastlane/Fastfile
@@ -67,11 +67,35 @@ platform :android do
desc "Run instrumented Compose UI tests on a connected Android device or emulator"
lane :ui_tests do
native_library
- gradle(
- task: "connectedDebugAndroidTest",
- flags: "--no-daemon",
- project_dir: project_root
+ report_pattern = File.join(
+ project_root,
+ "app/build/outputs/androidTest-results/connected/debug/TEST-*.xml"
)
+ Dir.glob(report_pattern).each { |report| File.delete(report) }
+ attempts = 0
+ begin
+ attempts += 1
+ gradle(
+ task: "connectedDebugAndroidTest",
+ flags: "--no-daemon",
+ project_dir: project_root
+ )
+ rescue
+ reports = Dir.glob(report_pattern)
+ executed_tests = reports.sum do |report|
+ (File.read(report).match(/tests="(\d+)"/)&.captures&.first || "0").to_i
+ end
+
+ # A software-emulated Android process can occasionally die before the
+ # instrumentation runner starts. Retry that infrastructure failure once,
+ # but never hide an assertion failure from a test that actually ran.
+ raise if attempts >= 2 || reports.empty? || executed_tests.positive?
+
+ UI.important("Instrumentation exited before running a test; retrying once")
+ reports.each { |report| File.delete(report) }
+ sh("adb wait-for-device")
+ retry
+ end
end
desc "Run every native and Android test and check"