From 486dff29fd4826f4a805df40c22713b2d2f01495 Mon Sep 17 00:00:00 2001 From: QiuSW <105186638@qq.com> Date: Mon, 7 Sep 2026 10:51:24 +0800 Subject: [PATCH] fix(agent): launch purchase deep links with fresh PDD task (#232) --- android/app/build.gradle.kts | 4 +-- .../agent/automation/PddLaunchFallback.kt | 8 ++++++ .../goauto/agent/automation/PddNavigation.kt | 12 ++++++++- .../agent/service/AgentForegroundService.kt | 2 +- .../goauto/agent/PddLaunchFallbackTest.kt | 25 +++++++++++++++++++ 5 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 android/app/src/main/java/cn/ilapage/goauto/agent/automation/PddLaunchFallback.kt create mode 100644 android/app/src/test/java/cn/ilapage/goauto/agent/PddLaunchFallbackTest.kt diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index c60474d..fb76f60 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 = 70 - versionName = "0.9.57" + versionCode = 71 + versionName = "0.9.58" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" diff --git a/android/app/src/main/java/cn/ilapage/goauto/agent/automation/PddLaunchFallback.kt b/android/app/src/main/java/cn/ilapage/goauto/agent/automation/PddLaunchFallback.kt new file mode 100644 index 0000000..533bdf5 --- /dev/null +++ b/android/app/src/main/java/cn/ilapage/goauto/agent/automation/PddLaunchFallback.kt @@ -0,0 +1,8 @@ +package cn.ilapage.goauto.agent.automation + +internal object PddLaunchFallback { + fun open(preferDirect: Boolean, direct: () -> Boolean, browser: () -> Boolean): Boolean { + if (preferDirect && runCatching(direct).getOrDefault(false)) return true + return runCatching(browser).getOrDefault(false) + } +} diff --git a/android/app/src/main/java/cn/ilapage/goauto/agent/automation/PddNavigation.kt b/android/app/src/main/java/cn/ilapage/goauto/agent/automation/PddNavigation.kt index 8539b2b..a8b9625 100644 --- a/android/app/src/main/java/cn/ilapage/goauto/agent/automation/PddNavigation.kt +++ b/android/app/src/main/java/cn/ilapage/goauto/agent/automation/PddNavigation.kt @@ -31,11 +31,21 @@ object PddPageClassifier { } class PddLinkLauncher(private val context: Context) { - fun open(url: String): Boolean { + fun open(url: String, preferDirect: Boolean = false): Boolean { val uri = runCatching { Uri.parse(url) }.getOrNull() ?: return false if (uri.scheme !in setOf("http", "https") || !isPddHost(uri.host) || uri.getQueryParameter("goods_id").isNullOrBlank()) { return false } + return PddLaunchFallback.open(preferDirect, direct = { + val direct = Intent(Intent.ACTION_VIEW, uri) + .setPackage("com.xunmeng.pinduoduo") + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + context.startActivity(direct) + true + }, browser = { openBrowser(uri) }) + } + + private fun openBrowser(uri: Uri): Boolean { val base = Intent(Intent.ACTION_VIEW, uri).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) val browser = BROWSER_PACKAGES.firstOrNull { packageName -> runCatching { context.packageManager.getPackageInfo(packageName, 0) }.isSuccess diff --git a/android/app/src/main/java/cn/ilapage/goauto/agent/service/AgentForegroundService.kt b/android/app/src/main/java/cn/ilapage/goauto/agent/service/AgentForegroundService.kt index a245b17..d9d6068 100644 --- a/android/app/src/main/java/cn/ilapage/goauto/agent/service/AgentForegroundService.kt +++ b/android/app/src/main/java/cn/ilapage/goauto/agent/service/AgentForegroundService.kt @@ -480,7 +480,7 @@ class AgentForegroundService : Service() { } else { PurchaseRehearsalExecutor( driver = accessibility, - openLink = { PddLinkLauncher(this).open(it) }, + openLink = { PddLinkLauncher(this).open(it, preferDirect = true) }, probeSpecs = { collectPurchaseProbe(accessibility, task, parsedRule) }, stepChanged = { step -> lastStep.set(step) diff --git a/android/app/src/test/java/cn/ilapage/goauto/agent/PddLaunchFallbackTest.kt b/android/app/src/test/java/cn/ilapage/goauto/agent/PddLaunchFallbackTest.kt new file mode 100644 index 0000000..31811bc --- /dev/null +++ b/android/app/src/test/java/cn/ilapage/goauto/agent/PddLaunchFallbackTest.kt @@ -0,0 +1,25 @@ +package cn.ilapage.goauto.agent + +import cn.ilapage.goauto.agent.automation.PddLaunchFallback +import org.junit.Assert.* +import org.junit.Test + +class PddLaunchFallbackTest { + @Test fun directSuccessDoesNotStartBrowser() { + assertTrue(PddLaunchFallback.open(true, { true }, { error("browser must not start") })) + } + @Test fun missingHandlerFallsBackOnce() { + var browserCalls = 0 + assertTrue(PddLaunchFallback.open(true, { throw IllegalStateException("no handler") }, { browserCalls++; true })) + assertEquals(1, browserCalls) + } + @Test fun rejectedDirectLaunchFallsBack() { + assertTrue(PddLaunchFallback.open(true, { false }, { true })) + assertFalse(PddLaunchFallback.open(true, { false }, { false })) + } + @Test fun collectionKeepsBrowserEntry() { + var directCalls = 0 + assertTrue(PddLaunchFallback.open(false, { directCalls++; true }, { true })) + assertEquals(0, directCalls) + } +}