From a97231e1d0e93c9f8313e24b9bf58c6677d25243 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=83=AD=E5=AD=9F=E5=B0=A7?=
<147088706+Justingwo@users.noreply.github.com>
Date: Sun, 13 Sep 2026 11:30:58 +0800
Subject: [PATCH 1/7] Create monochrome launcher icon drawable
Added a monochrome vector drawable for the app launcher icon.
---
.../res/drawable/ic_launcher_monochrome.xml | 57 +++++++++++++++++++
1 file changed, 57 insertions(+)
create mode 100644 app/src/main/res/drawable/ic_launcher_monochrome.xml
diff --git a/app/src/main/res/drawable/ic_launcher_monochrome.xml b/app/src/main/res/drawable/ic_launcher_monochrome.xml
new file mode 100644
index 0000000..9b894c1
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_monochrome.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From 3673b6787d46b73d2fd58fb59e177ab8a599cb96 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=83=AD=E5=AD=9F=E5=B0=A7?=
<147088706+Justingwo@users.noreply.github.com>
Date: Sun, 13 Sep 2026 11:34:16 +0800
Subject: [PATCH 2/7] Add monochrome drawable to adaptive icon
---
app/src/main/res/mipmap-anydpi-v26/logo.xml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/src/main/res/mipmap-anydpi-v26/logo.xml b/app/src/main/res/mipmap-anydpi-v26/logo.xml
index 16a18b9..c0ccd7a 100644
--- a/app/src/main/res/mipmap-anydpi-v26/logo.xml
+++ b/app/src/main/res/mipmap-anydpi-v26/logo.xml
@@ -2,4 +2,5 @@
-
\ No newline at end of file
+
+
From 956e07a490402a85d7860e081a92c96bda86fecb Mon Sep 17 00:00:00 2001
From: guomengyao
Date: Sun, 13 Sep 2026 13:04:31 +0800
Subject: [PATCH 3/7] feat(ui): add themed launcher icon support
---
.../res/drawable/ic_launcher_monochrome.xml | 46 +++++++++----------
1 file changed, 23 insertions(+), 23 deletions(-)
diff --git a/app/src/main/res/drawable/ic_launcher_monochrome.xml b/app/src/main/res/drawable/ic_launcher_monochrome.xml
index 9b894c1..f2b0d5c 100644
--- a/app/src/main/res/drawable/ic_launcher_monochrome.xml
+++ b/app/src/main/res/drawable/ic_launcher_monochrome.xml
@@ -4,54 +4,54 @@
android:viewportWidth="108"
android:viewportHeight="108">
-
+
+ android:pathData="M 54,28
+ C 63,33 72,35 80,35
+ C 80,50 75,64 54,79
+ C 33,64 28,50 28,35
+ C 36,35 45,33 54,28 Z" />
-
+
+ android:pathData="M 36.5,43.5 C 41.5,39.5 47.5,38 54,38 C 60.5,38 66.5,39.5 71.5,43.5" />
-
+
+ android:pathData="M 40.5,49.5 C 44.5,46 49,44.5 54,44.5 C 59,44.5 63.5,46 67.5,49.5" />
-
+
+ android:pathData="M 44.5,55.5 C 47.5,52.8 50.5,51.5 54,51.5 C 57.5,51.5 60.5,52.8 63.5,55.5" />
-
+
+ android:pathData="M 48.5,61.5 C 50.2,59.8 52,59 54,59 C 56,59 57.8,59.8 59.5,61.5" />
-
+
-
+ android:pathData="M 54,66
+ A 2.5,2.5 0 1,0 54.01,66 Z" />
+
\ No newline at end of file
From 2ab7f7bca348eb973bcfc44b757c42718b1ba04c Mon Sep 17 00:00:00 2001
From: guomengyao
Date: Sun, 13 Sep 2026 16:53:29 +0800
Subject: [PATCH 4/7] feat(i18n): add Simplified Chinese (zh-rCN) translations
---
app/src/main/res/values-zh-rCN/strings.xml | 139 +++++++++++++++++++++
1 file changed, 139 insertions(+)
create mode 100644 app/src/main/res/values-zh-rCN/strings.xml
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..fa7d4fd
--- /dev/null
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -0,0 +1,139 @@
+
+
+ 关于
+ 关于 LANShield
+ 同意
+ 全部
+ 允许
+ 已允许
+ 允许通知
+ 打开通知设置
+ 通知已启用
+ 允许本地网络访问
+ 已授予权限
+ 打开应用设置
+ 本地网络访问
+ 授予“附近设备”权限后,LANShield 才能为您的应用转发本地网络流量。
+ 按单个应用修改拦截策略
+ 匿名共享
+ 检测到的所有局域网流量\n都将在此处显示
+ LANShield
+ 开机自启动
+ 返回
+ 拦截
+ 默认拦截或允许局域网流量
+ 已拦截
+ 取消
+ 取消搜索
+ 修改局域网访问策略
+ 确定要清除 %1$s 的所有受监控局域网流量记录吗?此操作无法撤销。
+ 选择默认应允许还是拦截局域网流量
+ 全部清除
+ 清除局域网流量记录
+ "配置局域网访问权限:"
+ 确认
+ 默认策略
+ 默认
+ 检测到协议:%1$s
+ 检测到协议:%1$s
+ 不同意
+ 忽略
+ 启用始终开启
+ 结束时间:%1$s
+ "欢迎使用 LANShield!"
+ 例外规则
+ 反馈
+ 完成
+ 接收通知
+ 提交反馈
+ 入站:%1$s
+ 单个应用局域网流量
+ 待补充 individual_lan_traffic_explanation
+ 信息
+ "首先,您需要选择默认是拦截还是允许局域网访问。之后您可以针对各个应用单独覆盖此规则。"
+ "有任何反馈意见吗?您可以在“设置”标签页中向我们提交!"
+ "当应用首次尝试访问您的本地网络时,LANShield 会发送通知,以便您决定允许或拦截。通知仅用于此类本地网络访问事件。"
+ "为了让我们更深入地了解应用行为,我们希望获知哪些应用在使用过程中并未尝试访问局域网。为此,您可以选择与我们共享您的应用使用情况数据。"
+ 共享应用使用情况
+ "LANShield 是比利时鲁汶大学(KU Leuven)的一项学术研究项目。通过共享设备上应用与本地网络交互的数据,您可以帮助我们了解应用访问局域网的原因。所有数据均完全匿名化,绝不会外泄或出售。"
+ "您连接的本地网络中通常连接有打印机、摄像头、音响等各类设备。LANShield 可以让您自主掌控哪些应用可以访问它们,哪些不能。"
+ LANShield 通过建立本地虚拟 VPN 接口在设备端过滤局域网流量。您会在状态栏看到 VPN 图标,但没有任何数据会被发送至外部互联网。
+ 参与我们的学术研究
+ 参与用户调研
+ 参与鲁汶大学(KU Leuven)学术研究
+ 局域网流量
+ 局域网流量拦截
+ 您可以在此配置 LANShield 应如何拦截或允许局域网流量。在“单应用例外”页面中,您可以为设备上的每个应用单独设定规则。若未设定单独规则,则应用“默认策略”。建议不要拦截系统应用,否则可能导致某些系统功能异常。
+ 来自 %1$s 的局域网流量
+ 此处概览了所有发送或接收过局域网流量的应用。在某些情况下,LANShield 无法确定具体是哪个应用发送了特定数据包,这些流量将被归类为“未知”。
+ LANShield 已启用
+ 无法启动 LANShield
+ 局域网防火墙未能启动,请重试。
+ LANShield 不再具备作为 VPN 运行的权限。点按即可打开 LANShield 并重新启用。
+ LANShield 助您管控\n其他应用的局域网访问权限
+ LANShield 徽标
+ 过去 24 小时:%1$s
+ 最近活跃:%1$s
+ 前往 lanshield.eu 了解更多
+ 徽标
+ 管理通知
+ 手动允许了 %1$s 个应用%2$s
+ 手动拦截了 %1$s 个应用%2$s
+ 更多信息
+ 下一步
+ 未检测到局域网流量
+ 通知
+ 出站:%1$s
+ 概览
+ 若要在设备重启后自动启动 LANShield,请在下一步的 LANShield VPN 设置界面中勾选“始终开启的 VPN”选项。
+ 为了防护您的局域网流量,LANShield 使用虚拟本地 VPN 连接来管控设备上其他应用的局域网访问。虽然您会看到系统 VPN 通知,但不会建立连接到外部互联网的 VPN 隧道。
+ 为了防护您的局域网流量,LANShield 需要建立一个虚拟本地 VPN 接口。在下一步中,系统将请求您授予此权限。应用不会建立连接到外部互联网的 VPN 隧道。
+ 对端:%1$s - %2$s
+ 单应用例外
+
+ 允许组播流量
+ 允许 DNS 流量
+ 隐藏组播通知
+ 隐藏 DNS 通知
+
+ "您可以在此为各个应用单独配置允许或拦截局域网流量。"
+ 策略:允许局域网流量
+ 策略:拦截局域网流量
+ 上一步
+ 隐私政策
+ 搜索
+ 共享
+ 设置默认策略
+ 设置
+ 跳过
+ 继续
+ 共享应用使用情况可帮助我们识别哪些应用从未尝试访问本地网络。若要继续,请在接下来的界面中找到 LANShield 并选择“允许”。
+ 共享匿名应用使用情况
+ 共享匿名局域网指标
+ 共享中\n
+ 共享应用使用情况
+ 显示系统应用
+ 开始时间:%1$s
+ 系统应用
+ MainActivity
+ 总计:%1$s
+ 未知
+ VPN 通知
+ 为什么会有 VPN 图标?
+ VPN 权限申请
+ LANShield 需要通知权限才能运行。请启用通知以开启防护。
+ LANShield 需要“附近设备”权限才能向本地网络转发流量。
+ 缺少本地网络权限
+ LANShield 需要“附近设备”权限才能向本地网络转发流量。点按即可打开 LANShield 并授予该权限。
+ 准备就绪!
+ 导出局域网流量
+ 高级设置
+ 常规设置
+ 检测到的所有开放端口都将在此处显示
+ 未检测到开放端口
+ 开放端口
+ 此处列出了其他应用打开的端口。这些端口通常用于与同一局域网内的其他设备通信,例如设备发现或媒体串流。
+ 下拉即可刷新
+ 前往 lanshield.eu 了解详情(在浏览器中打开)
+ 为什么会显示 VPN 通知?(打开说明弹窗)
+
\ No newline at end of file
From a9965e097d14fd2b876a1de62e85db5a8237069e Mon Sep 17 00:00:00 2001
From: guomengyao
Date: Sun, 13 Sep 2026 19:00:40 +0800
Subject: [PATCH 5/7] ci: re-trigger tests after maven artifact timeout
From 1959dac835bbbf2c36d00e5170611beb5d9faea1 Mon Sep 17 00:00:00 2001
From: guomengyao
Date: Mon, 14 Sep 2026 20:03:37 +0800
Subject: [PATCH 6/7] add chinese strings
---
.../org/distrinet/lanshield/ui/openports/OpenPortsScreen.kt | 2 +-
.../org/distrinet/lanshield/ui/overview/OverviewScreen.kt | 5 ++++-
app/src/main/res/values-zh-rCN/strings.xml | 2 ++
app/src/main/res/values/strings.xml | 2 ++
4 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/app/src/main/java/org/distrinet/lanshield/ui/openports/OpenPortsScreen.kt b/app/src/main/java/org/distrinet/lanshield/ui/openports/OpenPortsScreen.kt
index a1471ac..0c96e86 100644
--- a/app/src/main/java/org/distrinet/lanshield/ui/openports/OpenPortsScreen.kt
+++ b/app/src/main/java/org/distrinet/lanshield/ui/openports/OpenPortsScreen.kt
@@ -186,7 +186,7 @@ private fun LANShieldNotActive(modifier: Modifier = Modifier) {
Spacer(modifier = Modifier.height(48.dp))
Text(
- text = "LANShield not active",
+ stringResource(LANShield_not_active),
modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center,
style = MaterialTheme.typography.titleMedium,
diff --git a/app/src/main/java/org/distrinet/lanshield/ui/overview/OverviewScreen.kt b/app/src/main/java/org/distrinet/lanshield/ui/overview/OverviewScreen.kt
index 4d30089..b23a542 100644
--- a/app/src/main/java/org/distrinet/lanshield/ui/overview/OverviewScreen.kt
+++ b/app/src/main/java/org/distrinet/lanshield/ui/overview/OverviewScreen.kt
@@ -235,7 +235,10 @@ internal fun OverviewScreen(
contentDescription = vpnNotificationContentDescription
}
) {
- Text("Why is there a VPN notification?", textAlign = TextAlign.Center)
+ Text(
+ stringResource(R.string.why_is_there_a_vpn_notification),
+ textAlign = TextAlign.Center
+ )
}
}
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index fa7d4fd..b98a76d 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -75,6 +75,7 @@
过去 24 小时:%1$s
最近活跃:%1$s
前往 lanshield.eu 了解更多
+ 为什么会显示 VPN 通知?
徽标
管理通知
手动允许了 %1$s 个应用%2$s
@@ -132,6 +133,7 @@
检测到的所有开放端口都将在此处显示
未检测到开放端口
开放端口
+ LANShield 未开启
此处列出了其他应用打开的端口。这些端口通常用于与同一局域网内的其他设备通信,例如设备发现或媒体串流。
下拉即可刷新
前往 lanshield.eu 了解详情(在浏览器中打开)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 74f333d..7291b44 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -75,6 +75,7 @@
Last 24h: %1$s
Last seen: %1$s
Learn more on lanshield.eu
+ Why is there a VPN notification?
Logo
Manage notifications
Manually allowed %1$s app%2$s
@@ -132,6 +133,7 @@
Any detected open ports will be shown here
No open ports detected
Open Ports
+ LANShield not active
Here you can see a list of ports opened by other apps. These are typically used to communicate with other devices on the same local network, such as for device discovery or media streaming.
⬇ Pull down to refresh
Learn more on lanshield.eu, opens in browser
From b642bcbbf8e3fd9535097b715ee0bba9aed75fc3 Mon Sep 17 00:00:00 2001
From: guomengyao
Date: Mon, 14 Sep 2026 20:24:53 +0800
Subject: [PATCH 7/7] fix strings in openport page
---
.../org/distrinet/lanshield/ui/openports/OpenPortsScreen.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/src/main/java/org/distrinet/lanshield/ui/openports/OpenPortsScreen.kt b/app/src/main/java/org/distrinet/lanshield/ui/openports/OpenPortsScreen.kt
index 0c96e86..ef0d0eb 100644
--- a/app/src/main/java/org/distrinet/lanshield/ui/openports/OpenPortsScreen.kt
+++ b/app/src/main/java/org/distrinet/lanshield/ui/openports/OpenPortsScreen.kt
@@ -186,7 +186,7 @@ private fun LANShieldNotActive(modifier: Modifier = Modifier) {
Spacer(modifier = Modifier.height(48.dp))
Text(
- stringResource(LANShield_not_active),
+ stringResource(R.string.LANShield_not_active),
modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center,
style = MaterialTheme.typography.titleMedium,