feat: per-mode voice-master hint copy in settings

- Add mode-specific voice hint messages (player vs master mode).
- Update VoiceToggles to show contextual hint based on current mode.
- Improve UX clarity in settings sheet.

Upstream: a60ea08
This commit is contained in:
2026-04-29 16:24:38 +07:00
parent 654972ec1c
commit 29007c3885
2 changed files with 37 additions and 17 deletions
@@ -4,6 +4,7 @@ import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
@@ -11,14 +12,16 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.miti99.loto.R
import com.miti99.loto.settings.SettingsState
/**
* Three voice-announcement toggle rows.
* Voice-announcement toggle rows. Mirrors `SettingsButton.svelte` gating:
*
* The "đọc số khi Chờ" switch is only visible when [state.voiceEnabledPlayer] is on
* (matching web's conditional render at SettingsButton.svelte).
* - Master row visible when mode != PLAYER. Hint copy varies by mode
* (BOTH includes "+ báo Chờ/Kinh", MASTER-only just "Đọc số đã xổ.").
* - Player + waiting-number rows visible when mode != MASTER.
*/
@Composable
internal fun VoiceToggles(
@@ -29,22 +32,37 @@ internal fun VoiceToggles(
modifier: Modifier = Modifier,
) {
Column(modifier = modifier) {
SwitchRow(
label = stringResource(R.string.voice_enabled_master),
checked = state.voiceEnabledMaster,
onCheckedChange = onSetVoiceEnabledMaster,
)
SwitchRow(
label = stringResource(R.string.voice_enabled_player),
checked = state.voiceEnabledPlayer,
onCheckedChange = onSetVoiceEnabledPlayer,
)
AnimatedVisibility(visible = state.voiceEnabledPlayer) {
if (state.mode != SettingsState.Mode.PLAYER) {
SwitchRow(
label = stringResource(R.string.voice_waiting_number),
checked = state.voiceWaitingNumber,
onCheckedChange = onSetVoiceWaitingNumber,
label = stringResource(R.string.voice_enabled_master),
checked = state.voiceEnabledMaster,
onCheckedChange = onSetVoiceEnabledMaster,
)
val hintRes = if (state.mode == SettingsState.Mode.BOTH)
R.string.voice_master_hint_both
else
R.string.voice_master_hint_master_only
Text(
text = stringResource(hintRes),
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(start = 4.dp, top = 2.dp, bottom = 8.dp),
)
}
if (state.mode != SettingsState.Mode.MASTER) {
SwitchRow(
label = stringResource(R.string.voice_enabled_player),
checked = state.voiceEnabledPlayer,
onCheckedChange = onSetVoiceEnabledPlayer,
)
AnimatedVisibility(visible = state.voiceEnabledPlayer) {
SwitchRow(
label = stringResource(R.string.voice_waiting_number),
checked = state.voiceWaitingNumber,
onCheckedChange = onSetVoiceWaitingNumber,
)
}
}
}
}
+2
View File
@@ -62,6 +62,8 @@
<string name="voice_enabled_master">Quản trò: đọc số</string>
<string name="voice_enabled_player">Người chơi: đọc Chờ / Kinh</string>
<string name="voice_waiting_number">Đọc số khi Chờ</string>
<string name="voice_master_hint_both">Đọc số đã xổ + báo Chờ/Kinh.</string>
<string name="voice_master_hint_master_only">Đọc số đã xổ.</string>
<string name="voice_picker_label">Chọn giọng</string>
<string name="settings_empty_cell_color">Màu ô trống</string>
<string name="empty_cell_custom">Tùy chỉnh</string>