From a6e559ececd1fdb5e36585594a349a878546e8ee Mon Sep 17 00:00:00 2001 From: Zane Schepke Date: Fri, 11 Apr 2025 21:06:47 -0400 Subject: [PATCH] fix: logger toggle bug closes #669 --- .../wireguardautotunnel/MainActivity.kt | 2 +- .../data/DataStoreManager.kt | 1 - .../data/model/GeneralState.kt | 2 +- .../{support => settings}/logs/LogsScreen.kt | 27 ++++++++++++-- .../logs/components/LogItem.kt | 2 +- .../logs/components/LogList.kt | 2 +- .../logs/components/LogsBottomSheet.kt | 2 +- .../wireguardautotunnel/util/Constants.kt | 1 + .../viewmodel/AppViewModel.kt | 37 +++++++++++-------- app/src/main/res/values/strings.xml | 1 + .../zaneschepke/logcatter/LogcatManager.kt | 1 + 11 files changed, 53 insertions(+), 25 deletions(-) rename app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/{support => settings}/logs/LogsScreen.kt (70%) rename app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/{support => settings}/logs/components/LogItem.kt (95%) rename app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/{support => settings}/logs/components/LogList.kt (92%) rename app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/{support => settings}/logs/components/LogsBottomSheet.kt (96%) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/MainActivity.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/MainActivity.kt index 4ca51737..c1bbb06a 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/MainActivity.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/MainActivity.kt @@ -84,8 +84,8 @@ import com.zaneschepke.wireguardautotunnel.ui.screens.settings.appearance.displa import com.zaneschepke.wireguardautotunnel.ui.screens.settings.appearance.language.LanguageScreen import com.zaneschepke.wireguardautotunnel.ui.screens.settings.disclosure.LocationDisclosureScreen import com.zaneschepke.wireguardautotunnel.ui.screens.settings.killswitch.KillSwitchScreen +import com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.LogsScreen import com.zaneschepke.wireguardautotunnel.ui.screens.support.SupportScreen -import com.zaneschepke.wireguardautotunnel.ui.screens.support.logs.LogsScreen import com.zaneschepke.wireguardautotunnel.ui.theme.WireguardAutoTunnelTheme import com.zaneschepke.wireguardautotunnel.util.extensions.goFromRoot import com.zaneschepke.wireguardautotunnel.viewmodel.AppViewModel diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/DataStoreManager.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/DataStoreManager.kt index fcf166f1..3b423700 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/DataStoreManager.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/DataStoreManager.kt @@ -24,7 +24,6 @@ class DataStoreManager( companion object { val locationDisclosureShown = booleanPreferencesKey("LOCATION_DISCLOSURE_SHOWN") val batteryDisableShown = booleanPreferencesKey("BATTERY_OPTIMIZE_DISABLE_SHOWN") - val currentSSID = stringPreferencesKey("CURRENT_SSID") val pinLockEnabled = booleanPreferencesKey("PIN_LOCK_ENABLED") val tunnelStatsExpanded = booleanPreferencesKey("TUNNEL_STATS_EXPANDED") val isLocalLogsEnabled = booleanPreferencesKey("LOCAL_LOGS_ENABLED") diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/GeneralState.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/GeneralState.kt index 7e4dd897..70dd34ba 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/GeneralState.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/GeneralState.kt @@ -21,7 +21,7 @@ data class GeneralState( isBatteryOptimizationDisableShown, isPinLockEnabled, isTunnelStatsExpanded, - isLocationDisclosureShown, + isLocalLogsEnabled, isRemoteControlEnabled, remoteKey, locale, diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/logs/LogsScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/LogsScreen.kt similarity index 70% rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/logs/LogsScreen.kt rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/LogsScreen.kt index 943f526b..de9f0413 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/logs/LogsScreen.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/LogsScreen.kt @@ -1,8 +1,11 @@ -package com.zaneschepke.wireguardautotunnel.ui.screens.support.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.layout.padding 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 @@ -11,11 +14,15 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember 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 androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.zaneschepke.wireguardautotunnel.ui.screens.support.logs.components.LogList -import com.zaneschepke.wireguardautotunnel.ui.screens.support.logs.components.LogsBottomSheet +import com.zaneschepke.wireguardautotunnel.R +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.state.AppViewState import com.zaneschepke.wireguardautotunnel.viewmodel.AppViewModel @@ -62,6 +69,20 @@ fun LogsScreen(appViewState: AppViewState, viewModel: AppViewModel) { LogsBottomSheet(viewModel) } + if (logs.isEmpty()) { + return Box( + modifier = Modifier.fillMaxSize().padding(horizontal = 24.dp), + contentAlignment = Alignment.Center, + ) { + Text( + text = stringResource(R.string.nothing_here_yet), + fontStyle = FontStyle.Italic, + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurface, + ) + } + } + LogList( logs = logs, lazyColumnListState = lazyColumnListState, diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/logs/components/LogItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogItem.kt similarity index 95% rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/logs/components/LogItem.kt rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogItem.kt index 5eb8769f..5c12ca0f 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/logs/components/LogItem.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogItem.kt @@ -1,4 +1,4 @@ -package com.zaneschepke.wireguardautotunnel.ui.screens.support.logs.components +package com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/logs/components/LogList.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogList.kt similarity index 92% rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/logs/components/LogList.kt rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogList.kt index 19b48611..317eb993 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/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.support.logs.components +package com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.lazy.LazyColumn diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/logs/components/LogsBottomSheet.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogsBottomSheet.kt similarity index 96% rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/logs/components/LogsBottomSheet.kt rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogsBottomSheet.kt index 1da21719..662dd42e 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/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.support.logs.components +package com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Row diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/Constants.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/Constants.kt index 38438dea..be46dce8 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/Constants.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/Constants.kt @@ -2,6 +2,7 @@ package com.zaneschepke.wireguardautotunnel.util object Constants { + const val MAX_LOG_SIZE = 10_000L const val BASE_PACKAGE = "com.zaneschepke.wireguardautotunnel" const val BASE_LOG_FILE_NAME = "wg_tunnel_logs" diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/AppViewModel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/AppViewModel.kt index 950522cb..d8295934 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/AppViewModel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/AppViewModel.kt @@ -36,13 +36,10 @@ import java.time.Instant import java.util.* import javax.inject.Inject import javax.inject.Provider -import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.* import kotlinx.coroutines.flow.* -import kotlinx.coroutines.launch -import kotlinx.coroutines.plus import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock -import kotlinx.coroutines.withContext import org.amnezia.awg.config.BadConfigException import org.amnezia.awg.config.Config import timber.log.Timber @@ -64,9 +61,12 @@ constructor( networkMonitor: NetworkMonitor, ) : ViewModel() { + private var logsJob: Job? = null + private val tunnelMutex = Mutex() private val settingsMutex = Mutex() private val tunControlMutex = Mutex() + private val loggerMutex = Mutex() private val _screenCallback = MutableStateFlow<(() -> Unit)?>(null) @@ -75,7 +75,7 @@ constructor( private val _logs = MutableStateFlow>(emptyList()) val logs: StateFlow> = _logs.asStateFlow() - private val maxLogSize = 10_000 + private val maxLogSize = Constants.MAX_LOG_SIZE val uiState = combine( @@ -88,7 +88,7 @@ constructor( ) { array -> val settings = array[0] as AppSettings val tunnels = array[1] as List - val generalState = array[2] as AppState + val appState = array[2] as AppState val activeTunnels = array[3] as Map val autoTunnel = array[4] as Boolean val network = array[5] as NetworkStatus @@ -97,7 +97,7 @@ constructor( appSettings = settings, tunnels = tunnels, activeTunnels = activeTunnels, - appState = generalState, + appState = appState, isAutoTunnelActive = autoTunnel, isAppLoaded = true, networkStatus = network, @@ -115,7 +115,7 @@ constructor( initPin(state.appState.isPinLockEnabled) handleKillSwitchChange(state.appSettings) initServicesFromSavedState(state) - if (state.appState.isLocalLogsEnabled) startCollectingLogs() + if (state.appState.isLocalLogsEnabled) logsJob = startCollectingLogs() } } } @@ -213,7 +213,7 @@ constructor( appDataRepository.appState.setIsRemoteControlEnabled(enabled) } - private fun startCollectingLogs() { + private fun startCollectingLogs() = viewModelScope.launch { logReader.bufferedLogs.flowOn(ioDispatcher).collect { logMessage -> _logs.update { currentList -> @@ -226,7 +226,6 @@ constructor( } } } - } private suspend fun handleAppReadyCheck(tunnels: List) { if (tunnels.size == appDataRepository.tunnels.count()) { @@ -244,14 +243,16 @@ constructor( saveTunnel(tunnel.copy(isPingEnabled = !tunnel.isPingEnabled)) private suspend fun handleToggleLocalLogging(currentlyEnabled: Boolean) { - val enable = !currentlyEnabled - appDataRepository.appState.setLocalLogsEnabled(enable) - withContext(mainDispatcher) { + loggerMutex.withLock { + val enable = !currentlyEnabled + appDataRepository.appState.setLocalLogsEnabled(enable) if (enable) { + logsJob?.cancel() logReader.start() - startCollectingLogs() + logsJob = startCollectingLogs() } else { logReader.stop() + logsJob?.cancel() _logs.update { emptyList() } } } @@ -677,9 +678,13 @@ constructor( } private suspend fun handleDeleteLogs() { - withContext(mainDispatcher) { - logReader.deleteAndClearLogs() + loggerMutex.withLock { + logsJob?.cancel() _logs.update { emptyList() } + logReader.stop() + logReader.deleteAndClearLogs() + logReader.start() + logsJob = startCollectingLogs() } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 734b7f14..019d3b1b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -236,4 +236,5 @@ Biometric security update required Tunnel starting Enable remote app control + Nothing here yet! diff --git a/logcatter/src/main/java/com/zaneschepke/logcatter/LogcatManager.kt b/logcatter/src/main/java/com/zaneschepke/logcatter/LogcatManager.kt index 9978c4aa..172f51dd 100644 --- a/logcatter/src/main/java/com/zaneschepke/logcatter/LogcatManager.kt +++ b/logcatter/src/main/java/com/zaneschepke/logcatter/LogcatManager.kt @@ -62,6 +62,7 @@ class LogcatManager(pid: Int, logDir: String, maxFileSize: Long, maxFolderSize: logJob?.cancel() logcatReader.stop() fileManager.close() + _bufferedLogs.resetReplayCache() isStarted = false }