fix: restore PDD task before current-page collection (#104)

This commit is contained in:
QiuSW
2026-08-27 11:16:26 +08:00
parent 28c3cb5138
commit 95a0660e8e
6 changed files with 84 additions and 7 deletions
+2 -2
View File
@@ -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"
@@ -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(')', ']', '}', ')', '】', '」', '』', '》', ',', ',', '.', '。', ';', ';')
@@ -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
@@ -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 {
@@ -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()
}
@@ -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<String>()
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(