From b85c31f93903234aa9533d81f6bc963ec6f29fd2 Mon Sep 17 00:00:00 2001
From: 18034727885 <973609879@qq.com>
Date: 星期日, 21 六月 2026 12:42:20 +0800
Subject: [PATCH] 修复问题

---
 app/src/main/java/com/xw/yunwei/ui/work/site/SiteNavActivity.kt |    3 +
 common/src/main/java/com/xw/common/SecureScreenShot.kt          |   85 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 88 insertions(+), 0 deletions(-)

diff --git a/app/src/main/java/com/xw/yunwei/ui/work/site/SiteNavActivity.kt b/app/src/main/java/com/xw/yunwei/ui/work/site/SiteNavActivity.kt
index 220c02b..33c051f 100644
--- a/app/src/main/java/com/xw/yunwei/ui/work/site/SiteNavActivity.kt
+++ b/app/src/main/java/com/xw/yunwei/ui/work/site/SiteNavActivity.kt
@@ -310,11 +310,14 @@
                     }
                 }
             }
+            filterDialog?.setOnDismissListener { binding.filterOverlay.visibility = View.GONE }
         }
 
         filterDialog?.show()
+        binding.filterOverlay.visibility = View.VISIBLE
         // 关键:让软键盘把 BottomSheet 顶上去
         filterDialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
+        filterDialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
         filterDialog?.window?.setLayout(
             ViewGroup.LayoutParams.MATCH_PARENT,
             ViewGroup.LayoutParams.WRAP_CONTENT
diff --git a/common/src/main/java/com/xw/common/SecureScreenShot.kt b/common/src/main/java/com/xw/common/SecureScreenShot.kt
new file mode 100644
index 0000000..3232e6f
--- /dev/null
+++ b/common/src/main/java/com/xw/common/SecureScreenShot.kt
@@ -0,0 +1,85 @@
+package com.xw.common
+
+import android.view.Window
+import android.view.WindowManager
+import java.lang.ref.WeakReference
+
+/**
+ * 统一管理 APP 防截屏(FLAG_SECURE)开关。
+ *
+ * 默认行为:非 DEBUG 包禁止截屏,DEBUG 包允许截屏,保持与历史逻辑一致。
+ *
+ * 内部用弱引用集合保存所有受管理的 [Window](避免持有 Activity/Dialog 导致内存泄漏)。
+ * 当 [allowScreenShot] 在 true/false 之间发生变化时,会自动刷新所有存活 window 的
+ * FLAG_SECURE 标记,从而实时启用 / 禁用截屏。
+ */
+object SecureScreenShot {
+
+    /** 受管理的 window 弱引用集合 */
+    private val windowRefs = mutableListOf<WeakReference<Window>>()
+
+    /**
+     * 运行时是否允许截屏。默认 false(即开启防截屏)。
+     * 赋值发生变化时,会自动刷新所有已登记 window 的截屏标记。
+     */
+    @Volatile
+    var allowScreenShot: Boolean = false
+        set(value) {
+            if (field == value) return
+            field = value
+            refreshAll()
+        }
+
+    /**
+     * 登记并立即为指定 [window] 应用当前的截屏配置。
+     * 同一个 window 不会重复登记,失效的弱引用会被顺带清理。
+     */
+    @Synchronized
+    fun apply(window: Window?) {
+        window ?: return
+        var exists = false
+        val iterator = windowRefs.iterator()
+        while (iterator.hasNext()) {
+            val w = iterator.next().get()
+            if (w == null) {
+                iterator.remove()
+            } else if (w === window) {
+                exists = true
+            }
+        }
+        if (!exists) {
+            windowRefs.add(WeakReference(window))
+        }
+        applyFlag(window)
+    }
+
+    /**
+     * 刷新所有存活 window 的截屏标记,并清理已失效的弱引用。
+     */
+    @Synchronized
+    private fun refreshAll() {
+        val iterator = windowRefs.iterator()
+        while (iterator.hasNext()) {
+            val w = iterator.next().get()
+            if (w == null) {
+                iterator.remove()
+            } else {
+                applyFlag(w)
+            }
+        }
+    }
+
+    /**
+     * 根据当前配置为指定 [window] 应用或清除防截屏标记。
+     *
+     * - DEBUG 包或 [allowScreenShot] 为 true 时:清除 FLAG_SECURE,允许截屏
+     * - 否则:添加 FLAG_SECURE,禁止截屏
+     */
+    private fun applyFlag(window: Window) {
+        if (BuildConfig.DEBUG || allowScreenShot) {
+            window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
+        } else {
+            window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)//禁止截屏
+        }
+    }
+}

--
Gitblit v1.7.1