From dc7ed336406b4b98b14a6e2a1a61eaac37a3d648 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 14 Jan 2026 11:51:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=82=AC=E6=B5=AE=E7=AA=97):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=82=B9=E5=87=BB=E6=82=AC=E6=B5=AE=E7=AA=97=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E7=BF=BB=E8=AF=91=E9=A1=B5=E9=9D=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现悬浮窗语言区域点击返回翻译页面功能,并记录上次翻译模式 - 在Android平台下记录当前翻译模式 - 点击悬浮窗语言区域时返回翻译页面并恢复上次模式 - 添加模式存储和读取功能 --- .../services/floating_window_manager.dart | 40 ++++++++++++++++--- .../controllers/translation_controller.dart | 6 +++ .../native_plugin/FloatingWindowService.kt | 21 ++++++++++ 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/lib/core/services/floating_window_manager.dart b/lib/core/services/floating_window_manager.dart index 47f347483..056425701 100644 --- a/lib/core/services/floating_window_manager.dart +++ b/lib/core/services/floating_window_manager.dart @@ -2,8 +2,11 @@ import 'dart:async'; import 'package:flutter/services.dart'; import 'package:floating_ui_plugin/native_plugin.dart'; import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; import '../utils/logger.dart'; import '../utils/overlay_permission_util.dart'; +import '../../routes/app_routes.dart'; +import '../../modules/translation/controllers/translation_controller.dart'; /// 悬浮窗状态 enum FloatingWindowState { @@ -48,6 +51,9 @@ class FloatingWindowManager extends GetxController { static MethodChannel get _channel => TranslationFloatingWindowApi.channel; final TranslationFloatingWindowApi _api = TranslationFloatingWindowApi(); + static const String _lastTranslationModeKey = + 'floating_window_last_translation_mode'; + final GetStorage _storage = GetStorage(); final _isEnabled = false.obs; final _currentState = FloatingWindowState.hidden.obs; @@ -79,7 +85,7 @@ class FloatingWindowManager extends GetxController { break; case 'onFloatingWindowClicked': // 悬浮窗被点击,可以执行相应操作(如返回主应用) - _handleFloatingWindowClick(); + await _handleFloatingWindowClick(); break; } }); @@ -194,9 +200,33 @@ class FloatingWindowManager extends GetxController { } /// 处理悬浮窗点击事件 - void _handleFloatingWindowClick() { - // 这里可以实现点击悬浮窗后的操作,比如返回主应用 - Logger.info('悬浮窗被点击'); - // 可以发送事件给其他组件处理 + Future _handleFloatingWindowClick() async { + final String mode = getLastTranslationMode(); + Logger.info('悬浮窗语言区域被点击,返回翻译页面: $mode'); + + if (Get.isRegistered()) { + final controller = Get.find(); + if (controller.currentMode.value != mode) { + await controller.changeTranslationMode(mode); + } + } + + if (Get.currentRoute != Routes.translation) { + Get.toNamed(Routes.translation, arguments: {'translationId': mode}); + } + } + + void setLastTranslationMode(String mode) { + _storage.write(_lastTranslationModeKey, _normalizeTranslationMode(mode)); + } + + String getLastTranslationMode() { + final String? mode = _storage.read(_lastTranslationModeKey); + return _normalizeTranslationMode(mode); + } + + String _normalizeTranslationMode(String? mode) { + if (mode == 'audioVideo' || mode == 'call') return mode!; + return 'call'; } } diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index af6a8302e..56d64f1d2 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -315,6 +315,12 @@ class TranslationController extends GetxController with WidgetsBindingObserver { loadTranslationHistory(); //stopAll(); + if (Platform.isAndroid && (mode == 'call' || mode == 'audioVideo')) { + try { + _floatingWindowManager.setLastTranslationMode(mode); + } catch (_) {} + } + // 检查悬浮窗支持情况 if (isFloatingWindowEnabled.value && !_isFloatingWindowSupportedMode()) { // 当前模式不支持悬浮窗,自动禁用 diff --git a/local_plugins/native_plugin/android/src/main/kotlin/com/example/native_plugin/FloatingWindowService.kt b/local_plugins/native_plugin/android/src/main/kotlin/com/example/native_plugin/FloatingWindowService.kt index 9fb2e5266..760c12060 100644 --- a/local_plugins/native_plugin/android/src/main/kotlin/com/example/native_plugin/FloatingWindowService.kt +++ b/local_plugins/native_plugin/android/src/main/kotlin/com/example/native_plugin/FloatingWindowService.kt @@ -459,6 +459,11 @@ class FloatingWindowService : Service() { stopSelf() notifyClosed() } + + languageInfoView?.setOnClickListener { + bringAppToFront() + notifyClicked() + } } private fun setupDragListener() { @@ -492,6 +497,9 @@ class FloatingWindowService : Service() { if (!isMinimized && isTouchingView(resizeHandleView, event.rawX, event.rawY)) { return false } + if (!isMinimized && isTouchingView(languageInfoView, event.rawX, event.rawY)) { + return false + } dragging = false scaling = false @@ -684,6 +692,19 @@ class FloatingWindowService : Service() { channel.invokeMethod("onFloatingWindowClicked", null) } + private fun bringAppToFront() { + try { + val launchIntent = packageManager.getLaunchIntentForPackage(packageName) ?: return + launchIntent.addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK or + Intent.FLAG_ACTIVITY_SINGLE_TOP or + Intent.FLAG_ACTIVITY_CLEAR_TOP + ) + startActivity(launchIntent) + } catch (_: Exception) { + } + } + private fun dp(value: Int): Int { return (value * resources.displayMetrics.density).toInt() }