From 86953d2a53a1f59fe26807c2dca93b5bbdfba7bb Mon Sep 17 00:00:00 2001
From: "p.frasyn"
Date: Thu, 9 Apr 2026 19:46:46 +0300
Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?=
=?UTF-8?q?=D0=BD=D0=B0=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20=D0=B8=20?=
=?UTF-8?q?=D0=B1=D0=B8=D0=BB=D0=B4=20=D0=B2=20=D1=82=D0=B5=D0=BA=D1=82?=
=?UTF-8?q?=D0=BE=D0=B2=D1=8B=D0=B9=20=D1=80=D0=B5=D0=BF=D0=BE=D1=80=D1=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cherepavel/vpndetector/MainActivity.kt | 2 +-
.../vpndetector/ui/export/ExportReport.kt | 2 +
.../ui/export/ReportExportBuilder.kt | 42 ++++++++-----------
.../ui/export/ReportExportFormatter.kt | 2 +
4 files changed, 22 insertions(+), 26 deletions(-)
diff --git a/app/src/main/java/com/cherepavel/vpndetector/MainActivity.kt b/app/src/main/java/com/cherepavel/vpndetector/MainActivity.kt
index 4d8689f..b402e7b 100644
--- a/app/src/main/java/com/cherepavel/vpndetector/MainActivity.kt
+++ b/app/src/main/java/com/cherepavel/vpndetector/MainActivity.kt
@@ -204,7 +204,7 @@ class MainActivity : AppCompatActivity() {
val snapshot = detectionEngine.detect()
val report = ReportFormatter.build(this, snapshot)
- val exportReport = ReportExportBuilder.build(snapshot)
+ val exportReport = ReportExportBuilder.build(this, snapshot)
val exportText = ReportExportFormatter.buildText(exportReport)
return DetectionOutput(
diff --git a/app/src/main/java/com/cherepavel/vpndetector/ui/export/ExportReport.kt b/app/src/main/java/com/cherepavel/vpndetector/ui/export/ExportReport.kt
index 5754811..2adb382 100644
--- a/app/src/main/java/com/cherepavel/vpndetector/ui/export/ExportReport.kt
+++ b/app/src/main/java/com/cherepavel/vpndetector/ui/export/ExportReport.kt
@@ -3,6 +3,8 @@ package com.cherepavel.vpndetector.ui.export
data class ExportReport(
val title: String,
val generatedAt: String,
+ val buildInfo: String,
+ val sourceCodeUrl: String,
val sections: List
)
diff --git a/app/src/main/java/com/cherepavel/vpndetector/ui/export/ReportExportBuilder.kt b/app/src/main/java/com/cherepavel/vpndetector/ui/export/ReportExportBuilder.kt
index e097abd..8f89912 100644
--- a/app/src/main/java/com/cherepavel/vpndetector/ui/export/ReportExportBuilder.kt
+++ b/app/src/main/java/com/cherepavel/vpndetector/ui/export/ReportExportBuilder.kt
@@ -1,5 +1,8 @@
package com.cherepavel.vpndetector.ui.export
+import android.content.Context
+import com.cherepavel.vpndetector.BuildConfig
+import com.cherepavel.vpndetector.R
import com.cherepavel.vpndetector.detector.TunnelNameMatcher
import com.cherepavel.vpndetector.model.DetectionConfidence
import com.cherepavel.vpndetector.model.DetectionSnapshot
@@ -8,7 +11,10 @@ import com.cherepavel.vpndetector.util.nowString
object ReportExportBuilder {
- fun build(snapshot: DetectionSnapshot): ExportReport {
+ fun build(
+ context: Context,
+ snapshot: DetectionSnapshot
+ ): ExportReport {
val sections = buildList {
add(
ExportSection(
@@ -35,10 +41,16 @@ object ReportExportBuilder {
return ExportReport(
title = "VPN Detector Report",
generatedAt = nowString(),
+ buildInfo = buildBuildInfo(),
+ sourceCodeUrl = context.getString(R.string.repo_url),
sections = sections
)
}
+ private fun buildBuildInfo(): String {
+ return "${BuildConfig.VERSION_NAME} • ${BuildConfig.GIT_HASH} • ${BuildConfig.BUILD_TYPE}"
+ }
+
private fun buildOverallItems(snapshot: DetectionSnapshot): List {
val overall = buildOverallBlock(snapshot)
@@ -102,27 +114,12 @@ object ReportExportBuilder {
add(ExportItem.Paragraph("API signals:"))
add(ExportItem.Paragraph("- Interface name"))
- add(
- ExportItem.Field(
- "source",
- "LinkProperties.getInterfaceName()"
- )
- )
- add(
- ExportItem.Field(
- "value",
- snapshot.rawInterfaceName ?: "none"
- )
- )
+ add(ExportItem.Field("source", "LinkProperties.getInterfaceName()"))
+ add(ExportItem.Field("value", snapshot.rawInterfaceName ?: "none"))
add(ExportItem.Field("hint", interfaceHint))
add(ExportItem.Paragraph("- Transport info"))
- add(
- ExportItem.Field(
- "source",
- "NetworkCapabilities.getTransportInfo()"
- )
- )
+ add(ExportItem.Field("source", "NetworkCapabilities.getTransportInfo()"))
add(
ExportItem.Field(
"value",
@@ -138,12 +135,7 @@ object ReportExportBuilder {
private fun buildVpnNetworkDetailsSection(snapshot: DetectionSnapshot): ExportSection? {
val items = buildList {
if (snapshot.vpnRoutes.isNotEmpty()) {
- add(
- ExportItem.ListBlock(
- label = "Routes",
- values = snapshot.vpnRoutes
- )
- )
+ add(ExportItem.ListBlock("Routes", snapshot.vpnRoutes))
}
if (snapshot.vpnDnsServers.isNotEmpty()) {
diff --git a/app/src/main/java/com/cherepavel/vpndetector/ui/export/ReportExportFormatter.kt b/app/src/main/java/com/cherepavel/vpndetector/ui/export/ReportExportFormatter.kt
index a550919..a9db03d 100644
--- a/app/src/main/java/com/cherepavel/vpndetector/ui/export/ReportExportFormatter.kt
+++ b/app/src/main/java/com/cherepavel/vpndetector/ui/export/ReportExportFormatter.kt
@@ -6,6 +6,8 @@ object ReportExportFormatter {
return buildString {
appendLine(report.title)
appendLine("Generated: ${report.generatedAt}")
+ appendLine("Build: ${report.buildInfo}")
+ appendLine("Source code: ${report.sourceCodeUrl}")
appendLine()
report.sections.forEachIndexed { index, section ->