From 6bf01d7a7b7cdba024ec61e36a366776a5c74c52 Mon Sep 17 00:00:00 2001 From: niuhuan Date: Fri, 29 Oct 2021 11:38:36 +0800 Subject: [PATCH] android secure flag --- .../kotlin/niuhuan/pikapi/MainActivity.kt | 12 +++++ .../gradle/wrapper/gradle-wrapper.properties | 6 +-- lib/basic/Method.dart | 7 +++ lib/basic/config/AndroidSecureFlag.dart | 53 +++++++++++++++++++ lib/screens/InitScreen.dart | 4 +- lib/screens/SettingsScreen.dart | 2 + 6 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 lib/basic/config/AndroidSecureFlag.dart diff --git a/android/app/src/main/kotlin/niuhuan/pikapi/MainActivity.kt b/android/app/src/main/kotlin/niuhuan/pikapi/MainActivity.kt index fb5d1e5..02b5222 100644 --- a/android/app/src/main/kotlin/niuhuan/pikapi/MainActivity.kt +++ b/android/app/src/main/kotlin/niuhuan/pikapi/MainActivity.kt @@ -11,6 +11,7 @@ import android.provider.MediaStore import android.util.Log import android.view.Display import android.view.KeyEvent +import android.view.WindowManager import androidx.annotation.NonNull import androidx.annotation.RequiresApi import io.flutter.embedding.android.FlutterActivity @@ -98,6 +99,7 @@ class MainActivity : FlutterActivity() { "migrate" -> androidMigrate(call.argument("path")!!) // 获取可以迁移数据地址 "androidGetExtendDirs" -> androidGetExtendDirs() + "androidSecureFlag" -> androidSecureFlag(call.argument("flag")!!) else -> { notImplementedToken } @@ -338,4 +340,14 @@ class MainActivity : FlutterActivity() { return super.onKeyDown(keyCode, event) } + private fun androidSecureFlag(flag: Boolean) { + uiThreadHandler.post { + if (flag) { + window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE) + } else { + window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE) + } + } + } + } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index bc6a58a..eb51f3b 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Jun 23 08:50:38 CEST 2017 +#Fri Oct 29 09:53:43 CST 2021 distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip +zipStoreBase=GRADLE_USER_HOME diff --git a/lib/basic/Method.dart b/lib/basic/Method.dart index 8e8acf0..54f7e60 100644 --- a/lib/basic/Method.dart +++ b/lib/basic/Method.dart @@ -581,4 +581,11 @@ class Method { Future saveDownloadAndExportPath(String folder) { return _flatInvoke("saveDownloadAndExportPath", folder); } + + /// 切换安全策略 (安卓禁止截图, 录屏, 不显示在任务视图) + Future androidSecureFlag(bool flag) { + return _channel.invokeMethod("androidSecureFlag", { + "flag": flag, + }); + } } diff --git a/lib/basic/config/AndroidSecureFlag.dart b/lib/basic/config/AndroidSecureFlag.dart new file mode 100644 index 0000000..1a675bc --- /dev/null +++ b/lib/basic/config/AndroidSecureFlag.dart @@ -0,0 +1,53 @@ +/// 音量键翻页 + +import 'dart:io'; + +import 'package:flutter/material.dart'; + +import '../Common.dart'; +import '../Method.dart'; + +const propertyName = "androidSecureFlag"; + +late bool androidSecureFlag; + +Future initAndroidSecureFlag() async { + if (Platform.isAndroid) { + androidSecureFlag = + (await method.loadProperty(propertyName, "false")) == "true"; + if (androidSecureFlag) { + await method.androidSecureFlag(true); + } + } +} + +String androidSecureFlagName() { + return androidSecureFlag ? "是" : "否"; +} + +Future chooseAndroidSecureFlag(BuildContext context) async { + String? result = + await chooseListDialog(context, "禁止截图/禁止显示在任务视图", ["是", "否"]); + if (result != null) { + var target = result == "是"; + await method.saveProperty(propertyName, "$target"); + androidSecureFlag = target; + await method.androidSecureFlag(androidSecureFlag); + } +} + +Widget androidSecureFlagSetting() { + if (Platform.isAndroid) { + return StatefulBuilder(builder: + (BuildContext context, void Function(void Function()) setState) { + return ListTile( + title: Text("禁止截图/禁止显示在任务视图(仅安卓)"), + subtitle: Text(androidSecureFlagName()), + onTap: () async { + await chooseAndroidSecureFlag(context); + setState(() {}); + }); + }); + } + return Container(); +} diff --git a/lib/screens/InitScreen.dart b/lib/screens/InitScreen.dart index 94c2880..2e9c8ac 100644 --- a/lib/screens/InitScreen.dart +++ b/lib/screens/InitScreen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:pikapi/basic/config/Address.dart'; import 'package:pikapi/basic/config/AndroidDisplayMode.dart'; +import 'package:pikapi/basic/config/AndroidSecureFlag.dart'; import 'package:pikapi/basic/config/AutoClean.dart'; import 'package:pikapi/basic/config/AutoFullScreen.dart'; import 'package:pikapi/basic/config/ChooserRoot.dart'; @@ -40,7 +41,7 @@ class _InitScreenState extends State { Future _init() async { // 初始化配置文件 - await initPlatform(); // 必须第一个初始化, 加载设备信息 + await initPlatform(); // 必须第一个初始化, 加载设备信息 await autoClean(); await initAddress(); await initProxy(); @@ -63,6 +64,7 @@ class _InitScreenState extends State { await initChooserRoot(); await initTimeZone(); await initDownloadAndExportPath(); + await initAndroidSecureFlag(); // 登录, 如果token失效重新登录, 网络不好的时候可能需要1分钟 if (await method.preLogin()) { // 如果token或username+password有效则直接进入登录好的界面 diff --git a/lib/screens/SettingsScreen.dart b/lib/screens/SettingsScreen.dart index 94d8f36..53f6d58 100644 --- a/lib/screens/SettingsScreen.dart +++ b/lib/screens/SettingsScreen.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:pikapi/basic/Common.dart'; import 'package:pikapi/basic/config/AndroidDisplayMode.dart'; +import 'package:pikapi/basic/config/AndroidSecureFlag.dart'; import 'package:pikapi/basic/config/AutoClean.dart'; import 'package:pikapi/basic/config/AutoFullScreen.dart'; import 'package:pikapi/basic/config/ChooserRoot.dart'; @@ -121,6 +122,7 @@ class _SettingsScreenState extends State { ), Divider(), androidDisplayModeSetting(), + androidSecureFlagSetting(), Divider(), ListTile( title: Text("文件夹选择器默认路径"),