fix(accessibility, floatwindow): 同步无障碍服务状态并优化悬浮窗控制逻辑

- 新增无障碍服务状态广播,实现服务启停状态与UI页面同步
- 重置悬浮窗暂停状态,避免服务重启后卡在上次暂停状态
- 为悬浮窗菜单添加播放/暂停和停止功能
- 修复ListenActivity中无障碍开关切换的无限循环问题
This commit is contained in:
2026-05-11 15:53:42 +08:00
parent 9a9ffb79d5
commit ccc0c3c4ae
3 changed files with 53 additions and 3 deletions

View File

@@ -28,6 +28,7 @@ import kotlin.random.Random
class ListenActivity : AppCompatActivity() { class ListenActivity : AppCompatActivity() {
var riskRetry: Int = 0 var riskRetry: Int = 0
private var updatingAccessibilitySwitch = false
companion object { companion object {
/** /**
@@ -66,7 +67,7 @@ class ListenActivity : AppCompatActivity() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
sw_overlay.isChecked = Settings.canDrawOverlays(Utils.getApp()) && FlowPermissionHelper.canBackgroundStart(Utils.getApp()) sw_overlay.isChecked = Settings.canDrawOverlays(Utils.getApp()) && FlowPermissionHelper.canBackgroundStart(Utils.getApp())
sw_accessibility.isChecked = PermissionHelper.isAccessibilitySettingOn() refreshAccessibilitySwitch()
if (needToWork) { if (needToWork) {
needToWork = false needToWork = false
goToWork() goToWork()
@@ -128,6 +129,9 @@ class ListenActivity : AppCompatActivity() {
private fun initAccessibility() { private fun initAccessibility() {
sw_accessibility.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener { buttonView, isChecked -> sw_accessibility.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener { buttonView, isChecked ->
if (updatingAccessibilitySwitch) {
return@OnCheckedChangeListener
}
LogUtils.i("sw_accessibility onCheckedChanged: $isChecked") LogUtils.i("sw_accessibility onCheckedChanged: $isChecked")
if (isChecked) { if (isChecked) {
if (Constant.robotId.isBlank()) { if (Constant.robotId.isBlank()) {
@@ -322,10 +326,21 @@ class ListenActivity : AppCompatActivity() {
private val openWsReceiver = object : BroadcastReceiver() { private val openWsReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
if (intent.getStringExtra("type") == "openWs") { when (intent.getStringExtra("type")) {
needToWork = intent.getBooleanExtra("switch", false) "openWs" -> {
needToWork = intent.getBooleanExtra("switch", false)
}
"accessibility_state" -> {
refreshAccessibilitySwitch(intent.getBooleanExtra("enabled", PermissionHelper.isAccessibilitySettingOn()))
}
} }
} }
} }
private fun refreshAccessibilitySwitch(checked: Boolean = PermissionHelper.isAccessibilitySettingOn()) {
updatingAccessibilitySwitch = true
sw_accessibility.isChecked = checked
updatingAccessibilitySwitch = false
}
} }

View File

@@ -37,8 +37,11 @@ class WeworkService : AccessibilityService() {
LogUtils.i("初始化成功") LogUtils.i("初始化成功")
//隐藏软键盘模式 //隐藏软键盘模式
softKeyboardController.showMode = SHOW_MODE_HIDDEN softKeyboardController.showMode = SHOW_MODE_HIDDEN
// 服务重启后恢复主功能默认运行态,避免被上一次暂停状态卡住
FloatWindowHelper.isPause = false
WeworkController.weworkService = this WeworkController.weworkService = this
WeworkController.enableLoopRunning = true WeworkController.enableLoopRunning = true
notifyAccessibilityState(true)
//初始化长连接 //初始化长连接
initWebSocket() initWebSocket()
//初始化消息处理器 //初始化消息处理器
@@ -115,11 +118,21 @@ class WeworkService : AccessibilityService() {
LogUtils.i("onDestroy") LogUtils.i("onDestroy")
//关闭自动回复 //关闭自动回复
WeworkController.enableLoopRunning = false WeworkController.enableLoopRunning = false
// 关闭主功能时清理暂停态,确保下次开启可立即进入检测
FloatWindowHelper.isPause = false
notifyAccessibilityState(false)
//隐藏软键盘模式 //隐藏软键盘模式
softKeyboardController.showMode = SHOW_MODE_AUTO softKeyboardController.showMode = SHOW_MODE_AUTO
webSocketManager.close(1000, "service Destroy") webSocketManager.close(1000, "service Destroy")
} }
private fun notifyAccessibilityState(enabled: Boolean) {
sendBroadcast(Intent(Constant.WEWORK_NOTIFY).apply {
putExtra("type", "accessibility_state")
putExtra("enabled", enabled)
})
}
inner class EchoWebSocketListener : WebSocketListener() { inner class EchoWebSocketListener : WebSocketListener() {
private val TAG = "WeworkService.EchoWebSocketListener" private val TAG = "WeworkService.EchoWebSocketListener"
override fun onOpen(webSocket: WebSocket, response: Response) { override fun onOpen(webSocket: WebSocket, response: Response) {

View File

@@ -144,6 +144,28 @@ object FloatWindowHelper {
ToastUtils.showShort("请先打开Awin WorkTool主功能~") ToastUtils.showShort("请先打开Awin WorkTool主功能~")
} }
} }
5 -> {
if (PermissionHelper.isAccessibilitySettingOn()) {
if (isPause) {
Glide.with(Utils.getApp()).load(R.drawable.float_icon_pause).into(v as ImageView)
accessibilityServiceResume()
} else {
Glide.with(Utils.getApp()).load(R.drawable.float_icon_play).into(v as ImageView)
accessibilityServicePause()
}
} else {
ToastUtils.showShort("请先打开Awin WorkTool主功能~")
}
}
6 -> {
if (PermissionHelper.isAccessibilitySettingOn()) {
// 停止主功能时复位暂停状态,避免下次开启后主循环被卡住
isPause = false
WeworkController.weworkService.disableSelf()
} else {
ToastUtils.showShort("主功能已关闭~")
}
}
3 -> { 3 -> {
Utils.getApp().packageManager.getLaunchIntentForPackage(Constant.PACKAGE_NAMES)?.apply { Utils.getApp().packageManager.getLaunchIntentForPackage(Constant.PACKAGE_NAMES)?.apply {
this.flags = Intent.FLAG_ACTIVITY_NEW_TASK this.flags = Intent.FLAG_ACTIVITY_NEW_TASK