From 03345bdf868da7f77cd87b6ab181e8059629275c Mon Sep 17 00:00:00 2001 From: Zane Schepke Date: Thu, 12 Jun 2025 11:00:25 -0400 Subject: [PATCH] fix!: deprecated wifi info api, add detection option selection This will break for users who have selected get tunnel name via root shell. They will need to select the new option on update. Also, this will cause more location pings. Users who want less location pings will have to enable the legacy api option manually. #768 #797 --- .../16.json | 11 +- .../17.json | 295 ++++++++++++++++++ .../wireguardautotunnel/MainActivity.kt | 4 + .../core/service/TunnelForegroundService.kt | 2 +- .../service/autotunnel/AutoTunnelService.kt | 4 +- .../core/service/tile/TunnelControlTile.kt | 2 +- .../core/tunnel/BaseTunnel.kt | 2 +- .../core/tunnel/Extensions.kt | 2 +- .../core/tunnel/KernelTunnel.kt | 2 +- .../core/tunnel/TunnelManager.kt | 2 +- .../core/tunnel/TunnelProvider.kt | 2 +- .../core/tunnel/UserspaceTunnel.kt | 2 +- .../wireguardautotunnel/data/AppDatabase.kt | 12 +- ...istConverters.kt => DatabaseConverters.kt} | 9 +- .../data/dao/SettingsDao.kt | 2 +- .../data/dao/TunnelConfigDao.kt | 2 +- .../data/{model => entity}/Asset.kt | 2 +- .../data/entity/GeneralState.kt | 24 ++ .../data/entity/GitHubRelease.kt | 12 + .../data/{model => entity}/Settings.kt | 71 +---- .../data/{model => entity}/TunnelConfig.kt | 44 +-- .../data/mapper/GeneralStateMapper.kt | 37 +++ .../data/mapper/GitHubReleaseMapper.kt | 20 ++ .../data/mapper/SettingsMapper.kt | 67 ++++ .../data/mapper/TunnelConfigMapper.kt | 48 +++ .../data/model/GeneralState.kt | 54 ---- .../data/model/GitHubRelease.kt | 24 -- .../data/network/GitHubApi.kt | 2 +- .../data/network/KtorGitHubApi.kt | 2 +- .../data/repository/AppDataRoomRepository.kt | 2 +- .../repository/DataStoreAppStateRepository.kt | 7 +- .../data/repository/GitHubUpdateRepository.kt | 5 +- .../data/repository/RoomSettingsRepository.kt | 11 +- .../data/repository/RoomTunnelRepository.kt | 42 ++- .../wireguardautotunnel/di/TunnelModule.kt | 8 +- .../domain/events/AutoTunnelEvent.kt | 2 +- .../domain/{entity => model}/AppSettings.kt | 9 +- .../domain/{entity => model}/AppState.kt | 2 +- .../domain/{entity => model}/AppUpdate.kt | 2 +- .../domain/{entity => model}/TunnelConf.kt | 2 +- .../domain/repository/AppDataRepository.kt | 2 +- .../domain/repository/AppSettingRepository.kt | 2 +- .../domain/repository/AppStateRepository.kt | 2 +- .../domain/repository/TunnelRepository.kt | 2 +- .../domain/repository/UpdateRepository.kt | 2 +- .../domain/state/AutoTunnelState.kt | 4 +- .../wireguardautotunnel/ui/Route.kt | 2 + .../ui/common/button/IconSurfaceButton.kt | 2 +- .../currentNavBackStackEntryAsNavBarState.kt | 8 + .../components/WifiTunnelingItems.kt | 80 +++-- .../detection/WifiDetectionMethodScreen.kt | 41 +++ .../main/autotunnel/TunnelAutoTunnelScreen.kt | 4 +- .../components/EthernetTunnelItem.kt | 2 +- .../components/MobileDataTunnelItem.kt | 2 +- .../autotunnel/components/WifiTunnelItem.kt | 4 +- .../ui/screens/main/components/TunnelList.kt | 2 +- .../screens/main/components/TunnelRowItem.kt | 2 +- .../main/components/TunnelStatisticsRow.kt | 2 +- .../ui/screens/main/config/ConfigScreen.kt | 2 +- .../ui/screens/main/config/ConfigViewModel.kt | 2 +- .../main/splittunnel/SplitTunnelViewModel.kt | 2 +- .../splittunnel/state/SplitTunnelUiState.kt | 2 +- .../main/tunneloptions/TunnelOptionsScreen.kt | 2 +- .../components/AutoTunnelingItem.kt | 2 +- .../components/PingConfigItem.kt | 2 +- .../components/PingRestartItem.kt | 2 +- .../components/PrimaryTunnelItem.kt | 2 +- .../tunneloptions/components/QrCodeDialog.kt | 2 +- .../components/ServerIpv4Item.kt | 2 +- .../components/SplitTunnelingItem.kt | 2 +- .../ui/screens/support/SupportUiState.kt | 2 +- .../ui/screens/support/SupportViewModel.kt | 2 +- .../ui/state/AppUiState.kt | 11 +- .../ui/state/AppViewState.kt | 2 +- .../wireguardautotunnel/ui/state/PeerProxy.kt | 2 +- .../wireguardautotunnel/util/FileUtils.kt | 4 +- .../util/extensions/Extensions.kt | 4 +- .../util/extensions/UiExtensions.kt | 25 ++ .../viewmodel/AppViewModel.kt | 38 ++- .../viewmodel/event/AppEvent.kt | 8 +- app/src/main/res/values/strings.xml | 19 +- gradle.properties | 2 +- gradle/libs.versions.toml | 2 +- .../networkmonitor/AndroidNetworkMonitor.kt | 169 ++++++---- .../zaneschepke/networkmonitor/Extensions.kt | 13 + 85 files changed, 948 insertions(+), 398 deletions(-) create mode 100644 app/schemas/com.zaneschepke.wireguardautotunnel.data.AppDatabase/17.json rename app/src/main/java/com/zaneschepke/wireguardautotunnel/data/{DatabaseListConverters.kt => DatabaseConverters.kt} (68%) rename app/src/main/java/com/zaneschepke/wireguardautotunnel/data/{model => entity}/Asset.kt (79%) create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/GeneralState.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/GitHubRelease.kt rename app/src/main/java/com/zaneschepke/wireguardautotunnel/data/{model => entity}/Settings.kt (53%) rename app/src/main/java/com/zaneschepke/wireguardautotunnel/data/{model => entity}/TunnelConfig.kt (56%) create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/GeneralStateMapper.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/GitHubReleaseMapper.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/SettingsMapper.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/TunnelConfigMapper.kt delete mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/GeneralState.kt delete mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/GitHubRelease.kt rename app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/{entity => model}/AppSettings.kt (80%) rename app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/{entity => model}/AppState.kt (87%) rename app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/{entity => model}/AppUpdate.kt (73%) rename app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/{entity => model}/TunnelConf.kt (99%) create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/autotunnel/detection/WifiDetectionMethodScreen.kt diff --git a/app/schemas/com.zaneschepke.wireguardautotunnel.data.AppDatabase/16.json b/app/schemas/com.zaneschepke.wireguardautotunnel.data.AppDatabase/16.json index c912f396..b14acff5 100644 --- a/app/schemas/com.zaneschepke.wireguardautotunnel.data.AppDatabase/16.json +++ b/app/schemas/com.zaneschepke.wireguardautotunnel.data.AppDatabase/16.json @@ -155,9 +155,7 @@ "columnNames": [ "id" ] - }, - "indices": [], - "foreignKeys": [] + } }, { "tableName": "TunnelConfig", @@ -227,21 +225,18 @@ "fieldPath": "pingInterval", "columnName": "ping_interval", "affinity": "INTEGER", - "notNull": false, "defaultValue": "null" }, { "fieldPath": "pingCooldown", "columnName": "ping_cooldown", "affinity": "INTEGER", - "notNull": false, "defaultValue": "null" }, { "fieldPath": "pingIp", "columnName": "ping_ip", "affinity": "TEXT", - "notNull": false, "defaultValue": "null" }, { @@ -275,11 +270,9 @@ "orders": [], "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_TunnelConfig_name` ON `${TABLE_NAME}` (`name`)" } - ], - "foreignKeys": [] + ] } ], - "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'ae51793c4d09ea3194ecd26f0606f35c')" diff --git a/app/schemas/com.zaneschepke.wireguardautotunnel.data.AppDatabase/17.json b/app/schemas/com.zaneschepke.wireguardautotunnel.data.AppDatabase/17.json new file mode 100644 index 00000000..f25d2b9f --- /dev/null +++ b/app/schemas/com.zaneschepke.wireguardautotunnel.data.AppDatabase/17.json @@ -0,0 +1,295 @@ +{ + "formatVersion": 1, + "database": { + "version": 17, + "identityHash": "380d82359c99933cc9ce783347c4ec31", + "entities": [ + { + "tableName": "Settings", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `is_tunnel_enabled` INTEGER NOT NULL, `is_tunnel_on_mobile_data_enabled` INTEGER NOT NULL, `trusted_network_ssids` TEXT NOT NULL, `is_always_on_vpn_enabled` INTEGER NOT NULL, `is_tunnel_on_ethernet_enabled` INTEGER NOT NULL, `is_shortcuts_enabled` INTEGER NOT NULL DEFAULT false, `is_tunnel_on_wifi_enabled` INTEGER NOT NULL DEFAULT false, `is_kernel_enabled` INTEGER NOT NULL DEFAULT false, `is_restore_on_boot_enabled` INTEGER NOT NULL DEFAULT false, `is_multi_tunnel_enabled` INTEGER NOT NULL DEFAULT false, `is_ping_enabled` INTEGER NOT NULL DEFAULT false, `is_amnezia_enabled` INTEGER NOT NULL DEFAULT false, `is_wildcards_enabled` INTEGER NOT NULL DEFAULT false, `is_stop_on_no_internet_enabled` INTEGER NOT NULL DEFAULT false, `is_vpn_kill_switch_enabled` INTEGER NOT NULL DEFAULT false, `is_kernel_kill_switch_enabled` INTEGER NOT NULL DEFAULT false, `is_lan_on_kill_switch_enabled` INTEGER NOT NULL DEFAULT false, `debounce_delay_seconds` INTEGER NOT NULL DEFAULT 3, `is_disable_kill_switch_on_trusted_enabled` INTEGER NOT NULL DEFAULT false, `is_tunnel_on_unsecure_enabled` INTEGER NOT NULL DEFAULT false, `split_tunnel_apps` TEXT NOT NULL DEFAULT '', `wifi_detection_method` INTEGER NOT NULL DEFAULT 0)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isAutoTunnelEnabled", + "columnName": "is_tunnel_enabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isTunnelOnMobileDataEnabled", + "columnName": "is_tunnel_on_mobile_data_enabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "trustedNetworkSSIDs", + "columnName": "trusted_network_ssids", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isAlwaysOnVpnEnabled", + "columnName": "is_always_on_vpn_enabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isTunnelOnEthernetEnabled", + "columnName": "is_tunnel_on_ethernet_enabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isShortcutsEnabled", + "columnName": "is_shortcuts_enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "isTunnelOnWifiEnabled", + "columnName": "is_tunnel_on_wifi_enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "isKernelEnabled", + "columnName": "is_kernel_enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "isRestoreOnBootEnabled", + "columnName": "is_restore_on_boot_enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "isMultiTunnelEnabled", + "columnName": "is_multi_tunnel_enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "isPingEnabled", + "columnName": "is_ping_enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "isAmneziaEnabled", + "columnName": "is_amnezia_enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "isWildcardsEnabled", + "columnName": "is_wildcards_enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "isStopOnNoInternetEnabled", + "columnName": "is_stop_on_no_internet_enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "isVpnKillSwitchEnabled", + "columnName": "is_vpn_kill_switch_enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "isKernelKillSwitchEnabled", + "columnName": "is_kernel_kill_switch_enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "isLanOnKillSwitchEnabled", + "columnName": "is_lan_on_kill_switch_enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "debounceDelaySeconds", + "columnName": "debounce_delay_seconds", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "3" + }, + { + "fieldPath": "isDisableKillSwitchOnTrustedEnabled", + "columnName": "is_disable_kill_switch_on_trusted_enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "isTunnelOnUnsecureEnabled", + "columnName": "is_tunnel_on_unsecure_enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "splitTunnelApps", + "columnName": "split_tunnel_apps", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "wifiDetectionMethod", + "columnName": "wifi_detection_method", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + } + }, + { + "tableName": "TunnelConfig", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `wg_quick` TEXT NOT NULL, `tunnel_networks` TEXT NOT NULL DEFAULT '', `is_mobile_data_tunnel` INTEGER NOT NULL DEFAULT false, `is_primary_tunnel` INTEGER NOT NULL DEFAULT false, `am_quick` TEXT NOT NULL DEFAULT '', `is_Active` INTEGER NOT NULL DEFAULT false, `is_ping_enabled` INTEGER NOT NULL DEFAULT false, `ping_interval` INTEGER DEFAULT null, `ping_cooldown` INTEGER DEFAULT null, `ping_ip` TEXT DEFAULT null, `is_ethernet_tunnel` INTEGER NOT NULL DEFAULT false, `is_ipv4_preferred` INTEGER NOT NULL DEFAULT true)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "wgQuick", + "columnName": "wg_quick", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "tunnelNetworks", + "columnName": "tunnel_networks", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "isMobileDataTunnel", + "columnName": "is_mobile_data_tunnel", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "isPrimaryTunnel", + "columnName": "is_primary_tunnel", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "amQuick", + "columnName": "am_quick", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "isActive", + "columnName": "is_Active", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "isPingEnabled", + "columnName": "is_ping_enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "pingInterval", + "columnName": "ping_interval", + "affinity": "INTEGER", + "defaultValue": "null" + }, + { + "fieldPath": "pingCooldown", + "columnName": "ping_cooldown", + "affinity": "INTEGER", + "defaultValue": "null" + }, + { + "fieldPath": "pingIp", + "columnName": "ping_ip", + "affinity": "TEXT", + "defaultValue": "null" + }, + { + "fieldPath": "isEthernetTunnel", + "columnName": "is_ethernet_tunnel", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "false" + }, + { + "fieldPath": "isIpv4Preferred", + "columnName": "is_ipv4_preferred", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "true" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_TunnelConfig_name", + "unique": true, + "columnNames": [ + "name" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_TunnelConfig_name` ON `${TABLE_NAME}` (`name`)" + } + ] + } + ], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '380d82359c99933cc9ce783347c4ec31')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/MainActivity.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/MainActivity.kt index 2c4bce65..13afbdfd 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/MainActivity.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/MainActivity.kt @@ -49,6 +49,7 @@ import com.zaneschepke.wireguardautotunnel.ui.navigation.components.DynamicTopAp import com.zaneschepke.wireguardautotunnel.ui.navigation.components.currentNavBackStackEntryAsNavBarState import com.zaneschepke.wireguardautotunnel.ui.screens.autotunnel.AutoTunnelScreen import com.zaneschepke.wireguardautotunnel.ui.screens.autotunnel.advanced.AutoTunnelAdvancedScreen +import com.zaneschepke.wireguardautotunnel.ui.screens.autotunnel.detection.WifiDetectionMethodScreen import com.zaneschepke.wireguardautotunnel.ui.screens.autotunnel.disclosure.LocationDisclosureScreen import com.zaneschepke.wireguardautotunnel.ui.screens.main.MainScreen import com.zaneschepke.wireguardautotunnel.ui.screens.main.autotunnel.TunnelAutoTunnelScreen @@ -284,6 +285,9 @@ class MainActivity : AppCompatActivity() { composable { AutoTunnelAdvancedScreen(appUiState, viewModel) } + composable { + WifiDetectionMethodScreen(appUiState, viewModel) + } composable { LogsScreen(appViewState, viewModel) } composable { backStack -> val args = backStack.toRoute() diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/service/TunnelForegroundService.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/service/TunnelForegroundService.kt index cf5c5d48..e2df2619 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/service/TunnelForegroundService.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/service/TunnelForegroundService.kt @@ -14,9 +14,9 @@ import com.zaneschepke.wireguardautotunnel.core.notification.NotificationManager import com.zaneschepke.wireguardautotunnel.core.notification.WireGuardNotification import com.zaneschepke.wireguardautotunnel.core.tunnel.TunnelManager import com.zaneschepke.wireguardautotunnel.di.IoDispatcher -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.enums.NotificationAction import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState import com.zaneschepke.wireguardautotunnel.util.Constants diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/service/autotunnel/AutoTunnelService.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/service/autotunnel/AutoTunnelService.kt index 9a8ca818..ab35fdff 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/service/autotunnel/AutoTunnelService.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/service/autotunnel/AutoTunnelService.kt @@ -15,12 +15,12 @@ import com.zaneschepke.wireguardautotunnel.core.notification.WireGuardNotificati import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager import com.zaneschepke.wireguardautotunnel.core.tunnel.TunnelManager import com.zaneschepke.wireguardautotunnel.di.IoDispatcher -import com.zaneschepke.wireguardautotunnel.domain.entity.AppSettings -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.enums.BackendState import com.zaneschepke.wireguardautotunnel.domain.enums.NotificationAction import com.zaneschepke.wireguardautotunnel.domain.events.AutoTunnelEvent import com.zaneschepke.wireguardautotunnel.domain.events.KillSwitchEvent +import com.zaneschepke.wireguardautotunnel.domain.model.AppSettings +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository import com.zaneschepke.wireguardautotunnel.domain.state.AutoTunnelState import com.zaneschepke.wireguardautotunnel.domain.state.NetworkState diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/service/tile/TunnelControlTile.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/service/tile/TunnelControlTile.kt index 380c8490..c5b259e3 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/service/tile/TunnelControlTile.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/service/tile/TunnelControlTile.kt @@ -13,7 +13,7 @@ import com.zaneschepke.wireguardautotunnel.R import com.zaneschepke.wireguardautotunnel.WireGuardAutoTunnel import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager import com.zaneschepke.wireguardautotunnel.core.tunnel.TunnelManager -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState import dagger.hilt.android.AndroidEntryPoint diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/BaseTunnel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/BaseTunnel.kt index ec7de0be..7b9a6c89 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/BaseTunnel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/BaseTunnel.kt @@ -3,9 +3,9 @@ package com.zaneschepke.wireguardautotunnel.core.tunnel import com.wireguard.android.backend.Tunnel import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager import com.zaneschepke.wireguardautotunnel.di.ApplicationScope -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.enums.BackendError import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState import com.zaneschepke.wireguardautotunnel.domain.state.TunnelStatistics diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/Extensions.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/Extensions.kt index cd9ce280..dcd69959 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/Extensions.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/Extensions.kt @@ -1,7 +1,7 @@ package com.zaneschepke.wireguardautotunnel.core.tunnel -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/KernelTunnel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/KernelTunnel.kt index af7fefcb..6673afb0 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/KernelTunnel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/KernelTunnel.kt @@ -5,9 +5,9 @@ import com.wireguard.android.backend.BackendException import com.wireguard.android.backend.Tunnel import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager import com.zaneschepke.wireguardautotunnel.di.ApplicationScope -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.enums.BackendState import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository import com.zaneschepke.wireguardautotunnel.domain.state.TunnelStatistics import com.zaneschepke.wireguardautotunnel.domain.state.WireGuardStatistics diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/TunnelManager.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/TunnelManager.kt index 9988901c..60ee3ba1 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/TunnelManager.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/TunnelManager.kt @@ -4,10 +4,10 @@ import com.zaneschepke.wireguardautotunnel.di.ApplicationScope import com.zaneschepke.wireguardautotunnel.di.IoDispatcher import com.zaneschepke.wireguardautotunnel.di.Kernel import com.zaneschepke.wireguardautotunnel.di.Userspace -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.enums.BackendError import com.zaneschepke.wireguardautotunnel.domain.enums.BackendState import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository import com.zaneschepke.wireguardautotunnel.domain.state.TunnelStatistics import java.util.concurrent.ConcurrentHashMap diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/TunnelProvider.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/TunnelProvider.kt index 388d0362..88cd5e37 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/TunnelProvider.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/TunnelProvider.kt @@ -1,9 +1,9 @@ package com.zaneschepke.wireguardautotunnel.core.tunnel -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.enums.BackendError import com.zaneschepke.wireguardautotunnel.domain.enums.BackendState import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState import com.zaneschepke.wireguardautotunnel.domain.state.TunnelStatistics import java.util.concurrent.ConcurrentHashMap diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/UserspaceTunnel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/UserspaceTunnel.kt index a7761ad6..27939643 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/UserspaceTunnel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel/UserspaceTunnel.kt @@ -2,9 +2,9 @@ package com.zaneschepke.wireguardautotunnel.core.tunnel import com.zaneschepke.wireguardautotunnel.core.service.ServiceManager import com.zaneschepke.wireguardautotunnel.di.ApplicationScope -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.enums.BackendState import com.zaneschepke.wireguardautotunnel.domain.enums.TunnelStatus +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository import com.zaneschepke.wireguardautotunnel.domain.state.AmneziaStatistics import com.zaneschepke.wireguardautotunnel.domain.state.TunnelStatistics diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/AppDatabase.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/AppDatabase.kt index 53851034..55025121 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/AppDatabase.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/AppDatabase.kt @@ -8,12 +8,12 @@ import androidx.room.TypeConverters import androidx.room.migration.AutoMigrationSpec import com.zaneschepke.wireguardautotunnel.data.dao.SettingsDao import com.zaneschepke.wireguardautotunnel.data.dao.TunnelConfigDao -import com.zaneschepke.wireguardautotunnel.data.model.Settings -import com.zaneschepke.wireguardautotunnel.data.model.TunnelConfig +import com.zaneschepke.wireguardautotunnel.data.entity.Settings +import com.zaneschepke.wireguardautotunnel.data.entity.TunnelConfig @Database( entities = [Settings::class, TunnelConfig::class], - version = 16, + version = 17, autoMigrations = [ AutoMigration(from = 1, to = 2), @@ -31,10 +31,11 @@ import com.zaneschepke.wireguardautotunnel.data.model.TunnelConfig AutoMigration(from = 13, to = 14), AutoMigration(from = 14, to = 15), AutoMigration(from = 15, to = 16), + AutoMigration(from = 16, to = 17, spec = WifiDetectionMigration::class), ], exportSchema = true, ) -@TypeConverters(DatabaseListConverters::class) +@TypeConverters(DatabaseConverters::class) abstract class AppDatabase : RoomDatabase() { abstract fun settingDao(): SettingsDao @@ -47,3 +48,6 @@ class RemoveLegacySettingColumnsMigration : AutoMigrationSpec @DeleteColumn(tableName = "Settings", columnName = "is_auto_tunnel_paused") class RemoveTunnelPauseMigration : AutoMigrationSpec + +@DeleteColumn(tableName = "Settings", columnName = "is_wifi_by_shell_enabled") +class WifiDetectionMigration : AutoMigrationSpec diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/DatabaseListConverters.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/DatabaseConverters.kt similarity index 68% rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/data/DatabaseListConverters.kt rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/data/DatabaseConverters.kt index e8316b1d..4ae2e567 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/DatabaseListConverters.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/DatabaseConverters.kt @@ -1,9 +1,10 @@ package com.zaneschepke.wireguardautotunnel.data import androidx.room.TypeConverter +import com.zaneschepke.wireguardautotunnel.data.entity.Settings import kotlinx.serialization.json.Json -class DatabaseListConverters { +class DatabaseConverters { @TypeConverter fun listToString(value: MutableList): String { return Json.encodeToString(value) @@ -20,4 +21,10 @@ class DatabaseListConverters { Json.decodeFromString>(json) } } + + @TypeConverter fun fromStatus(status: Settings.WifiDetectionMethod): Int = status.value + + @TypeConverter + fun toStatus(value: Int): Settings.WifiDetectionMethod = + Settings.WifiDetectionMethod.fromValue(value) } diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/dao/SettingsDao.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/dao/SettingsDao.kt index 26092b85..fe270ffd 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/dao/SettingsDao.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/dao/SettingsDao.kt @@ -5,7 +5,7 @@ import androidx.room.Delete import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.zaneschepke.wireguardautotunnel.data.model.Settings +import com.zaneschepke.wireguardautotunnel.data.entity.Settings import kotlinx.coroutines.flow.Flow @Dao diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/dao/TunnelConfigDao.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/dao/TunnelConfigDao.kt index f0e32af6..2ceb8b43 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/dao/TunnelConfigDao.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/dao/TunnelConfigDao.kt @@ -5,7 +5,7 @@ import androidx.room.Delete import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.zaneschepke.wireguardautotunnel.data.model.TunnelConfig +import com.zaneschepke.wireguardautotunnel.data.entity.TunnelConfig import com.zaneschepke.wireguardautotunnel.util.extensions.TunnelConfigs import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/Asset.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/Asset.kt similarity index 79% rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/Asset.kt rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/Asset.kt index 3c5b81cf..f1874faf 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/Asset.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/Asset.kt @@ -1,4 +1,4 @@ -package com.zaneschepke.wireguardautotunnel.data.model +package com.zaneschepke.wireguardautotunnel.data.entity import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/GeneralState.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/GeneralState.kt new file mode 100644 index 00000000..2e6368a0 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/GeneralState.kt @@ -0,0 +1,24 @@ +package com.zaneschepke.wireguardautotunnel.data.entity + +import com.zaneschepke.wireguardautotunnel.ui.theme.Theme + +data class GeneralState( + val isLocationDisclosureShown: Boolean = LOCATION_DISCLOSURE_SHOWN_DEFAULT, + val isBatteryOptimizationDisableShown: Boolean = BATTERY_OPTIMIZATION_DISABLE_SHOWN_DEFAULT, + val isPinLockEnabled: Boolean = PIN_LOCK_ENABLED_DEFAULT, + val expandedTunnelIds: List = emptyList(), + val isLocalLogsEnabled: Boolean = IS_LOGS_ENABLED_DEFAULT, + val isRemoteControlEnabled: Boolean = IS_REMOTE_CONTROL_ENABLED, + val remoteKey: String? = null, + val locale: String? = null, + val theme: Theme = Theme.AUTOMATIC, +) { + + companion object { + const val LOCATION_DISCLOSURE_SHOWN_DEFAULT = false + const val BATTERY_OPTIMIZATION_DISABLE_SHOWN_DEFAULT = false + const val PIN_LOCK_ENABLED_DEFAULT = false + const val IS_LOGS_ENABLED_DEFAULT = false + const val IS_REMOTE_CONTROL_ENABLED = false + } +} diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/GitHubRelease.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/GitHubRelease.kt new file mode 100644 index 00000000..fbfe5df7 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/GitHubRelease.kt @@ -0,0 +1,12 @@ +package com.zaneschepke.wireguardautotunnel.data.entity + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class GitHubRelease( + @SerialName("tag_name") val tagName: String, + val name: String?, + val body: String?, + val assets: List, +) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/Settings.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/Settings.kt similarity index 53% rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/Settings.kt rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/Settings.kt index c3903706..2e7d14fb 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/Settings.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/Settings.kt @@ -1,9 +1,8 @@ -package com.zaneschepke.wireguardautotunnel.data.model +package com.zaneschepke.wireguardautotunnel.data.entity import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.zaneschepke.wireguardautotunnel.domain.entity.AppSettings @Entity data class Settings( @@ -32,8 +31,6 @@ data class Settings( val isAmneziaEnabled: Boolean = false, @ColumnInfo(name = "is_wildcards_enabled", defaultValue = "false") val isWildcardsEnabled: Boolean = false, - @ColumnInfo(name = "is_wifi_by_shell_enabled", defaultValue = "false") - val isWifiNameByShellEnabled: Boolean = false, @ColumnInfo(name = "is_stop_on_no_internet_enabled", defaultValue = "false") val isStopOnNoInternetEnabled: Boolean = false, @ColumnInfo(name = "is_vpn_kill_switch_enabled", defaultValue = "false") @@ -46,61 +43,23 @@ data class Settings( val debounceDelaySeconds: Int = 3, @ColumnInfo(name = "is_disable_kill_switch_on_trusted_enabled", defaultValue = "false") val isDisableKillSwitchOnTrustedEnabled: Boolean = false, + @ColumnInfo(name = "is_tunnel_on_unsecure_enabled", defaultValue = "false") + val isTunnelOnUnsecureEnabled: Boolean = false, + @ColumnInfo(name = "split_tunnel_apps", defaultValue = "") + val splitTunnelApps: MutableList = mutableListOf(), + @ColumnInfo(name = "wifi_detection_method", defaultValue = "0") + val wifiDetectionMethod: WifiDetectionMethod = WifiDetectionMethod.fromValue(0), ) { - fun toAppSettings(): AppSettings { - return AppSettings( - id, - isAutoTunnelEnabled, - isTunnelOnMobileDataEnabled, - trustedNetworkSSIDs, - isAlwaysOnVpnEnabled, - isTunnelOnEthernetEnabled, - isShortcutsEnabled, - isTunnelOnWifiEnabled, - isKernelEnabled, - isRestoreOnBootEnabled, - isMultiTunnelEnabled, - isPingEnabled, - isAmneziaEnabled, - isWildcardsEnabled, - isWifiNameByShellEnabled, - isStopOnNoInternetEnabled, - isVpnKillSwitchEnabled, - isKernelKillSwitchEnabled, - isLanOnKillSwitchEnabled, - debounceDelaySeconds, - isDisableKillSwitchOnTrustedEnabled, - ) - } + enum class WifiDetectionMethod(val value: Int) { + DEFAULT(0), + LEGACY(1), + ROOT(2), + SHIZUKU(3); - companion object { - fun from(appSettings: AppSettings): Settings { - return with(appSettings) { - Settings( - id, - isAutoTunnelEnabled, - isTunnelOnMobileDataEnabled, - trustedNetworkSSIDs.toMutableList(), - isAlwaysOnVpnEnabled, - isTunnelOnEthernetEnabled, - isShortcutsEnabled, - isTunnelOnWifiEnabled, - isKernelEnabled, - isRestoreOnBootEnabled, - isMultiTunnelEnabled, - isPingEnabled, - isAmneziaEnabled, - isWildcardsEnabled, - isWifiNameByShellEnabled, - isStopOnNoInternetEnabled, - isVpnKillSwitchEnabled, - isKernelKillSwitchEnabled, - isLanOnKillSwitchEnabled, - debounceDelaySeconds, - isDisableKillSwitchOnTrustedEnabled, - ) - } + companion object { + fun fromValue(value: Int): WifiDetectionMethod = + entries.find { it.value == value } ?: DEFAULT } } } diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/TunnelConfig.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/TunnelConfig.kt similarity index 56% rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/TunnelConfig.kt rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/TunnelConfig.kt index d67ddf8a..29148d2d 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/TunnelConfig.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity/TunnelConfig.kt @@ -1,10 +1,9 @@ -package com.zaneschepke.wireguardautotunnel.data.model +package com.zaneschepke.wireguardautotunnel.data.entity import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.Index import androidx.room.PrimaryKey -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf @Entity(indices = [Index(value = ["name"], unique = true)]) data class TunnelConfig( @@ -30,48 +29,7 @@ data class TunnelConfig( var isIpv4Preferred: Boolean = true, ) { - fun toTunnel(): TunnelConf { - return TunnelConf( - id, - name, - wgQuick, - tunnelNetworks, - isMobileDataTunnel, - isPrimaryTunnel, - amQuick, - isActive, - isPingEnabled, - pingInterval, - pingCooldown, - pingIp, - isEthernetTunnel, - isIpv4Preferred, - ) - } - companion object { - const val AM_QUICK_DEFAULT = "" - - fun from(tunnelConf: TunnelConf): TunnelConfig { - return with(tunnelConf) { - return TunnelConfig( - id, - tunName, - wgQuick, - tunnelNetworks.toMutableList(), - isMobileDataTunnel, - isPrimaryTunnel, - amQuick, - isActive, - isPingEnabled, - pingInterval, - pingCooldown, - pingIp, - isEthernetTunnel, - isIpv4Preferred, - ) - } - } } } diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/GeneralStateMapper.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/GeneralStateMapper.kt new file mode 100644 index 00000000..422d5fbc --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/GeneralStateMapper.kt @@ -0,0 +1,37 @@ +package com.zaneschepke.wireguardautotunnel.data.mapper + +import com.zaneschepke.wireguardautotunnel.data.entity.GeneralState +import com.zaneschepke.wireguardautotunnel.domain.model.AppState + +object GeneralStateMapper { + fun toAppState(generalState: GeneralState): AppState = + with(generalState) { + AppState( + isLocationDisclosureShown, + isBatteryOptimizationDisableShown, + isPinLockEnabled, + expandedTunnelIds, + isLocalLogsEnabled, + isRemoteControlEnabled, + remoteKey, + locale, + theme, + ) + } + + fun toGeneralState(appState: AppState): GeneralState { + return with(appState) { + GeneralState( + isLocationDisclosureShown, + isBatteryOptimizationDisableShown, + isPinLockEnabled, + expandedTunnelIds, + isLocalLogsEnabled, + isRemoteControlEnabled, + remoteKey, + locale, + theme, + ) + } + } +} diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/GitHubReleaseMapper.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/GitHubReleaseMapper.kt new file mode 100644 index 00000000..2d42e74e --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/GitHubReleaseMapper.kt @@ -0,0 +1,20 @@ +package com.zaneschepke.wireguardautotunnel.data.mapper + +import com.zaneschepke.wireguardautotunnel.data.entity.GitHubRelease +import com.zaneschepke.wireguardautotunnel.domain.model.AppUpdate +import kotlin.collections.firstOrNull + +object GitHubReleaseMapper { + fun toAppUpdate(gitHubRelease: GitHubRelease): AppUpdate { + with(gitHubRelease) { + val apkAsset = assets.firstOrNull { it.name.endsWith(".apk") } + return AppUpdate( + version = tagName.removePrefix("v"), + title = name ?: "Update $tagName", + releaseNotes = body ?: "No release notes provided", + apkUrl = apkAsset?.browserDownloadUrl, + apkFileName = apkAsset?.name, + ) + } + } +} diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/SettingsMapper.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/SettingsMapper.kt new file mode 100644 index 00000000..5ae4496b --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/SettingsMapper.kt @@ -0,0 +1,67 @@ +package com.zaneschepke.wireguardautotunnel.data.mapper + +import com.zaneschepke.networkmonitor.AndroidNetworkMonitor +import com.zaneschepke.wireguardautotunnel.data.entity.Settings +import com.zaneschepke.wireguardautotunnel.domain.model.AppSettings + +object SettingsMapper { + fun toAppSettings(settings: Settings): AppSettings { + return AppSettings( + id = settings.id, + isAutoTunnelEnabled = settings.isAutoTunnelEnabled, + isTunnelOnMobileDataEnabled = settings.isTunnelOnMobileDataEnabled, + trustedNetworkSSIDs = settings.trustedNetworkSSIDs, + isAlwaysOnVpnEnabled = settings.isAlwaysOnVpnEnabled, + isTunnelOnEthernetEnabled = settings.isTunnelOnEthernetEnabled, + isShortcutsEnabled = settings.isShortcutsEnabled, + isTunnelOnWifiEnabled = settings.isTunnelOnWifiEnabled, + isKernelEnabled = settings.isKernelEnabled, + isRestoreOnBootEnabled = settings.isRestoreOnBootEnabled, + isMultiTunnelEnabled = settings.isMultiTunnelEnabled, + isPingEnabled = settings.isPingEnabled, + isAmneziaEnabled = settings.isAmneziaEnabled, + isWildcardsEnabled = settings.isWildcardsEnabled, + isStopOnNoInternetEnabled = settings.isStopOnNoInternetEnabled, + isVpnKillSwitchEnabled = settings.isVpnKillSwitchEnabled, + isKernelKillSwitchEnabled = settings.isKernelKillSwitchEnabled, + isLanOnKillSwitchEnabled = settings.isLanOnKillSwitchEnabled, + debounceDelaySeconds = settings.debounceDelaySeconds, + isDisableKillSwitchOnTrustedEnabled = settings.isDisableKillSwitchOnTrustedEnabled, + isTunnelOnUnsecureEnabled = settings.isTunnelOnUnsecureEnabled, + splitTunnelApps = settings.splitTunnelApps, + wifiDetectionMethod = + AndroidNetworkMonitor.WifiDetectionMethod.fromValue( + settings.wifiDetectionMethod.value + ), + ) + } + + fun toSettings(appSettings: AppSettings): Settings { + return Settings( + id = appSettings.id, + isAutoTunnelEnabled = appSettings.isAutoTunnelEnabled, + isTunnelOnMobileDataEnabled = appSettings.isTunnelOnMobileDataEnabled, + trustedNetworkSSIDs = appSettings.trustedNetworkSSIDs.toMutableList(), + isAlwaysOnVpnEnabled = appSettings.isAlwaysOnVpnEnabled, + isTunnelOnEthernetEnabled = appSettings.isTunnelOnEthernetEnabled, + isShortcutsEnabled = appSettings.isShortcutsEnabled, + isTunnelOnWifiEnabled = appSettings.isTunnelOnWifiEnabled, + isKernelEnabled = appSettings.isKernelEnabled, + isRestoreOnBootEnabled = appSettings.isRestoreOnBootEnabled, + isMultiTunnelEnabled = appSettings.isMultiTunnelEnabled, + isPingEnabled = appSettings.isPingEnabled, + isAmneziaEnabled = appSettings.isAmneziaEnabled, + isWildcardsEnabled = appSettings.isWildcardsEnabled, + isStopOnNoInternetEnabled = appSettings.isStopOnNoInternetEnabled, + isVpnKillSwitchEnabled = appSettings.isVpnKillSwitchEnabled, + isKernelKillSwitchEnabled = appSettings.isKernelKillSwitchEnabled, + isLanOnKillSwitchEnabled = appSettings.isLanOnKillSwitchEnabled, + debounceDelaySeconds = appSettings.debounceDelaySeconds, + isDisableKillSwitchOnTrustedEnabled = appSettings.isDisableKillSwitchOnTrustedEnabled, + isTunnelOnUnsecureEnabled = appSettings.isTunnelOnUnsecureEnabled, + splitTunnelApps = appSettings.splitTunnelApps.toMutableList(), + wifiDetectionMethod = + Settings.WifiDetectionMethod.fromValue(appSettings.wifiDetectionMethod.value), + ) + } +} diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/TunnelConfigMapper.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/TunnelConfigMapper.kt new file mode 100644 index 00000000..1cd14684 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/TunnelConfigMapper.kt @@ -0,0 +1,48 @@ +package com.zaneschepke.wireguardautotunnel.data.mapper + +import com.zaneschepke.wireguardautotunnel.data.entity.TunnelConfig +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf + +object TunnelConfigMapper { + fun toTunnelConf(tunnelConfig: TunnelConfig): TunnelConf { + return with(tunnelConfig) { + TunnelConf( + id, + name, + wgQuick, + tunnelNetworks, + isMobileDataTunnel, + isPrimaryTunnel, + amQuick, + isActive, + isPingEnabled, + pingInterval, + pingCooldown, + pingIp, + isEthernetTunnel, + isIpv4Preferred, + ) + } + } + + fun toTunnelConfig(tunnelConf: TunnelConf): TunnelConfig { + return with(tunnelConf) { + TunnelConfig( + id, + tunName, + wgQuick, + tunnelNetworks.toMutableList(), + isMobileDataTunnel, + isPrimaryTunnel, + amQuick, + isActive, + isPingEnabled, + pingInterval, + pingCooldown, + pingIp, + isEthernetTunnel, + isIpv4Preferred, + ) + } + } +} 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 deleted file mode 100644 index dd619de1..00000000 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/GeneralState.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.zaneschepke.wireguardautotunnel.data.model - -import com.zaneschepke.wireguardautotunnel.domain.entity.AppState -import com.zaneschepke.wireguardautotunnel.ui.theme.Theme - -data class GeneralState( - val isLocationDisclosureShown: Boolean = LOCATION_DISCLOSURE_SHOWN_DEFAULT, - val isBatteryOptimizationDisableShown: Boolean = BATTERY_OPTIMIZATION_DISABLE_SHOWN_DEFAULT, - val isPinLockEnabled: Boolean = PIN_LOCK_ENABLED_DEFAULT, - val expandedTunnelIds: List = emptyList(), - val isLocalLogsEnabled: Boolean = IS_LOGS_ENABLED_DEFAULT, - val isRemoteControlEnabled: Boolean = IS_REMOTE_CONTROL_ENABLED, - val remoteKey: String? = null, - val locale: String? = null, - val theme: Theme = Theme.AUTOMATIC, -) { - - fun toAppState(): AppState = - AppState( - isLocationDisclosureShown, - isBatteryOptimizationDisableShown, - isPinLockEnabled, - expandedTunnelIds, - isLocalLogsEnabled, - isRemoteControlEnabled, - remoteKey, - locale, - theme, - ) - - companion object { - fun from(appState: AppState): GeneralState { - return with(appState) { - GeneralState( - isLocationDisclosureShown, - isBatteryOptimizationDisableShown, - isPinLockEnabled, - expandedTunnelIds, - isLocalLogsEnabled, - isRemoteControlEnabled, - remoteKey, - locale, - theme, - ) - } - } - - const val LOCATION_DISCLOSURE_SHOWN_DEFAULT = false - const val BATTERY_OPTIMIZATION_DISABLE_SHOWN_DEFAULT = false - const val PIN_LOCK_ENABLED_DEFAULT = false - const val IS_LOGS_ENABLED_DEFAULT = false - const val IS_REMOTE_CONTROL_ENABLED = false - } -} diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/GitHubRelease.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/GitHubRelease.kt deleted file mode 100644 index 680e0427..00000000 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/model/GitHubRelease.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.zaneschepke.wireguardautotunnel.data.model - -import com.zaneschepke.wireguardautotunnel.domain.entity.AppUpdate -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -data class GitHubRelease( - @SerialName("tag_name") val tagName: String, - val name: String?, - val body: String?, - val assets: List, -) { - fun toAppUpdate(): AppUpdate { - val apkAsset = assets.firstOrNull { it.name.endsWith(".apk") } - return AppUpdate( - version = tagName.removePrefix("v"), - title = name ?: "Update $tagName", - releaseNotes = body ?: "No release notes provided", - apkUrl = apkAsset?.browserDownloadUrl, - apkFileName = apkAsset?.name, - ) - } -} diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/network/GitHubApi.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/network/GitHubApi.kt index c664493c..d9454c98 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/network/GitHubApi.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/network/GitHubApi.kt @@ -1,6 +1,6 @@ package com.zaneschepke.wireguardautotunnel.data.network -import com.zaneschepke.wireguardautotunnel.data.model.GitHubRelease +import com.zaneschepke.wireguardautotunnel.data.entity.GitHubRelease interface GitHubApi { suspend fun getLatestRelease(owner: String, repo: String): Result diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/network/KtorGitHubApi.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/network/KtorGitHubApi.kt index 892595e2..f9174dcc 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/network/KtorGitHubApi.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/network/KtorGitHubApi.kt @@ -1,6 +1,6 @@ package com.zaneschepke.wireguardautotunnel.data.network -import com.zaneschepke.wireguardautotunnel.data.model.GitHubRelease +import com.zaneschepke.wireguardautotunnel.data.entity.GitHubRelease import io.ktor.client.HttpClient import io.ktor.client.call.body import io.ktor.client.plugins.ClientRequestException diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/AppDataRoomRepository.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/AppDataRoomRepository.kt index d2452d6c..878298a7 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/AppDataRoomRepository.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/AppDataRoomRepository.kt @@ -1,6 +1,6 @@ package com.zaneschepke.wireguardautotunnel.data.repository -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository import com.zaneschepke.wireguardautotunnel.domain.repository.AppSettingRepository import com.zaneschepke.wireguardautotunnel.domain.repository.AppStateRepository diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/DataStoreAppStateRepository.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/DataStoreAppStateRepository.kt index 8eb1908b..e93798f9 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/DataStoreAppStateRepository.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/DataStoreAppStateRepository.kt @@ -1,8 +1,9 @@ package com.zaneschepke.wireguardautotunnel.data.repository import com.zaneschepke.wireguardautotunnel.data.DataStoreManager -import com.zaneschepke.wireguardautotunnel.data.model.GeneralState -import com.zaneschepke.wireguardautotunnel.domain.entity.AppState +import com.zaneschepke.wireguardautotunnel.data.entity.GeneralState +import com.zaneschepke.wireguardautotunnel.data.mapper.GeneralStateMapper +import com.zaneschepke.wireguardautotunnel.domain.model.AppState import com.zaneschepke.wireguardautotunnel.domain.repository.AppStateRepository import com.zaneschepke.wireguardautotunnel.ui.theme.Theme import kotlinx.coroutines.flow.Flow @@ -153,5 +154,5 @@ class DataStoreAppStateRepository(private val dataStoreManager: DataStoreManager } } ?: GeneralState() } - .map { it.toAppState() } + .map(GeneralStateMapper::toAppState) } diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/GitHubUpdateRepository.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/GitHubUpdateRepository.kt index 486499fd..2f72656d 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/GitHubUpdateRepository.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/GitHubUpdateRepository.kt @@ -2,9 +2,10 @@ package com.zaneschepke.wireguardautotunnel.data.repository import android.content.Context import com.zaneschepke.wireguardautotunnel.BuildConfig +import com.zaneschepke.wireguardautotunnel.data.mapper.GitHubReleaseMapper import com.zaneschepke.wireguardautotunnel.data.network.GitHubApi import com.zaneschepke.wireguardautotunnel.di.IoDispatcher -import com.zaneschepke.wireguardautotunnel.domain.entity.AppUpdate +import com.zaneschepke.wireguardautotunnel.domain.model.AppUpdate import com.zaneschepke.wireguardautotunnel.domain.repository.UpdateRepository import com.zaneschepke.wireguardautotunnel.util.NumberUtils import io.ktor.client.HttpClient @@ -47,7 +48,7 @@ class GitHubUpdateRepository( Timber.i("Latest version: $newVersion, current version: $currentVersion") if (NumberUtils.compareVersions(newVersion, currentVersion) > 0) { - release.toAppUpdate() + GitHubReleaseMapper.toAppUpdate(release) } else { null } diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/RoomSettingsRepository.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/RoomSettingsRepository.kt index 6fa04f2b..35710796 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/RoomSettingsRepository.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/RoomSettingsRepository.kt @@ -1,9 +1,10 @@ package com.zaneschepke.wireguardautotunnel.data.repository import com.zaneschepke.wireguardautotunnel.data.dao.SettingsDao -import com.zaneschepke.wireguardautotunnel.data.model.Settings +import com.zaneschepke.wireguardautotunnel.data.entity.Settings +import com.zaneschepke.wireguardautotunnel.data.mapper.SettingsMapper import com.zaneschepke.wireguardautotunnel.di.IoDispatcher -import com.zaneschepke.wireguardautotunnel.domain.entity.AppSettings +import com.zaneschepke.wireguardautotunnel.domain.model.AppSettings import com.zaneschepke.wireguardautotunnel.domain.repository.AppSettingRepository import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.flowOn @@ -16,15 +17,15 @@ class RoomSettingsRepository( ) : AppSettingRepository { override suspend fun save(appSettings: AppSettings) { - withContext(ioDispatcher) { settingsDoa.save(Settings.from(appSettings)) } + withContext(ioDispatcher) { settingsDoa.save(SettingsMapper.toSettings(appSettings)) } } override val flow = - settingsDoa.getSettingsFlow().flowOn(ioDispatcher).map { it.toAppSettings() } + settingsDoa.getSettingsFlow().flowOn(ioDispatcher).map(SettingsMapper::toAppSettings) override suspend fun get(): AppSettings { return withContext(ioDispatcher) { - (settingsDoa.getAll().firstOrNull() ?: Settings()).toAppSettings() + SettingsMapper.toAppSettings(settingsDoa.getAll().firstOrNull() ?: Settings()) } } } diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/RoomTunnelRepository.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/RoomTunnelRepository.kt index a9d91fd5..bc7b711e 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/RoomTunnelRepository.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository/RoomTunnelRepository.kt @@ -1,9 +1,9 @@ package com.zaneschepke.wireguardautotunnel.data.repository import com.zaneschepke.wireguardautotunnel.data.dao.TunnelConfigDao -import com.zaneschepke.wireguardautotunnel.data.model.TunnelConfig +import com.zaneschepke.wireguardautotunnel.data.mapper.TunnelConfigMapper import com.zaneschepke.wireguardautotunnel.di.IoDispatcher -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository import com.zaneschepke.wireguardautotunnel.util.extensions.Tunnels import kotlinx.coroutines.CoroutineDispatcher @@ -17,19 +17,25 @@ class RoomTunnelRepository( ) : TunnelRepository { override val flow = - tunnelConfigDao.getAllFlow().flowOn(ioDispatcher).map { it.map { it.toTunnel() } } + tunnelConfigDao.getAllFlow().flowOn(ioDispatcher).map { + it.map(TunnelConfigMapper::toTunnelConf) + } override suspend fun getAll(): Tunnels { - return withContext(ioDispatcher) { tunnelConfigDao.getAll().map { it.toTunnel() } } + return withContext(ioDispatcher) { + tunnelConfigDao.getAll().map(TunnelConfigMapper::toTunnelConf) + } } override suspend fun save(tunnelConf: TunnelConf) { - withContext(ioDispatcher) { tunnelConfigDao.save(TunnelConfig.from(tunnelConf)) } + withContext(ioDispatcher) { + tunnelConfigDao.save(TunnelConfigMapper.toTunnelConfig(tunnelConf)) + } } override suspend fun saveAll(tunnelConfList: List) { withContext(ioDispatcher) { - tunnelConfigDao.saveAll(tunnelConfList.map(TunnelConfig::from)) + tunnelConfigDao.saveAll(tunnelConfList.map(TunnelConfigMapper::toTunnelConfig)) } } @@ -55,15 +61,21 @@ class RoomTunnelRepository( } override suspend fun delete(tunnelConf: TunnelConf) { - withContext(ioDispatcher) { tunnelConfigDao.delete(TunnelConfig.from(tunnelConf)) } + withContext(ioDispatcher) { + tunnelConfigDao.delete(TunnelConfigMapper.toTunnelConfig(tunnelConf)) + } } override suspend fun getById(id: Int): TunnelConf? { - return withContext(ioDispatcher) { tunnelConfigDao.getById(id.toLong())?.toTunnel() } + return withContext(ioDispatcher) { + tunnelConfigDao.getById(id.toLong())?.let(TunnelConfigMapper::toTunnelConf) + } } override suspend fun getActive(): Tunnels { - return withContext(ioDispatcher) { tunnelConfigDao.getActive().map { it.toTunnel() } } + return withContext(ioDispatcher) { + tunnelConfigDao.getActive().map(TunnelConfigMapper::toTunnelConf) + } } override suspend fun count(): Int { @@ -71,22 +83,26 @@ class RoomTunnelRepository( } override suspend fun findByTunnelName(name: String): TunnelConf? { - return withContext(ioDispatcher) { tunnelConfigDao.getByName(name)?.toTunnel() } + return withContext(ioDispatcher) { + tunnelConfigDao.getByName(name)?.let(TunnelConfigMapper::toTunnelConf) + } } override suspend fun findByTunnelNetworksName(name: String): Tunnels { return withContext(ioDispatcher) { - tunnelConfigDao.findByTunnelNetworkName(name).map { it.toTunnel() } + tunnelConfigDao.findByTunnelNetworkName(name).map(TunnelConfigMapper::toTunnelConf) } } override suspend fun findByMobileDataTunnel(): Tunnels { return withContext(ioDispatcher) { - tunnelConfigDao.findByMobileDataTunnel().map { it.toTunnel() } + tunnelConfigDao.findByMobileDataTunnel().map(TunnelConfigMapper::toTunnelConf) } } override suspend fun findPrimary(): Tunnels { - return withContext(ioDispatcher) { tunnelConfigDao.findByPrimary().map { it.toTunnel() } } + return withContext(ioDispatcher) { + tunnelConfigDao.findByPrimary().map(TunnelConfigMapper::toTunnelConf) + } } } diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/di/TunnelModule.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/di/TunnelModule.kt index da2fd202..25fe1f91 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/di/TunnelModule.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/di/TunnelModule.kt @@ -113,9 +113,11 @@ class TunnelModule { @ApplicationContext context: Context, settingsRepository: AppSettingRepository, ): NetworkMonitor { - return AndroidNetworkMonitor(context) { - runBlocking { settingsRepository.get().isWifiNameByShellEnabled } - } + val method = runBlocking { settingsRepository.get().wifiDetectionMethod } + return AndroidNetworkMonitor( + context, + AndroidNetworkMonitor.WifiDetectionMethod.fromValue(method.value), + ) } @Singleton diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/events/AutoTunnelEvent.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/events/AutoTunnelEvent.kt index 948308d3..a6aa36d6 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/events/AutoTunnelEvent.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/events/AutoTunnelEvent.kt @@ -1,6 +1,6 @@ package com.zaneschepke.wireguardautotunnel.domain.events -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf sealed class AutoTunnelEvent { data class Start(val tunnelConf: TunnelConf? = null) : AutoTunnelEvent() diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/entity/AppSettings.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/model/AppSettings.kt similarity index 80% rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/entity/AppSettings.kt rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/model/AppSettings.kt index 430bffd8..36282028 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/entity/AppSettings.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/model/AppSettings.kt @@ -1,4 +1,6 @@ -package com.zaneschepke.wireguardautotunnel.domain.entity +package com.zaneschepke.wireguardautotunnel.domain.model + +import com.zaneschepke.networkmonitor.AndroidNetworkMonitor data class AppSettings( val id: Int = 0, @@ -15,13 +17,16 @@ data class AppSettings( val isPingEnabled: Boolean = false, val isAmneziaEnabled: Boolean = false, val isWildcardsEnabled: Boolean = false, - val isWifiNameByShellEnabled: Boolean = false, val isStopOnNoInternetEnabled: Boolean = false, val isVpnKillSwitchEnabled: Boolean = false, val isKernelKillSwitchEnabled: Boolean = false, val isLanOnKillSwitchEnabled: Boolean = false, val debounceDelaySeconds: Int = 3, val isDisableKillSwitchOnTrustedEnabled: Boolean = false, + val isTunnelOnUnsecureEnabled: Boolean = false, + val splitTunnelApps: List = emptyList(), + val wifiDetectionMethod: AndroidNetworkMonitor.WifiDetectionMethod = + AndroidNetworkMonitor.WifiDetectionMethod.DEFAULT, ) { fun debounceDelayMillis(): Long { return debounceDelaySeconds * 1000L diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/entity/AppState.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/model/AppState.kt similarity index 87% rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/entity/AppState.kt rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/model/AppState.kt index 566bc452..601b110b 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/entity/AppState.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/model/AppState.kt @@ -1,4 +1,4 @@ -package com.zaneschepke.wireguardautotunnel.domain.entity +package com.zaneschepke.wireguardautotunnel.domain.model import com.zaneschepke.wireguardautotunnel.ui.theme.Theme diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/entity/AppUpdate.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/model/AppUpdate.kt similarity index 73% rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/entity/AppUpdate.kt rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/model/AppUpdate.kt index b1d9cb38..241a4e2f 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/entity/AppUpdate.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/model/AppUpdate.kt @@ -1,4 +1,4 @@ -package com.zaneschepke.wireguardautotunnel.domain.entity +package com.zaneschepke.wireguardautotunnel.domain.model data class AppUpdate( val version: String, diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/entity/TunnelConf.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/model/TunnelConf.kt similarity index 99% rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/entity/TunnelConf.kt rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/model/TunnelConf.kt index 3c24c7eb..7f410f7d 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/entity/TunnelConf.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/model/TunnelConf.kt @@ -1,4 +1,4 @@ -package com.zaneschepke.wireguardautotunnel.domain.entity +package com.zaneschepke.wireguardautotunnel.domain.model import com.wireguard.android.backend.Tunnel import com.wireguard.config.Config diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/AppDataRepository.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/AppDataRepository.kt index ec2d83ea..263803e0 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/AppDataRepository.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/AppDataRepository.kt @@ -1,6 +1,6 @@ package com.zaneschepke.wireguardautotunnel.domain.repository -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf interface AppDataRepository { suspend fun getPrimaryOrFirstTunnel(): TunnelConf? diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/AppSettingRepository.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/AppSettingRepository.kt index d75c558b..eecc086e 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/AppSettingRepository.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/AppSettingRepository.kt @@ -1,6 +1,6 @@ package com.zaneschepke.wireguardautotunnel.domain.repository -import com.zaneschepke.wireguardautotunnel.domain.entity.AppSettings +import com.zaneschepke.wireguardautotunnel.domain.model.AppSettings import kotlinx.coroutines.flow.Flow interface AppSettingRepository { diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/AppStateRepository.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/AppStateRepository.kt index 3f25db46..26f9d535 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/AppStateRepository.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/AppStateRepository.kt @@ -1,6 +1,6 @@ package com.zaneschepke.wireguardautotunnel.domain.repository -import com.zaneschepke.wireguardautotunnel.domain.entity.AppState +import com.zaneschepke.wireguardautotunnel.domain.model.AppState import com.zaneschepke.wireguardautotunnel.ui.theme.Theme import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/TunnelRepository.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/TunnelRepository.kt index 55c8a38e..bdcffd59 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/TunnelRepository.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/TunnelRepository.kt @@ -1,6 +1,6 @@ package com.zaneschepke.wireguardautotunnel.domain.repository -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.util.extensions.Tunnels import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/UpdateRepository.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/UpdateRepository.kt index 031b0b9a..efdbfb8d 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/UpdateRepository.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository/UpdateRepository.kt @@ -1,6 +1,6 @@ package com.zaneschepke.wireguardautotunnel.domain.repository -import com.zaneschepke.wireguardautotunnel.domain.entity.AppUpdate +import com.zaneschepke.wireguardautotunnel.domain.model.AppUpdate import java.io.File interface UpdateRepository { diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/state/AutoTunnelState.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/state/AutoTunnelState.kt index 1083ee41..314a40d9 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/state/AutoTunnelState.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/state/AutoTunnelState.kt @@ -3,10 +3,10 @@ package com.zaneschepke.wireguardautotunnel.domain.state import com.zaneschepke.wireguardautotunnel.core.tunnel.allDown import com.zaneschepke.wireguardautotunnel.core.tunnel.hasActive import com.zaneschepke.wireguardautotunnel.core.tunnel.isUp -import com.zaneschepke.wireguardautotunnel.domain.entity.AppSettings -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.events.AutoTunnelEvent import com.zaneschepke.wireguardautotunnel.domain.events.KillSwitchEvent +import com.zaneschepke.wireguardautotunnel.domain.model.AppSettings +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.util.extensions.isMatchingToWildcardList data class AutoTunnelState( diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Route.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Route.kt index 293e4832..044673ce 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Route.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Route.kt @@ -13,6 +13,8 @@ sealed class Route { @Serializable data object AutoTunnelAdvanced : Route() + @Serializable data object WifiDetectionMethod : Route() + @Serializable data object LocationDisclosure : Route() @Serializable data object Appearance : Route() diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/button/IconSurfaceButton.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/button/IconSurfaceButton.kt index f0968377..ca574c75 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/button/IconSurfaceButton.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/button/IconSurfaceButton.kt @@ -73,7 +73,7 @@ fun IconSurfaceButton( else MaterialTheme.colorScheme.onSurface, ) } - Column { + Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { Text(title, style = MaterialTheme.typography.titleMedium) description?.let { Text( diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components/currentNavBackStackEntryAsNavBarState.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components/currentNavBackStackEntryAsNavBarState.kt index d9995667..f9831327 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components/currentNavBackStackEntryAsNavBarState.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components/currentNavBackStackEntryAsNavBarState.kt @@ -188,6 +188,14 @@ fun currentNavBackStackEntryAsNavBarState( route = Route.Display, ) + backStackEntry.isCurrentRoute(Route.WifiDetectionMethod::class) -> + NavBarState( + showTop = true, + showBottom = true, + topTitle = { Text(stringResource(R.string.wifi_detection_method)) }, + route = Route.WifiDetectionMethod, + ) + backStackEntry.isCurrentRoute(Route.KillSwitch::class) -> NavBarState( showTop = true, diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/autotunnel/components/WifiTunnelingItems.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/autotunnel/components/WifiTunnelingItems.kt index 8e729bf9..e9e6f7ff 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/autotunnel/components/WifiTunnelingItems.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/autotunnel/components/WifiTunnelingItems.kt @@ -1,18 +1,9 @@ package com.zaneschepke.wireguardautotunnel.ui.screens.autotunnel.components import androidx.compose.foundation.clickable -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.foundation.layout.size +import androidx.compose.foundation.layout.* import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.Code -import androidx.compose.material.icons.outlined.Filter1 -import androidx.compose.material.icons.outlined.Security -import androidx.compose.material.icons.outlined.VpnKeyOff -import androidx.compose.material.icons.outlined.Wifi +import androidx.compose.material.icons.outlined.* import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -26,14 +17,19 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +import com.zaneschepke.networkmonitor.AndroidNetworkMonitor import com.zaneschepke.networkmonitor.NetworkStatus import com.zaneschepke.wireguardautotunnel.R +import com.zaneschepke.wireguardautotunnel.ui.Route +import com.zaneschepke.wireguardautotunnel.ui.common.button.ForwardButton import com.zaneschepke.wireguardautotunnel.ui.common.button.ScaledSwitch import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionItem import com.zaneschepke.wireguardautotunnel.ui.common.functions.rememberClipboardHelper +import com.zaneschepke.wireguardautotunnel.ui.navigation.LocalNavController import com.zaneschepke.wireguardautotunnel.ui.screens.settings.components.LearnMoreLinkLabel import com.zaneschepke.wireguardautotunnel.ui.state.AppUiState import com.zaneschepke.wireguardautotunnel.ui.theme.iconSize +import com.zaneschepke.wireguardautotunnel.util.extensions.asString import com.zaneschepke.wireguardautotunnel.util.extensions.openWebUrl import com.zaneschepke.wireguardautotunnel.viewmodel.AppViewModel import com.zaneschepke.wireguardautotunnel.viewmodel.event.AppEvent @@ -47,6 +43,7 @@ fun WifiTunnelingItems( isWifiNameReadable: () -> Boolean, ): List { val context = LocalContext.current + val navController = LocalNavController.current val clipboardHelper = rememberClipboardHelper() val baseItems = @@ -107,40 +104,40 @@ fun WifiTunnelingItems( } }, onClick = { viewModel.handleEvent(AppEvent.ToggleAutoTunnelOnWifi) }, - ), - SelectionItem( - leadingIcon = Icons.Outlined.Code, - title = { - Text( - stringResource(R.string.wifi_name_via_shell), - style = - MaterialTheme.typography.bodyMedium.copy( - MaterialTheme.colorScheme.onSurface - ), - ) - }, - description = { - Text( - stringResource(R.string.use_root_shell_for_wifi), - style = - MaterialTheme.typography.bodySmall.copy( - MaterialTheme.colorScheme.outline - ), - ) - }, - trailing = { - ScaledSwitch( - checked = uiState.appSettings.isWifiNameByShellEnabled, - onClick = { viewModel.handleEvent(AppEvent.ToggleRootShellWifi) }, - ) - }, - onClick = { viewModel.handleEvent(AppEvent.ToggleRootShellWifi) }, - ), + ) ) return if (uiState.appSettings.isTunnelOnWifiEnabled) { baseItems + listOf( + SelectionItem( + leadingIcon = Icons.Outlined.WifiFind, + title = { + Text( + stringResource(R.string.wifi_detection_method), + style = + MaterialTheme.typography.bodyMedium.copy( + MaterialTheme.colorScheme.onSurface + ), + ) + }, + description = { + Text( + stringResource( + R.string.current_template, + uiState.appSettings.wifiDetectionMethod.asString(context), + ), + style = + MaterialTheme.typography.bodySmall.copy( + MaterialTheme.colorScheme.outline + ), + ) + }, + trailing = { + ForwardButton { navController.navigate(Route.WifiDetectionMethod) } + }, + onClick = { navController.navigate(Route.WifiDetectionMethod) }, + ), SelectionItem( leadingIcon = Icons.Outlined.Filter1, title = { @@ -205,7 +202,8 @@ fun WifiTunnelingItems( currentText = currentText, onSave = { ssid -> if ( - uiState.appSettings.isWifiNameByShellEnabled || + uiState.appSettings.wifiDetectionMethod == + AndroidNetworkMonitor.WifiDetectionMethod.ROOT || isWifiNameReadable() ) { viewModel.handleEvent(AppEvent.SaveTrustedSSID(ssid)) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/autotunnel/detection/WifiDetectionMethodScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/autotunnel/detection/WifiDetectionMethodScreen.kt new file mode 100644 index 00000000..00f0bf57 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/autotunnel/detection/WifiDetectionMethodScreen.kt @@ -0,0 +1,41 @@ +package com.zaneschepke.wireguardautotunnel.ui.screens.autotunnel.detection + +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.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import com.zaneschepke.networkmonitor.AndroidNetworkMonitor +import com.zaneschepke.wireguardautotunnel.ui.common.button.IconSurfaceButton +import com.zaneschepke.wireguardautotunnel.ui.state.AppUiState +import com.zaneschepke.wireguardautotunnel.util.extensions.asDescriptionString +import com.zaneschepke.wireguardautotunnel.util.extensions.asString +import com.zaneschepke.wireguardautotunnel.viewmodel.AppViewModel +import com.zaneschepke.wireguardautotunnel.viewmodel.event.AppEvent + +@Composable +fun WifiDetectionMethodScreen(uiState: AppUiState, viewModel: AppViewModel) { + val context = LocalContext.current + Column( + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.spacedBy(24.dp, Alignment.Top), + modifier = Modifier.fillMaxSize().padding(top = 24.dp).padding(horizontal = 24.dp), + ) { + enumValues().forEach { + val title = it.asString(context) + val description = it.asDescriptionString(context) + // TODO skip shizuku for now + if (it == AndroidNetworkMonitor.WifiDetectionMethod.SHIZUKU) return@forEach + IconSurfaceButton( + title = title, + onClick = { viewModel.handleEvent(AppEvent.SetDetectionMethod(it)) }, + selected = uiState.appSettings.wifiDetectionMethod == it, + description = description, + ) + } + } +} diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/autotunnel/TunnelAutoTunnelScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/autotunnel/TunnelAutoTunnelScreen.kt index c3948835..2e4366bf 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/autotunnel/TunnelAutoTunnelScreen.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/autotunnel/TunnelAutoTunnelScreen.kt @@ -15,8 +15,8 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import com.zaneschepke.wireguardautotunnel.domain.entity.AppSettings -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.AppSettings +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SurfaceSelectionGroupButton import com.zaneschepke.wireguardautotunnel.ui.screens.main.autotunnel.components.EthernetTunnelItem import com.zaneschepke.wireguardautotunnel.ui.screens.main.autotunnel.components.MobileDataTunnelItem diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/autotunnel/components/EthernetTunnelItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/autotunnel/components/EthernetTunnelItem.kt index 8250ae0e..a26982a3 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/autotunnel/components/EthernetTunnelItem.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/autotunnel/components/EthernetTunnelItem.kt @@ -7,7 +7,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import com.zaneschepke.wireguardautotunnel.R -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.ui.common.button.ScaledSwitch import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionItem import com.zaneschepke.wireguardautotunnel.viewmodel.AppViewModel diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/autotunnel/components/MobileDataTunnelItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/autotunnel/components/MobileDataTunnelItem.kt index cefdc34b..e08c8ea8 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/autotunnel/components/MobileDataTunnelItem.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/autotunnel/components/MobileDataTunnelItem.kt @@ -7,7 +7,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import com.zaneschepke.wireguardautotunnel.R -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.ui.common.button.ScaledSwitch import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionItem import com.zaneschepke.wireguardautotunnel.viewmodel.AppViewModel diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/autotunnel/components/WifiTunnelItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/autotunnel/components/WifiTunnelItem.kt index ae65f582..6bc96bc1 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/autotunnel/components/WifiTunnelItem.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/autotunnel/components/WifiTunnelItem.kt @@ -16,8 +16,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.zaneschepke.wireguardautotunnel.R -import com.zaneschepke.wireguardautotunnel.domain.entity.AppSettings -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.AppSettings +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionItem import com.zaneschepke.wireguardautotunnel.ui.screens.autotunnel.components.TrustedNetworkTextBox import com.zaneschepke.wireguardautotunnel.ui.screens.autotunnel.components.WildcardsLabel diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelList.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelList.kt index 8729d41e..1303e2e0 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelList.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelList.kt @@ -16,7 +16,7 @@ import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import com.zaneschepke.wireguardautotunnel.core.tunnel.getValueById -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState import com.zaneschepke.wireguardautotunnel.ui.Route import com.zaneschepke.wireguardautotunnel.ui.navigation.LocalIsAndroidTV diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelRowItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelRowItem.kt index 0c896216..66c01122 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelRowItem.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelRowItem.kt @@ -22,7 +22,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.zaneschepke.wireguardautotunnel.R -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState import com.zaneschepke.wireguardautotunnel.ui.common.ExpandingRowListItem import com.zaneschepke.wireguardautotunnel.ui.common.button.ScaledSwitch diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelStatisticsRow.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelStatisticsRow.kt index 34a0d5f0..106f9588 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelStatisticsRow.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/components/TunnelStatisticsRow.kt @@ -16,7 +16,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.zaneschepke.wireguardautotunnel.R -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.state.TunnelStatistics import com.zaneschepke.wireguardautotunnel.util.NumberUtils import com.zaneschepke.wireguardautotunnel.util.extensions.toThreeDecimalPlaceString diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/config/ConfigScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/config/ConfigScreen.kt index ee9a9f74..b9f106e3 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/config/ConfigScreen.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/config/ConfigScreen.kt @@ -20,7 +20,7 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.zaneschepke.wireguardautotunnel.MainActivity import com.zaneschepke.wireguardautotunnel.R -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.ui.common.prompt.AuthorizationPrompt import com.zaneschepke.wireguardautotunnel.ui.screens.main.config.components.AddPeerButton import com.zaneschepke.wireguardautotunnel.ui.screens.main.config.components.InterfaceSection diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/config/ConfigViewModel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/config/ConfigViewModel.kt index 21f429e8..92a3fc34 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/config/ConfigViewModel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/config/ConfigViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.zaneschepke.wireguardautotunnel.R import com.zaneschepke.wireguardautotunnel.di.IoDispatcher -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository import com.zaneschepke.wireguardautotunnel.ui.screens.main.config.state.ConfigUiState import com.zaneschepke.wireguardautotunnel.ui.state.ConfigProxy diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/splittunnel/SplitTunnelViewModel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/splittunnel/SplitTunnelViewModel.kt index 56109e20..95dceffe 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/splittunnel/SplitTunnelViewModel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/splittunnel/SplitTunnelViewModel.kt @@ -4,7 +4,7 @@ import android.content.Context import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.repository.TunnelRepository import com.zaneschepke.wireguardautotunnel.ui.Route import com.zaneschepke.wireguardautotunnel.ui.screens.main.splittunnel.state.SplitOption diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/splittunnel/state/SplitTunnelUiState.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/splittunnel/state/SplitTunnelUiState.kt index 549bc2e9..571fa8b2 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/splittunnel/state/SplitTunnelUiState.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/splittunnel/state/SplitTunnelUiState.kt @@ -1,6 +1,6 @@ package com.zaneschepke.wireguardautotunnel.ui.screens.main.splittunnel.state -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf data class SplitTunnelUiState( val loading: Boolean = true, diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/TunnelOptionsScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/TunnelOptionsScreen.kt index 153e4118..56d74029 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/TunnelOptionsScreen.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/TunnelOptionsScreen.kt @@ -10,7 +10,7 @@ import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.ui.common.SectionDivider import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SurfaceSelectionGroupButton import com.zaneschepke.wireguardautotunnel.ui.navigation.LocalIsAndroidTV diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/AutoTunnelingItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/AutoTunnelingItem.kt index aa03c7a8..b72949f8 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/AutoTunnelingItem.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/AutoTunnelingItem.kt @@ -7,7 +7,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import com.zaneschepke.wireguardautotunnel.R -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.ui.Route import com.zaneschepke.wireguardautotunnel.ui.common.button.ForwardButton import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionItem diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/PingConfigItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/PingConfigItem.kt index 292d615d..11b8a58a 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/PingConfigItem.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/PingConfigItem.kt @@ -9,7 +9,7 @@ import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import com.zaneschepke.wireguardautotunnel.R -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionItem import com.zaneschepke.wireguardautotunnel.ui.common.config.SubmitConfigurationTextBox import com.zaneschepke.wireguardautotunnel.util.Constants diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/PingRestartItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/PingRestartItem.kt index ab21a667..ed771e56 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/PingRestartItem.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/PingRestartItem.kt @@ -7,7 +7,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import com.zaneschepke.wireguardautotunnel.R -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.ui.common.button.ScaledSwitch import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionItem import com.zaneschepke.wireguardautotunnel.viewmodel.AppViewModel diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/PrimaryTunnelItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/PrimaryTunnelItem.kt index f2171f8b..058d7236 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/PrimaryTunnelItem.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/PrimaryTunnelItem.kt @@ -7,7 +7,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import com.zaneschepke.wireguardautotunnel.R -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.ui.common.button.ScaledSwitch import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionItem import com.zaneschepke.wireguardautotunnel.viewmodel.AppViewModel diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/QrCodeDialog.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/QrCodeDialog.kt index 0b2cddb9..64c948fb 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/QrCodeDialog.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/QrCodeDialog.kt @@ -35,8 +35,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogProperties import com.zaneschepke.wireguardautotunnel.MainActivity import com.zaneschepke.wireguardautotunnel.R -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.enums.ConfigType +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.util.extensions.setScreenBrightness import io.github.alexzhirkevich.qrose.options.QrBallShape import io.github.alexzhirkevich.qrose.options.QrBrush diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/ServerIpv4Item.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/ServerIpv4Item.kt index 3d54bc89..3a702446 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/ServerIpv4Item.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/ServerIpv4Item.kt @@ -7,7 +7,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import com.zaneschepke.wireguardautotunnel.R -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.ui.common.button.ScaledSwitch import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionItem import com.zaneschepke.wireguardautotunnel.viewmodel.AppViewModel diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/SplitTunnelingItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/SplitTunnelingItem.kt index 54869cf5..80b96bee 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/SplitTunnelingItem.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/tunneloptions/components/SplitTunnelingItem.kt @@ -7,7 +7,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import com.zaneschepke.wireguardautotunnel.R -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.ui.Route import com.zaneschepke.wireguardautotunnel.ui.common.button.ForwardButton import com.zaneschepke.wireguardautotunnel.ui.common.button.surface.SelectionItem diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportUiState.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportUiState.kt index 6552bc17..fc94a0e4 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportUiState.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportUiState.kt @@ -1,6 +1,6 @@ package com.zaneschepke.wireguardautotunnel.ui.screens.support -import com.zaneschepke.wireguardautotunnel.domain.entity.AppUpdate +import com.zaneschepke.wireguardautotunnel.domain.model.AppUpdate import com.zaneschepke.wireguardautotunnel.util.StringValue data class SupportUiState( diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportViewModel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportViewModel.kt index e666ff99..66deb887 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportViewModel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.zaneschepke.wireguardautotunnel.BuildConfig import com.zaneschepke.wireguardautotunnel.R -import com.zaneschepke.wireguardautotunnel.domain.entity.AppUpdate +import com.zaneschepke.wireguardautotunnel.domain.model.AppUpdate import com.zaneschepke.wireguardautotunnel.domain.repository.UpdateRepository import com.zaneschepke.wireguardautotunnel.util.FileUtils import com.zaneschepke.wireguardautotunnel.util.StringValue diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state/AppUiState.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state/AppUiState.kt index afd9a9cd..468aaa79 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state/AppUiState.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state/AppUiState.kt @@ -1,17 +1,18 @@ package com.zaneschepke.wireguardautotunnel.ui.state import com.zaneschepke.networkmonitor.NetworkStatus -import com.zaneschepke.wireguardautotunnel.data.model.GeneralState -import com.zaneschepke.wireguardautotunnel.domain.entity.AppSettings -import com.zaneschepke.wireguardautotunnel.domain.entity.AppState -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.data.entity.GeneralState +import com.zaneschepke.wireguardautotunnel.data.mapper.GeneralStateMapper +import com.zaneschepke.wireguardautotunnel.domain.model.AppSettings +import com.zaneschepke.wireguardautotunnel.domain.model.AppState +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState data class AppUiState( val appSettings: AppSettings = AppSettings(), val tunnels: List = emptyList(), val activeTunnels: Map = emptyMap(), - val appState: AppState = GeneralState().toAppState(), + val appState: AppState = GeneralStateMapper.toAppState(GeneralState()), val isAutoTunnelActive: Boolean = false, val appConfigurationChange: Boolean = false, val isAppLoaded: Boolean = false, diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state/AppViewState.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state/AppViewState.kt index fe66588f..e0bd2c93 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state/AppViewState.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state/AppViewState.kt @@ -1,6 +1,6 @@ package com.zaneschepke.wireguardautotunnel.ui.state -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.util.StringValue data class AppViewState( diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state/PeerProxy.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state/PeerProxy.kt index 64d8b707..7e04b0d4 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state/PeerProxy.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state/PeerProxy.kt @@ -1,7 +1,7 @@ package com.zaneschepke.wireguardautotunnel.ui.state import com.wireguard.config.Peer -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.util.extensions.joinAndTrim data class PeerProxy( diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/FileUtils.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/FileUtils.kt index 3ca6d4dd..440ed159 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/FileUtils.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/FileUtils.kt @@ -10,8 +10,8 @@ import android.provider.OpenableColumns import androidx.annotation.RequiresApi import androidx.core.content.FileProvider import com.zaneschepke.wireguardautotunnel.R -import com.zaneschepke.wireguardautotunnel.data.model.TunnelConfig -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.data.entity.TunnelConfig +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.util.extensions.getInputStreamFromUri import com.zaneschepke.wireguardautotunnel.util.extensions.installApk import com.zaneschepke.wireguardautotunnel.util.extensions.launchShareFile diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/extensions/Extensions.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/extensions/Extensions.kt index 9f08c8a7..9395b94f 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/extensions/Extensions.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/extensions/Extensions.kt @@ -1,8 +1,8 @@ package com.zaneschepke.wireguardautotunnel.util.extensions import android.content.pm.PackageInfo -import com.zaneschepke.wireguardautotunnel.data.model.TunnelConfig -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.wireguardautotunnel.data.entity.TunnelConfig +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import java.math.BigDecimal import java.text.DecimalFormat diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/extensions/UiExtensions.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/extensions/UiExtensions.kt index 69d73b5e..dd7702ac 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/extensions/UiExtensions.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/util/extensions/UiExtensions.kt @@ -1,6 +1,9 @@ package com.zaneschepke.wireguardautotunnel.util.extensions +import android.content.Context import androidx.navigation.NavController +import com.zaneschepke.networkmonitor.AndroidNetworkMonitor +import com.zaneschepke.wireguardautotunnel.R import com.zaneschepke.wireguardautotunnel.ui.Route import com.zaneschepke.wireguardautotunnel.ui.navigation.isCurrentRoute @@ -11,3 +14,25 @@ fun NavController.goFromRoot(route: Route) { launchSingleTop = true } } + +fun AndroidNetworkMonitor.WifiDetectionMethod.asString(context: Context): String { + return when (this) { + AndroidNetworkMonitor.WifiDetectionMethod.DEFAULT -> context.getString(R.string._default) + AndroidNetworkMonitor.WifiDetectionMethod.LEGACY -> context.getString(R.string.legacy) + AndroidNetworkMonitor.WifiDetectionMethod.ROOT -> context.getString(R.string.root) + AndroidNetworkMonitor.WifiDetectionMethod.SHIZUKU -> context.getString(R.string.shizuku) + } +} + +fun AndroidNetworkMonitor.WifiDetectionMethod.asDescriptionString(context: Context): String? { + return when (this) { + AndroidNetworkMonitor.WifiDetectionMethod.LEGACY -> + context.getString(R.string.legacy_api_description) + AndroidNetworkMonitor.WifiDetectionMethod.ROOT -> + context.getString(R.string.use_root_shell_for_wifi) + AndroidNetworkMonitor.WifiDetectionMethod.SHIZUKU -> + context.getString(R.string.use_shell_via_shizuku) + AndroidNetworkMonitor.WifiDetectionMethod.DEFAULT -> + context.getString(R.string.use_android_recommended) + } +} 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 0b8ad65e..7a473212 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/AppViewModel.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/AppViewModel.kt @@ -8,6 +8,7 @@ import com.wireguard.android.backend.WgQuickBackend import com.wireguard.android.util.RootShell import com.zaneschepke.logcatter.LogReader import com.zaneschepke.logcatter.model.LogMessage +import com.zaneschepke.networkmonitor.AndroidNetworkMonitor import com.zaneschepke.networkmonitor.NetworkMonitor import com.zaneschepke.networkmonitor.NetworkStatus import com.zaneschepke.wireguardautotunnel.R @@ -18,11 +19,11 @@ import com.zaneschepke.wireguardautotunnel.core.tunnel.TunnelManager import com.zaneschepke.wireguardautotunnel.di.AppShell import com.zaneschepke.wireguardautotunnel.di.IoDispatcher import com.zaneschepke.wireguardautotunnel.di.MainDispatcher -import com.zaneschepke.wireguardautotunnel.domain.entity.AppSettings -import com.zaneschepke.wireguardautotunnel.domain.entity.AppState -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.enums.BackendState import com.zaneschepke.wireguardautotunnel.domain.enums.ConfigType +import com.zaneschepke.wireguardautotunnel.domain.model.AppSettings +import com.zaneschepke.wireguardautotunnel.domain.model.AppState +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.domain.repository.AppDataRepository import com.zaneschepke.wireguardautotunnel.domain.state.TunnelState import com.zaneschepke.wireguardautotunnel.ui.state.AppUiState @@ -177,7 +178,6 @@ constructor( handleDeleteTrustedSSID(event.ssid, state.appSettings) AppEvent.ToggleAutoTunnelWildcards -> handleToggleAutoTunnelWildcards(state.appSettings) - AppEvent.ToggleRootShellWifi -> handleToggleRootShellWifi(state.appSettings) is AppEvent.SaveTrustedSSID -> handleSaveTrustedSSID(event.ssid, state.appSettings) AppEvent.ToggleAutoTunnelOnEthernet -> @@ -210,10 +210,31 @@ constructor( AppEvent.ClearSelectedTunnels -> clearSelectedTunnels() is AppEvent.SetShowModal -> _appViewState.update { it.copy(showModal = event.modalType) } + + is AppEvent.SetDetectionMethod -> + handleSetDetectionMethod(event.detectionMethod, state.appSettings) } } } + private suspend fun handleSetDetectionMethod( + detectionMethod: AndroidNetworkMonitor.WifiDetectionMethod, + appSettings: AppSettings, + ) { + if (detectionMethod == appSettings.wifiDetectionMethod) return + when (detectionMethod) { + AndroidNetworkMonitor.WifiDetectionMethod.ROOT -> { + val allowed = requestRoot() + if (!allowed) return + } + // TODO check if shizuku available + AndroidNetworkMonitor.WifiDetectionMethod.SHIZUKU -> Unit + else -> Unit + } + saveSettings(appSettings.copy(wifiDetectionMethod = detectionMethod)) + handleShowMessage(StringValue.StringResource(R.string.app_restart_required)) + } + private fun handleToggleSelectAllTunnels(tunnels: List) = _appViewState.update { it -> val remove = tunnels.size == it.selectedTunnels.size @@ -264,6 +285,7 @@ constructor( } } + // TODO private fun handleTunnelErrors() = viewModelScope.launch { tunnelManager.errorEvents.collect { errorEvent -> } } @@ -630,14 +652,6 @@ constructor( ) ) - private suspend fun handleToggleRootShellWifi(appSettings: AppSettings) { - if (requestRoot()) { - saveSettings( - appSettings.copy(isWifiNameByShellEnabled = !appSettings.isWifiNameByShellEnabled) - ) - } - } - private suspend fun handleToggleTunnelOnEthernet(appSettings: AppSettings) = saveSettings( appSettings.copy(isTunnelOnEthernetEnabled = !appSettings.isTunnelOnEthernetEnabled) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/event/AppEvent.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/event/AppEvent.kt index fa12ccc7..6a28a6c6 100644 --- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/event/AppEvent.kt +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/event/AppEvent.kt @@ -1,8 +1,9 @@ package com.zaneschepke.wireguardautotunnel.viewmodel.event import android.net.Uri -import com.zaneschepke.wireguardautotunnel.domain.entity.TunnelConf +import com.zaneschepke.networkmonitor.AndroidNetworkMonitor import com.zaneschepke.wireguardautotunnel.domain.enums.ConfigType +import com.zaneschepke.wireguardautotunnel.domain.model.TunnelConf import com.zaneschepke.wireguardautotunnel.ui.state.AppViewState import com.zaneschepke.wireguardautotunnel.ui.theme.Theme import com.zaneschepke.wireguardautotunnel.util.StringValue @@ -78,6 +79,9 @@ sealed class AppEvent { data class SetTheme(val theme: Theme) : AppEvent() + data class SetDetectionMethod(val detectionMethod: AndroidNetworkMonitor.WifiDetectionMethod) : + AppEvent() + data object ToggleAutoTunnelOnWifi : AppEvent() data object ToggleAutoTunnelOnCellular : AppEvent() @@ -90,8 +94,6 @@ sealed class AppEvent { data object ToggleAutoTunnelWildcards : AppEvent() - data object ToggleRootShellWifi : AppEvent() - data class DeleteTrustedSSID(val ssid: String) : AppEvent() data class SaveTrustedSSID(val ssid: String) : AppEvent() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0cb952d4..1ce43ca2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -152,7 +152,7 @@ Learn more Wildcards active Wifi name via shell - Use root shell to get wifi name + Use a root shell to get Wi-Fi information, preventing the need for location permissions Kernel not supported Start auto-tunnel Stop auto-tunnel @@ -222,6 +222,7 @@ Key: %1$s Version: %1$s Security: %1$s + Current: %1$s Flavor: %1$s config error dns resolution error @@ -262,4 +263,20 @@ Amnezia WireGuard Done + Use deprecated Wi-Fi API + App restart required + Wi-Fi detection method + Default + Legacy + Root + Shizuku + Use an Android 12 deprecated method for getting Wi-Fi information that limits + location queries, but may not work reliably on newer devices + + Use shell via Shizuku to get Wi-Fi information, preventing the need for + location permission on non-rooted devices + + Use Android\'s recommended method for getting Wi-Fi information, based on + Android version + diff --git a/gradle.properties b/gradle.properties index 107c4b29..9454e59a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx8g -XX:MaxMetaspaceSize=2g -XX:+HeapDumpOnOutOfMemoryError # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d4a3b8dc..2662196e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -26,7 +26,7 @@ timber = "5.0.1" tunnel = "1.3.0" androidGradlePlugin = "8.10.1" kotlin = "2.1.21" -ksp = "2.1.21-2.0.1" +ksp = "2.1.21-2.0.2" composeBom = "2025.06.00" compose = "1.8.2" icons = "1.7.8" diff --git a/networkmonitor/src/main/java/com/zaneschepke/networkmonitor/AndroidNetworkMonitor.kt b/networkmonitor/src/main/java/com/zaneschepke/networkmonitor/AndroidNetworkMonitor.kt index 47316437..1d73efb6 100644 --- a/networkmonitor/src/main/java/com/zaneschepke/networkmonitor/AndroidNetworkMonitor.kt +++ b/networkmonitor/src/main/java/com/zaneschepke/networkmonitor/AndroidNetworkMonitor.kt @@ -12,7 +12,6 @@ import android.net.NetworkRequest import android.net.wifi.WifiManager import android.os.Build import com.wireguard.android.util.RootShell -import java.util.Collections import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.awaitClose @@ -21,19 +20,31 @@ import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext import timber.log.Timber -class AndroidNetworkMonitor( - context: Context, - private val useRootShellCallback: suspend () -> Boolean, -) : NetworkMonitor { +class AndroidNetworkMonitor(context: Context, val wifiDetectionMethod: WifiDetectionMethod) : + NetworkMonitor { companion object { const val LOCATION_GRANTED = "LOCATION_PERMISSIONS_GRANTED" const val LOCATION_SERVICES_FILTER = "android.location.PROVIDERS_CHANGED" } + enum class WifiDetectionMethod(val value: Int) { + DEFAULT(0), + LEGACY(1), + ROOT(2), + SHIZUKU(3); + + companion object { + fun fromValue(value: Int): WifiDetectionMethod = + WifiDetectionMethod.entries.find { it.value == value } ?: DEFAULT + } + } + private val appContext = context.applicationContext private val packageName = appContext.packageName private val connectivityManager = @@ -43,15 +54,17 @@ class AndroidNetworkMonitor( appContext.getSystemService(Context.LOCATION_SERVICE) as LocationManager private val rootShell = RootShell(context) + private val wifiMutex = Mutex() + private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO - @get:Synchronized @set:Synchronized var currentSsid: String? = null - @get:Synchronized @set:Synchronized var securityType: WifiSecurityType? = null + private var currentSsid: String? = null + private var securityType: WifiSecurityType? = null - @get:Synchronized @set:Synchronized var wifiConnected = false + private var wifiConnected = false // Track active Wi-Fi networks and last active network ID - private val activeNetworks = Collections.synchronizedSet(mutableSetOf()) + private val activeWifiNetworks = mutableSetOf() data class WifiState( val connected: Boolean = false, @@ -65,30 +78,28 @@ class AndroidNetworkMonitor( @Suppress("DEPRECATION") suspend fun getWifiSsid(): String? { return withContext(ioDispatcher) { - if (useRootShellCallback()) { - rootShell.getCurrentWifiName() - } else { - if (wifiManager == null) return@withContext null - try { - wifiManager.connectionInfo?.ssid?.trim('"')?.takeIf { it.isNotEmpty() } - } catch (e: Exception) { - Timber.e(e) - null - } + if (wifiManager == null) return@withContext null + try { + wifiManager.connectionInfo?.ssid?.trim('"')?.takeIf { it.isNotEmpty() } + } catch (e: Exception) { + Timber.e(e) + null } } } suspend fun handleUnknownWifi() { - val newSsid = getWifiSsid() - val securityType = wifiManager?.getCurrentSecurityType() - // Only update if new SSID is valid; preserve existing valid SSID otherwise - if (newSsid != null && newSsid != WifiManager.UNKNOWN_SSID) { - currentSsid = newSsid - trySend(WifiState(wifiConnected, currentSsid, securityType)) - } else if (currentSsid == null || currentSsid == WifiManager.UNKNOWN_SSID) { - currentSsid = newSsid - trySend(WifiState(wifiConnected, currentSsid, securityType)) + wifiMutex.withLock { + val newSsid = getWifiSsid() + val securityType = wifiManager?.getCurrentSecurityType() + // Only update if new SSID is valid; preserve existing valid SSID otherwise + if (newSsid != null && newSsid != WifiManager.UNKNOWN_SSID) { + currentSsid = newSsid + trySend(WifiState(wifiConnected, currentSsid, securityType)) + } else if (currentSsid == null || currentSsid == WifiManager.UNKNOWN_SSID) { + currentSsid = newSsid + trySend(WifiState(wifiConnected, currentSsid, securityType)) + } } } @@ -144,39 +155,81 @@ class AndroidNetworkMonitor( flags, ) - val callback = - object : ConnectivityManager.NetworkCallback() { - override fun onAvailable(network: Network) { - Timber.d("Wi-Fi onAvailable: network=$network") - activeNetworks.add(network.toString()) - launch { - currentSsid = getWifiSsid() - securityType = wifiManager?.getCurrentSecurityType() - wifiConnected = true - trySend( - WifiState( - connected = true, - ssid = currentSsid, - securityType = securityType, - ) - ) - } + suspend fun handleOnWifiLost(network: Network) { + wifiMutex.withLock { + Timber.d("Wi-Fi onLost: network=$network") + activeWifiNetworks.remove(network.toString()) + if (activeWifiNetworks.isEmpty()) { + Timber.d( + "All Wi-Fi networks disconnected, clearing currentSsid and wifiConnected" + ) + currentSsid = null + wifiConnected = false + trySend(WifiState(connected = false, ssid = null, securityType = null)) + } else { + Timber.d("Wi-Fi onLost, but still connected to other networks, ignoring") } + } + } - override fun onLost(network: Network) { - Timber.d("Wi-Fi onLost: network=$network") - activeNetworks.remove(network.toString()) - if (activeNetworks.isEmpty()) { - Timber.d( - "All Wi-Fi networks disconnected, clearing currentSsid and wifiConnected" - ) - currentSsid = null - wifiConnected = false - trySend(WifiState(connected = false, ssid = null, securityType = null)) - } else { - Timber.d("Wi-Fi onLost, but still connected to other networks, ignoring") + suspend fun handleOnWifiAvailable( + network: Network, + networkCapabilities: NetworkCapabilities?, + ) { + wifiMutex.withLock { + Timber.d("Wi-Fi onAvailable: network=$network") + activeWifiNetworks.add(network.toString()) + currentSsid = + when (wifiDetectionMethod) { + WifiDetectionMethod.DEFAULT -> + networkCapabilities?.getWifiSsid() ?: getWifiSsid() + WifiDetectionMethod.LEGACY -> getWifiSsid() + WifiDetectionMethod.ROOT -> rootShell.getCurrentWifiName() + // TODO implement Shizuku + else -> networkCapabilities?.getWifiSsid() ?: getWifiSsid() + } + securityType = wifiManager?.getCurrentSecurityType() + wifiConnected = true + trySend( + WifiState(connected = true, ssid = currentSsid, securityType = securityType) + ) + } + } + + val callback = + when { + wifiDetectionMethod == WifiDetectionMethod.LEGACY || + Build.VERSION.SDK_INT < Build.VERSION_CODES.S -> + object : ConnectivityManager.NetworkCallback() { + override fun onAvailable(network: Network) { + Timber.i("Wi-Fi change detected using old API") + launch { handleOnWifiAvailable(network, null) } + } + + override fun onLost(network: Network) { + launch { handleOnWifiLost(network) } + } + } + else -> + object : ConnectivityManager.NetworkCallback(FLAG_INCLUDE_LOCATION_INFO) { + private var netCapabilities: NetworkCapabilities? = null + + override fun onAvailable(network: Network) { + Timber.i("Wi-Fi change detected using new API") + launch { handleOnWifiAvailable(network, netCapabilities) } + } + + override fun onCapabilitiesChanged( + network: Network, + networkCapabilities: NetworkCapabilities, + ) { + launch { wifiMutex.withLock { netCapabilities = networkCapabilities } } + } + + override fun onLost(network: Network) { + launch { handleOnWifiLost(network) } + } } - } } val request = diff --git a/networkmonitor/src/main/java/com/zaneschepke/networkmonitor/Extensions.kt b/networkmonitor/src/main/java/com/zaneschepke/networkmonitor/Extensions.kt index 3085b36b..53ff1cad 100644 --- a/networkmonitor/src/main/java/com/zaneschepke/networkmonitor/Extensions.kt +++ b/networkmonitor/src/main/java/com/zaneschepke/networkmonitor/Extensions.kt @@ -1,5 +1,7 @@ package com.zaneschepke.networkmonitor +import android.net.NetworkCapabilities +import android.net.wifi.WifiInfo import android.net.wifi.WifiManager import android.os.Build import com.wireguard.android.util.RootShell @@ -21,3 +23,14 @@ fun WifiManager.getCurrentSecurityType(): WifiSecurityType? { null } } + +fun NetworkCapabilities.getWifiSsid(): String? { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + val info: WifiInfo + if (transportInfo is WifiInfo) { + info = transportInfo as WifiInfo + return info.ssid + } + } + return null +}