mirror of
https://github.com/wgtunnel/android.git
synced 2026-06-02 00:29:08 +02:00
@@ -26,6 +26,7 @@ import androidx.compose.ui.text.LinkAnnotation
|
||||
import androidx.compose.ui.text.SpanStyle
|
||||
import androidx.compose.ui.text.TextLinkStyles
|
||||
import androidx.compose.ui.text.buildAnnotatedString
|
||||
import androidx.compose.ui.text.intl.Locale
|
||||
import androidx.compose.ui.text.style.TextDecoration
|
||||
import androidx.compose.ui.text.withLink
|
||||
import androidx.compose.ui.unit.dp
|
||||
@@ -100,7 +101,6 @@ import com.zaneschepke.wireguardautotunnel.viewmodel.SplitTunnelViewModel
|
||||
import com.zaneschepke.wireguardautotunnel.viewmodel.TunnelViewModel
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import de.raphaelebner.roomdatabasebackup.core.RoomBackup
|
||||
import java.util.*
|
||||
import javax.inject.Inject
|
||||
import kotlinx.coroutines.flow.collectLatest
|
||||
import kotlinx.coroutines.launch
|
||||
@@ -316,7 +316,7 @@ class MainActivity : AppCompatActivity() {
|
||||
if (uiState.settings.appMode == AppMode.LOCK_DOWN) {
|
||||
AppAlertBanner(
|
||||
stringResource(R.string.locked_down)
|
||||
.uppercase(Locale.getDefault()),
|
||||
.uppercase(Locale.current.platformLocale),
|
||||
OffWhite,
|
||||
AlertRed,
|
||||
modifier = Modifier.fillMaxWidth().zIndex(2f),
|
||||
|
||||
+2
-3
@@ -1,11 +1,10 @@
|
||||
package com.zaneschepke.wireguardautotunnel.ui.common.label
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.remember
|
||||
import java.util.*
|
||||
import androidx.compose.ui.text.intl.Locale
|
||||
|
||||
@Composable
|
||||
fun lowercaseLabel(text: String): String {
|
||||
val locale = remember { Locale.getDefault() }
|
||||
val locale = Locale.current.platformLocale
|
||||
return text.lowercase(locale)
|
||||
}
|
||||
|
||||
+5
@@ -12,6 +12,7 @@ import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.text.input.ImeAction
|
||||
import androidx.compose.ui.text.input.KeyboardCapitalization
|
||||
import androidx.compose.ui.text.input.VisualTransformation
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Composable
|
||||
@@ -50,6 +51,8 @@ fun ConfigurationTextBox(
|
||||
label,
|
||||
color = MaterialTheme.colorScheme.onSurface,
|
||||
style = MaterialTheme.typography.labelMedium,
|
||||
overflow = TextOverflow.Ellipsis,
|
||||
maxLines = 1,
|
||||
)
|
||||
},
|
||||
containerColor = MaterialTheme.colorScheme.surface,
|
||||
@@ -58,6 +61,8 @@ fun ConfigurationTextBox(
|
||||
hint,
|
||||
style = MaterialTheme.typography.bodySmall,
|
||||
color = MaterialTheme.colorScheme.outline,
|
||||
overflow = TextOverflow.Ellipsis,
|
||||
maxLines = 1,
|
||||
)
|
||||
},
|
||||
keyboardOptions = keyboardOptions,
|
||||
|
||||
+2
-2
@@ -21,6 +21,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.res.vectorResource
|
||||
import androidx.compose.ui.text.intl.Locale
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
@@ -45,7 +46,6 @@ import com.zaneschepke.wireguardautotunnel.util.extensions.asTitleString
|
||||
import com.zaneschepke.wireguardautotunnel.util.extensions.capitalize
|
||||
import com.zaneschepke.wireguardautotunnel.util.extensions.showToast
|
||||
import com.zaneschepke.wireguardautotunnel.viewmodel.SettingsViewModel
|
||||
import java.util.*
|
||||
|
||||
@Composable
|
||||
fun SettingsScreen(viewModel: SettingsViewModel = hiltViewModel()) {
|
||||
@@ -53,7 +53,7 @@ fun SettingsScreen(viewModel: SettingsViewModel = hiltViewModel()) {
|
||||
val navController = LocalNavController.current
|
||||
val sharedViewModel = LocalSharedVm.current
|
||||
|
||||
val locale = remember { Locale.getDefault() }
|
||||
val locale = Locale.current.platformLocale
|
||||
|
||||
val sharedUiState by sharedViewModel.container.stateFlow.collectAsStateWithLifecycle()
|
||||
val uiState by viewModel.container.stateFlow.collectAsStateWithLifecycle()
|
||||
|
||||
+3
-3
@@ -14,13 +14,13 @@ import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.intl.Locale
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import com.zaneschepke.wireguardautotunnel.R
|
||||
import com.zaneschepke.wireguardautotunnel.ui.LocalSharedVm
|
||||
import com.zaneschepke.wireguardautotunnel.ui.common.button.SurfaceRow
|
||||
import com.zaneschepke.wireguardautotunnel.util.LocaleUtil
|
||||
import java.text.Collator
|
||||
import java.util.*
|
||||
|
||||
@Composable
|
||||
fun LanguageScreen() {
|
||||
@@ -28,11 +28,11 @@ fun LanguageScreen() {
|
||||
val sharedViewModel = LocalSharedVm.current
|
||||
val appState by sharedViewModel.container.stateFlow.collectAsStateWithLifecycle()
|
||||
|
||||
val collator = Collator.getInstance(Locale.getDefault())
|
||||
val collator = Collator.getInstance(Locale.current.platformLocale)
|
||||
val locales =
|
||||
LocaleUtil.supportedLocales.map {
|
||||
val tag = it.replace("_", "-")
|
||||
Locale.forLanguageTag(tag)
|
||||
java.util.Locale.forLanguageTag(tag)
|
||||
}
|
||||
|
||||
val sortedLocales =
|
||||
|
||||
+2
-3
@@ -13,13 +13,13 @@ import androidx.compose.material.icons.outlined.Dns
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.res.vectorResource
|
||||
import androidx.compose.ui.text.intl.Locale
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
@@ -34,7 +34,6 @@ import com.zaneschepke.wireguardautotunnel.ui.common.label.GroupLabel
|
||||
import com.zaneschepke.wireguardautotunnel.ui.navigation.Route
|
||||
import com.zaneschepke.wireguardautotunnel.util.extensions.capitalize
|
||||
import com.zaneschepke.wireguardautotunnel.viewmodel.DnsViewModel
|
||||
import java.util.*
|
||||
|
||||
@Composable
|
||||
fun DnsSettingsScreen(viewModel: DnsViewModel = hiltViewModel()) {
|
||||
@@ -43,7 +42,7 @@ fun DnsSettingsScreen(viewModel: DnsViewModel = hiltViewModel()) {
|
||||
val dnsUiState by viewModel.container.stateFlow.collectAsStateWithLifecycle()
|
||||
|
||||
if (dnsUiState.isLoading) return
|
||||
val locale = remember { Locale.getDefault() }
|
||||
val locale = Locale.current.platformLocale
|
||||
|
||||
Column(
|
||||
horizontalAlignment = Alignment.Start,
|
||||
|
||||
+2
-2
@@ -19,6 +19,7 @@ import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.input.ImeAction
|
||||
import androidx.compose.ui.text.input.PasswordVisualTransformation
|
||||
import androidx.compose.ui.text.input.VisualTransformation
|
||||
import androidx.compose.ui.text.intl.Locale
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
@@ -33,7 +34,6 @@ import com.zaneschepke.wireguardautotunnel.ui.common.security.SecureScreenFromRe
|
||||
import com.zaneschepke.wireguardautotunnel.ui.common.textbox.ConfigurationTextBox
|
||||
import com.zaneschepke.wireguardautotunnel.ui.sideeffect.LocalSideEffect
|
||||
import com.zaneschepke.wireguardautotunnel.viewmodel.ProxySettingsViewModel
|
||||
import java.util.Locale
|
||||
import org.orbitmvi.orbit.compose.collectSideEffect
|
||||
|
||||
@Composable
|
||||
@@ -44,7 +44,7 @@ fun ProxySettingsScreen(viewModel: ProxySettingsViewModel = hiltViewModel()) {
|
||||
|
||||
if (uiState.isLoading) return
|
||||
|
||||
val locale = remember { Locale.getDefault() }
|
||||
val locale = Locale.current.platformLocale
|
||||
|
||||
val proxySettings by remember(uiState) { mutableStateOf(uiState.proxySettings) }
|
||||
|
||||
|
||||
+2
-2
@@ -14,6 +14,7 @@ import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.intl.Locale
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.zaneschepke.wireguardautotunnel.R
|
||||
import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConfig
|
||||
@@ -22,7 +23,6 @@ import com.zaneschepke.wireguardautotunnel.ui.common.label.lowercaseLabel
|
||||
import com.zaneschepke.wireguardautotunnel.util.extensions.abbreviateKey
|
||||
import com.zaneschepke.wireguardautotunnel.util.extensions.localizedDuration
|
||||
import com.zaneschepke.wireguardautotunnel.util.extensions.millisAgo
|
||||
import java.util.Locale
|
||||
import kotlinx.coroutines.delay
|
||||
|
||||
@Composable
|
||||
@@ -35,7 +35,7 @@ fun TunnelStatisticsRow(
|
||||
val context = LocalContext.current
|
||||
val textStyle = MaterialTheme.typography.bodySmall
|
||||
val textColor = MaterialTheme.colorScheme.outline
|
||||
val locale = remember { Locale.getDefault() }
|
||||
val locale = Locale.current.platformLocale
|
||||
|
||||
// needs to be set as peer stats for duplicates return as a single set of stats
|
||||
val peers by
|
||||
|
||||
+2
-2
@@ -11,6 +11,7 @@ import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.intl.Locale
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import com.zaneschepke.wireguardautotunnel.R
|
||||
@@ -25,7 +26,6 @@ import com.zaneschepke.wireguardautotunnel.ui.sideeffect.LocalSideEffect
|
||||
import com.zaneschepke.wireguardautotunnel.ui.state.ConfigProxy
|
||||
import com.zaneschepke.wireguardautotunnel.ui.state.PeerProxy
|
||||
import com.zaneschepke.wireguardautotunnel.viewmodel.ConfigViewModel
|
||||
import java.util.Locale
|
||||
import org.orbitmvi.orbit.compose.collectSideEffect
|
||||
|
||||
@Composable
|
||||
@@ -36,7 +36,7 @@ fun ConfigScreen(viewModel: ConfigViewModel) {
|
||||
|
||||
if (uiState.isLoading) return
|
||||
|
||||
val locale = remember { Locale.getDefault() }
|
||||
val locale = Locale.current.platformLocale
|
||||
|
||||
var configProxy by remember {
|
||||
mutableStateOf(uiState.tunnel?.let { ConfigProxy.from(it.toAmConfig()) } ?: ConfigProxy())
|
||||
|
||||
+119
-23
@@ -17,6 +17,7 @@ import androidx.compose.ui.text.input.ImeAction
|
||||
import androidx.compose.ui.text.input.KeyboardType
|
||||
import androidx.compose.ui.text.input.PasswordVisualTransformation
|
||||
import androidx.compose.ui.text.input.VisualTransformation
|
||||
import androidx.compose.ui.text.intl.Locale
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.wireguard.crypto.KeyPair
|
||||
import com.zaneschepke.wireguardautotunnel.R
|
||||
@@ -24,7 +25,6 @@ import com.zaneschepke.wireguardautotunnel.ui.LocalIsAndroidTV
|
||||
import com.zaneschepke.wireguardautotunnel.ui.common.functions.rememberClipboardHelper
|
||||
import com.zaneschepke.wireguardautotunnel.ui.common.textbox.ConfigurationTextBox
|
||||
import com.zaneschepke.wireguardautotunnel.ui.state.InterfaceProxy
|
||||
import java.util.*
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
@@ -36,12 +36,12 @@ fun InterfaceFields(
|
||||
onInterfaceChange: (InterfaceProxy) -> Unit,
|
||||
showKey: Boolean,
|
||||
) {
|
||||
val locale = Locale.current.platformLocale
|
||||
val keyboardController = LocalSoftwareKeyboardController.current
|
||||
val isTv = LocalIsAndroidTV.current
|
||||
val clipboardManager = rememberClipboardHelper()
|
||||
val keyboardActions = KeyboardActions(onDone = { keyboardController?.hide() })
|
||||
val keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done)
|
||||
val locale = Locale.getDefault()
|
||||
var showPrivateKey by rememberSaveable { mutableStateOf(false) }
|
||||
|
||||
LaunchedEffect(showKey) { showPrivateKey = showKey }
|
||||
@@ -52,7 +52,7 @@ fun InterfaceFields(
|
||||
value = interfaceState.privateKey,
|
||||
hint =
|
||||
stringResource(R.string.hint_template, stringResource(R.string.base64_key))
|
||||
.lowercase(Locale.getDefault()),
|
||||
.lowercase(locale),
|
||||
onValueChange = { onInterfaceChange(interfaceState.copy(privateKey = it)) },
|
||||
label = stringResource(R.string.private_key),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
@@ -107,7 +107,7 @@ fun InterfaceFields(
|
||||
value = interfaceState.publicKey,
|
||||
hint =
|
||||
stringResource(R.string.hint_template, stringResource(R.string.base64_key))
|
||||
.lowercase(Locale.getDefault()),
|
||||
.lowercase(locale),
|
||||
onValueChange = { onInterfaceChange(interfaceState.copy(publicKey = it)) },
|
||||
label = stringResource(R.string.public_key),
|
||||
enabled = false,
|
||||
@@ -115,7 +115,7 @@ fun InterfaceFields(
|
||||
singleLine = true,
|
||||
trailing =
|
||||
if (!isTv) {
|
||||
{ modifier ->
|
||||
{ _ ->
|
||||
IconButton(
|
||||
onClick = { clipboardManager.copy(interfaceState.publicKey) }
|
||||
) {
|
||||
@@ -138,9 +138,9 @@ fun InterfaceFields(
|
||||
hint =
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.comma_separated).lowercase(locale),
|
||||
stringResource(R.string.comma_separated).lowercase(),
|
||||
)
|
||||
.lowercase(Locale.getDefault()),
|
||||
.lowercase(locale),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
)
|
||||
if (!isGlobalConfig)
|
||||
@@ -225,7 +225,13 @@ fun InterfaceFields(
|
||||
ConfigurationTextBox(
|
||||
value = interfaceState.junkPacketCount,
|
||||
onValueChange = { onInterfaceChange(interfaceState.copy(junkPacketCount = it)) },
|
||||
label = stringResource(R.string.junk_packet_count),
|
||||
label =
|
||||
stringResource(R.string.jc) +
|
||||
" " +
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.junk_packet_count).lowercase(locale),
|
||||
),
|
||||
hint = stringResource(R.string.range_hint, 1, 128),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
|
||||
@@ -233,7 +239,13 @@ fun InterfaceFields(
|
||||
ConfigurationTextBox(
|
||||
value = interfaceState.junkPacketMinSize,
|
||||
onValueChange = { onInterfaceChange(interfaceState.copy(junkPacketMinSize = it)) },
|
||||
label = stringResource(R.string.junk_packet_minimum_size),
|
||||
label =
|
||||
stringResource(R.string.jmin) +
|
||||
" " +
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.junk_packet_minimum_size).lowercase(locale),
|
||||
),
|
||||
hint = stringResource(R.string.range_hint, 1, 1279),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
|
||||
@@ -241,7 +253,13 @@ fun InterfaceFields(
|
||||
ConfigurationTextBox(
|
||||
value = interfaceState.junkPacketMaxSize,
|
||||
onValueChange = { onInterfaceChange(interfaceState.copy(junkPacketMaxSize = it)) },
|
||||
label = stringResource(R.string.junk_packet_maximum_size),
|
||||
label =
|
||||
stringResource(R.string.jmax) +
|
||||
" " +
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.junk_packet_maximum_size).lowercase(locale),
|
||||
),
|
||||
hint = stringResource(R.string.range_hint, 2, 1280),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
|
||||
@@ -249,7 +267,13 @@ fun InterfaceFields(
|
||||
ConfigurationTextBox(
|
||||
value = interfaceState.initPacketJunkSize,
|
||||
onValueChange = { onInterfaceChange(interfaceState.copy(initPacketJunkSize = it)) },
|
||||
label = stringResource(R.string.init_packet_junk_size),
|
||||
label =
|
||||
stringResource(R.string.s1) +
|
||||
" " +
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.init_packet_junk_size).lowercase(locale),
|
||||
),
|
||||
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
|
||||
hint = stringResource(R.string.range_hint, 0, 64),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
@@ -259,7 +283,13 @@ fun InterfaceFields(
|
||||
onValueChange = {
|
||||
onInterfaceChange(interfaceState.copy(responsePacketJunkSize = it))
|
||||
},
|
||||
label = stringResource(R.string.response_packet_junk_size),
|
||||
label =
|
||||
stringResource(R.string.s2) +
|
||||
" " +
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.response_packet_junk_size).lowercase(locale),
|
||||
),
|
||||
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
|
||||
hint = stringResource(R.string.range_hint, 0, 64),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
@@ -269,7 +299,13 @@ fun InterfaceFields(
|
||||
onValueChange = {
|
||||
onInterfaceChange(interfaceState.copy(cookiePacketJunkSize = it))
|
||||
},
|
||||
label = stringResource(R.string.cookie_packet_junk_size),
|
||||
label =
|
||||
stringResource(R.string.s3) +
|
||||
" " +
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.cookie_packet_junk_size).lowercase(locale),
|
||||
),
|
||||
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
|
||||
hint = stringResource(R.string.range_hint, 0, 928),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
@@ -279,7 +315,13 @@ fun InterfaceFields(
|
||||
onValueChange = {
|
||||
onInterfaceChange(interfaceState.copy(transportPacketJunkSize = it))
|
||||
},
|
||||
label = stringResource(R.string.transport_packet_junk_size),
|
||||
label =
|
||||
stringResource(R.string.s4) +
|
||||
" " +
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.transport_packet_junk_size).lowercase(locale),
|
||||
),
|
||||
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
|
||||
hint = stringResource(R.string.range_hint, 0, 928),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
@@ -289,7 +331,13 @@ fun InterfaceFields(
|
||||
onValueChange = {
|
||||
onInterfaceChange(interfaceState.copy(initPacketMagicHeader = it))
|
||||
},
|
||||
label = stringResource(R.string.init_packet_magic_header),
|
||||
label =
|
||||
stringResource(R.string.h1) +
|
||||
" " +
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.init_packet_magic_header).lowercase(locale),
|
||||
),
|
||||
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
|
||||
hint = stringResource(R.string.range_hint, 1, 4),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
@@ -299,7 +347,13 @@ fun InterfaceFields(
|
||||
onValueChange = {
|
||||
onInterfaceChange(interfaceState.copy(responsePacketMagicHeader = it))
|
||||
},
|
||||
label = stringResource(R.string.response_packet_magic_header),
|
||||
label =
|
||||
stringResource(R.string.h2) +
|
||||
" " +
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.response_packet_magic_header).lowercase(locale),
|
||||
),
|
||||
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
|
||||
hint = stringResource(R.string.range_hint, 1, 4),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
@@ -309,7 +363,13 @@ fun InterfaceFields(
|
||||
onValueChange = {
|
||||
onInterfaceChange(interfaceState.copy(underloadPacketMagicHeader = it))
|
||||
},
|
||||
label = stringResource(R.string.underload_packet_magic_header),
|
||||
label =
|
||||
stringResource(R.string.h3) +
|
||||
" " +
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.underload_packet_magic_header).lowercase(locale),
|
||||
),
|
||||
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
|
||||
hint = stringResource(R.string.range_hint, 1, 4),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
@@ -319,7 +379,13 @@ fun InterfaceFields(
|
||||
onValueChange = {
|
||||
onInterfaceChange(interfaceState.copy(transportPacketMagicHeader = it))
|
||||
},
|
||||
label = stringResource(R.string.transport_packet_magic_header),
|
||||
label =
|
||||
stringResource(R.string.h4) +
|
||||
" " +
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.transport_packet_magic_header).lowercase(locale),
|
||||
),
|
||||
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
|
||||
hint = stringResource(R.string.range_hint, 1, 4),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
@@ -327,35 +393,65 @@ fun InterfaceFields(
|
||||
ConfigurationTextBox(
|
||||
value = interfaceState.i1,
|
||||
onValueChange = { onInterfaceChange(interfaceState.copy(i1 = it)) },
|
||||
label = "I1",
|
||||
label =
|
||||
stringResource(R.string.i1) +
|
||||
" " +
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.special_junk_packet).lowercase(locale),
|
||||
),
|
||||
hint = stringResource(R.string.hint_template, "<b 0x1A2B3C>"),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
)
|
||||
ConfigurationTextBox(
|
||||
value = interfaceState.i2,
|
||||
onValueChange = { onInterfaceChange(interfaceState.copy(i2 = it)) },
|
||||
label = "I2",
|
||||
label =
|
||||
stringResource(R.string.i2) +
|
||||
" " +
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.special_junk_packet).lowercase(locale),
|
||||
),
|
||||
hint = stringResource(R.string.hint_template, "<b 0x1A2B3C>"),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
)
|
||||
ConfigurationTextBox(
|
||||
value = interfaceState.i3,
|
||||
onValueChange = { onInterfaceChange(interfaceState.copy(i3 = it)) },
|
||||
label = "I3",
|
||||
label =
|
||||
stringResource(R.string.i3) +
|
||||
" " +
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.special_junk_packet).lowercase(locale),
|
||||
),
|
||||
hint = stringResource(R.string.hint_template, "<b 0x1A2B3C>"),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
)
|
||||
ConfigurationTextBox(
|
||||
value = interfaceState.i4,
|
||||
onValueChange = { onInterfaceChange(interfaceState.copy(i4 = it)) },
|
||||
label = "I4",
|
||||
label =
|
||||
stringResource(R.string.i4) +
|
||||
" " +
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.special_junk_packet).lowercase(locale),
|
||||
),
|
||||
hint = stringResource(R.string.hint_template, "<b 0x1A2B3C>"),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
)
|
||||
ConfigurationTextBox(
|
||||
value = interfaceState.i5,
|
||||
onValueChange = { onInterfaceChange(interfaceState.copy(i5 = it)) },
|
||||
label = "I5",
|
||||
label =
|
||||
stringResource(R.string.i5) +
|
||||
" " +
|
||||
stringResource(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.special_junk_packet).lowercase(locale),
|
||||
),
|
||||
hint = stringResource(R.string.hint_template, "<b 0x1A2B3C>"),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
)
|
||||
|
||||
+2
-2
@@ -13,6 +13,7 @@ import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.intl.Locale
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.wireguard.crypto.KeyPair
|
||||
import com.zaneschepke.wireguardautotunnel.R
|
||||
@@ -22,7 +23,6 @@ import com.zaneschepke.wireguardautotunnel.ui.common.text.DescriptionText
|
||||
import com.zaneschepke.wireguardautotunnel.ui.common.textbox.ConfigurationTextBox
|
||||
import com.zaneschepke.wireguardautotunnel.ui.state.ConfigProxy
|
||||
import com.zaneschepke.wireguardautotunnel.ui.state.InterfaceProxy
|
||||
import java.util.*
|
||||
|
||||
@Composable
|
||||
fun InterfaceSection(
|
||||
@@ -147,7 +147,7 @@ fun InterfaceSection(
|
||||
R.string.hint_template,
|
||||
stringResource(R.string.tunnel_name),
|
||||
)
|
||||
.lowercase(Locale.getDefault()),
|
||||
.lowercase(locale = Locale.current.platformLocale),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
)
|
||||
InterfaceFields(
|
||||
|
||||
+6
-5
@@ -20,16 +20,17 @@ import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.input.ImeAction
|
||||
import androidx.compose.ui.text.input.PasswordVisualTransformation
|
||||
import androidx.compose.ui.text.input.VisualTransformation
|
||||
import androidx.compose.ui.text.intl.Locale
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.zaneschepke.wireguardautotunnel.R
|
||||
import com.zaneschepke.wireguardautotunnel.ui.LocalIsAndroidTV
|
||||
import com.zaneschepke.wireguardautotunnel.ui.common.textbox.ConfigurationTextBox
|
||||
import com.zaneschepke.wireguardautotunnel.ui.state.PeerProxy
|
||||
import java.util.*
|
||||
|
||||
@Composable
|
||||
fun PeerFields(peer: PeerProxy, onPeerChange: (PeerProxy) -> Unit, showKey: Boolean) {
|
||||
val isTv = LocalIsAndroidTV.current
|
||||
val locale = Locale.current.platformLocale
|
||||
val keyboardController = LocalSoftwareKeyboardController.current
|
||||
val keyboardActions = KeyboardActions(onDone = { keyboardController?.hide() })
|
||||
val keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done)
|
||||
@@ -47,7 +48,7 @@ fun PeerFields(peer: PeerProxy, onPeerChange: (PeerProxy) -> Unit, showKey: Bool
|
||||
label = stringResource(R.string.public_key),
|
||||
hint =
|
||||
stringResource(R.string.hint_template, stringResource(R.string.base64_key))
|
||||
.lowercase(Locale.getDefault()),
|
||||
.lowercase(locale),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
)
|
||||
ConfigurationTextBox(
|
||||
@@ -81,7 +82,7 @@ fun PeerFields(peer: PeerProxy, onPeerChange: (PeerProxy) -> Unit, showKey: Bool
|
||||
hint = stringResource(R.string.optional),
|
||||
trailing = {
|
||||
Text(
|
||||
stringResource(R.string.seconds).lowercase(Locale.getDefault()),
|
||||
stringResource(R.string.seconds).lowercase(locale),
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
modifier = Modifier.padding(end = 10.dp),
|
||||
)
|
||||
@@ -96,7 +97,7 @@ fun PeerFields(peer: PeerProxy, onPeerChange: (PeerProxy) -> Unit, showKey: Bool
|
||||
label = stringResource(R.string.endpoint),
|
||||
hint =
|
||||
stringResource(R.string.hint_template, stringResource(R.string.server_port))
|
||||
.lowercase(Locale.getDefault()),
|
||||
.lowercase(locale),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
)
|
||||
ConfigurationTextBox(
|
||||
@@ -105,7 +106,7 @@ fun PeerFields(peer: PeerProxy, onPeerChange: (PeerProxy) -> Unit, showKey: Bool
|
||||
label = stringResource(R.string.allowed_ips),
|
||||
hint =
|
||||
stringResource(R.string.hint_template, stringResource(R.string.comma_separated))
|
||||
.lowercase(Locale.getDefault()),
|
||||
.lowercase(locale),
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
keyboardOptions = keyboardOptions,
|
||||
keyboardActions = keyboardActions,
|
||||
|
||||
+2
-2
@@ -16,12 +16,12 @@ import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.input.ImeAction
|
||||
import androidx.compose.ui.text.input.KeyboardCapitalization
|
||||
import androidx.compose.ui.text.intl.Locale
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.zaneschepke.wireguardautotunnel.R
|
||||
import com.zaneschepke.wireguardautotunnel.domain.model.InstalledPackage
|
||||
import com.zaneschepke.wireguardautotunnel.ui.common.textbox.CustomTextField
|
||||
import com.zaneschepke.wireguardautotunnel.ui.screens.tunnels.splittunnel.state.SplitOption
|
||||
import java.util.*
|
||||
|
||||
@Composable
|
||||
fun AppListSection(
|
||||
@@ -31,7 +31,7 @@ fun AppListSection(
|
||||
) {
|
||||
|
||||
var query by remember { mutableStateOf("") }
|
||||
val locale = remember { Locale.getDefault() }
|
||||
val locale = Locale.current.platformLocale
|
||||
|
||||
val filteredAndSortedPackages by remember {
|
||||
derivedStateOf {
|
||||
|
||||
+3
-2
@@ -13,14 +13,15 @@ import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.intl.Locale
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.zaneschepke.wireguardautotunnel.R
|
||||
import com.zaneschepke.wireguardautotunnel.ui.screens.tunnels.splittunnel.state.SplitOption
|
||||
import java.util.*
|
||||
|
||||
@Composable
|
||||
fun SplitOptionSelector(selectedOption: SplitOption, onOptionChange: (SplitOption) -> Unit) {
|
||||
val context = LocalContext.current
|
||||
val locale = Locale.current.platformLocale
|
||||
val inputHeight = 45.dp
|
||||
|
||||
MultiChoiceSegmentedButtonRow(
|
||||
@@ -69,7 +70,7 @@ fun SplitOptionSelector(selectedOption: SplitOption, onOptionChange: (SplitOptio
|
||||
) {
|
||||
Text(
|
||||
entry.text().asString(context).replaceFirstChar {
|
||||
if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString()
|
||||
if (it.isLowerCase()) it.titlecase(locale) else it.toString()
|
||||
},
|
||||
color = MaterialTheme.colorScheme.onBackground,
|
||||
style = MaterialTheme.typography.labelMedium,
|
||||
|
||||
+1
-1
@@ -309,7 +309,7 @@ fun PackageManager.getFriendlyAppName(packageName: String, appInfo: ApplicationI
|
||||
val label =
|
||||
try {
|
||||
getApplicationLabel(appInfo).toString()
|
||||
} catch (e: PackageManager.NameNotFoundException) {
|
||||
} catch (_: PackageManager.NameNotFoundException) {
|
||||
packageName
|
||||
}
|
||||
|
||||
|
||||
@@ -438,4 +438,21 @@
|
||||
<string name="donation_prompt_suffix">to keep it free and improving.</string>
|
||||
<string name="cookie_packet_junk_size">Cookie packet junk size</string>
|
||||
<string name="transport_packet_junk_size">Transport packet junk size</string>
|
||||
<string name="special_junk_packet">Special junk packet</string>
|
||||
<string name="jc" translatable="false">Jc</string>
|
||||
<string name="jmin" translatable="false">Jmin</string>
|
||||
<string name="jmax" translatable="false">Jmax</string>
|
||||
<string name="s1" translatable="false">S1</string>
|
||||
<string name="s2" translatable="false">S2</string>
|
||||
<string name="s3" translatable="false">S3</string>
|
||||
<string name="s4" translatable="false">S4</string>
|
||||
<string name="h1" translatable="false">H1</string>
|
||||
<string name="h2" translatable="false">H2</string>
|
||||
<string name="h3" translatable="false">H3</string>
|
||||
<string name="h4" translatable="false">H4</string>
|
||||
<string name="i1" translatable="false">I1</string>
|
||||
<string name="i2" translatable="false">I2</string>
|
||||
<string name="i3" translatable="false">I3</string>
|
||||
<string name="i4" translatable="false">I4</string>
|
||||
<string name="i5" translatable="false">I5</string>
|
||||
</resources>
|
||||
|
||||
Reference in New Issue
Block a user