Skip to content

Commit 751ca3b

Browse files
committed
Call onDone after the voice from bakery is finished #102
1 parent 83894f5 commit 751ca3b

File tree

2 files changed

+64
-6
lines changed

2 files changed

+64
-6
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package xyz.aprildown.timer.app.base.media
2+
3+
import android.content.ContentResolver
4+
import android.content.Context
5+
import android.media.MediaMetadataRetriever
6+
import android.net.Uri
7+
import android.os.Build
8+
import androidx.core.net.toFile
9+
import java.io.File
10+
11+
private fun <T> withMediaMetadataRetriever(
12+
setDataSource: MediaMetadataRetriever.() -> Unit,
13+
block: (retriever: MediaMetadataRetriever) -> T?
14+
): T? {
15+
var retriever: MediaMetadataRetriever? = null
16+
return try {
17+
retriever = MediaMetadataRetriever()
18+
setDataSource(retriever)
19+
block(retriever)
20+
} catch (_: Throwable) {
21+
// Ignore
22+
null
23+
} finally {
24+
try {
25+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
26+
retriever?.close()
27+
} else {
28+
retriever?.release()
29+
}
30+
} catch (_: Throwable) {
31+
// Ignore
32+
}
33+
}
34+
}
35+
36+
private fun retrieveMediaDuration(setDataSource: MediaMetadataRetriever.() -> Unit): Long {
37+
return withMediaMetadataRetriever(setDataSource = setDataSource) { retriever ->
38+
retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)
39+
?.toLongOrNull() ?: 0L
40+
} ?: 0L
41+
}
42+
43+
fun File.getMediaDuration(): Long {
44+
return retrieveMediaDuration(setDataSource = { setDataSource(canonicalPath) })
45+
}
46+
47+
fun Uri.getMediaDuration(context: Context): Long {
48+
if (scheme == ContentResolver.SCHEME_FILE) return toFile().getMediaDuration()
49+
return retrieveMediaDuration(
50+
setDataSource = { setDataSource(context, this@getMediaDuration) }
51+
)
52+
}

component-tts/src/main/java/com/github/deweyreed/timer/component/tts/TtsSpeaker.kt

+12-6
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import androidx.core.content.getSystemService
1313
import androidx.core.net.toUri
1414
import androidx.core.os.bundleOf
1515
import androidx.core.os.postDelayed
16+
import com.github.deweyreed.timer.component.tts.TtsSpeaker.onDone
1617
import com.github.deweyreed.tools.anko.longToast
1718
import com.github.deweyreed.tools.helper.HandlerHelper
1819
import kotlinx.coroutines.Dispatchers
@@ -25,6 +26,7 @@ import xyz.aprildown.timer.app.base.data.PreferenceData.storedAudioTypeValue
2526
import xyz.aprildown.timer.app.base.data.PreferenceData.useBakedCount
2627
import xyz.aprildown.timer.app.base.media.AudioFocusManager
2728
import xyz.aprildown.timer.app.base.media.RingtonePreviewKlaxon
29+
import xyz.aprildown.timer.app.base.media.getMediaDuration
2830
import xyz.aprildown.timer.domain.utils.fireAndForget
2931
import xyz.aprildown.tools.helper.safeSharedPreference
3032
import java.io.File
@@ -232,15 +234,11 @@ private class WelcomingTextToSpeech(
232234
tts.setOnUtteranceProgressListener(
233235
object : UtteranceProgressListener() {
234236
override fun onStart(utteranceId: String?) {
235-
HandlerHelper.runOnUiThread {
236-
listener.onStart()
237-
}
237+
HandlerHelper.runOnUiThread(listener::onStart)
238238
}
239239

240240
override fun onDone(utteranceId: String?) {
241-
HandlerHelper.runOnUiThread {
242-
listener.onDone()
243-
}
241+
HandlerHelper.runOnUiThread(listener::onDone)
244242
}
245243

246244
@Suppress("OVERRIDE_DEPRECATION")
@@ -312,6 +310,12 @@ private class WelcomingTextToSpeech(
312310
)
313311

314312
listener.onStart()
313+
314+
HandlerHelper.postDelayed(
315+
speechUri.getMediaDuration(application) + 100L,
316+
listener::onDone
317+
)
318+
315319
return@fireAndForget
316320
}
317321

@@ -336,10 +340,12 @@ private class WelcomingTextToSpeech(
336340

337341
fun stop() {
338342
textToSpeech.stop()
343+
HandlerHelper.remove(listener::onDone)
339344
}
340345

341346
fun shutdown() {
342347
textToSpeech.shutdown()
348+
HandlerHelper.remove(listener::onDone)
343349
}
344350
}
345351

0 commit comments

Comments
 (0)