fix: restore PDD task before current-page collection (#104)
This commit is contained in:
@@ -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(')', ']', '}', ')', '】', '」', '』', '》', ',', ',', '.', '。', ';', ';')
|
||||
|
||||
+5
-3
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user