From 95a0660e8e39ce5e92127b2e4886cd680c6e7c06 Mon Sep 17 00:00:00 2001 From: QiuSW <105186638@qq.com> Date: Thu, 27 Aug 2026 11:16:26 +0800 Subject: [PATCH] fix: restore PDD task before current-page collection (#104) --- android/app/build.gradle.kts | 4 +- .../agent/automation/CurrentPageCollection.kt | 22 +++++++++ .../automation/GoAutoAccessibilityService.kt | 8 ++-- .../goauto/agent/ui/AgentSettingsFragment.kt | 4 +- .../goauto/agent/ui/TaskHistoryFragment.kt | 7 ++- .../goauto/agent/CurrentPageCollectionTest.kt | 46 +++++++++++++++++++ 6 files changed, 84 insertions(+), 7 deletions(-) diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 973f003..9bf960a 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -11,8 +11,8 @@ android { applicationId = "cn.ilapage.goauto.agent" minSdk = 23 targetSdk = 34 - versionCode = 13 - versionName = "0.9.0" + versionCode = 14 + versionName = "0.9.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" diff --git a/android/app/src/main/java/cn/ilapage/goauto/agent/automation/CurrentPageCollection.kt b/android/app/src/main/java/cn/ilapage/goauto/agent/automation/CurrentPageCollection.kt index 03d07b1..cecd1a3 100644 --- a/android/app/src/main/java/cn/ilapage/goauto/agent/automation/CurrentPageCollection.kt +++ b/android/app/src/main/java/cn/ilapage/goauto/agent/automation/CurrentPageCollection.kt @@ -9,6 +9,28 @@ data class CurrentPageIdentityResult( val shareUrl: String? = null, ) +enum class CurrentPageRestoreDecision { + READY, + BACK_FROM_AGENT, + REJECT, +} + +object CurrentPageNavigationPolicy { + fun restoreDecision(currentPackage: String?, agentPackage: String, recentPdd: Boolean): CurrentPageRestoreDecision = when { + currentPackage == PDD_PACKAGE -> CurrentPageRestoreDecision.READY + currentPackage == agentPackage && recentPdd -> CurrentPageRestoreDecision.BACK_FROM_AGENT + else -> CurrentPageRestoreDecision.REJECT + } + + fun backgroundAndLaunch(moveTaskToBack: () -> Boolean, launch: () -> Unit): Boolean { + if (!moveTaskToBack()) return false + launch() + return true + } + + private const val PDD_PACKAGE = "com.xunmeng.pinduoduo" +} + object PddShareLinkExtractor { private val urlPattern = Regex("https://[^\\s]+", RegexOption.IGNORE_CASE) private val trailingPunctuation = charArrayOf(')', ']', '}', ')', '】', '」', '』', '》', ',', ',', '.', '。', ';', ';') diff --git a/android/app/src/main/java/cn/ilapage/goauto/agent/automation/GoAutoAccessibilityService.kt b/android/app/src/main/java/cn/ilapage/goauto/agent/automation/GoAutoAccessibilityService.kt index d559a1c..4863cef 100644 --- a/android/app/src/main/java/cn/ilapage/goauto/agent/automation/GoAutoAccessibilityService.kt +++ b/android/app/src/main/java/cn/ilapage/goauto/agent/automation/GoAutoAccessibilityService.kt @@ -100,9 +100,11 @@ class GoAutoAccessibilityService : AccessibilityService(), UiDriver, PddCollecto } fun restoreRecentPddPage(timeoutMillis: Long = 5_000L): Boolean { - if (currentPackage() == PDD_PACKAGE) return true - if (currentPackage() != packageName || !hasRecentPddForeground()) return false - if (!performGlobalAction(GLOBAL_ACTION_BACK)) return false + when (CurrentPageNavigationPolicy.restoreDecision(currentPackage(), packageName, hasRecentPddForeground())) { + CurrentPageRestoreDecision.READY -> return true + CurrentPageRestoreDecision.REJECT -> return false + CurrentPageRestoreDecision.BACK_FROM_AGENT -> if (!performGlobalAction(GLOBAL_ACTION_BACK)) return false + } val deadline = SystemClock.elapsedRealtime() + timeoutMillis do { if (currentPackage() == PDD_PACKAGE) return true diff --git a/android/app/src/main/java/cn/ilapage/goauto/agent/ui/AgentSettingsFragment.kt b/android/app/src/main/java/cn/ilapage/goauto/agent/ui/AgentSettingsFragment.kt index 6b647b7..84a3101 100644 --- a/android/app/src/main/java/cn/ilapage/goauto/agent/ui/AgentSettingsFragment.kt +++ b/android/app/src/main/java/cn/ilapage/goauto/agent/ui/AgentSettingsFragment.kt @@ -162,7 +162,9 @@ class AgentSettingsFragment : Fragment() { text = "打开无障碍设置" minHeight = context.dp(48) contentDescription = "打开系统无障碍设置" - setOnClickListener { startActivity(Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)) } + setOnClickListener { + startActivity(Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)) + } }, fullWidth(12)) })) addView(context.card(context.cardColumn().apply { diff --git a/android/app/src/main/java/cn/ilapage/goauto/agent/ui/TaskHistoryFragment.kt b/android/app/src/main/java/cn/ilapage/goauto/agent/ui/TaskHistoryFragment.kt index 646e657..5083ad0 100644 --- a/android/app/src/main/java/cn/ilapage/goauto/agent/ui/TaskHistoryFragment.kt +++ b/android/app/src/main/java/cn/ilapage/goauto/agent/ui/TaskHistoryFragment.kt @@ -24,6 +24,7 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import cn.ilapage.goauto.agent.R import cn.ilapage.goauto.agent.identity.SecureDeviceStore import cn.ilapage.goauto.agent.automation.GoAutoAccessibilityService +import cn.ilapage.goauto.agent.automation.CurrentPageNavigationPolicy import cn.ilapage.goauto.agent.network.AgentApiClient import cn.ilapage.goauto.agent.network.CollectionHistoryDetail import cn.ilapage.goauto.agent.network.CollectionHistoryItem @@ -493,7 +494,11 @@ class TaskHistoryFragment : Fragment() { .setNegativeButton("取消", null) .setPositiveButton("开始采集") { _, _ -> toast("正在创建临时采集任务…") - AgentForegroundService.collectCurrentPage(context, UUID.randomUUID().toString()) + val launched = CurrentPageNavigationPolicy.backgroundAndLaunch( + moveTaskToBack = { requireActivity().moveTaskToBack(true) }, + launch = { AgentForegroundService.collectCurrentPage(context, UUID.randomUUID().toString()) }, + ) + if (!launched) showCurrentPageBlocked("无法返回拼多多,请重新打开商品后再试。") } .show() } diff --git a/android/app/src/test/java/cn/ilapage/goauto/agent/CurrentPageCollectionTest.kt b/android/app/src/test/java/cn/ilapage/goauto/agent/CurrentPageCollectionTest.kt index f095400..b7900cf 100644 --- a/android/app/src/test/java/cn/ilapage/goauto/agent/CurrentPageCollectionTest.kt +++ b/android/app/src/test/java/cn/ilapage/goauto/agent/CurrentPageCollectionTest.kt @@ -3,6 +3,8 @@ package cn.ilapage.goauto.agent import cn.ilapage.goauto.agent.automation.CollectionRule import cn.ilapage.goauto.agent.automation.CurrentPageIdentityConfig import cn.ilapage.goauto.agent.automation.CurrentPageIdentityRunner +import cn.ilapage.goauto.agent.automation.CurrentPageNavigationPolicy +import cn.ilapage.goauto.agent.automation.CurrentPageRestoreDecision import cn.ilapage.goauto.agent.automation.FreshActionResult import cn.ilapage.goauto.agent.automation.NodeBounds import cn.ilapage.goauto.agent.automation.NodeSelector @@ -19,6 +21,50 @@ import org.junit.Assert.assertTrue import org.junit.Test class CurrentPageCollectionTest { + @Test + fun backgroundsAgentBeforeLaunchingCurrentPageCollection() { + val calls = mutableListOf() + val launched = CurrentPageNavigationPolicy.backgroundAndLaunch( + moveTaskToBack = { calls += "background"; true }, + launch = { calls += "launch" }, + ) + + assertTrue(launched) + assertEquals(listOf("background", "launch"), calls) + } + + @Test + fun doesNotLaunchWhenAgentTaskCannotMoveToBackground() { + var launchCalled = false + val launched = CurrentPageNavigationPolicy.backgroundAndLaunch( + moveTaskToBack = { false }, + launch = { launchCalled = true }, + ) + + assertFalse(launched) + assertFalse(launchCalled) + } + + @Test + fun restoresOnlyPddOrOneRecentAgentFallback() { + assertEquals( + CurrentPageRestoreDecision.READY, + CurrentPageNavigationPolicy.restoreDecision(PDD_PACKAGE, "cn.ilapage.goauto.agent", recentPdd = true), + ) + assertEquals( + CurrentPageRestoreDecision.BACK_FROM_AGENT, + CurrentPageNavigationPolicy.restoreDecision("cn.ilapage.goauto.agent", "cn.ilapage.goauto.agent", recentPdd = true), + ) + assertEquals( + CurrentPageRestoreDecision.REJECT, + CurrentPageNavigationPolicy.restoreDecision("com.android.settings", "cn.ilapage.goauto.agent", recentPdd = true), + ) + assertEquals( + CurrentPageRestoreDecision.REJECT, + CurrentPageNavigationPolicy.restoreDecision("cn.ilapage.goauto.agent", "cn.ilapage.goauto.agent", recentPdd = false), + ) + } + @Test fun extractsOneWhitelistedHttpsUrlOnly() { assertEquals(