Skip to content

Commit c6f271e

Browse files
committed
feat(ui): remember subtitle language dialog
1 parent d0e3c68 commit c6f271e

File tree

4 files changed

+125
-46
lines changed

4 files changed

+125
-46
lines changed

app/src/main/java/com/junkfood/seal/Downloader.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ object Downloader {
398398
videoClips: List<VideoClip>,
399399
splitByChapter: Boolean,
400400
newTitle: String,
401-
selectedSubtitleLang: List<String>,
401+
selectedSubtitleCodes: List<String>,
402402
) {
403403
currentJob = applicationScope.launch(Dispatchers.IO) {
404404
val fileSize = formatList.fold(.0) { acc, format ->
@@ -429,13 +429,13 @@ object Downloader {
429429
).run {
430430
copy(extractAudio = extractAudio || audioOnly)
431431
}.run {
432-
selectedSubtitleLang.takeIf { it.isNotEmpty() }
432+
selectedSubtitleCodes.takeIf { it.isNotEmpty() }
433433
?.let {
434-
val autoSubtitle = !info.subtitles.keys.containsAll(selectedSubtitleLang)
434+
val autoSubtitle = !info.subtitles.keys.containsAll(selectedSubtitleCodes)
435435
copy(
436436
downloadSubtitle = true,
437437
autoSubtitle = autoSubtitle,
438-
subtitleLanguage = selectedSubtitleLang.joinToString(separator = ",") { it }
438+
subtitleLanguage = selectedSubtitleCodes.joinToString(separator = ",") { it }
439439
)
440440
}
441441
?: this

app/src/main/java/com/junkfood/seal/ui/page/download/FormatPage.kt

+114-37
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.junkfood.seal.ui.page.download
22

33
import android.content.Intent
4-
import android.util.Log
54
import androidx.compose.animation.AnimatedVisibility
65
import androidx.compose.animation.core.spring
76
import androidx.compose.animation.fadeOut
@@ -94,6 +93,9 @@ import com.junkfood.seal.util.EXTRACT_AUDIO
9493
import com.junkfood.seal.util.Format
9594
import com.junkfood.seal.util.MERGE_MULTI_AUDIO_STREAM
9695
import com.junkfood.seal.util.PreferenceUtil.getBoolean
96+
import com.junkfood.seal.util.PreferenceUtil.getString
97+
import com.junkfood.seal.util.PreferenceUtil.updateString
98+
import com.junkfood.seal.util.SUBTITLE_LANGUAGE
9799
import com.junkfood.seal.util.SubtitleFormat
98100
import com.junkfood.seal.util.VIDEO_CLIP
99101
import com.junkfood.seal.util.VideoClip
@@ -111,24 +113,63 @@ fun FormatPage(downloadViewModel: DownloadViewModel, onBackPressed: () -> Unit =
111113
if (videoInfo.formats.isNullOrEmpty()) return
112114
val audioOnly = EXTRACT_AUDIO.getBoolean()
113115
val mergeAudioStream = MERGE_MULTI_AUDIO_STREAM.getBoolean()
116+
val subtitleLanguageRegex = SUBTITLE_LANGUAGE.getString()
117+
val initialSelectedSubtitles =
118+
videoInfo.run { subtitles.keys + automaticCaptions.keys }
119+
.filterWithRegex(subtitleLanguageRegex)
120+
121+
var showUpdateSubtitleDialog by remember { mutableStateOf(false) }
122+
123+
var diffSubtitleLanguages by remember { mutableStateOf(emptySet<String>()) }
124+
114125
FormatPageImpl(
115126
videoInfo = videoInfo,
116127
onBackPressed = onBackPressed,
117128
audioOnly = audioOnly,
118129
mergeAudioStream = !audioOnly && mergeAudioStream,
130+
selectedSubtitleCodes = initialSelectedSubtitles,
119131
isClippingAvailable = VIDEO_CLIP.getBoolean() && (videoInfo.duration ?: .0) >= 0
120-
) { formatList, videoClips, splitByChapter, title, subtitleLanguages ->
121-
Log.d(TAG, formatList.toString())
132+
) { formatList, videoClips, splitByChapter, title, selectedSubtitleCodes ->
133+
134+
diffSubtitleLanguages = selectedSubtitleCodes.run {
135+
this - this.filterWithRegex(subtitleLanguageRegex)
136+
}.toSet()
137+
122138
Downloader.downloadVideoWithConfigurations(
123139
videoInfo = videoInfo,
124140
formatList = formatList,
125141
videoClips = videoClips,
126142
splitByChapter = splitByChapter,
127143
newTitle = title,
128-
selectedSubtitleLang = subtitleLanguages,
144+
selectedSubtitleCodes = selectedSubtitleCodes,
145+
)
146+
147+
if (diffSubtitleLanguages.isNotEmpty()) {
148+
showUpdateSubtitleDialog = true
149+
} else {
150+
onBackPressed()
151+
}
152+
}
153+
154+
if (showUpdateSubtitleDialog) {
155+
UpdateSubtitleLanguageDialog(
156+
modifier = Modifier,
157+
languages = diffSubtitleLanguages,
158+
onDismissRequest = {
159+
showUpdateSubtitleDialog = false
160+
onBackPressed()
161+
},
162+
onConfirm = {
163+
SUBTITLE_LANGUAGE.updateString(
164+
(diffSubtitleLanguages + subtitleLanguageRegex).joinToString(
165+
separator = ",",
166+
) { it })
167+
showUpdateSubtitleDialog = false
168+
onBackPressed()
169+
}
129170
)
130-
onBackPressed()
131171
}
172+
132173
}
133174

134175

@@ -137,32 +178,44 @@ private const val NOT_SELECTED = -1
137178
@Preview
138179
@Composable
139180
private fun FormatPagePreview() {
140-
val captionsMap = buildMap {
141-
repeat(4) {
142-
put(
143-
"translated-$it", listOf(
144-
SubtitleFormat(
145-
ext = "ass",
146-
url = "",
147-
name = "Translated"
148-
)
149-
)
181+
val captionsMap = mapOf(
182+
"en-en" to listOf(SubtitleFormat(ext = "", url = "", name = "English from English")),
183+
"ja-en" to listOf(SubtitleFormat(ext = "", url = "", name = "Japanese from English")),
184+
"zh-Hans-en" to listOf(
185+
SubtitleFormat(
186+
ext = "",
187+
url = "",
188+
name = "Chinese (Simplified) from English"
150189
)
151-
}
152-
}
190+
),
191+
"zh-Hant-en" to listOf(
192+
SubtitleFormat(
193+
ext = "",
194+
url = "",
195+
name = "Chinese (Traditional) from English"
196+
)
197+
),
198+
)
153199

154200
val subMap = buildMap {
155-
repeat(3) {
156-
put(
157-
"en$it", listOf(
158-
SubtitleFormat(
159-
ext = "ass",
160-
url = "",
161-
name = "English"
162-
)
201+
put(
202+
"en", listOf(
203+
SubtitleFormat(
204+
ext = "ass",
205+
url = "",
206+
name = "English"
163207
)
164208
)
165-
}
209+
)
210+
put(
211+
"ja", listOf(
212+
SubtitleFormat(
213+
ext = "ass",
214+
url = "",
215+
name = "Japanese"
216+
)
217+
)
218+
)
166219
}
167220
val videoInfo =
168221
VideoInfo(
@@ -201,7 +254,12 @@ private fun FormatPagePreview() {
201254
duration = 100000.0
202255
)
203256
SealTheme {
204-
FormatPageImpl(videoInfo = videoInfo, isClippingAvailable = true, mergeAudioStream = true)
257+
FormatPageImpl(
258+
videoInfo = videoInfo,
259+
isClippingAvailable = true,
260+
mergeAudioStream = true,
261+
selectedSubtitleCodes = setOf("en", "ja-en")
262+
)
205263
}
206264
}
207265

@@ -212,6 +270,7 @@ fun FormatPageImpl(
212270
audioOnly: Boolean = false,
213271
mergeAudioStream: Boolean = false,
214272
isClippingAvailable: Boolean = false,
273+
selectedSubtitleCodes: Set<String>,
215274
onBackPressed: () -> Unit = {},
216275
onDownloadPressed: (List<Format>, List<VideoClip>, Boolean, String, List<String>) -> Unit = { _, _, _, _, _ -> }
217276
) {
@@ -286,7 +345,8 @@ fun FormatPageImpl(
286345
}
287346

288347

289-
val selectedLanguageList = remember { mutableStateListOf<String>() }
348+
val selectedLanguageList =
349+
remember { mutableStateListOf<String>().apply { addAll(selectedSubtitleCodes) } }
290350

291351
Scaffold(modifier = Modifier
292352
.fillMaxSize()
@@ -932,16 +992,31 @@ private fun ClickableTextAction(
932992
}
933993
}
934994

995+
fun <T : Collection<String>> T.filterWithRegex(subtitleLanguageRegex: String): Set<String> {
996+
val regexGroup = subtitleLanguageRegex.split(',')
997+
return filter { language ->
998+
regexGroup.any {
999+
language.contains(Regex(it))
1000+
}
1001+
}.toSet()
1002+
}
9351003

9361004
@OptIn(ExperimentalLayoutApi::class)
9371005
@Composable
9381006
@Preview
939-
fun RememberSubtitleChoiceDialog(
1007+
fun UpdateSubtitleLanguageDialog(
9401008
modifier: Modifier = Modifier,
941-
languages: List<String> = listOf("en", "ja", "zh-Hant", "ar", "zh-Hans")
1009+
languages: Set<String> = setOf("en", "ja"),
1010+
onDismissRequest: () -> Unit = {},
1011+
onConfirm: () -> Unit = {}
9421012
) {
943-
AlertDialog(onDismissRequest = { /*TODO*/ },
944-
title = { Text(text = "Update subtitle languages?", textAlign = TextAlign.Center) },
1013+
AlertDialog(onDismissRequest = onDismissRequest,
1014+
title = {
1015+
Text(
1016+
text = stringResource(R.string.update_subtitle_languages),
1017+
textAlign = TextAlign.Center
1018+
)
1019+
},
9451020
icon = {
9461021
Icon(
9471022
imageVector = Icons.Filled.Subtitles,
@@ -950,14 +1025,15 @@ fun RememberSubtitleChoiceDialog(
9501025
},
9511026
text = {
9521027
Column {
953-
Text(text = "The following languages will be added to your preference for future downloads:")
954-
Spacer(modifier = Modifier.height(16.dp))
1028+
Text(text = stringResource(R.string.update_language_msg))
1029+
1030+
Spacer(modifier = Modifier.height(24.dp))
9551031

9561032
FlowRow(
9571033
horizontalArrangement = Arrangement.spacedBy(20.dp),
9581034
verticalArrangement = Arrangement.spacedBy(12.dp)
9591035
) {
960-
(languages).forEach {
1036+
languages.forEach {
9611037
Row(
9621038
modifier = Modifier,
9631039
verticalAlignment = Alignment.CenterVertically,
@@ -981,15 +1057,16 @@ fun RememberSubtitleChoiceDialog(
9811057
}
9821058
}
9831059
}
1060+
Spacer(modifier = Modifier.height(8.dp))
9841061
}
9851062
},
9861063
confirmButton = {
987-
Button(onClick = {}) {
1064+
Button(onClick = onConfirm) {
9881065
Text(text = stringResource(id = R.string.okay))
9891066
}
9901067
},
9911068
dismissButton = {
992-
OutlinedButton(onClick = { }) {
1069+
OutlinedButton(onClick = onDismissRequest) {
9931070
Text(text = stringResource(id = R.string.no_thanks))
9941071
}
9951072
})

app/src/main/java/com/junkfood/seal/ui/page/settings/format/FormatSettingDialogs.kt

+5-5
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,7 @@ fun SubtitleLanguageDialog(onDismissRequest: () -> Unit) {
689689
val languages = SUBTITLE_LANGUAGE.getString()
690690
SubtitleLanguageDialogImpl(
691691
onDismissRequest = onDismissRequest,
692-
languages = languages,
692+
initialLanguages = languages,
693693
onReset = { with(SUBTITLE_LANGUAGE) { updateString(getStringDefault()) } },
694694
onConfirm = { SUBTITLE_LANGUAGE.updateString(it) },
695695
)
@@ -700,11 +700,11 @@ fun SubtitleLanguageDialog(onDismissRequest: () -> Unit) {
700700
@Preview
701701
private fun SubtitleLanguageDialogImpl(
702702
onDismissRequest: () -> Unit = {},
703-
languages: String = "en.*,.*-orig",
703+
initialLanguages: String = "en.*,.*-orig",
704704
onReset: () -> Unit = {},
705705
onConfirm: (String) -> Unit = {},
706706
) {
707-
var text by remember { mutableStateOf(languages) }
707+
var languages by remember { mutableStateOf(initialLanguages) }
708708
val uriHandler = LocalUriHandler.current
709709
SealDialog(
710710
onDismissRequest = onDismissRequest,
@@ -722,8 +722,8 @@ private fun SubtitleLanguageDialogImpl(
722722
modifier = Modifier
723723
.fillMaxWidth()
724724
.padding(horizontal = 24.dp),
725-
value = text,
726-
onValueChange = { text = it },
725+
value = languages,
726+
onValueChange = { languages = it },
727727
label = {
728728
Text(stringResource(id = R.string.subtitle_language))
729729
},

app/src/main/res/values/strings.xml

+2
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,8 @@
424424
<string name="reset">Reset</string>
425425
<string name="search_in_subtitles">Search in subtitles</string>
426426
<string name="no_thanks">No thanks</string>
427+
<string name="update_language_msg">The following languages will be added to your preference for future downloads:</string>
428+
<string name="update_subtitle_languages">Update subtitle languages?</string>
427429

428430
<plurals name="item_count">
429431
<item quantity="one">%d item</item>

0 commit comments

Comments
 (0)