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 +}