feat: play supplied audio on electronic photo completion

This commit is contained in:
2026-09-15 16:21:44 +08:00
parent 2231c38792
commit 6d81f1a28b
6 changed files with 34 additions and 6 deletions
@@ -44,6 +44,29 @@ class LocalAudioPlaybackTest {
} }
} }
@Test fun electronicCompletionSwitchesToDedicatedClipAndPreservesPrintAudio() {
val instrumentation = InstrumentationRegistry.getInstrumentation()
lateinit var service: LocalAudioPlayService
instrumentation.runOnMainSync { service = LocalAudioPlayService(instrumentation.targetContext) }
try {
instrumentation.runOnMainSync { service.playByRoute(AppRoutes.PRINT_SUCCESS) }
awaitPlaying(service)
assertEquals(R.raw.print_complete_page, service.currentResId.value)
instrumentation.runOnMainSync {
service.playByRoute(AppRoutes.buildElectronicCompletionRoute("AUDIO-TEST-ORDER"))
}
awaitPlaying(service)
assertEquals(R.raw.electronic_complete_page, service.currentResId.value)
instrumentation.runOnMainSync { service.playByRoute(AppRoutes.PRINT_SUCCESS) }
awaitPlaying(service)
assertEquals(R.raw.print_complete_page, service.currentResId.value)
} finally {
instrumentation.runOnMainSync { service.release() }
}
}
private fun awaitPlaying(service: LocalAudioPlayService) { private fun awaitPlaying(service: LocalAudioPlayService) {
val deadline = System.currentTimeMillis() + 5000 val deadline = System.currentTimeMillis() + 5000
while (!service.isPlaying.value && System.currentTimeMillis() < deadline) Thread.sleep(20) while (!service.isPlaying.value && System.currentTimeMillis() < deadline) Thread.sleep(20)
@@ -47,6 +47,7 @@ class LocalAudioPlayService @Inject constructor(
AppRoutes.PHOTO_SELECT to R.raw.upload_unpaid_result_page, AppRoutes.PHOTO_SELECT to R.raw.upload_unpaid_result_page,
AppRoutes.PRINTING to R.raw.printing_page, AppRoutes.PRINTING to R.raw.printing_page,
AppRoutes.PRINT_SUCCESS to R.raw.print_complete_page, AppRoutes.PRINT_SUCCESS to R.raw.print_complete_page,
ELECTRONIC_COMPLETION_AUDIO_KEY to R.raw.electronic_complete_page,
// 特殊状态页面 // 特殊状态页面
"face_recognition_recognizing" to R.raw.face_recognition_recognizing_page, "face_recognition_recognizing" to R.raw.face_recognition_recognizing_page,
"face_recognition_failed" to R.raw.face_recognition_failed_page, "face_recognition_failed" to R.raw.face_recognition_failed_page,
@@ -112,10 +113,6 @@ class LocalAudioPlayService @Inject constructor(
// 同一结果页根据入口选择播报,避免最近照片误播识别成功。 // 同一结果页根据入口选择播报,避免最近照片误播识别成功。
val audioKey = localAudioKeyForRoute(route) val audioKey = localAudioKeyForRoute(route)
if (audioKey == ELECTRONIC_COMPLETION_AUDIO_KEY) {
stop()
return
}
val audioResId = ROUTE_TO_AUDIO_MAP[audioKey] val audioResId = ROUTE_TO_AUDIO_MAP[audioKey]
if (audioResId == null) { if (audioResId == null) {
@@ -3,7 +3,7 @@ package com.yzx.kiosk.audio
import com.yzx.kiosk.navigation.routes.AppRoutes import com.yzx.kiosk.navigation.routes.AppRoutes
import java.net.URLDecoder import java.net.URLDecoder
internal const val ELECTRONIC_COMPLETION_AUDIO_KEY = "electronic_completion_silent" internal const val ELECTRONIC_COMPLETION_AUDIO_KEY = "electronic_completion"
internal const val RECENT_PHOTOS_AUDIO_KEY = "recent_photos_result" internal const val RECENT_PHOTOS_AUDIO_KEY = "recent_photos_result"
Binary file not shown.
@@ -5,7 +5,7 @@ import org.junit.Assert.assertEquals
import org.junit.Test import org.junit.Test
class LocalAudioRouteTest { class LocalAudioRouteTest {
@Test fun `electronic completion suppresses printing audio while print routes retain it`() { @Test fun `electronic completion uses its own audio while print routes retain theirs`() {
assertEquals(ELECTRONIC_COMPLETION_AUDIO_KEY, localAudioKeyForRoute(AppRoutes.buildElectronicCompletionRoute("ORDER"))) assertEquals(ELECTRONIC_COMPLETION_AUDIO_KEY, localAudioKeyForRoute(AppRoutes.buildElectronicCompletionRoute("ORDER")))
assertEquals(AppRoutes.PRINTING, localAudioKeyForRoute(AppRoutes.buildPrintingRoute("[]", "ORDER", 1))) assertEquals(AppRoutes.PRINTING, localAudioKeyForRoute(AppRoutes.buildPrintingRoute("[]", "ORDER", 1)))
assertEquals(AppRoutes.PRINTING, localAudioKeyForRoute("printing?urls=electronic%3Dtrue")) assertEquals(AppRoutes.PRINTING, localAudioKeyForRoute("printing?urls=electronic%3Dtrue"))
@@ -0,0 +1,8 @@
# 电子版完成页语音
- 来源:用户提供的 `9月15日.wav`。
- 项目资源名称:`app/src/main/res/raw/electronic_complete_page.wav`。
- 原先从打印完成提示音裁剪得到的版本已被替换。
- 按原文件复制,未裁剪、转码或调整音量;48 kHz、双声道、16-bit PCM WAV,时长 5.632 秒。
- 进入电子版完成页时通过 `LocalAudioPlayService` 播放此资源。
- 打印完成页继续使用 `print_complete_page.wav`。