feat(android): collect bounded Pinduoduo candidates

This commit is contained in:
QiuSW
2026-07-25 20:18:05 +08:00
parent f226d0f2ff
commit c25d63c730
23 changed files with 1449 additions and 33 deletions
@@ -48,8 +48,13 @@ import kotlinx.coroutines.launch
import rikka.shizuku.Shizuku
import android.util.Log
import com.roubao.autopilot.pinduoduo.AndroidPinduoduoUiDriver
import com.roubao.autopilot.pinduoduo.AndroidPinduoduoCandidateDriver
import com.roubao.autopilot.pinduoduo.PinduoduoCandidateAutomation
import com.roubao.autopilot.pinduoduo.CandidateBrowsePhase
import com.roubao.autopilot.pinduoduo.PinduoduoCandidateEvidence
import com.roubao.autopilot.pinduoduo.PinduoduoCandidateWorkflow
import com.roubao.autopilot.pinduoduo.PinduoduoProbeAutomation
import com.roubao.autopilot.pinduoduo.PinduoduoSearchAutomation
import com.roubao.autopilot.pinduoduo.PinduoduoSearchWorkflow
import com.roubao.autopilot.workflow.WorkflowReport
import com.roubao.autopilot.workflow.WorkflowRunner
import com.roubao.autopilot.workflow.WorkflowState
@@ -76,6 +81,8 @@ class MainActivity : ComponentActivity() {
private val searchProbeState = mutableStateOf(WorkflowState.IDLE)
private val searchProbeStepId = mutableStateOf<String?>(null)
private val searchProbeReport = mutableStateOf<WorkflowReport?>(null)
private val candidateEvidence =
mutableStateOf<List<PinduoduoCandidateEvidence>>(emptyList())
private var searchProbeRunner: WorkflowRunner? = null
private var searchProbeJob: Job? = null
@@ -198,6 +205,7 @@ class MainActivity : ComponentActivity() {
val probeState by remember { searchProbeState }
val probeStepId by remember { searchProbeStepId }
val probeReport by remember { searchProbeReport }
val evidence by remember { candidateEvidence }
// 监听跳转事件
LaunchedEffect(navigateToRecord, recordId) {
@@ -286,6 +294,7 @@ class MainActivity : ComponentActivity() {
state = probeState,
currentStepId = probeStepId,
report = probeReport,
candidateEvidenceCount = evidence.size,
onStart = { startSearchProbe() },
onStop = { stopSearchProbe() }
)
@@ -384,13 +393,23 @@ class MainActivity : ComponentActivity() {
return
}
val candidateAutomation = PinduoduoCandidateAutomation(
AndroidPinduoduoCandidateDriver(this)
)
candidateAutomation.reset()
val runner = WorkflowRunner(
PinduoduoSearchAutomation(AndroidPinduoduoUiDriver(this))
PinduoduoProbeAutomation(
searchAutomation = PinduoduoSearchAutomation(
AndroidPinduoduoUiDriver(this)
),
candidateAutomation = candidateAutomation
)
)
searchProbeRunner = runner
searchProbeReport.value = null
searchProbeState.value = WorkflowState.IDLE
searchProbeStepId.value = null
candidateEvidence.value = emptyList()
searchProbeJob = lifecycleScope.launch {
val stateCollector = launch {
runner.state.collect { state -> searchProbeState.value = state }
@@ -398,13 +417,27 @@ class MainActivity : ComponentActivity() {
val stepCollector = launch {
runner.currentStepId.collect { stepId -> searchProbeStepId.value = stepId }
}
val evidenceCollector = launch {
candidateAutomation.evidence.collect { evidence ->
candidateEvidence.value = evidence
}
}
val candidatePhaseCollector = launch {
candidateAutomation.phase.collect { phase ->
if (phase != CandidateBrowsePhase.IDLE) {
Log.d(TAG, "Candidate probe phase: ${phase.name}")
}
}
}
try {
val report = runner.run(PinduoduoSearchWorkflow.steps())
val report = runner.run(PinduoduoCandidateWorkflow.steps())
searchProbeReport.value = report
searchProbeState.value = report.state
} finally {
stateCollector.cancel()
stepCollector.cancel()
evidenceCollector.cancel()
candidatePhaseCollector.cancel()
searchProbeRunner = null
refreshReadiness()
}