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 ->