diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a1cf897e..98b18e4b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -224,6 +224,7 @@ dependencies { // UI utilities implementation(libs.bundles.ui.utilities) + implementation(libs.lottie.compose) // Misc utilities implementation(libs.bundles.misc.utilities) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/MainActivity.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/MainActivity.kt index dfeea3cc..da628f28 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/MainActivity.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/MainActivity.kt @@ -95,8 +95,8 @@ import com.zaneschepke.wireguardautotunnel.ui.screens.settings.dns.DnsSettingsSc import com.zaneschepke.wireguardautotunnel.ui.screens.settings.globals.TunnelGlobalsScreen import com.zaneschepke.wireguardautotunnel.ui.screens.settings.integrations.AndroidIntegrationsScreen import com.zaneschepke.wireguardautotunnel.ui.screens.settings.lockdown.LockdownSettingsScreen +import com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.LogsScreen import com.zaneschepke.wireguardautotunnel.ui.screens.settings.monitoring.MonitoringScreen -import com.zaneschepke.wireguardautotunnel.ui.screens.settings.monitoring.logs.LogsScreen import com.zaneschepke.wireguardautotunnel.ui.screens.settings.security.SecurityScreen import com.zaneschepke.wireguardautotunnel.ui.screens.support.SupportScreen import com.zaneschepke.wireguardautotunnel.ui.screens.support.donate.DonateScreen diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/animations/EmptyStateLottie.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/animations/EmptyStateLottie.kt new file mode 100644 index 00000000..63309000 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/animations/EmptyStateLottie.kt @@ -0,0 +1,49 @@ +package com.zaneschepke.wireguardautotunnel.ui.screens.tunnels.components + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.airbnb.lottie.compose.LottieAnimation +import com.airbnb.lottie.compose.LottieCompositionSpec +import com.airbnb.lottie.compose.LottieConstants +import com.airbnb.lottie.compose.animateLottieCompositionAsState +import com.airbnb.lottie.compose.rememberLottieComposition +import com.zaneschepke.wireguardautotunnel.R + +@Composable +fun EmptyStateLottie( + message: String, + modifier: Modifier = Modifier, + lottieResId: Int = R.raw.nothing_here, +) { + val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(lottieResId)) + val progress by + animateLottieCompositionAsState( + composition = composition, + iterations = LottieConstants.IterateForever, + ) + + Column(horizontalAlignment = Alignment.CenterHorizontally, modifier = modifier) { + LottieAnimation( + composition = composition, + progress = { progress }, + modifier = Modifier.size(240.dp), + ) + + Spacer(modifier = Modifier.height(24.dp)) + + Text( + text = message, + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurface, + ) + } +} diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components/currentBackStackEntryAsNavbarState.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components/currentBackStackEntryAsNavbarState.kt index 72fa929f..273fc115 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components/currentBackStackEntryAsNavbarState.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components/currentBackStackEntryAsNavbarState.kt @@ -367,11 +367,13 @@ fun currentRouteAsNavbarState( stringResource(R.string.add_tunnel), ) } - IconButton(onClick = { navController.push(Sort) }) { - Icon( - Icons.AutoMirrored.Rounded.Sort, - stringResource(R.string.sort), - ) + if (globalState.tunnelNames.size > 1) { + IconButton(onClick = { navController.push(Sort) }) { + Icon( + Icons.AutoMirrored.Rounded.Sort, + stringResource(R.string.sort), + ) + } } } else -> diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/LogsScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/LogsScreen.kt similarity index 82% rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/LogsScreen.kt rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/LogsScreen.kt index 0137585f..25231cda 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/LogsScreen.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/LogsScreen.kt @@ -1,10 +1,7 @@ -package com.zaneschepke.wireguardautotunnel.ui.screens.settings.monitoring.logs +package com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -13,13 +10,12 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontStyle import com.zaneschepke.wireguardautotunnel.R -import com.zaneschepke.wireguardautotunnel.ui.screens.settings.monitoring.logs.components.LogList -import com.zaneschepke.wireguardautotunnel.ui.screens.settings.monitoring.logs.components.LogsBottomSheet +import com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components.LogList +import com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components.LogsBottomSheet +import com.zaneschepke.wireguardautotunnel.ui.screens.tunnels.components.EmptyStateLottie import com.zaneschepke.wireguardautotunnel.ui.sideeffect.LocalSideEffect import com.zaneschepke.wireguardautotunnel.util.StringValue import com.zaneschepke.wireguardautotunnel.viewmodel.LoggerViewModel @@ -36,6 +32,8 @@ fun LogsScreen( ) { val loggerState by viewModel.collectAsState() + if (loggerState.isLoading) return + val lazyColumnListState = rememberLazyListState() var isAutoScrolling by rememberSaveable { mutableStateOf(true) } var lastScrollPosition by rememberSaveable { mutableIntStateOf(0) } @@ -103,14 +101,8 @@ fun LogsScreen( } if (loggerState.messages.isEmpty()) { - return Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { - Text( - text = stringResource(R.string.nothing_here_yet), - fontStyle = FontStyle.Italic, - style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.onSurface, - ) - } + EmptyStateLottie(message = stringResource(R.string.no_tunnels_yet)) + return } LogList( diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogItem.kt new file mode 100644 index 00000000..60f56ee8 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogItem.kt @@ -0,0 +1,100 @@ +package com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +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.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.zaneschepke.logcatter.model.LogMessage +import com.zaneschepke.wireguardautotunnel.ui.common.functions.rememberClipboardHelper +import com.zaneschepke.wireguardautotunnel.ui.common.text.LogTypeLabel +import java.time.Instant +import java.time.ZoneId +import java.time.format.DateTimeFormatter + +private val timeFormatter = + DateTimeFormatter.ofPattern("MM-dd HH:mm:ss.SSS").withZone(ZoneId.systemDefault()) + +@Composable +fun LogItem(log: LogMessage) { + val clipboardManager = rememberClipboardHelper() + + Column( + modifier = + Modifier.fillMaxWidth() + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + onClick = { clipboardManager.copy(log.toString()) }, + ) + .padding(vertical = 6.dp, horizontal = 4.dp) + ) { + // Top row: Time + Level + Tag + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + modifier = Modifier.fillMaxWidth(), + ) { + // Timestamp + Text( + text = formatLogTime(log.time), + fontSize = 10.sp, + fontFamily = FontFamily.Monospace, + color = Color.Gray, + ) + + // Log Level + LogTypeLabel(color = Color(log.level.color())) { + Text( + text = log.level.signifier, + fontSize = 10.sp, + fontFamily = FontFamily.Monospace, + ) + } + + // Tag (truncated if too long) + Text( + text = log.tag, + fontSize = 10.sp, + fontFamily = FontFamily.Monospace, + color = MaterialTheme.colorScheme.primary, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.weight(1f), + ) + } + + // Message - full width + wrapping + Text( + text = log.message, + fontSize = 12.sp, + fontFamily = FontFamily.Monospace, + lineHeight = 16.sp, + maxLines = 4, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.fillMaxWidth().padding(top = 2.dp), + ) + } +} + +private fun formatLogTime(timeString: String): String { + return try { + val instant = Instant.parse(timeString) + timeFormatter.format(instant) + } catch (e: Exception) { + timeString.takeLast(12) + } +} diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogList.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogList.kt similarity index 61% rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogList.kt rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogList.kt index c99452a1..64af1915 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogList.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogList.kt @@ -1,4 +1,4 @@ -package com.zaneschepke.wireguardautotunnel.ui.screens.settings.monitoring.logs.components +package com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.padding @@ -6,7 +6,6 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.zaneschepke.logcatter.model.LogMessage @@ -18,15 +17,10 @@ fun LogList( modifier: Modifier = Modifier, ) { LazyColumn( - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(16.dp, Alignment.Top), state = lazyColumnListState, - modifier = modifier.padding(horizontal = 16.dp), + modifier = modifier.padding(horizontal = 12.dp), + verticalArrangement = Arrangement.spacedBy(2.dp), ) { - itemsIndexed(items = logs, key = { index, _ -> index }, contentType = { _, _ -> null }) { - _, - log -> - LogItem(log = log) - } + itemsIndexed(items = logs, key = { index, _ -> index }) { _, log -> LogItem(log = log) } } } diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogsBottomSheet.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogsBottomSheet.kt similarity index 98% rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogsBottomSheet.kt rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogsBottomSheet.kt index e312f529..2fbe6b3d 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogsBottomSheet.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogsBottomSheet.kt @@ -1,4 +1,4 @@ -package com.zaneschepke.wireguardautotunnel.ui.screens.settings.monitoring.logs.components +package com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components import android.net.Uri import androidx.compose.material.icons.Icons diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogItem.kt deleted file mode 100644 index cf8c6db3..00000000 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogItem.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.zaneschepke.wireguardautotunnel.ui.screens.settings.monitoring.logs.components - -import androidx.compose.foundation.clickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import com.zaneschepke.logcatter.model.LogMessage -import com.zaneschepke.wireguardautotunnel.ui.common.functions.rememberClipboardHelper -import com.zaneschepke.wireguardautotunnel.ui.common.text.LogTypeLabel - -@Composable -fun LogItem(log: LogMessage) { - val clipboardManager = rememberClipboardHelper() - val fontSize = 10.sp - - Row( - horizontalArrangement = Arrangement.spacedBy(5.dp, Alignment.Start), - verticalAlignment = Alignment.Top, - modifier = - Modifier.fillMaxSize() - .clickable( - interactionSource = remember { MutableInteractionSource() }, - indication = null, - onClick = { clipboardManager.copy(log.toString()) }, - ), - ) { - Text(text = log.tag, modifier = Modifier.fillMaxSize(0.3f), fontSize = fontSize) - LogTypeLabel(color = Color(log.level.color())) { - Text(text = log.level.signifier, textAlign = TextAlign.Center, fontSize = fontSize) - } - Text(text = "${log.message} - ${log.time}", fontSize = fontSize) - } -} diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/GettingStartedLabel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/GettingStartedLabel.kt deleted file mode 100644 index cd2dda1d..00000000 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/GettingStartedLabel.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.zaneschepke.wireguardautotunnel.ui.screens.tunnels.components - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -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.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.font.FontStyle -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.withLink -import androidx.compose.ui.unit.dp -import com.zaneschepke.wireguardautotunnel.R - -@Composable -fun GettingStartedLabel(onClick: (url: String) -> Unit, modifier: Modifier = Modifier) { - Column( - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center, - modifier = modifier.padding(top = 100.dp).fillMaxSize(), - ) { - val url = stringResource(id = R.string.docs_url) - val gettingStarted = buildAnnotatedString { - append(stringResource(id = R.string.see_the)) - append(" ") - withLink( - LinkAnnotation.Clickable( - tag = "gettingStarted", - styles = - TextLinkStyles(style = SpanStyle(color = MaterialTheme.colorScheme.primary)), - ) { - onClick(url) - } - ) { - append(stringResource(id = R.string.getting_started_guide)) - } - append(" ") - append(stringResource(R.string.unsure_how)) - append(".") - } - Text(text = stringResource(R.string.no_tunnels), fontStyle = FontStyle.Italic) - Text( - modifier = Modifier.padding(vertical = 10.dp, horizontal = 24.dp), - text = gettingStarted, - style = - MaterialTheme.typography.bodyMedium.copy( - color = MaterialTheme.colorScheme.onSurfaceVariant, - textAlign = TextAlign.Center, - ), - ) - } -} diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/GettingStartedSection.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/GettingStartedSection.kt new file mode 100644 index 00000000..6d9b18ed --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/GettingStartedSection.kt @@ -0,0 +1,74 @@ +package com.zaneschepke.wireguardautotunnel.ui.screens.tunnels.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +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.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.style.TextAlign +import androidx.compose.ui.text.withLink +import androidx.compose.ui.unit.dp +import com.zaneschepke.wireguardautotunnel.R + +@Composable +fun GettingStartedSection(onClick: (url: String) -> Unit, modifier: Modifier = Modifier) { + val url = stringResource(id = R.string.docs_url) + + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = modifier.padding(horizontal = 40.dp).fillMaxSize(), + ) { + // Reusable empty state visual + main message + EmptyStateLottie(message = stringResource(R.string.no_tunnels_yet)) + + Spacer(modifier = Modifier.height(16.dp)) + + // Guidance text with link (specific to this screen) + val fullText = stringResource(R.string.getting_started_guidance) + val linkPhrase = stringResource(R.string.getting_started_guide_link) + + val guidance = buildAnnotatedString { + val startIndex = fullText.indexOf(linkPhrase) + if (startIndex >= 0) { + append(fullText.substring(0, startIndex)) + withLink( + LinkAnnotation.Clickable( + tag = "gettingStarted", + styles = + TextLinkStyles( + style = SpanStyle(color = MaterialTheme.colorScheme.primary) + ), + ) { + onClick(url) + } + ) { + append(linkPhrase) + } + append(fullText.substring(startIndex + linkPhrase.length)) + } else { + append(fullText) + } + } + + Text( + text = guidance, + style = + MaterialTheme.typography.bodyMedium.copy( + color = MaterialTheme.colorScheme.onSurfaceVariant + ), + textAlign = TextAlign.Center, + ) + } +} diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/TunnelList.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/TunnelList.kt index 8bcf0b24..41f6dd39 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/TunnelList.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/TunnelList.kt @@ -74,7 +74,7 @@ fun TunnelList( ) { if (uiState.tunnels.isEmpty()) { item { - GettingStartedLabel( + GettingStartedSection( onClick = { context.openWebUrl(it) }, modifier = Modifier.animateItem(), ) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state/LoggerUiState.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state/LoggerUiState.kt index cb97c2ca..939b35e9 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state/LoggerUiState.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state/LoggerUiState.kt @@ -6,4 +6,5 @@ import com.zaneschepke.wireguardautotunnel.domain.model.MonitoringSettings data class LoggerUiState( val messages: List = emptyList(), val monitoringSettings: MonitoringSettings = MonitoringSettings(), + val isLoading: Boolean = true, ) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/LoggerViewModel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/LoggerViewModel.kt index db8313d4..584c8d01 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/LoggerViewModel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/LoggerViewModel.kt @@ -13,7 +13,9 @@ import com.zaneschepke.wireguardautotunnel.util.FileUtils import com.zaneschepke.wireguardautotunnel.util.StringValue import com.zaneschepke.wireguardautotunnel.util.extensions.toUserFriendlyTimestamp import java.time.Instant +import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.delay import org.orbitmvi.orbit.ContainerHost import org.orbitmvi.orbit.viewmodel.container import timber.log.Timber @@ -38,11 +40,18 @@ class LoggerViewModel( state.messages.toMutableList().apply { if (size >= MAX_LOG_SIZE) removeAt(0) add(logMessage) - } + }, + isLoading = false, ) } } } + intent { + delay(300.milliseconds) + if (state.isLoading) { + reduce { state.copy(isLoading = false) } + } + } } suspend fun postSideEffect(globalSideEffect: GlobalSideEffect) { diff --git a/app/src/main/res/drawable-hdpi/ic_action_name.png b/app/src/main/res/drawable-hdpi/ic_action_name.png deleted file mode 100644 index 06a8f4a4..00000000 Binary files a/app/src/main/res/drawable-hdpi/ic_action_name.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_name.png b/app/src/main/res/drawable-mdpi/ic_action_name.png deleted file mode 100644 index 327485e3..00000000 Binary files a/app/src/main/res/drawable-mdpi/ic_action_name.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_name.png b/app/src/main/res/drawable-xhdpi/ic_action_name.png deleted file mode 100644 index 13173ec9..00000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_name.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_name.png b/app/src/main/res/drawable-xxhdpi/ic_action_name.png deleted file mode 100644 index 448a1b94..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_name.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_name.png b/app/src/main/res/drawable-xxxhdpi/ic_action_name.png deleted file mode 100644 index d898558c..00000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_action_name.png and /dev/null differ diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_channel.xml b/app/src/main/res/mipmap-anydpi-v26/ic_channel.xml deleted file mode 100644 index 35c2c05c..00000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_channel.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png deleted file mode 100644 index be762cac..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_banner_foreground.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_channel.png b/app/src/main/res/mipmap-xhdpi/ic_channel.png deleted file mode 100644 index 264e7095..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_channel.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_channel_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_channel_foreground.png deleted file mode 100644 index 40c3ebe8..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_channel_foreground.png and /dev/null differ diff --git a/app/src/main/res/raw/nothing_here.json b/app/src/main/res/raw/nothing_here.json new file mode 100644 index 00000000..16b2833f --- /dev/null +++ b/app/src/main/res/raw/nothing_here.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.21","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":90.0000036657751,"w":360,"h":360,"nm":"empty file","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[215.204,137.012,0],"ix":2},"a":{"a":0,"k":[14.61,4.12,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[24.287,1.155],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-14.36,-3.871],[14.36,-3.871],[14.36,3.871]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356862745098,0.356862745098,0.356862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[14.61,4.121],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 4 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[251.283,188.617,0],"ix":2},"a":{"a":0,"k":[6.806,6.808,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":42,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":63,"s":[100,100,100]},{"t":84.0000034213901,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-3.621],[3.621,0],[0,3.621],[-3.621,0]],"o":[[0,3.621],[-3.621,0],[0,-3.621],[3.621,0]],"v":[[6.557,-0.001],[-0.001,6.558],[-6.557,-0.001],[-0.001,-6.558]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.439215686275,0.439215686275,0.439215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[6.806,6.808],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[181.361,174.31,0],"ix":2},"a":{"a":0,"k":[12.264,6.842,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.323,0],[0.028,0.004],[-0.045,0.356],[-10.29,0],[-0.016,-0.124],[0.357,-0.045],[0.045,0.356],[9.135,0],[0.059,-0.46]],"o":[[-0.027,0],[-0.357,-0.045],[0.015,-0.124],[10.289,0],[0.045,0.356],[-0.363,0.051],[-0.058,-0.46],[-9.135,0],[-0.042,0.329]],"v":[[-11.321,6.547],[-11.404,6.541],[-11.969,5.814],[0,-6.592],[11.969,5.814],[11.404,6.541],[10.674,5.977],[0,-5.287],[-10.675,5.977]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843137255,0.807843137255,0.807843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.264,6.842],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[198.908,154.694,0],"ix":2},"a":{"a":0,"k":[3.529,3.529,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.811],[1.81,0],[0,1.811],[-1.811,0]],"o":[[0,1.811],[-1.811,0],[0,-1.811],[1.81,0]],"v":[[3.279,-0.001],[0,3.279],[-3.279,-0.001],[0,-3.279]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843137255,0.807843137255,0.807843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.529,3.529],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 7 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[163.751,154.694,0],"ix":2},"a":{"a":0,"k":[3.528,3.529,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.811],[1.81,0],[0,1.811],[-1.811,0]],"o":[[0,1.811],[-1.811,0],[0,-1.811],[1.81,0]],"v":[[3.279,-0.001],[0,3.279],[-3.279,-0.001],[0,-3.279]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843137255,0.807843137255,0.807843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.528,3.529],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 8 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[95.033,253.586,0],"ix":2},"a":{"a":0,"k":[4.971,4.97,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":25,"s":[100,100,100]},{"t":56.0000022809268,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.148,0],[0,-2.149],[-2.149,0],[0,2.149]],"o":[[-2.149,0],[0,2.149],[2.148,0],[0,-2.149]],"v":[[0.001,-3.898],[-3.898,0],[0.001,3.898],[3.898,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[2.603,0],[0,2.603],[-2.604,0],[0,-2.603]],"o":[[-2.604,0],[0,-2.603],[2.603,0],[0,2.603]],"v":[[0.001,4.72],[-4.721,0],[0.001,-4.72],[4.721,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.572507611443,0.572507611443,0.572507611443,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[4.971,4.97],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Layer 9 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[184.161,81.167,0],"ix":2},"a":{"a":0,"k":[3.679,3.679,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":14,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":46,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":63,"s":[0,0,100]},{"t":77.0000031362743,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.561,0],[0,-1.56],[-1.561,0],[0,1.561]],"o":[[-1.561,0],[0,1.561],[1.561,0],[0,-1.56]],"v":[[0,-2.831],[-2.831,0],[0,2.831],[2.831,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.891,0],[0,1.891],[-1.891,0],[0,-1.891]],"o":[[-1.891,0],[0,-1.891],[1.891,0],[0,1.891]],"v":[[0,3.429],[-3.429,0],[0,-3.429],[3.429,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.439215686275,0.439215686275,0.439215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.679,3.679],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Layer 10 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[78.382,206.246,0],"ix":2},"a":{"a":0,"k":[6.132,6.132,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":45,"s":[100,100,100]},{"t":84.0000034213901,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.882,-1.069],[1.068,-1.069],[1.068,-5.882],[-1.068,-5.882],[-1.068,-1.069],[-5.882,-1.069],[-5.882,1.067],[-1.068,1.067],[-1.068,5.882],[1.068,5.882],[1.068,1.067],[5.882,1.067]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843137255,0.807843137255,0.807843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[6.132,6.132],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Layer 11 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[195.63,287.76,0],"ix":2},"a":{"a":0,"k":[7.104,7.104,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[100,100,100]},{"t":56.0000022809268,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.854,-1.245],[1.244,-1.245],[1.244,-6.854],[-1.245,-6.854],[-1.245,-1.245],[-6.854,-1.245],[-6.854,1.243],[-1.245,1.243],[-1.245,6.854],[1.244,6.854],[1.244,1.243],[6.854,1.243]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.922272566253,0.922272566253,0.922272566253,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[7.104,7.103],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Layer 12 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[275.899,128.928,0],"ix":2},"a":{"a":0,"k":[11.851,11.85,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":28,"s":[100,100,100]},{"t":56.0000022809268,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[11.601,-2.107],[2.106,-2.107],[2.106,-11.6],[-2.106,-11.6],[-2.106,-2.107],[-11.601,-2.107],[-11.601,2.107],[-2.106,2.107],[-2.106,11.6],[2.106,11.6],[2.106,2.107],[11.601,2.107]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.922272566253,0.922272566253,0.922272566253,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11.85,11.85],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Layer 13 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[113.989,73.072,0],"ix":2},"a":{"a":0,"k":[7.935,7.935,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[1,1,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":18,"s":[100,100,100]},{"t":35.0000014255792,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.685,-1.395],[1.395,-1.395],[1.395,-7.685],[-1.396,-7.685],[-1.396,-1.395],[-7.685,-1.395],[-7.685,1.396],[-1.396,1.396],[-1.396,7.685],[1.395,7.685],[1.395,1.396],[7.685,1.396]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.922272566253,0.922272566253,0.922272566253,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[7.935,7.935],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Layer 14 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[215.906,100.276,0],"ix":2},"a":{"a":0,"k":[3.529,3.528,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":29,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":73,"s":[100,100,100]},{"t":89.0000036250443,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.811],[1.81,0],[0,1.811],[-1.811,0]],"o":[[0,1.811],[-1.811,0],[0,-1.811],[1.81,0]],"v":[[3.279,0],[0,3.278],[-3.279,0],[0,-3.278]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.922272566253,0.922272566253,0.922272566253,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.529,3.528],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Layer 15 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[88.485,133.141,0],"ix":2},"a":{"a":0,"k":[7.433,7.433,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":38,"s":[100,100,100]},{"t":75.0000030548126,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.271,0],[0,-3.271],[-3.271,0],[0,3.27]],"o":[[-3.271,0],[0,3.27],[3.271,0],[0,-3.271]],"v":[[0,-5.931],[-5.931,0.001],[0,5.931],[5.931,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[3.961,0],[0,3.961],[-3.961,0],[0,-3.961]],"o":[[-3.961,0],[0,-3.961],[3.961,0],[0,3.961]],"v":[[0,7.183],[-7.183,0.001],[0,-7.183],[7.183,0.001]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843137255,0.807843137255,0.807843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[7.433,7.433],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Layer 16 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[212.628,117.617,0],"ix":2},"a":{"a":0,"k":[17.186,15.774,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.726,0],[0,0]],"o":[[0,0],[0,2.727],[0,0],[0,0]],"v":[[-16.936,-15.525],[-16.936,10.587],[-11.999,15.525],[16.936,15.525]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.572507611443,0.572507611443,0.572507611443,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[17.185,15.774],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Layer 17 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[226.093,234.412,0],"ix":2},"a":{"a":0,"k":[47.053,47.052,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-15.434,0],[0,15.433],[15.434,0],[0,-15.434]],"o":[[15.434,0],[0,-15.434],[-15.434,0],[0,15.433]],"v":[[-9.541,18.402],[18.403,-9.542],[-9.541,-37.488],[-37.486,-9.542]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[4.904,-6.309],[0,0],[1.819,-1.818],[1.82,1.819],[0,0],[8.61,0],[0,20.578],[-20.578,0],[0,-20.578]],"o":[[0,0],[1.819,1.819],[-1.819,1.819],[0,0],[-6.31,4.905],[-20.578,0],[0,-20.578],[20.578,0],[0,8.61]],"v":[[19.894,13.305],[44.983,38.396],[44.983,44.983],[38.396,44.983],[13.307,19.892],[-9.541,27.717],[-46.802,-9.542],[-9.541,-46.802],[27.719,-9.542]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.807843137255,0.807843137255,0.807843137255,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.052,47.052],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Layer 18 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[180.115,171.638,0],"ix":2},"a":{"a":0,"k":[49.699,69.796,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.815,0],[0,0],[0,3.815],[0,0],[-3.817,0],[0,0],[-8.561,-4.747],[0,0]],"o":[[0,0],[-3.817,0],[0,0],[0,-3.815],[0,0],[11.221,18.511],[0,0],[0,3.815]],"v":[[42.54,69.546],[-42.539,69.546],[-49.449,62.637],[-49.449,-62.637],[-42.539,-69.546],[15.578,-69.546],[49.449,-38.497],[49.449,62.637]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.439215686275,0.439215686275,0.439215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.699,69.796],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Layer 19 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164.088,187.506,0],"ix":2},"a":{"a":0,"k":[48.475,67.57,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-33.108,-64.841],[-40.419,-64.841],[-40.458,-67.32],[-33.108,-67.32]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-18.411,-64.841],[-25.76,-64.841],[-25.76,-67.32],[-18.411,-67.32]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.712,-64.841],[-11.061,-64.841],[-11.061,-67.32],[-3.712,-67.32]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[10.984,-64.841],[3.635,-64.841],[3.635,-67.32],[10.984,-67.32]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[25.683,-64.841],[18.333,-64.841],[18.333,-67.32],[25.683,-67.32]],"c":true},"ix":2},"nm":"Path 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[40.38,-64.841],[33.031,-64.841],[33.031,-67.32],[40.38,-67.32]],"c":true},"ix":2},"nm":"Path 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.363,0.736],[0,0],[0,-1.211]],"o":[[0,0],[0,0],[0,-0.827],[0,0],[0.534,1.08],[0,0]],"v":[[48.225,-55.175],[45.745,-55.175],[45.745,-59.515],[45.199,-61.87],[47.421,-62.968],[48.225,-59.515]],"c":true},"ix":2},"nm":"Path 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.505,1.058],[0,0],[0,-0.805]],"o":[[0,0],[0,0],[0,-1.178],[0,0],[-0.345,0.72],[0,0]],"v":[[-45.745,-55.095],[-48.223,-55.095],[-48.223,-59.515],[-47.462,-62.883],[-45.225,-61.813],[-45.745,-59.515]],"c":true},"ix":2},"nm":"Path 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":8,"ty":"sh","ix":9,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[48.225,-40.478],[45.746,-40.478],[45.746,-47.827],[48.225,-47.827]],"c":true},"ix":2},"nm":"Path 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":9,"ty":"sh","ix":10,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-45.745,-40.398],[-48.225,-40.398],[-48.225,-47.747],[-45.745,-47.747]],"c":true},"ix":2},"nm":"Path 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":10,"ty":"sh","ix":11,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[48.225,-25.779],[45.746,-25.779],[45.746,-33.128],[48.225,-33.128]],"c":true},"ix":2},"nm":"Path 11","mn":"ADBE Vector Shape - Group","hd":false},{"ind":11,"ty":"sh","ix":12,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-45.745,-25.7],[-48.225,-25.7],[-48.225,-33.049],[-45.745,-33.049]],"c":true},"ix":2},"nm":"Path 12","mn":"ADBE Vector Shape - Group","hd":false},{"ind":12,"ty":"sh","ix":13,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[48.225,-11.082],[45.746,-11.082],[45.746,-18.431],[48.225,-18.431]],"c":true},"ix":2},"nm":"Path 13","mn":"ADBE Vector Shape - Group","hd":false},{"ind":13,"ty":"sh","ix":14,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-45.745,-11.002],[-48.225,-11.002],[-48.225,-18.351],[-45.745,-18.351]],"c":true},"ix":2},"nm":"Path 14","mn":"ADBE Vector Shape - Group","hd":false},{"ind":14,"ty":"sh","ix":15,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[48.225,3.616],[45.746,3.616],[45.746,-3.734],[48.225,-3.734]],"c":true},"ix":2},"nm":"Path 15","mn":"ADBE Vector Shape - Group","hd":false},{"ind":15,"ty":"sh","ix":16,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-45.745,3.695],[-48.225,3.695],[-48.225,-3.654],[-45.745,-3.654]],"c":true},"ix":2},"nm":"Path 16","mn":"ADBE Vector Shape - Group","hd":false},{"ind":16,"ty":"sh","ix":17,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[48.225,18.313],[45.746,18.313],[45.746,10.964],[48.225,10.964]],"c":true},"ix":2},"nm":"Path 17","mn":"ADBE Vector Shape - Group","hd":false},{"ind":17,"ty":"sh","ix":18,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-45.745,18.393],[-48.225,18.393],[-48.225,11.043],[-45.745,11.043]],"c":true},"ix":2},"nm":"Path 18","mn":"ADBE Vector Shape - Group","hd":false},{"ind":18,"ty":"sh","ix":19,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[48.225,33.011],[45.746,33.011],[45.746,25.662],[48.225,25.662]],"c":true},"ix":2},"nm":"Path 19","mn":"ADBE Vector Shape - Group","hd":false},{"ind":19,"ty":"sh","ix":20,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-45.745,33.091],[-48.225,33.091],[-48.225,25.742],[-45.745,25.742]],"c":true},"ix":2},"nm":"Path 20","mn":"ADBE Vector Shape - Group","hd":false},{"ind":20,"ty":"sh","ix":21,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[48.225,47.709],[45.746,47.709],[45.746,40.36],[48.225,40.36]],"c":true},"ix":2},"nm":"Path 21","mn":"ADBE Vector Shape - Group","hd":false},{"ind":21,"ty":"sh","ix":22,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-45.745,47.788],[-48.225,47.788],[-48.225,40.439],[-45.745,40.439]],"c":true},"ix":2},"nm":"Path 22","mn":"ADBE Vector Shape - Group","hd":false},{"ind":22,"ty":"sh","ix":23,"ks":{"a":0,"k":{"i":[[0.494,-1.044],[0,0],[0,0.795],[0,0],[0,0],[0,0]],"o":[[0,0],[0.335,-0.71],[0,0],[0,0],[0,0],[0,1.165]],"v":[[47.48,62.844],[45.241,61.783],[45.745,59.515],[45.745,55.057],[48.225,55.057],[48.225,59.515]],"c":true},"ix":2},"nm":"Path 23","mn":"ADBE Vector Shape - Group","hd":false},{"ind":23,"ty":"sh","ix":24,"ks":{"a":0,"k":{"i":[[0,0],[0.001,1.197],[0,0],[0,0],[0,0],[-0.353,-0.728]],"o":[[-0.52,-1.067],[0,0],[0,0],[0,0],[0.001,0.818],[0,0]],"v":[[-47.439,62.928],[-48.223,59.516],[-48.223,55.138],[-45.745,55.138],[-45.745,59.515],[-45.212,61.844]],"c":true},"ix":2},"nm":"Path 24","mn":"ADBE Vector Shape - Group","hd":false},{"ind":24,"ty":"sh","ix":25,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-33.068,67.32],[-40.417,67.32],[-40.417,64.841],[-33.068,64.841]],"c":true},"ix":2},"nm":"Path 25","mn":"ADBE Vector Shape - Group","hd":false},{"ind":25,"ty":"sh","ix":26,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-18.371,67.32],[-25.72,67.32],[-25.72,64.841],[-18.371,64.841]],"c":true},"ix":2},"nm":"Path 26","mn":"ADBE Vector Shape - Group","hd":false},{"ind":26,"ty":"sh","ix":27,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.673,67.32],[-11.021,67.32],[-11.021,64.841],[-3.673,64.841]],"c":true},"ix":2},"nm":"Path 27","mn":"ADBE Vector Shape - Group","hd":false},{"ind":27,"ty":"sh","ix":28,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[11.025,67.32],[3.676,67.32],[3.676,64.841],[11.025,64.841]],"c":true},"ix":2},"nm":"Path 28","mn":"ADBE Vector Shape - Group","hd":false},{"ind":28,"ty":"sh","ix":29,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[25.723,67.32],[18.373,67.32],[18.373,64.841],[25.723,64.841]],"c":true},"ix":2},"nm":"Path 29","mn":"ADBE Vector Shape - Group","hd":false},{"ind":29,"ty":"sh","ix":30,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[40.495,67.32],[33.072,67.32],[33.072,64.842],[40.42,64.842]],"c":true},"ix":2},"nm":"Path 30","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.439215686275,0.439215686275,0.439215686275,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[48.475,67.57],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":32,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 87ac3a32..2c22aa9f 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -126,7 +126,6 @@ Response packet junk size Start Enable Amnezia compatibility - Nothing here yet! Feature unavailable in %1$s mode. DNS servers Support @@ -158,12 +157,10 @@ Configuration Drag Handle Global DNS servers - if you are unsure how to proceed Display theme Contact Failed. Proxies must have different ports. Notifications - getting started guide Join Matrix community Backup and restore Send me an email @@ -208,7 +205,6 @@ Public key Show scripts Allowed IPs - No tunnels added yet! Monitoring WG Tunnel Control Bridge Rotate keys @@ -245,7 +241,6 @@ Okay Search File is not a .conf or .zip - See the Listen port Unauthorized (Auto) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index c8fd24e1..17b273b6 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -1,6 +1,5 @@ - Žádné tunely ještě nebyly přidány! Tunelovat na mobilních datech Zásady soukromí OK @@ -41,9 +40,6 @@ Junk packet maximální velikost Init packet junk velikost Response packet junk velikost - pokud si nejste jisti, jak postupovat - Podívejte se na - začátečnickou příručku Soubor není ve formátu .conf nebo .zip Tunelovat na ethernetu Tato funkce vyžaduje oprávnění pro přístup k poloze na pozadí pro zapnutí monitorování Wi-Fi SSID, i když je aplikace zavřená. Pro více detailů, podívejte se prosím na zásady soukromí umístěné v kategorii Podpora. @@ -149,7 +145,6 @@ Ovládání tunelů a funkcí automatického tunelování https://hosted.weblate.org/translate/wg-tunnel/strings/en/?checksum=e52d7eb2e28a9a12 Ovládání funkcí tunelu a automatického tunelování. Povolit vzdálené ovládání aplikace - Zatím zde nic není! Export byl úspěšně dokončen Stáhnout Zkontrolovat aktualizaci diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 88ff1a3a..3627a7be 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -128,7 +128,6 @@ Response packet junk size Start Enable Amnezia compatibility - Nothing here yet! Feature unavailable in %1$s mode. DNS servers Support @@ -160,12 +159,10 @@ Configuration Drag Handle Global DNS servers - if you are unsure how to proceed Display theme Contact Failed. Proxies must have different ports. Notifications - getting started guide Join Matrix community Backup and restore Send me an email @@ -210,7 +207,6 @@ Public key Show scripts Allowed IPs - No tunnels added yet! Monitoring Rotate keys Allows Android to start tunnels @@ -246,7 +242,6 @@ Okay Search File is not a .conf or .zip - See the Listen port Unauthorized (Auto) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 497d461a..1361094c 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -2,7 +2,6 @@ WG Tunnel Datei ist keine .conf oder .zip - Noch keine Tunnel hinzugefügt! Tunnel Tunnel für mobile Daten Datenschutzbestimmungen @@ -78,11 +77,8 @@ Junk-Paket minimale Grösse Antwort Junk-Paketgröße Initialpaket magic header - Schnellstartanleitung Transportpaket magic header Unterlastpaket magic header - wirf einen Blick in die - Wenn du nicht sicher bist, wie du weiterverfahren sollst Antwortpaket magic header Beim Hochfahren starten VPN-Systemeinstellungen @@ -163,7 +159,6 @@ DNS-Auflösung fehlgeschlagen Kameraberechtigung erforderlich Löschen - Noch nix hier! Alles auswählen Version: %1$s Export Erfolg diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 11d49521..d6e2fdec 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -21,7 +21,6 @@ Direcciones Clave pública No es un archivo .conf o .zip - ¡Ningún túnel añadido aún! Túneles Activar túnel en datos móviles Política de privacidad @@ -78,14 +77,11 @@ Mostrar propiedades de Amnezia Nunca Encabezado del paquete de transporte - Guía de inicio Se ha denegado el permiso de conexión VPN. Por favor, compruebe el para asegurarse de que la VPN siempre activa esté desactivada para todas las demás aplicaciones e inténtelo de nuevo Encabezado del paquete de respuesta Tamaño máximo de paquetes «ruido» Tamaño de «datos de ruido» añadidos al paquete de inicialización - Si no estás seguro de cómo proceder - Ver la Permiso denegado Configuraciones VPN del sistema Tamaño de «datos ruido» del paquete de respuesta @@ -183,7 +179,6 @@ AMOLED Mostrar QR Hecho - ¡No hay nada aquí de momento! Actual: %1$s %1$s (se necesita root) %1$s (recomendado) diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index bcfc1e85..1bad79c8 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -3,7 +3,6 @@ WG Tunnel See pole .conf või .zip fail See funktsionaalsus eeldab, et rakendusel on õigus asukoha ja WiFi SSID taustal tuvastamiseks, seda ka siis, kui rakendus on suletud. Lisateavet leiad Privaatsusreeglite lehelt, leitav Kasutajatoe vaatest. - Ühtegi tunnelit pole veel lisatud! Tunnelid Loo tunnel mobiilse andmesidega Andmekaitsepõhimõtted @@ -46,7 +45,6 @@ Õigused on vajalikud See rakendus vajab uuenduse paigaldamiseks õigusi. Luba - Siin pole veel midagi! Vali kõik Eksportimine õnnestus Luba rakenduse kaugjuhtimine @@ -132,9 +130,6 @@ Vigane seadistus Pole lubatud Teenus ei tööta - kui ei oska otsustada, mida järgmiseks teha - Vaata - esmaste toimingute juhendit Käivita alglaadimisel Õigusi napib Mitte kunagi diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 03a55b37..72efb9d1 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -3,7 +3,6 @@ پل کنترل تونل وایرگاردکنترل تونل‌ها و قابلیت‌های تونل خودکار. مشاهده سیاست حفظ حریم خصوصی فایل .conf یا .zip نیست. - هنوز تونلی اضافه نشده! تونل‌ها تونل روی داده تلفن همراه باشه @@ -137,7 +136,6 @@ Response packet junk size Start Enable Amnezia compatibility - Nothing here yet! Feature unavailable in %1$s mode. DNS servers Support @@ -168,12 +166,10 @@ Configuration Drag Handle Global DNS servers - if you are unsure how to proceed Display theme Contact Failed. Proxies must have different ports. Notifications - getting started guide Join Matrix community Backup and restore Send me an email @@ -248,7 +244,6 @@ SSID already exists Split tunneling Search - See the Listen port Unauthorized (Auto) diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index eb39f75c..bdae7286 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -11,7 +11,6 @@ DNS-palvelimet WG Tunnel Haluatko varmasti poistaa tämän tunnelin? - Ei tunneleita määriteltynä! Tunnelit Näytä tietosuojakäytäntö Okei @@ -53,9 +52,6 @@ Muokkaa tunnelia Asetukset Tuki - jos et tiedä, miten jatkaa - katso - aloitusopas Ei käyttöoikeutta VPN järjestelmäasetukset VPN-yhteyden käyttöoikeus on evätty. Tarkista @@ -186,7 +182,6 @@ Response packet junk size Start Enable Amnezia compatibility - Nothing here yet! Feature unavailable in %1$s mode. Already donated Ko-fi diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 450299cc..fb2e4e93 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,6 +1,5 @@ - Aucun tunnel n\'a été ajouté pour le moment ! Tunnels Tunnel sur données mobiles Politique de Confidentialité @@ -66,8 +65,6 @@ Taille des paquets indésirables en réponse Initialiser l\'en-tête magique En-tête magique des paquets indésirables de sous-charge - si vous n\'êtes pas sûr de comment procéder - Voir le Redémarrer au démarrage du système paramètres système des VPN Accès au shell root autorisé @@ -89,7 +86,6 @@ Taille maximum des paquets indésirables En-tête magique des paquets indésirables de réponse En-tête magique des paquets indésirables de transport - guide de démarrage rapide Permission Refusée Connexion au VPN interdite. Merci de vérifier les afin de s\'assurer que le VPN permanent est désactivé pour toutes les autres applis puis réessayer @@ -212,7 +208,6 @@ Faire un don Échec de la mise à jour du tunnel actif Commencez - Il n\'y a encore rien ici ! Cette fonctionnalité n\'est pas disponible en mode %1$s. Déjà donné Ko-fi diff --git a/app/src/main/res/values-gsw/strings.xml b/app/src/main/res/values-gsw/strings.xml index 58045e99..933679dd 100644 --- a/app/src/main/res/values-gsw/strings.xml +++ b/app/src/main/res/values-gsw/strings.xml @@ -127,7 +127,6 @@ Response packet junk size Start Enable Amnezia compatibility - Nothing here yet! Feature unavailable in %1$s mode. DNS servers Support @@ -159,13 +158,11 @@ Configuration Drag Handle Global DNS servers - if you are unsure how to proceed Display theme Contact Failed. Proxies must have different ports. Notifications Cookie packet junk size - getting started guide Join Matrix community Backup and restore Send me an email @@ -210,7 +207,6 @@ Public key Show scripts Allowed IPs - No tunnels added yet! Monitoring Control tunnels and auto-tunnel features. Rotate keys @@ -247,7 +243,6 @@ Okay Search File is not a .conf or .zip - See the Listen port Unauthorized (Auto) diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 90249bd6..f5034f21 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -128,7 +128,6 @@ Válaszcsomag szemétmérete Indítás Amnezia kompatibilitás engedélyezése - Még nincs itt semmi! A funkció nem érhető el %1$s módban. DNS szerverek Támogatás @@ -160,12 +159,10 @@ Konfiguráció Húzóka Globális DNS szerverek - ha nem biztos a folytatásban Megjelenítési téma Kapcsolat Sikertelen. A proxyknak különböző portokat kell használniuk. Értesítések - kezdő útmutatót Csatlakozás a Matrix közösséghez Mentés és visszaállítás E-mail küldése nekem @@ -210,7 +207,6 @@ Publikus kulcs Szkriptek megjelenítése Engedélyezett IP-címek - Még nincsenek hozzáadott alagutak! Figyelés WG Tunnel Vezérlő Híd. Kulcsok rotálása @@ -246,7 +242,6 @@ Ok Keresés A fájl nem .conf vagy .zip - Lásd a Figyelt port (Listen port) Nincs jogosultság (Auto) diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 6c5b26b7..fee01db8 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -5,7 +5,6 @@ Ukuran sampah paket init WG Tunnel File bukan berformat .conf atau .zip - Belum ada terowongan yang ditambahkan! Terowongan Terowongan pada data seluler Kebijakan privasi @@ -54,9 +53,6 @@ Header ajaib paket respons Header ajaib paket transport Header ajaib paket underload - jika Anda tidak yakin cara melanjutkan - Lihat - panduan memulai Mulai saat booting Izin Ditolak Pengaturan sistem VPN @@ -172,7 +168,6 @@ Pembaruan terowongan aktif gagal Mulai Aktifkan kompatibilitas Amnezia - Belum ada apa pun di sini! Fitur tidak tersedia dalam mode %1$s. Server DNS Sudah berdonasi diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 1f9a543a..5e362944 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -18,7 +18,6 @@ Invia una email… Leggi la documentazione Inviami una email (in inglese) - Ancora nessun tunnel aggiunto! Peer MTU (casuale) @@ -47,7 +46,6 @@ Permesso localizzazione in background (Auto) Magic header pacchetto sottocarico - se non sei sicuro su come procedere Impostazioni sistema VPN Permessi connessione VPN negati. Verifica la Dimensione massima pacchetti indesiderati @@ -76,8 +74,6 @@ Dimensione pacchetto indesiderato risposta Magic header pacchetto inizializzazione Magic header pacchetto risposta - guida di avvio rapido - Vedi la Avvia all\'avvio Permesso Negato Accesso alla shell root accettata @@ -181,7 +177,6 @@ Controllo degli aggiornamenti fallito. Controllo la disponibilità di aggiornamenti AMOLED - Non c\'è ancora nulla qui! (%1$d–%2$d) Nome tunnel già in uso. La password non può contenere spazi. diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 2dcebec6..6bd076f3 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -30,7 +30,6 @@ 事前共有鍵 このトンネルを削除しますか? はい - VPNトンネルはまだ追加されていません! VPNトンネル プライバシーポリシーを見る この機能は、アプリケーションを閉じている間でもWi-Fi SSIDの監視を可能にするため、バックグラウンドでの位置情報の許可が必要です。 詳しくはサポート画面のプライバシーポリシーをご覧ください。 @@ -44,7 +43,6 @@ エンドポイント ピアの追加 トンネルの削除 - 操作方法がわからない場合 Ethernetでのトンネルの有効化 問題を報告する PINが無効です @@ -60,7 +58,6 @@ アプリロックを有効にする VPN接続の許可が拒否されました。 他のすべてのアプリで常時接続VPNがオフになっていることを確認して、再度お試しください - スタートガイド 通知 ログ クリップボードからの追加 @@ -164,7 +161,6 @@ Response packet junk size Start Enable Amnezia compatibility - Nothing here yet! Feature unavailable in %1$s mode. Support Already donated @@ -260,7 +256,6 @@ Split tunneling Okay Search - See the Listen port Unauthorized (Auto) diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 896e641b..14d80eb5 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -4,7 +4,6 @@ ვგ ტუნელის კონტროლის ხიდი მართე ტუნელის და ავტო-ტუნელის ფუნქციები. ფაილი არ წარმოადგენს .conf ან .zip ფორმატს - ტუნელები ჯერ არ არის დამატებული! ტუნელები ტუნელი მობილური ინტერნეტით კონფიდენციალურობის პოლიტიკა @@ -63,8 +62,6 @@ შეიყვანეთ პინი შექმენით პინი გააქტიურე აპლიკაციის დაბლოკვა - ნახეთ - საწყისი ინსტრუქცია ჩართვისას დაწყება უფლება უარყოფილია Auto-tunnel Channel @@ -215,7 +212,6 @@ Response packet junk size Start Enable Amnezia compatibility - Nothing here yet! Feature unavailable in %1$s mode. Support Already donated @@ -241,7 +237,6 @@ Configuration Drag Handle Global DNS servers - if you are unsure how to proceed Display theme Contact Failed. Proxies must have different ports. diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 82407c9d..1b9f80b2 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -127,7 +127,6 @@ 응답 패킷 정크 크기 시작 Amnezia 호환 켬 - 아직 아무것도 없습니다! %1$s 모드에서는 이용할 수 없습니다. DNS 서버 지원 @@ -159,13 +158,11 @@ 설정 핸들 드래그 글로벌 DNS 서버 - 진행하는 법을 모르겠다면 표시 테마 연락 실패. 프록시는 다른 포트를 이용해야 합니다. 알림 쿠키 패킷 정크 크기 - 시작 도움말 Matrix 커뮤니티 참여 백업 및 복원 이메일 전송하기 @@ -210,7 +207,6 @@ 공개 키 스크립트 표시 허용된 IP - 추가한 터널이 없습니다! 모니터링 터널 및 자동 터널 기능을 제어합니다. 키 순환 @@ -247,7 +243,6 @@ 확인 검색 파일이 .conf 혹은 .zip 형식이 아닙니다 - 참고: 수신 포트 미인증 (자동) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 9ebf7bd5..1a4ef80d 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -128,7 +128,6 @@ Response packet junk size Start Enable Amnezia compatibility - Nothing here yet! Feature unavailable in %1$s mode. DNS servers Support @@ -160,12 +159,10 @@ Configuration Drag Handle Global DNS servers - if you are unsure how to proceed Display theme Contact Failed. Proxies must have different ports. Notifications - getting started guide Join Matrix community Backup and restore Send me an email @@ -210,7 +207,6 @@ Public key Show scripts Allowed IPs - No tunnels added yet! Monitoring WG Tunnel Control Bridge Rotate keys @@ -246,7 +242,6 @@ Okay Search File is not a .conf or .zip - See the Listen port Unauthorized (Auto) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 4213ad17..c3b63192 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -6,7 +6,6 @@ Tunnels Privacybeleid Tunnel bij ethernet - Nog geen tunnels geconfigureerd! Oke Meenemen Adres @@ -78,7 +77,6 @@ Geen bestandsverkenner geïnstalleerd Response packet magic header Underload packet magic header - als je niet weet hoe verder te gaan Start na systeemstart VPN verbindingstoegang geweigerd. Controleer aub de om zeker te zijn dat Altijd-aan VPN is uitgeschakeld voor alle andere apps, en probeer dan opnieuw @@ -86,8 +84,6 @@ Nooit Logboeken Stuur mij een email - Bekijk de - \"aan de slag\" handleiding Toegang geweigerd VPN systeeminstellingen Root toegang verleend @@ -159,7 +155,6 @@ Niet toegelaten Service niet actief Activeer applicatie controle vanop afstand - Nog niets hier! Selecteer alles Export gelukt Download diff --git a/app/src/main/res/values-nod/strings.xml b/app/src/main/res/values-nod/strings.xml index 58045e99..933679dd 100644 --- a/app/src/main/res/values-nod/strings.xml +++ b/app/src/main/res/values-nod/strings.xml @@ -127,7 +127,6 @@ Response packet junk size Start Enable Amnezia compatibility - Nothing here yet! Feature unavailable in %1$s mode. DNS servers Support @@ -159,13 +158,11 @@ Configuration Drag Handle Global DNS servers - if you are unsure how to proceed Display theme Contact Failed. Proxies must have different ports. Notifications Cookie packet junk size - getting started guide Join Matrix community Backup and restore Send me an email @@ -210,7 +207,6 @@ Public key Show scripts Allowed IPs - No tunnels added yet! Monitoring Control tunnels and auto-tunnel features. Rotate keys @@ -247,7 +243,6 @@ Okay Search File is not a .conf or .zip - See the Listen port Unauthorized (Auto) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index ff56d33f..eced5a7f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -2,8 +2,6 @@ Tunele WG Tunnel - jeśli nie masz pewności, jak postępować - przewodnik wprowadzający, Peer Rotuj klucze Tunel przez sieć ethernetową @@ -24,7 +22,6 @@ Nagłówek magicznego pakietu odpowiedzi Nagłówek magicznego pakietu transportowego Nagłówek magicznego pakietu niedociążenia - Zobacz Uruchom przy rozruchu Nigdy Pokaż właściwości protokołu Amnezia @@ -111,7 +108,6 @@ Zatrzymaj autotunel Wyślij wiadomość e-mail… OK - Nie dodano jeszcze żadnych tuneli! Wyklucz Przeczytaj dokumentację Wyślij mi wiadomość e-mail @@ -164,7 +160,6 @@ Dodaj tunel Wybierz Rozwiązywanie DNS się nie powiodło - Jeszcze nic tu nie ma! Wybierz wszystkie Pobierz Wersja: %1$s diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index c015a1e4..6b52f42f 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -22,7 +22,6 @@ Tamanho de pacote-lixo inicial Tamanho de resposta de pacote-lixo WG Tunnel - Nenhum túnel foi adicionado! O ficheiro não é .conf ou .zip Este recurso precisa de permissões de localização em segundo plano para ativar o monitoramento do SSID da rede Wi-Fi mesmo quando a aplicação está fechado. Para mais pormenores, por favor veja a Política de Privacidade no ecrã de Suporte. Ativar atalhos de aplicações @@ -77,9 +76,6 @@ Selecionar como túnel principal Suporte Configurações - se não tiver certeza em como continuar - Veja o - guia de início rápido Permissão negada Configurações do sistema VPN A permissão de conexão VPN foi negada. Por favor, verifique @@ -200,7 +196,6 @@ Donate Active tunnel update failed Start - Nothing here yet! Feature unavailable in %1$s mode. Already donated Ko-fi diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 658b42c7..04c497fe 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -15,7 +15,6 @@ Suporte MTU O ficheiro não é .conf ou .zip - Nenhum túnel foi adicionado! Túnel em dados móveis Ver a Política de Privacidade OK @@ -40,7 +39,6 @@ Quantidade de pacotes-lixo Tamanho mínimo de pacote-lixo Tamanho de resposta de pacote-lixo - se não tiver certeza em como continuar A permissão de conexão VPN foi negada. Por favor, verifique Shell root aceito Mostrar propriedades de Amnezia @@ -84,8 +82,6 @@ segundos Nenhum navegador detetado Abrir um problema - Veja o - guia de início rápido para ter certeza que VPN Sempre-ligada é desligada para todas as outras aplicações e tente novamente Ativar na inicialização Interruptor de desligamento padrão @@ -201,7 +197,6 @@ Donate Active tunnel update failed Start - Nothing here yet! Feature unavailable in %1$s mode. Already donated Ko-fi diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index d31317cc..3b36e43b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -7,7 +7,6 @@ Пир Политика конфиденциальности Добавить из QR-кода - Туннели ещё не добавлены! Исключить Включить Изменения конфигурации сохранены. @@ -29,7 +28,6 @@ S1 S2 H1 - Смотрите Туннелировать через сотовую сеть Туннелировать через Ethernet Отмена @@ -81,8 +79,6 @@ Jmin H2 H4 - руководство по началу работы - , если не уверены, что делать дальше H3 Root-доступ разрешён Разрешение на VPN-соединение было отклонено, проверьте @@ -163,7 +159,6 @@ Экспорт не выполнен Удалённое управление приложением Невозможно скачать конфигурацию - Здесь пока ничего нет! Выбрать все Экспорт успешно выполнен Проверить обновление diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index d4781af4..9bed20fc 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -3,7 +3,6 @@ Tunel WG Ovládanie tunelov a funkcie automatického tunela. Súbor nie je typu .conf ani .zip - Zatiaľ neboli pridané žiadne tunely! Tunely Zobraziť zásady ochrany osobných údajov Dobre @@ -161,7 +160,6 @@ Response packet junk size Start Enable Amnezia compatibility - Nothing here yet! Feature unavailable in %1$s mode. Podpora Already donated @@ -187,12 +185,10 @@ Configuration Drag Handle Global DNS servers - Ak si nieste istý ako pokračovať Motív zobrazenia Contact Failed. Proxies must have different ports. Notifikácie - getting started guide Join Matrix community Backup and restore Proxy settings @@ -257,7 +253,6 @@ Jazyk Split tunneling Search - Pozri Unauthorized (Auto) Add from clipboard diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 87ac3a32..2c22aa9f 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -126,7 +126,6 @@ Response packet junk size Start Enable Amnezia compatibility - Nothing here yet! Feature unavailable in %1$s mode. DNS servers Support @@ -158,12 +157,10 @@ Configuration Drag Handle Global DNS servers - if you are unsure how to proceed Display theme Contact Failed. Proxies must have different ports. Notifications - getting started guide Join Matrix community Backup and restore Send me an email @@ -208,7 +205,6 @@ Public key Show scripts Allowed IPs - No tunnels added yet! Monitoring WG Tunnel Control Bridge Rotate keys @@ -245,7 +241,6 @@ Okay Search File is not a .conf or .zip - See the Listen port Unauthorized (Auto) diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 3deb708e..2284fbea 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -7,7 +7,6 @@ விலக்கு VPN மாநில அறிவிப்புகளுக்கான சேனல் Wg சுரங்கப்பாதை - இன்னும் சுரங்கங்கள் எதுவும் சேர்க்கப்படவில்லை! கோப்பு ஒரு .conf அல்லது .zip அல்ல சுரங்கங்கள் மொபைல் தரவுகளில் சுரங்கப்பாதை @@ -61,9 +60,6 @@ மறுமொழி பாக்கெட் மேசிக் தலைப்பு போக்குவரத்து பாக்கெட் மேசிக் தலைப்பு பாக்கெட் மேசிக் தலைப்பு - எப்படி தொடர வேண்டும் என்று உங்களுக்குத் தெரியாவிட்டால் - பார்க்க - தொடங்குதல் வழிகாட்டி துவக்கத்தில் மறுதொடக்கம் செய்யுங்கள் இசைவு மறுக்கப்பட்டது VPN கணினி அமைப்புகள் @@ -168,7 +164,6 @@ நகலெடு சேமி கேமரா இசைவு தேவை - இன்னும் இங்கே எதுவும் இல்லை! ஏற்றுமதி செய் பதிவிறக்கம் புதுப்பிப்புக்கு சரிபார்க்கவும் diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 9f7278de..733902b9 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -127,7 +127,6 @@ Response packet junk size Start Enable Amnezia compatibility - Nothing here yet! Feature unavailable in %1$s mode. DNS servers Support @@ -159,13 +158,11 @@ Configuration Drag Handle Global DNS servers - if you are unsure how to proceed Display theme Contact Failed. Proxies must have different ports. Notifications Cookie packet junk size - getting started guide Join Matrix community Backup and restore Send me an email @@ -210,7 +207,6 @@ Public key Show scripts Allowed IPs - ยังไม่มีโปรไฟล์ Monitoring ตั้งค่า เชื่อมต่อเองอัตโนมัติ Rotate keys @@ -246,7 +242,6 @@ Okay Search File is not a .conf or .zip - See the Listen port Unauthorized (Auto) diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 98e3876e..453ab5d7 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -7,7 +7,6 @@ https://wgtunnel.com/privacy-policy/ https://wgtunnel.com/docs/auto-tunneling/#use-name-wildcards Dosya .conf veya .zip değil - Henüz tünel eklenmedi! Tüneller Mobil veride tünel Gizlilik politikasını görüntüle @@ -89,9 +88,6 @@ Taşıma paketi sihirli başlığı Düşük yük paketi sihirli başlığı https://t.me/wgtunnel - nasıl devam edeceğinizden emin değilseniz - Bakınız - başlangıç kılavuzu Başlangıçta yeniden başlat İzin Reddedildi VPN sistem ayarları @@ -218,7 +214,6 @@ Donate Active tunnel update failed Start - Nothing here yet! Feature unavailable in %1$s mode. Already donated Ko-fi diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index e5641966..46bb6532 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1,6 +1,5 @@ - Тунелі ще не додані! WG Tunnel Тунелі ОК @@ -20,7 +19,6 @@ Рут-доступ заборонено Невірний PIN-код Заголовок транспортного пакету - інструкція щодо початку роботи Файл не є .conf або .zip файлом Тунелювати мобільні дані Переглянути політику конфіденційності @@ -82,8 +80,6 @@ Заголовок пакету ініціалізації Заголовок пакету під навантаженням Заголовок пакету відповіді - , якщо не впевнені що робити далі - Дивіться Пропустити Довірені мережі Wi-Fi Немає дозволу @@ -207,7 +203,6 @@ Подяка Не вдалося оновити активний тунель Запустити - Тут нічого нема! Ця функція недоступна в режимі %1$s. Ви вже підтримали Ko-fi diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 987d368b..d0576c57 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -11,7 +11,6 @@ عوامی کلید ڈبلیو جی ٹنل فائل conf یا zip نہیں ہے - ابھی تک کوئی ٹنلز شامل نہیں کی گئیں! ٹنلز موبائل ڈیٹا پر ٹنل رازداری کی پالیسی دیکھیں @@ -63,7 +62,6 @@ اِنِٹ پیکٹ جنک سائز اِنِٹ پیکٹ میجک ہیڈر ٹرانسپورٹ پیکٹ میجک ہیڈر - دیکھیں اجازت نامنظور وی پی این سسٹم کی ترتیبات وی پی این کنکشن کی اجازت مسترد کر دی گئی ہے۔ براہ کرم چیک کریں @@ -110,9 +108,7 @@ ایپ ترتیبات لانچ کریں ریاستی تبدیلیوں کی نگرانی پن درج کریں - شروع کرنے کی گائیڈ رسپانس پیکٹ میجک ہیڈر - اگر آپ کو یقین نہیں کہ کیسے آگے بڑھیں وائی فائی کی معلومات حاصل کرنے کے لیے روٹ شیل کا استعمال کریں، مقام کی اجازت کی ضرورت کو روکتے ہوئے رسپانس پیکٹ جنک سائز جنک پیکٹ کا کم از کم سائز @@ -161,7 +157,6 @@ ڈی این ایس ریزولوشن ناکام غیر مجاز سروس نہیں چل رہی - ابھی تک یہاں کچھ نہیں! میٹرکس کمیونٹی میں شامل ہوں لاگز حذف اور صاف کریں سبھی کو منتخب کریں diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 9f4e1bc7..5bbfe678 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1,6 +1,5 @@ - Chưa có đường nối nào! Các đường nối Tệp không phải .conf hay .zip Enter config URL @@ -128,7 +127,6 @@ Response packet junk size Start Enable Amnezia compatibility - Nothing here yet! Feature unavailable in %1$s mode. Máy chủ DNS Support @@ -160,12 +158,10 @@ Configuration Drag Handle Global DNS servers - if you are unsure how to proceed Display theme Contact Failed. Proxies must have different ports. Notifications - getting started guide Join Matrix community Backup and restore Send me an email @@ -245,7 +241,6 @@ Split tunneling Ok Search - See the Listen port Unauthorized (Auto) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 8aa03fea..c303d104 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1,6 +1,5 @@ - 您还没有添加隧道! 隧道列表 隐私政策 允许隧道使用数据流量 @@ -103,9 +102,6 @@ 欠载数据包 magic header 开机时启动 了解更多 - 如果您不确定如何进行 - 请查阅 - 入门指南 取消 打开应用设置 使用名称通配符 @@ -163,7 +159,6 @@ 控制隧道和自动隧道功能. 控制隧道和自动隧道功能。 导出已保存的日志 - 此处还什么都没有! 全选 当前版本:%1$s 导出成功 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index db0535a5..f29d4114 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -46,7 +46,6 @@ 編輯隧道 系統 VPN 設定 支援 - 取得入門指南 設定 開機時啟動 垃圾封包數 @@ -74,12 +73,9 @@ 終端點 未啟用定位服務 垃圾封包最大值 - 還沒有新增任何隧道! 允許的 IP 垃圾封包最小值 未安裝任何檔案管理器 - 如果您不確定如何進行 - 請參閱 本機日誌監視器 給作者寄電子郵件 允許永久連線的 VPN @@ -104,7 +100,6 @@ 新增隧道 需要相機權限 DNS 解析失敗 - 這裡目前還沒有任何東西! 移除 Amnezia 相容性 啟用 Amnezia 相容性 顯示 Amnezia 屬性 diff --git a/app/src/main/res/values/ic_banner_background.xml b/app/src/main/res/values/ic_banner_background.xml index c6f4fe3c..a6b3daec 100644 --- a/app/src/main/res/values/ic_banner_background.xml +++ b/app/src/main/res/values/ic_banner_background.xml @@ -1,4 +1,2 @@ - - #21272A - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/values/ic_channel_background.xml b/app/src/main/res/values/ic_channel_background.xml index fca38bde..a6b3daec 100644 --- a/app/src/main/res/values/ic_channel_background.xml +++ b/app/src/main/res/values/ic_channel_background.xml @@ -1,4 +1,2 @@ - - #21272A - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7e5823a0..502c8c3f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,7 +17,6 @@ https://matrix.to/#/#wg-tunnel-space:matrix.org https://t.me/wgtunnel File is not a .conf or .zip - No tunnels added yet! Tunnels Tunnel on mobile data Privacy policy @@ -98,9 +97,6 @@ Response packet magic header Transport packet magic header Underload packet magic header - if you are unsure how to proceed - See the - getting started guide Start on boot Permission Denied VPN system settings @@ -184,7 +180,6 @@ Unauthorized Service not running Enable remote app control - Nothing here yet! Select all Export success Download @@ -516,4 +511,7 @@ Restore IPv6 Switch back to IPv6 when an IPv6 network is detected. + Nothing here… yet. + Use the + button to import a tunnel, or view the getting started guide. + view the getting started guide diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 933565ad..7ce7558d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,6 +7,7 @@ ipaddress = "5.6.2" koinBom = "4.2.1" kotlinxCoroutinesAndroid = "1.11.0" leakcanaryAndroid = "3.0-alpha-8" +lottieCompose = "6.7.1" orbitCompose = "11.0.0" roomdatabasebackup = "1.1.0" shizuku = "13.1.5" @@ -128,6 +129,7 @@ icmp4a = { module = "com.marsounjan:icmp4a", version.ref = "icmp4a" } ipaddress = { module = "com.github.seancfoley:ipaddress", version.ref = "ipaddress" } kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinxCoroutinesAndroid" } leakcanary-android = { module = "com.squareup.leakcanary:leakcanary-android", version.ref = "leakcanaryAndroid" } +lottie-compose = { module = "com.airbnb.android:lottie-compose", version.ref = "lottieCompose" } material = { group = "com.google.android.material", name = "material", version.ref = "material" } androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activityCompose" } androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } diff --git a/logcatter/src/main/java/com/zaneschepke/logcatter/model/LogMessage.kt b/logcatter/src/main/java/com/zaneschepke/logcatter/model/LogMessage.kt index 7011c56f..5b3ce6c5 100644 --- a/logcatter/src/main/java/com/zaneschepke/logcatter/model/LogMessage.kt +++ b/logcatter/src/main/java/com/zaneschepke/logcatter/model/LogMessage.kt @@ -27,15 +27,21 @@ data class LogMessage( ) } else { val parts = logcatLine.trim().split(" ").filter { it.isNotEmpty() } - val epochParts = parts[0].split(".").map { it.toLong() } - val message = parts.subList(5, parts.size).joinToString(" ") + val timeParts = parts[0].split(".") + + val seconds = timeParts[0].toLong() + val millis = if (timeParts.size > 1) timeParts[1].toLong() else 0L + + // Convert milliseconds to nanoseconds + val nanos = millis * 1_000_000L + LogMessage( - Instant.ofEpochSecond(epochParts[0], epochParts[1]).toString(), + Instant.ofEpochSecond(seconds, nanos).toString(), parts[1], parts[2], LogLevel.fromSignifier(parts[3]), parts[4], - message, + parts.subList(5, parts.size).joinToString(" "), ) } } diff --git a/tunnel/tools/libwg-go/proxy/proxy_jni.c b/tunnel/tools/libwg-go/proxy/proxy_jni.c index f13cff07..df11b04a 100644 --- a/tunnel/tools/libwg-go/proxy/proxy_jni.c +++ b/tunnel/tools/libwg-go/proxy/proxy_jni.c @@ -140,8 +140,6 @@ int bypass_socket(int fd) { jboolean attached = JNI_FALSE; jint rs = -1; - LOGD("bypass_socket called with FD: %d", fd); - if (g_jvm == NULL) { LOGE("g_jvm is NULL"); return 0;