From 005afc7089b5d00e65740846870b6c86617817ce Mon Sep 17 00:00:00 2001 From: Zane Schepke Date: Wed, 24 May 2023 01:33:20 -0400 Subject: [PATCH] initial commit --- .gitignore | 71 +++++ LICENSE | 21 ++ README.md | 59 ++++ app/.gitignore | 2 + app/build.gradle.kts | 126 ++++++++ app/google-services.json | 39 +++ app/objectbox-models/default.json | 94 ++++++ app/objectbox-models/default.json.bak | 98 ++++++ app/proguard-rules.pro | 21 ++ .../ExampleInstrumentedTest.kt | 24 ++ app/src/main/AndroidManifest.xml | 63 ++++ app/src/main/ic_launcher-playstore.png | Bin 0 -> 39338 bytes .../wireguardautotunnel/BootReceiver.kt | 49 +++ .../WireGuardAutoTunnel.kt | 21 ++ .../wireguardautotunnel/module/BoxModule.kt | 40 +++ .../module/RepositoryModule.kt | 25 ++ .../module/ServiceModule.kt | 29 ++ .../module/TunnelModule.kt | 31 ++ .../repository/Repository.kt | 16 + .../repository/SettingsBox.kt | 63 ++++ .../repository/TunnelBox.kt | 57 ++++ .../service/foreground/Action.kt | 6 + .../service/foreground/ForegroundService.kt | 62 ++++ .../service/foreground/ServiceState.kt | 6 + .../service/foreground/ServiceTracker.kt | 52 ++++ .../WireGuardConnectivityWatcherService.kt | 220 +++++++++++++ .../foreground/WireGuardTunnelService.kt | 76 +++++ .../service/network/BaseNetworkService.kt | 117 +++++++ .../service/network/MobileDataService.kt | 10 + .../service/network/NetworkService.kt | 10 + .../service/network/NetworkStatus.kt | 10 + .../service/network/WifiService.kt | 10 + .../notification/NotificationService.kt | 16 + .../notification/WireGuardNotification.kt | 60 ++++ .../service/tunnel/VpnService.kt | 13 + .../service/tunnel/WireGuardTunnel.kt | 65 ++++ .../service/tunnel/model/Settings.kt | 14 + .../service/tunnel/model/TunnelConfig.kt | 36 +++ .../wireguardautotunnel/ui/MainActivity.kt | 168 ++++++++++ .../wireguardautotunnel/ui/Routes.kt | 34 ++ .../wireguardautotunnel/ui/ViewState.kt | 9 + .../ui/common/ClickableIconButton.kt | 31 ++ .../common/PermissionRequestFailedScreen.kt | 35 +++ .../ui/common/RowListItem.kt | 41 +++ .../ui/common/navigation/BottomNavBar.kt | 42 +++ .../ui/common/navigation/BottomNavItem.kt | 9 + .../ui/screens/main/MainScreen.kt | 212 +++++++++++++ .../ui/screens/main/MainViewModel.kt | 159 ++++++++++ .../ui/screens/settings/SettingsScreen.kt | 290 ++++++++++++++++++ .../ui/screens/settings/SettingsViewModel.kt | 121 ++++++++ .../ui/screens/support/SupportScreen.kt | 73 +++++ .../wireguardautotunnel/ui/theme/Color.kt | 12 + .../wireguardautotunnel/ui/theme/Theme.kt | 80 +++++ .../ui/theme/TransparentSystemBars.kt | 22 ++ .../wireguardautotunnel/ui/theme/Type.kt | 34 ++ app/src/main/res/drawable/discord.xml | 10 + app/src/main/res/drawable/github.xml | 12 + .../res/drawable/ic_launcher_background.xml | 170 ++++++++++ .../res/drawable/ic_launcher_foreground.xml | 30 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 2004 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 0 -> 2936 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 3568 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 1268 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 0 -> 1926 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 2242 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 2728 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 0 -> 3956 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 5030 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 4246 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 0 -> 6154 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 7718 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 5854 bytes .../ic_launcher_foreground.webp | Bin 0 -> 8314 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 10402 bytes app/src/main/res/values/colors.xml | 11 + .../res/values/ic_launcher_background.xml | 4 + app/src/main/res/values/strings.xml | 38 +++ app/src/main/res/values/themes.xml | 6 + app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 ++ .../wireguardautotunnel/ExampleUnitTest.kt | 17 + asset/main_screen.png | Bin 0 -> 42320 bytes asset/settings_screen.png | Bin 0 -> 77006 bytes asset/support_screen.png | Bin 0 -> 96437 bytes build.gradle.kts | 20 ++ gradle.properties | 25 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 +++++++++++ gradlew.bat | 89 ++++++ index.html | 47 +++ settings.gradle.kts | 18 ++ 94 files changed, 3834 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 app/.gitignore create mode 100644 app/build.gradle.kts create mode 100644 app/google-services.json create mode 100644 app/objectbox-models/default.json create mode 100644 app/objectbox-models/default.json.bak create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/zaneschepke/wireguardautotunnel/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/BootReceiver.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/WireGuardAutoTunnel.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/module/BoxModule.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/module/RepositoryModule.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/module/ServiceModule.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/Repository.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/SettingsBox.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/TunnelBox.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/Action.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ForegroundService.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceState.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceTracker.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardConnectivityWatcherService.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardTunnelService.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/BaseNetworkService.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/MobileDataService.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkService.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkStatus.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/WifiService.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/NotificationService.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/WireGuardNotification.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/VpnService.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/WireGuardTunnel.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/Settings.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/TunnelConfig.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/MainActivity.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Routes.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/ViewState.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ClickableIconButton.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/PermissionRequestFailedScreen.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/RowListItem.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavBar.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavItem.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsViewModel.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Color.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Theme.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/TransparentSystemBars.kt create mode 100644 app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Type.kt create mode 100644 app/src/main/res/drawable/discord.xml create mode 100644 app/src/main/res/drawable/github.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/ic_launcher_background.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/test/java/com/zaneschepke/wireguardautotunnel/ExampleUnitTest.kt create mode 100644 asset/main_screen.png create mode 100644 asset/settings_screen.png create mode 100644 asset/support_screen.png create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 index.html create mode 100644 settings.gradle.kts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..31caa0c --- /dev/null +++ b/.gitignore @@ -0,0 +1,71 @@ +# Built application files +*.apk +*.aar +*.ap_ +*.aab +# Files for the ART/Dalvik VM +*.dex +# Java class files +*.class +# Generated files +bin/ +gen/ +out/ +release/ +build/ +# Gradle files +.gradle/ +# Local configuration file (sdk path, etc) +local.properties +# Proguard folder generated by Eclipse +proguard/ +# Log Files +*.log +# Android Studio Navigation editor temp files +.navigation/ +# Android Studio captures folder +captures/ +# IntelliJ +*.iml +.idea/ +# .idea/workspace.xml +# .idea/tasks.xml +# .idea/gradle.xml +# .idea/assetWizardSettings.xml +# .idea/dictionaries +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +*.jks +*.keystore +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild +.cxx/ +# Freeline +freeline.py +freeline/ +freeline_project_description.json +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md +# Version control +vcs.xml +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ +# MacOS +.DS_Store +# App Specific cases +app/release/output.json +.idea/codeStyles/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4557c46 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 WG Auto Tunnel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..448aea7 --- /dev/null +++ b/README.md @@ -0,0 +1,59 @@ +

+WG Tunnel +

+ + + +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[![Discord Chat](https://img.shields.io/discord/1108285024631001111.svg)](https://discord.gg/Ad5fuEts) + + + + + + +[![Google Play](https://img.shields.io/badge/Google_Play-414141?style=for-the-badge&logo=google-play&logoColor=white)](https://play.google.com/store/apps/details?id=com.zaneschepke.wireguardautotunnel) + + + + + +This is an alternative Android Application for [WireGuard](https://www.wireguard.com/) with added features. Built using the [wireguard-android](https://github.com/WireGuard/wireguard-android) library and [Jetpack Compose](https://developer.android.com/jetpack/compose), this application was inspired by the official [WireGuard Android](https://github.com/WireGuard/wireguard-android) app. + + + + + +## Screenshots + +

+ + + +

+ + + +## Inspiration + +The inspiration for this app came from the inconvenience of constantly having to turn VPN off and on while on different networks. With there being no free solution to this problem, this app was created to meet that need. + +## Features + +* Add tunnels via .conf file +* Auto connect to VPN based on Wi-Fi SSID +* Configurable Trusted Network list +* Optional auto connect on mobile data +* Automatic service restart after reboot +* Service will stay running in background after app has been closed + + +## Building + +``` +$ git clone https://github.com/zaneschepke/wgtunnel +$ cd wgtunnel +$ ./gradlew assembleRelease +``` + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..956c004 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,2 @@ +/build +/release \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..0e4798d --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,126 @@ +val rExtra = rootProject.extra + +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + kotlin("kapt") + id("com.google.dagger.hilt.android") + id("io.objectbox") + id("com.google.gms.google-services") + id("com.google.firebase.crashlytics") + id("org.jetbrains.kotlin.plugin.serialization") +} + +android { + namespace = "com.zaneschepke.wireguardautotunnel" + compileSdk = 33 + + val versionMajor = 1 + val versionMinor = 1 + val versionPatch = 2 + val versionBuild = 0 + + defaultConfig { + applicationId = "com.zaneschepke.wireguardautotunnel" + minSdk = 29 + targetSdk = 33 + versionCode = versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild + versionName = "${versionMajor}.${versionMinor}.${versionPatch}" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + } + + buildTypes { + release { + isDebuggable = false + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = "17" + } + buildFeatures { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.4.7" + } + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } +} + +dependencies { + implementation("androidx.core:core-ktx:1.10.1") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") + implementation("androidx.activity:activity-compose:1.7.2") + implementation(platform("androidx.compose:compose-bom:2023.03.00")) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-graphics") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material3:material3") + implementation("androidx.appcompat:appcompat:1.6.1") + + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) + androidTestImplementation("androidx.compose.ui:ui-test-junit4") + debugImplementation("androidx.compose.ui:ui-tooling") + debugImplementation("androidx.compose.ui:ui-test-manifest") + + //wireguard tunnel + implementation("com.wireguard.android:tunnel:1.0.20230405") + + //logging + implementation("com.jakewharton.timber:timber:5.0.1") + + // compose navigation + implementation("androidx.navigation:navigation-compose:2.5.3") + implementation("androidx.hilt:hilt-navigation-compose:1.0.0") + + // hilt + implementation("com.google.dagger:hilt-android:${rExtra.get("hiltVersion")}") + kapt("com.google.dagger:hilt-android-compiler:${rExtra.get("hiltVersion")}") + + //accompanist + implementation("com.google.accompanist:accompanist-systemuicontroller:${rExtra.get("accompanistVersion")}") + implementation("com.google.accompanist:accompanist-permissions:${rExtra.get("accompanistVersion")}") + implementation("com.google.accompanist:accompanist-flowlayout:${rExtra.get("accompanistVersion")}") + implementation("com.google.accompanist:accompanist-navigation-animation:${rExtra.get("accompanistVersion")}") + + //db + implementation("io.objectbox:objectbox-kotlin:${rExtra.get("objectBoxVersion")}") + + //lifecycle + implementation("androidx.lifecycle:lifecycle-runtime-compose:2.6.1") + + //icons + implementation("androidx.compose.material:material-icons-extended:1.4.3") + + + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1") + + + //firebase crashlytics + implementation(platform("com.google.firebase:firebase-bom:32.0.0")) + implementation("com.google.firebase:firebase-crashlytics-ktx") + implementation("com.google.firebase:firebase-analytics-ktx") + +} +kapt { + correctErrorTypes = true +} \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..0ac748c --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,39 @@ +{ + "project_info": { + "project_number": "328300975830", + "project_id": "wireguard-auto-tunnel", + "storage_bucket": "wireguard-auto-tunnel.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:328300975830:android:82cd774598ccb7234b1b77", + "android_client_info": { + "package_name": "com.zaneschepke.wireguardautotunnel" + } + }, + "oauth_client": [ + { + "client_id": "328300975830-m72lc3hr69ddhdqh9ngr27rvc8o0jb2d.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyBsSMY0LlckizXDnuYBy7nXWGSdl8zZedI" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "328300975830-m72lc3hr69ddhdqh9ngr27rvc8o0jb2d.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/objectbox-models/default.json b/app/objectbox-models/default.json new file mode 100644 index 0000000..d408486 --- /dev/null +++ b/app/objectbox-models/default.json @@ -0,0 +1,94 @@ +{ + "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", + "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", + "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", + "entities": [ + { + "id": "1:2692736974585027589", + "lastPropertyId": "15:5057486545428188436", + "name": "TunnelConfig", + "properties": [ + { + "id": "1:1985347930017457084", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "12:2409068226744965585", + "name": "name", + "indexId": "1:4811206443952699137", + "type": 9, + "flags": 34848 + }, + { + "id": "13:8987443291286312275", + "name": "wgQuick", + "type": 9 + } + ], + "relations": [] + }, + { + "id": "2:8887605597748372702", + "lastPropertyId": "8:4981008812459251156", + "name": "Settings", + "properties": [ + { + "id": "1:7485739868216068651", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:5814013113141456749", + "name": "isAutoTunnelEnabled", + "type": 1 + }, + { + "id": "4:5645665441196906014", + "name": "trustedNetworkSSIDs", + "type": 30 + }, + { + "id": "5:4989886999117763881", + "name": "isTunnelOnMobileDataEnabled", + "type": 1 + }, + { + "id": "6:3370284381040192129", + "name": "defaultTunnel", + "type": 9 + } + ], + "relations": [] + } + ], + "lastEntityId": "2:8887605597748372702", + "lastIndexId": "1:4811206443952699137", + "lastRelationId": "0:0", + "lastSequenceId": "0:0", + "modelVersion": 5, + "modelVersionParserMinimum": 5, + "retiredEntityUids": [], + "retiredIndexUids": [], + "retiredPropertyUids": [ + 1763475292291320186, + 6483820955437198310, + 8323071516033820771, + 5904440563612311217, + 1408037976996390989, + 7737847485212546994, + 8215616901775229364, + 8021610768066328637, + 6174306582797008721, + 2175939938544485767, + 7555225587864607050, + 969146862000617878, + 5057486545428188436, + 2814640993034665120, + 4981008812459251156 + ], + "retiredRelationUids": [], + "version": 1 +} \ No newline at end of file diff --git a/app/objectbox-models/default.json.bak b/app/objectbox-models/default.json.bak new file mode 100644 index 0000000..534dc44 --- /dev/null +++ b/app/objectbox-models/default.json.bak @@ -0,0 +1,98 @@ +{ + "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.", + "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.", + "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.", + "entities": [ + { + "id": "1:2692736974585027589", + "lastPropertyId": "15:5057486545428188436", + "name": "TunnelConfig", + "properties": [ + { + "id": "1:1985347930017457084", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "12:2409068226744965585", + "name": "name", + "indexId": "1:4811206443952699137", + "type": 9, + "flags": 34848 + }, + { + "id": "13:8987443291286312275", + "name": "wgQuick", + "type": 9 + } + ], + "relations": [] + }, + { + "id": "2:8887605597748372702", + "lastPropertyId": "8:4981008812459251156", + "name": "Settings", + "properties": [ + { + "id": "1:7485739868216068651", + "name": "id", + "type": 6, + "flags": 1 + }, + { + "id": "2:5814013113141456749", + "name": "isAutoTunnelEnabled", + "type": 1 + }, + { + "id": "4:5645665441196906014", + "name": "trustedNetworkSSIDs", + "type": 30 + }, + { + "id": "5:4989886999117763881", + "name": "isTunnelOnMobileDataEnabled", + "type": 1 + }, + { + "id": "6:3370284381040192129", + "name": "defaultTunnel", + "type": 9 + }, + { + "id": "8:4981008812459251156", + "name": "showProminentDisclosure", + "type": 1 + } + ], + "relations": [] + } + ], + "lastEntityId": "2:8887605597748372702", + "lastIndexId": "1:4811206443952699137", + "lastRelationId": "0:0", + "lastSequenceId": "0:0", + "modelVersion": 5, + "modelVersionParserMinimum": 5, + "retiredEntityUids": [], + "retiredIndexUids": [], + "retiredPropertyUids": [ + 1763475292291320186, + 6483820955437198310, + 8323071516033820771, + 5904440563612311217, + 1408037976996390989, + 7737847485212546994, + 8215616901775229364, + 8021610768066328637, + 6174306582797008721, + 2175939938544485767, + 7555225587864607050, + 969146862000617878, + 5057486545428188436, + 2814640993034665120 + ], + "retiredRelationUids": [], + "version": 1 +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/zaneschepke/wireguardautotunnel/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/zaneschepke/wireguardautotunnel/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..0cd6894 --- /dev/null +++ b/app/src/androidTest/java/com/zaneschepke/wireguardautotunnel/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.zaneschepke.wireguardautotunnel + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.zaneschepke.wireguardautotunnel", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..2b8ef75 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..e5d8e99564658add3373147cb1504f3eb1e9776f GIT binary patch literal 39338 zcmeFY^;=YL)Hk|k02yhdK~hD!1?dt&x}+PVyPKiA6r?)^K{};Nx>Gu&yZhaI&-1+J zZ#dU=eu51%`(F3z_^eQQS#fj}ViW)X&_79hPy_%d_$w5EJp+H7xlY^w037)AL0H*U zXD{ti7q{oJ$1t+{b;el{Mbj%W#BE9OTo;c}{%&HA(5CDed2A#+T-@@@*GrFk_i58F z#clt!uGLj|Tt2K^OHBN2TKGGgH2r(`t&&fgELsN(TE`WBMxjp|_zO$KWd{_lPZ*@{ ziG>e5{cp{`4A29g3CRPHfd4*A!2moxcO&aVTA#im07C`9=b&R@HQ>KjV7CANulWBo zF9bTP%zSZiapXds(BtZ@cn4=2GuUdZ3j*ezU0+_goP*;3jRUI38iI5RJ_W(mS!7D# z&!)5@@^i(7a1-UroxnTh2QBwq{Jc_aIp0xs)13)m|0P<7D*>oF-Tg`b2tKU*NK*D( zfldl|iJ(5*r{Lc$2@*#>-pRa^yP92^f{qnI z&5TG`CC8P0KIx=|9wQlc3wJI`jIZur==iOG?>=WIP8KHts{}-i6dXGkb@LF zzo37<6qvww6o;egPp#&0@N-DsG6m@mpn{fiOr8HsUQLo`gH({!s3GIkK%;$9_P>92 zSrkFXR8MpgU=wot8~@Ufsvb@^55F=MGS{2CS)yez54uPLkNJ=BZzy&IOS3gp&Xfpj zO;}padAe|ia?HFfk@N^{;GmtlLcAZ^aO1zpA(;#*t}Pu_b^Rsc`0d7ci%iiffA0;F zf((+v%3U$Hw1<}5_y|n4c>iFWAIi->WqLF5F2+Yb(fR34sNkIpjX{DX+8O$0D&o!4 z`KItKO~$W=J^BQ_lBp`~-&4fsOJh8}jNafFGfXCi^sdOgp}NccJ#nXq&hg!IJpMYl zQ?iSYM<2;^=LU=seinya&Tx9YqR3rPytq%^g`Eojv31K;Ql~zwj~8V9nLNkCE!XGY zu98Vs)3hgBl*t#H#wSblY1vVv`Dau3bUqhq2Pczj%5;qlG;Z7WD6r_MUy=HRO0A&d z83@w4TcdI7vZ+u$^z%7Kn!~q0Cg8nK{3gC#`6iMhzac{42VMN~<6CCynC#3myTcwa z_>Q<~_IfL-M5>y? z_@Phc(me&kDM}w*sU!2zM%LCUnWj> zm=ui9-{1bYn8mSz)C3nL4AYt}$y#NRhjpHs{P-7n{|;$Krzv+nr-z1*@yUo15ub#u zhowi5rYQvKO+?Y3Xfa@K4BuUog2MJo)$y??sKo~{_Cb`=AMj`}J;{D%)kZ!rGlzmA=qaRuHsLTM z)zMh1JT@l69wyZ*NTJ*)2yzPY#3`)td}Jlp?w5UnPGLLy5?v(EVLMWm0#b&t&rCaB zz`Gu&tx^ildS9ut3-Nourtr_aJ0MM-t&?}A4Gr6RwItCFTmi+SXei-`+pP}N7SC|w-O80fqW3`rf@IPw!5Hv%U zCkrmXMm0PdFzVyC57>Q4tAYp^y;y^bU7G01Y4T^(N-S%A*t#giwKy|K8?NwXeY>tQ-R z$3()vbTf#}Ffu$2rb&F<3A8{0ur_U6FN6B5UE~d{5U%aMgI`2@`XWYWJ2@7%%%|`K zMRoDUzs~pmzHTi?*Gg8$$lp?u3(wA_rcvSE%P$JOF5*t2NOQ{K9MyN!ZU+g2>}a3N zCjN}zEcDmUtkrOW_3TY^-A8#LV4ctFC*y-&-?amq5SATu$F3A{Fo5pBNpWZHyrPS> z5s9$ds|>JxQRqYVGUEfgWS{B3_AU;ONsTu1F#6)$)dnnkE$+mPlsdZ=ij92`#vWA_C24QFli1upI_fzBa0v1wzDt=Ahps6t>8;5 zpEBv@HzY83%68X0;_{|8Bn+E9oU4?-`nk+O!;GkK?;Bf=tE%&fI~Y@GqlroCl#J_o zVn0hZqGLV%c5W53xy3%Th|e;s4BDnVJ1ORX`7$@L-5{B)T?DSL1wn-?V8wC=hcRiD z{jEZ!lpme^MB7q=|4k#;S)kjK!j;kWBh}zfO(D0Q=>AQ5sVidBm0HEiOWx#JFFDP- zwqaGxLiafI;MB0Idy3>(Mi!GpoiN(ux7u_Jh=kp4pcJrhZ9i$$8LcyFJl>0Qx+XOl zGa?0uody^y#xy^hmg@^!DqJ2=S6|P6IHwn7x>GR^1SIOF^FaCToEIyfE_%_1IwMdX ztrEpoFJ*JzUi2r1!9&!{>=ZJdcd)$jM}qq!c6BQK`(APr@a64iOm`ZmK^`KCKi`r* z3DN1gay*5?h(XQ5t5vbjETBBirMip!s#+(9m}}}aA*&*cFM&3W+lMr} zv*9C=WB;~4+S+>t;N@$+ccLF%EO6qR?kun&M4B~f)D>pFb1p31K;!+0`VWpueagWF zANar88pT1JOZ;QIXKKr@Y+Ovk1!1NZ@lav@Zd(|o{NqlZWn#c3CVpbbnWa>ZFv)O~ zeqxqBWSL^L9?70^gt`!0abcR?KP~&;`d1$cRWWuHETgiMPW<75s>qbwB=T?!d~z4O zeml;0hf9iEB`Kg-MLL&KL;y5sIoF>G8uMl$qLkV`xE3FK4T>wJ62c!F_cAn?*c~pi zA}=yNfWcicPwoj{~R}k@^WpJQ ziW#2$XYZw?MpZzC%VE~4R02b@myyd|u^@dV6v9$+o($Sz;t(&Jj68q0WoCummrE}? z9-nl!+Nb=}9Ysp^8*QUf!On07E5&^|C%YuQ*-*2Wvi&*TXa2odk~ah2B7HPb#0M?R zVhxyKc&{fNSe)CSt->#Mi3>-O%#=c0yPFrk;N#*zWV)amz{*cyugZ3K>2CUx} zhYL#hUD-{#Ua(9lcI4Gs_w7Xd*!3y6>N5vphU^1n?46Dqp;=%!e3vnL>~ZEpp1}%v z@4uqu0iv)!f2M}|Jzs));m7ehF?*tIOE~~b2;B_^k=B4ophn5WwXs;@5hk0BL;ocyEmC%Lk-(460{#rK2is7U7MQ36~6>hY&Y@lK8s z{X#e0GGocev804}Z)O{(qdJ zelcJ93n#QFQu;l(WT|W3K^hRVwaeU7nSFK0z?5EodoU%=Wv{LZW5802CTFBWacm>; z6cwhA+6EK)jXs~Czp5R{$dtFfLH~s@a;%1gZPBdra0?3xe5vaQG*xQJAR+_B_*MQh zeU9R!@0Kj_VpIH=K!sS0Sp@q_MMdg+{Wf;vzE;8{9IKk=sJ`w7Sv?1+m+*P(L=^0* z;ETRWeCGJ(_Ic6ZAGvvAH^*OknkcD}|BOB+_oLyf#fU>nu7r1bPWcr1iCcpJ! zYhpRv8ub<~lQ__M#r99$c7DJ&)v+$E%5KkJZOv-gTl5z$qRx;`(|3DJ^85--E^ST| z1G11I`mxgB|DjcTGp42Qv!36t-Cr@!b^%1lgtMnuwI^%45gQ9lrnr* zk(bN7w>ihJCFVm)uy*Lf!#Vn0tjZXB^USKo(1=Cg zUuf@TrGpGeHcGnSJ1gH;wGh;{QC-E=KvhlA+WeF7FU_ zh)p4ObA~lLj(ABL%dKiH^ff?ec>bY4x~ub+$MSW{H+UVKMd?@Ue;4p;rEI)cA%n(N zRY%`GmAWXysj;z#rXq1wda=s?SdmWG4M@_z(~jrJeQP~cD1aq0~rZDq1u2s5#q<8m_|rQ^hho)?FXvObrc0f3HE;ppHxv82+T;l3-+2k zXdl;UiFW0Et2h`WP31dyZx#Hznzp(elII;&H1C8%u|6{ZA7%XsGiXGVy&FZt{J1?X z6?W#F!1(0LfFG2tsOTAv^g_Tqw|<462n+cmJ`BcDqp{ZcZf(vE^Jt|5>UWK>`u58t zvD;Et0+R+}gJoFWqY9W-Wvc-ZPksVUKxNiuaES!r!C~!{(x;#<>ASrwJToT2OSk#n z_8tpH^CKB0mI8mHvs;YqFQsHi;14&kGcRY1dkW-0$tfMI8)B>+VpjnAFj^n+Z@yhk@_RaOXR&~* zMmAQnSF%FB0f`yP2H}@HzmeZP1u**j<$Uy zR6kr4Tjr~C&7Eh4hB_7D!kevpL8ns3OwDpkMP$M%duvga90 zM!-Iinp{9yH|@Rbu_@K*YSPcx=uem`*wQe2uI;Xt=vlar;3HUn9V3^aP>8~j;3QiF z$P!|KjitHg4FiV3LVs=?kijMibGXu*iHT42q|Vi4-}Nbj)Zi%){J^6)MB z^07mzGvib)E#I%wcy4WIDg9pR?_H`;bK#TEndjQ2Evp$dq z)`W)-ko#%-OqGzFE!<50Pe+7Q&r|!2%&h}zyntIS>E@@R#ip#~6fV=%;~b9T5#i${ z!?W$A@e}T##fI%~;9U>1*3D77Y}qrhJ3#f4|BO0lHX*!KQU+Yb{4V7^>;Jw~-L=%$ z*-eZx*Ah&p(-N2Of;dBojv3BCcT#_Q>1RQ;d0=&8ut0Z{TjMA2gErxjw9*J7GgIwP z#XF}Cu;f4Uf{nNc|1U4M(9>P^5;;NQ9m7&M1AvfIR*3vt=P}lTs9rH0?JL1D#E>qh zzSx$ne$>IU^Dg6?i<37uGJgt2dm)sm)Jt zT6v_(tI-I}-~AVwA-+5|_5$qxD#-V0x3{uS3PPj;I9`7T5+Cal@(<^%)%mO#?o_%t zrpB%WYccLrz6p)1KQ}+be8%YBhD*OWJi6(B1?BKRJ>h!Hz{1o0q;KcjjK@p9e*EZJ z9hhG&qNY{Qn!-hMH6>#lIHl12!*#QgDUD}?kr8r=}PqVN7FKfng{Qw?OOu_GmVG#%Pn70Dd+bf{=5jtkC44{}GjG!1 z;F~}nPPolzxCsZ?(J-qQqM!=s(z9b-#=jQq>5>0|^+llvW0XK-tCfwtxmogLyPfC8 zyThCkkx7y(#Qo(O|2io@op$Ap)*u=t=&6OoOYX)Cs{bDqj9x{)G~2ltoP!oYQCkB@ z|5h&zq)GER2Xwa`+N|AhnA4fAj&_j0eDp1QU!X=e#C30ywN)$a>DFeDR;EGI{K7y4 zCCpo@%O!z%^b$(Tpiw&VYr6Dn2BGR7k(hRokg$-y`?yX8{sz2Bmk^OF58TDh!SHurcLbZ8-ED?q`j3Aa5AhNNq)w&=&ksVa!oaNM7KSrSEe3vS684 zS6N{CFOZsu9XcI*!`-^Szxp;--6ZOO{$0=$)(FD@R$r1AwYQwFX*^T48B)mKK>xZoJ6Rq;J#N z_E_M}JsNa)$43MfsM{jR>T(#uidx*oFL|*2T_qf%KWbAQbBxcdE5E&)p!}m#lS12` zrWS^O{S$NsJ2f&KVp`*`DJ7{Hiwc-knPRPTJdc~2&r0jQJr(LGCI2gq80az@DxixC zn5HB%;eY+5`fCKAnBI`M$m}kEX?uLUpz1$~*h%XIyL;6TD(Q;hM3YVq>6^-?XWEfW zYqF78&X4PLGZp6adN|MG;w@?2$jP^!L!`Pe*-THv9DOO8R}(B$^XNN?TZtSiBSltF z>aFYoJ3}6yWpIDe{iRN8NH=kqA+IYVXgw#CwCeEYmyZ1Gvfhx-;{98OpYJLEK@IV? z3wsk%Xr)7@Mp`aLe@bm`EV=#VO{q2{K{`_+(JtsyE4S4b2DzX|VcT7z%WnzK z!K3Y~c~ACDf83n)kH#_gPks^H_Ki&M+ITw=qkFj!IC)?lAr{^r6zoI%^cFF-`Ixp8 z6@A}hzdfuvQI;URYKi!A{4xy+(e-2aB$O%k`aX#&k2yoZy!a}LktFXOv>aP6jIc69 zzt^(y-{(WC?tDgEEbN@Y$^WWVxNU|5gpcGSaFwo(bEye7^YgSDMSMM6#$0w)M{9Sz zUp;F7UAIO}g2H$@qA-jNCsxFPm(HFnw5q?o7-MnHcN5qoFdEz444}+V=5(c%a1(pQ zp7p3tWZ(FuCljw$FoU;=_q|qL$<!x^bE3Xoyge`))y85kwZr|f`H$zcD=xS{Z zS@APFjRi{bP8C!9aLhGY;KSN5l*9Q3@6l(E#fuiP_dUrJc0?dKXK9|_ZQ9%n=bKe8 zY3;`JJOB3T{|WXK{(xNC7;<)kA`K$oOtaG&9QwQwCy{>A(9>6=JmeLW6vwPN^8>@c zI|Bt(!A%+#h^Qq{JUmOxjrooBZj6QUmD8`25;3*77B|Mh{=8qHQ->(TUY4a8r*c#J zuRKHU)2D2;X30CJ%e$N=lkkG+kBU~h2b9$FI0!mA;IQ55?e7;G#ERn z&hF!-#>^q#Zd3_UHlRUW(i)7fIq`=_ZU1pZE|o`iGyI&!ug5I>DE%?#C%iDN<9VwS zoArYEy@wTiFXnmU!^F^vv~9-PayIctLK&=SU&l{%BolTfoWxxoF%|ZB*D{!+|C=nF z$OKCxoQVXz01}tI)PY1KSV&*Ou<60RW}M?nDuWTn+SzkStNPato4WxaWhkh{b!8fi zKk-r3=o#9Oy`zKg<*=69me%3d4UwD;T?HldLGmMKAY9hgLXb(_;)w z>K0n?I?D!pEPtlsMajSImQ-A$O8!TX`@hy$7RRCPDnc5vh(c`$W{L&nVc~5DSek2wi*ax%DCquj33D%W6hf$^ExVS$oIl)2 zwa-@jCv@$E>q<@UwU)5%Pc`W;B3eIMDrXB1yd=QUDu+h+If$-sI6cI{sUEyJ^Myr8uSm2mB zWug0{N`vUnQY?#Q<8oI)Eb-&}pm%d3x8z?q+i$x+Y>wo$w{S01-e7@MuT_()NCGsa(Uyhv?lim`a<{f)a>D~ zE&{R8xCJifzbv)lq=Hl)IB3qnfJIQq8~XM5ExmPsX=JyP=b7T#FUWlpkH;DF<)T-x1f2|M|VDmh;3 zs#Zp-5`2|}kj!O$uIt0UVuqHvfZucU$@LZo-uQ;?TDx~o%{E8tEKWIg@?fwU3ZTxD zAJX+P`_B?u3GraS9$X(qwdXD9_y%`aONCJ2>DD)^^Xf@>Ec(Mt#LW1!&l_FFE(_!o z7I8M2A4C<-FWzbmsA)bs4>2Hx51$R`wHjh{o(_)G1F3UJ$NZ*G&K6p?B5#L z^@GQB8i8YHI49OqH4>rV3$(VQ3fA!mD7-{&^9BzD4qJa7+>T-X(m_@vI>z|XQ-@NA zyUKew@|yBPx6NM$1gf5r>&R{^HPNMmzoKpnm%rQ3Y~CdBLU_Qm0~r>TAvWuAVU93L zL?KhWdaXp~bCX!4+rsf73qxAxK?P#F^IC?_TNz*Q`fkrGtjQw<30PxYZ~yC%(Og9d z$oG(AKRyxR>;H#P$O?MSFuTP^;dTk?OXqjqj)HD}T;!qK&$5;2%|TXtS%1Py ze{?ZNiA#6q|yBL<$M5ps4|I6+>8vg}!jGm}O;8 z`dgzUFa7&}<&F5UN8#U;)trzcF0PSqJm+KDUn6!Ri+UCH%G=B8IQRX&RzI%R$Ma1w z`oc};XGn54ThrfqO!tcLDlF!O938BXyz0$~y3z#>D&SPG9FY%Ps9C-Zx2Dy^btcGf z(gmf&Fc12ZZ+BQD4gm<<)2lAWlJU31s8X~Y60AAAW%|pkQ}HxqCp*>Mq@fm45m)wp zIU@v)5^jrK*prBVd}s1YTW(zRRkd64_0v!W&@LGBdF(I~=IFv~+}>nt`D;Bx)!B;a z^RqymtF+g9!xYWG&$KWmXo3PBX2#+~rClh0B7HCyuB#T7q2^08=9jlhe3Do);1eim z$-E(p6xUP}=go-om@)4j+59o;6st>2KyyrD^lh{vH{C#J?-!QB&(SZac&8FPs68J zA?xbRYL_?#dFyNV*TV6?8efzM;O(#4xc(Ype;v6bKij9=R0?j^lgCe!=`~F5FF*Sq#fxueY)WEIt@z#!BQ8trg1L!hz3mm=d-5uucwRoPvE`W$C=$C|m%);n~-Dd}!jR~j_ET;m| zMvS_*@@j<_C)UJ_ep+=gu{nAga;V}-8*K8t}{xDTjpu*yd`Rsh=?ctp88b12cHhPI`<=?+m zOYz6(Wk=K@X|*Rr3a*Xw`oXDjuFKS0-bXJE`j?G;pTJCZEhu zVqO#{FF=0UJRzu5ArLIq06^#v`pO8OJN%^4g{G$PLrMzL(tk06~ zQct%H$ET2QLUbQ$&~BtBeN&l8wDi$sS7o$r4zm*Io>Unr=qDK8yuBPr*i11hWf$r^MLxS7 z_$+uMpQ-j-I^W;xNTuaYFLzjnp%cejSKQF@3ym6qk6qf@^v~Q+Z==w!9tArMzLG}p zaGSLvm3gCkv3=lopf5`|TCkk-R_f*wvL%HsPHcHZ@FLc$G<*WoN;`spR;PK}UqB)= zA^>%pv}p4npY!f7Mid%q^RM7&DpTqz0E!FsGyo1 zcrd*~wEb1ta$Z<{zeQTF*%pALOPPI-eNIm2jQm|C*NTl@uc1{}T1POA`_s4S(h7!d zf0vaI8Lal@)9RMd=(o|meHJtxVG#l38cgGts!Zcxf8$eglV@ymy<=>1v!k#vTc-0Z zSX+E~t_qj5{whqhS=rQR_WO!-LTm}8nb&lQsmM{Ol*^DW<}?b<_3jG84=|k39=*gO zu7MshOt0ub-~+*#npU6;?>g9)WuO$h!=x1~DV*Z${|#XcHsclZ)Z`~2+{EUKzrS`_ z+4I`;o4b_mP4dh0Z7m6R1>Pu}9*3t3zG?aAz+v5?LG14+27|QK1v;Jems-WSv^Y@o zkPE1*BM3?VPV`i8#{Fg(SjUC^0)G14O@0=TDAOPiVDJW|z zn3>aP{4`|%OcJRWw36Svz6PRMI;e<%0m5%FV7W=0=i;o))XLj4-b|OBeR5G!H}_;J(N>gN!0|#er4Y7t2LSaAeb4 zMaLcr!EI`5w~zudO9LCT53wy_^vMld?eRgowi~?JepGt4yoJ-yV&b3Pi&TjukKS^h zPzm~fGC2JY$sacH#yqq3o=8T60VKR(galj&B3TI`7bzUqN0h`ZhP;tW&GFQGOK(Y1 zGhMOi@QQk_=t4dT%PWs%zrjt7S(kU>P_B;{V$S9ExRBpylBK1dIAnbRJ3&3H%j=5Q zTM3lv*UooQt6CONTEccC-9JG8Eh;9jxxl-k(Q&&2hRA~rRLR1k4Jx4=u+ifG!Fclz z={FvlChTZb_}_hvWCCzLKpTi6r3~VH?1Q6$&rUyi!hCE4BAjUXd~_O6Ck{EGSU?Tc zA|vV{Be(a2p%w%MgR)Du2?KF4(5b4?X>^c41Zxs`(!v)IDuKG_gwy}nYnChTI{hO3 zoyYkrr*ODO|Jh)WYqf z$-b2$oonztU;R`zQf!E@hD3esP7pQN_NTQmr3T@U#e1QCD_aoOM^QZOr>DumVE=iX z#RUP?a$=s(YJlwm%W-OmfBH=bijm^*ATcB2{~XmN8Qvnwx?jyc5UZ^=Sp=(~|`d_gfo;AoUK z*g)XskODX$;#48J1p^ud<#DCyPYu;8Y0Pei6Bu0?*zKy1-U0?X2~n8wcN0lLZQnhB+zAgN?;^a>i)NS z5{MlQd`)d(7*|dX#)=mpXc)xIBvC24SAkxi55(b)&m$lkO|pyo-KIVd5EuHu(50#( zCA``zB;4O#eE6G{GdAI{ubi9k!y@vGtN5~u_yYR*X({4#64I)#B3WNb9$U>)Fxl>1&V6}tMkoFKoQxQJU9Wx{mRn+9(x!>#4uAR zcRyRt;G;zfb6+^f+`5*hwJ9Y}@h{I^-1e=QYUKqFdcE0es2(HLgb#zy8Zi9G;Cl50 zL++JI7(ZKvd0DbKKgsJ3DhkG9MQ*Igwrwj{9l&u07dWbKDE^yLP`I^|t1k6jD*W49 z=?8LzsgSaD<-WP{Z#(?*-}LL^xb}W8yct0a#5%5ZA|)8=-$~io)b34v>vd+>|7Bkz z7jWGog#v!;Ss+9rcY?Kd=BbyRMEy+1;2zq6C|dt@MGK&z-D8D}{9Awm;XVc((4-Wb z&aNetQuL|NGeJ(J!8L(>0j=kXiz64Rq$Ds`(QONt=WtKT4th+{{WACr9 zy?i#lIx{Z8ATj@PPd3u?Z$?GK7@4xntYPqTV{kkKqi(tiGcRIS(}<%dlmsY7`Zl0K z-2fUT@OuU-@AjBp#nLu?5JmGi>UT-`ULX`izr;-zuXPCIEj( zsV>QUUFtAE=0dR_lDwKKE`!_|x4L}EsCHP5bI+z^!cxB#M~WI7fr7+krOkmMg((#J zkN*|Qtu{e|?-K$xcmOyzq;;D`L5YaMK`lN85#3`iViKjdQ#h5JGCV#2cMCQ4i=(C} z=;iZo04&$b{&)OGL-wSXRl|)aFgRNIAH#ChUmKdoE?CImnTUAI9mXc6hA~7$;9M8d z2T5?MvH%YRQ!RmI@r)+-NPRC*cEVwW5{dQqawMdl^+)YX{KbF0P?;N?9y}+V zmq~dXi!xmBu=uu{FpX+u&NZ4FJrx>|CkzMvq&D5=c6}oC8Tg|IVL<_5(S;zkf+Tej z94>O&rxv8z*!u%VX@r2|M*m#3rmUs0)?EpO0JYZM(7(L}dJBTW%WY`}RGSvyy@R`+ zr5`$nvO1fU!JXYa^3tu?OP0n)_Hzt_m$46j{N#Ua zcu)c-=>nrstR!1Lu`_jWuwz+r>!xdYkk#HQa=+7La`tT3Myb;oq?r0Z-Wsw8e= zF`smkj*a}h4@reI2i7gM>!iERj|c={(qR=%Lw)_KKAjU*DqOB|57N+{qGauvfjscb zOhoLPZ_p;mT|4LAH-SKkHH`k6b1{=pEX!@jt?ED z0WF1cwN^BtDU&EvcF^o2ny}skTKRH<(%c~l?dFmGY-d4LNn{bZK&E*)J)?z9LY}8X zG+BHGh@-`xj$NL=La>v2V70@ob0)pkZj^lBD(!cD5qBu|re`_D3fF!&e{YLmaddd! zndpkhtw5A>tc_5V-%EKy)Y>QYitEwe!)z@329v-$kXeNxU!7pM@eK|ISSE5@78~MT zU)f?7g4e-^*e>M*LJ`n_1owzpArj{yz!u}l-kep~NeCn};&>#Qo`V5)x5PsWaP>va zl-!#F7aw?sQ)%(%p8$!BwBIJLN7$+{8k?i}azOlR;m;h=3lfRK(r>G6>LSakb~b|4 zgZaa?Hq+@@eXmClha{;l{WqhJg97&}MUlxew$ALx-s0#v%MWg51 zCRc1=h*Hz8w)L$-k-Fq?5RyPy!+@KT~`($Okj3MS@(Z?@exbq=wYQ zVBQ#d9+?VRehnJf*Fx@kKWVrE9no$$Y^4ZUECzz%ZihwBI zTjDL1!+^`YMM^ccWAB8E=GN+ya4Y~;ryR|SQ_Y;NAT7))b4qgW(E$Ro->sObv&Be~ z7A_**1u+1r5-mym?>X%z!s%A!4N#;Qt}k{j--m_`HL^Lh(ozZS%{Sxw8A!J1F7>TD zJYL_HsI37;TCJIz0>?+X9L|#{H@W#*nr9^upzYdB{mhLZnXbCE zIb(wWr|x}4lXGgsv@|vTj)i{gCRK;FoQjAH*i^t^sHIl;f;4KbZYM9!>-4w()pJwc z;Ua%+`YZt~&te&47)3wA?At#tg^CxZq)arI03_NP1qqgjStgwIE>{XdYg`iIDrfmx+5A4i?RMeW=M@PoR%|^J9|@S z@X`+?Ikp<8adTk=I#2-id`Q?5ikJ_G0Ie$Lpz6ecL43G_F%+6oyb<=AV<>?He`o$z zfNvm?&q3x*%TjOVJ9?)-rwP{&hwCCi4S-tNa&5Q6M^2QnnVA0crOTKX$thc#gCwSX zV}WPeej2@Td8k`Gk-Ibxd$e>e<3l7+;6G|x4|T5EtA#`Sh0z1mj#Dk412CGqe9$XW zd2BLqZx$Jb**!%V#A-lMrS!oxIX=l3Xf-I7wYJ6vv%f#cm-rC)f*|om;hJeK;)hOo zaFVIK+1-Vthm4=5DFHTAsx2xAI{823nnX7kQh445E@;QOJ}?B53($Oe?-O)#xRBRy zd7!yP0gN0Es~qs(9UL$;D_vhiN)LAV310C~!0xQI3g`%WMC)*mdEYW?ZYTSx3!s2t zdMLT2h)k2}H1wzrIKoGT*Cp&Ui{pO(S{j)X3-98}YWUt~T`zcryY@2anLe#q&Pm5= zQ}1Gk+-bTsD)Ig|=qDTof0RU=iLE+v_i zMQaf@a*oo}c-BY^0}vNyiF2@kgO@q5la5=q_ogqF=a#$uJ;eCC8I%RxC1TYb(ll7d zr}ZH$8l8F{C{*%hAcY81nuK7=Tc-lJ#-akKCR$&r1%f^Tcbh+UIprfsiu-2`ye*3J zDEnzT(VXp(Oj4>GQqb2IhquNM4qGR7r{|MBqB&YZqMY}6jvgq=UQ8E}8RAQp*4P4> z-@t+d5i8>J*jP5YnoV07R7l#?nAR%nzzLR(8WA<#9lZc6CrZ=(aH>&iy6M7ICSY{9 zDB8yU;(WIXCnT8YOMFFLxVtyIZ)?|#EdLP(g+*Ih>?Ib-iYN>)Qf<}90#CBXc=^)n zh~X3hx(Hwnx=G5P51s{Sv}CB+$z8=KXtiYps9yl*zjS+H#!hNb8%2uH^pPS+UBqUP}|gRVt9on+3=i0d~?avNgKC&iA4k8wCY&qXlo}MmlkN z5PQt}l9X`WD)GP1Jc1Al&zS5K6aQA3ramvO_^JA-QTU0 zZ|9rLe8_VeF0%-4=|AG3f(sXFp(newdqmm zYnY`A^mUJDnt)OI78U38^65K1(I-7*HdZh00N~+ZD;_VCNo1_+ z)L>LQ^Rsvro7*-t?ETV*-i1rryn+;C!M)ftH1=C}v!OMCK98FZ_)H=@Q~`n&D0EBB z-;n}<9T-J?*+o;H9?k)}9TFDSX&1NO(lXYA?5h)%79Ii>J7V|hKj)F1r zx!$G!DowSu<;{vL7(X!*A4l7yNx5D@8u#c}^@}$-p?GO&s}K05(|j-FUp_bcx>G+0 z;D7jyymJ*G1(NRcSSJn);Dpyd4q2Ur&g>VX9s%HR?V>jCZ2QNzx$`;bC4BkgZyy@R z0Q;UTx1+%>)U$;RsfyWA=4lPnok{w$^8-?j=JJn^L*4?qH6dS_d8aB34jvG23EzbQ z8r{^OT_8G}rqc|pV)QM}-~)-cW$zo=DqPhddO;MeK8$%jqQ*SU9>SSg4?mQG7AQMT z-kBT|3y7%9Mq6P5cW1z%Zrj@NXPndAlc-fbe~d9Umd9WWuV=CR{m4d;wU)m zr6g{254_O!7mj`wXI<*~u6^^)#s{ettEY#+5Zs)Vr7|)Ov+OBC*J0M9L4|7~wzhP@ z030=dxa+`nF}{Cnpd^aOL-=-ltcG)c{$uv~&AZvJYE8}_Nu2xveLU7gD(h&-V|SK$ zi~5@{9V-W|pcMD+sP}Sv2a`{P_-Q2D>iu$V%7JW(wr1UE)9IFIe5_Bat+pV?fDI(J zyNyj2MUfagf_e4}-#>^~4#AwRO^|2}fC30ALeK+yE31N_&04H=S%V$jog4IufHHUM zR|>a#w0ZXrJ%s^7sb05*Do=DThicqE*A)Cy5U}XD=i0{&HyrF)NcUa_jz+;0v zfVK%`0Rvt;f2DpFr_NrNAWg)HTslXyk5+_-mdOYW3IbSKC5@rO^|%?%cCI=T#Zn9r z|A1ptzpvt$w0grCY^%E3uE;`Yz!+36eWcWd<3BiD$+gU*Kp==pEBHOcJ6DY#f*oQW&v7X6#wr9KFJd8kYu6OW= zS}*V8`_BgR!k-YEM9aZKf?AjB`P4)mnZ}%Gz1vD0-hYjW*`=|T!4=ROr(JU8ckK_D zh2?&w#XGM0AHi11Ti<7RvFhAUE8Qfm#yxA$)?6kaMEI(^AedLc?G3nTA{GG3N%1r{ zT9NDSz*YvR!;~!5W={)Ae~ZtN;>6Zz5VkA?QYe4E!#!we{Wbrh?K^PyxY!d;VW*lvT=C|BvY9B=LT)eW81anI!|0f-&StMac@)UUH@((e#Ds*c+u zz=aOk*BsoD|H8#Sk#-uJxI#t_Gzj3KNWfeIemei|l^@NAH)Ctdx~jugAIfZVs9Q}N z5RDIK4I8qB)Hq@f3Zmrp@)hVjUZXCWwz*`T=nO4jgmJqm;fTWP2#6e1m*npN`A6V021JpvxXYFKz>A{!GO;5tk+=#(X<4f%48o#$X9X9Nln9)nK%jC_8wip{!OX`*h9>FEbny`7>EY_ zE35epnZn6Q{M`HUgtFP~{NqQ>Sad&PQcU-VfgqB>86r$NMPPme3Gm!8eKB$6v-pmD z#=rV4;Cxpozf}n9Ud7BC2f6r|C*g0m7F_3|g9!PoIx6r2tb_J4nTb`bX4uqW?U zq>0?4m6zkN4^Lg_6MwCOaAvA*F%uxq#?@S`bjxQ*9+DOM;&j{8T#DrhYLg_5o(Xmx zi?+^~CIx>2dIYU8aZXkJ6P#A5GoSu(o+1Jm#)}*MY!oWsdy^`CTF@R8hb@%BO@J)0 zo~Sy04vDe-CH3^)Eidedh8Lg%_yRfrHo~$%8JRgfPIfGyO%w))89~Z`kycqkh#f>f zO03gx+8@KuSOZp)Nd`#P7F`-KgR3iCpD8HD*7J2*iXw-91ppGihoP+sF~aQ05ikA& zez0v_NByy}K|wTvu-MCw)hwTx1&=4_i7+?VwkZ<%RnK{CNr zqF98xX`|W#FcAzvf`mx7Al)D--7O6l5v4&S z6s1c^5fBiN%cq2NcS(15zVY|o`vcCLnK=`CueH}YZ(ytUlHajzG!?H1a(K2}T?ban zQ)QarA`+N?C!G5&FVNq@&|^NnsV9Zo@fNy}gNwv)6Rlx0E|WF`#3hYZxPa5(?k%*r zS3(k-EOrWL$!S%eiC>!ckG1u0J4fVx@$bt`AN_1487wDRZQS3=s=Rss#LF?$RzeNx zjbXb8QqZGtXRPl7yUt(vW=V*Rs7)7>3HaO~f&#~s7C#w(z$?rcy+a>f4kdf`ceQsq zY3YNl&U2Nf?AYF3K)~2JFqjhq!S}Zbf z=jUG^XQ#2J#(w$s{$MNzia!h9C^(#0;|GUkL#1Sq{X89iiwlXW_t4%M3>A{1mKB8J zEMBuZ|56w?SEZqf@q}?X8bMuJg?**a=WdwfybZg&GJKk9Z~4n~p3~9lLAt+bCDQnM z&bLjQz8`I5mpkD?X(xz{EWkT3nD-j*rXV^V7H-s1{Vk$Ix$bwl=l!7O)64fD7qQA#cps#{wNxG)wyfCgev)nXWj1(L* z1$U+?HX2`##=>n%ICvSx{?3K6=ghfIIja|dLJmF`vFrM*-JDbT!M1+ws@ z*4fs<6NLHvWAKw1*c?rzrr!+xJ2Gyj0;j3PF$ZoE^-G3Y(H0)VkCK4wW8-joTzJ>3 zvKh^Mkscjm$!(a=f;S?o{DC{~nIUzyl-|0OF!a(;h|8x)SZD+q__JMx%(*1MzR5Lj!nV~+4DwL> zC(#EhReO9}^P*1|bZTRRt8K z8Ub>Ff1l@Ok?jZKwc_CA$i{?U_kVVnQpY_e1)p<6E9gSX-$~RkfC3!EgIX&;0xX@0fu{&N4wo=@@NQxXIe$m zsg1;+9<#_N`J4W0b9C6=Gf=HDI9A!Tu`kZTOXGmyXOS8eR*WOua?cB}-e@azk~pJ2 z-i9j?OE1%JzRr@hJnnXYl+K zXhV=g@N;yBMubnpkMh))eb=L{|8Ek)5>udDd^K!FP6zKV8iYEHEP~#>}LUkqmQwsgIa-iaV4Xmfdm({q6;9j*p3(a1TjgBRQbN zDgSuQGV0SpZGFVQ#$8Y${@5gDe6G|07qop29(wvG_wy}sZ4Itz>~+6bwXI6lqzdoi zUxd>P54BaaG5Z<8V<#LW>bqVMUueW0^VgV^@3ZrVlK3#>xQn`*aNTy_dG{kGl-Frq zTvAxO+-OtbAKxPv`IUso!(Nq96g~>xWPu?aBqi-u1Q`wHG>aw*K&_uF4#pArvZVQS z?@Z;WMMZlI9_*WW8u`>%x8U{GkMMzHxc2WD;({+oJT(_=`fhQ59hJmZ^*2;^p3`Y` z7{Dt$lAGi02oXHl@|NLgQaha;+pY96>!Y)d?SRjW$q=kd+*^vP|MS1>Qx!u_?&;v? zbF}yH^7-DpjftxZRmwVJLvo%kcCG+%<%epga4zipIIMbt|16eY%ImOg)7WSo-a_?^ zCC>%J*h;C1Yh8aRdRG5@UQr|7{Q79)pANc-PE^UTVt`l|NFPB3+f091tf~RVOV{c@ zT!j6t#Wn zZJpME4334&r!ST;LEE{5i_CsY`i+RSy_fe16?zP`o0?OwDL1r@YPU)5sBwKw0Bon3 zfeSwDt}EiR|0!}n=u!>Ji1Q+Y1)}R22v5*cNsPWJ|6Yu_IK&0n$B5`QwqUYA)^j@* z=yZT;H^7NWV~C(4kiotu_cnXnaik+EjHyEH(Z?v^a`vH-dIk(|J(IlidOS3l-Tn{% z*4e{tSWQCJoEM&$x*l!rCB_S0e*?ApK&rt)F)E$^gzJRs^vc3Q$>{6*j>i+#wo5!6 zGY#KNShTT$!7bx6m-m!=rutJGInY*RYn=aojqTw_ey#F7nu}{8d`$|rJrLx-&@{$j zmg2Bp`}{*FGMwIWL#XHg$%&ms#qtu?(L^#DM%#TAnE-sC;%D+-|lF&$g=iGNe3%z z`!BF?kqlCI6xY+d=g-D{3u69puQoP9Tv_L%%SHH5t%=5X#q@B+p*LxdOS2?-WP*KDb#i>?dwboiA%)^2YZtVEw$yeZl>VDOuQUHP00uS^%A28`LQQWBtkEz&i zW&J<5gADcs!#;PugI=160}m{D-i*$)oAt3v8EhbM`#B;j3@`PckTtP)z0zt5I{yfV zMXdYj^L*r>GJk?V(xc*Dz_Mh;+t|@5BxJ)YOL#b$lJ87zhAPhF5B$>l{YI1Qo62r2 z-#`LBobkN}VC!7a+39*m<{`_}#*oC$MwT|Sk$7%z_&GHNwDLot zqihXFf}f`Rr(;II#NPni6z`z=q>&N->A{Lf7D!@6cpmxjXJE>|gykpw8L6V}A;-UA z_mr`bzXO&Xmo^>XNd=9+HtfiuJyeFd1LziaLkYM5b};dV5b(s2&5|x zl#f>a_$EPB`v=ov30|KBRt(e-0|u(=0uu8V0uOF{W|n-~rC?zQ!EM1Kt-FrAkqF55 zG|trNg4%COYi$@vQ4?TyPNc7wE&jB%lAb3w>x)u=={Ehzn&tV?gs!twaL^tai+3d; zzteRi-`!12Oj9T>+xqZdlg)5bQVNApnLomndjAXq$@d&+wD83}OQpp7ZA~1BsSj6_ zIaD2D4B&oQW!;-5!oQLyI^IcE5%Ws;NxGxJkBht^*l~v!pMYiXhvQ4~Uie^Gm(h>^ zh+U9>UxH~K(DSK4T|G1L#=8c54nCDSM$^b-S}S=N^JtSosF`Jbp>LfB4+Km(*x zv^)Z+f~svzRn`7|qAJGq!Z6@P|7rT9{eRo(i#|Uiqo&@g8BSklw7PumeG9kO2T!)Y z?S%hRz0OluORVQ_w#Dc9Nx(vwwL&aE87C$Oy1I*S$hPf8uL$fc;eJqhSs;;rmG#T4 zE=z`MhWtWzXGSa50QI1Ua5t(X)o5>Js%LVs#*-@6^>a3)y(P_^oLPcyE{v328$8FF_OP0SB?@Gp|-HGjb+AV}dM*_mzGW@VlXyx(o_AD~DXLxx92K8ZHDE!iu*CcO; z$1GJ`4PudxCH7K>CHc!riQy`bgT_L*Q*pCfp3%2d;`}%i%2-8uD-RTU1tnK_>mIfg+&%Q{wEn;oQ4~7pS`|$H znDOxhyB0Q%!H+&k`Z6;w`e^z(td|Rj{M!TJpxbxI_3vtcoacEd^}r8{YNsc!#>kl; zElayKocH~(AfeK7!!G(QYC6sP*x|S68z29#a~iW>LVbR)=(TCdhdaqd6C4Z5e2;+ZLS zjpA}j7b``{ed4{ZiM&0`|3%`RXe~9Lw4%O_V{gJ9*ET80%n*@ZfHk_AL%I$N{iK$u z+&PhLaS&HQ5YW8)eQ`^|(IIgJ&x=~_kHrx6>GA+(bpAqA%fOyxC&~Gl1MZdo6^E*0 z<8kI{t+%$`PE3O{Ax*!}g}maZiDB)Ns5q<>c3o_|h}e>!rjbWMi7v_4KDTxvs+VDXSfHAp60hXdh|Ji{SOL26jCb=G{s@DTn(?6u4uT+6|*S#-6K zk?@KL{?N&-68m}*6J^f;M#>A+UlZhWSf=pgMZUpbTj4|K^@pA)|5Uu%!J8p#V45}k z`Do6xA}Y?T%%r;30Md{!D#an)Q3WS`513)KV)qbGhKPtmMlJ7q=R996fNHo|>R_43 zJ8#CA)KFazwnRKCHOYN=CL>lzXIrq^+ozI+K50G_BFsQb2%w09@7M^W@D@b2#jmaG zA?~M(N#8uHNDL;VqB*ML%YZdBh=`s)sk+NC>;G2q6G!Llay{PB`@{GcQkLAYvpHDx1S zL7K~8K;Jor-F2n%>SAp&QEM=c+x1@`p@u?QekEq(Umw|4w{tRuN>hIZJ9})|ZYE;> zv)tP{{}elpffC?bJI4ywHt?WiDL;+H`PlQvtE9P!w@9-`+*d>IkzCxdz>WEqm;!5{ z8jp3l2vbmB#CUtqxm>HimE`t2cLwMcU>#-t&p2THCvW{>_v#PMtJ$|TqIv4n6?I~r8cCH^lKU$G-jpy5 zrnQ${=j+K+*)$4+jG8*xP^5`&T^BYgq)k|7Fz?9Gu46BkbZ~o4N#oLx@g`=j=>`q4 zB|V)TT0Y_mGkJLHy_Uu9m^=ND)aY4w{4DrRZ4To=rG1)NLa=Gryb9vMy@Xq-W8SGh zA9-m+^i>PIIJ-w#=|mW7QvEXcQEmLP#Og>KMO5oeW!~r&>*JY|=s2I0Au$BbJ%(`n zVcuvnv3HuM?a!sXehv?W>NF2wiSq|N(2T&7JIT#JI8dQF2m^8T;)HOV>KPuQ6O^2E zR^OCR6VSNjKFJQH9}lkivvTF~F20c|EW9;IJYcQeeZu&r1Dlfp6_1!-!~CwQodOo404K1 zyPsR@hi^>(n#gp}X@R{mdU1js%qh+<_yJaLnTb`RHrDf2CuxWqELl}!KYkJCZGH3= zJiuYYsq*L6#U&~K`8nej?q(m_TmcNuNDPI>qhdpRSP1M0DaOw$9}$57&W}n+!La1&ZN!{X7d`mT##RGTmJ`+S#4*4AvFK;95rt6D*tNUyOP~w~=v>NX z!erG9vB2sQ9DZCvZV5v-sZ*?1S~LB*L%Yk#$1;A2@i@p6E^w!L2t;vbs3(i(y2?(n z$(am&64S0lh_L{3p7^Z>rmMf-VeBfZOL;pc{ZkX(A9|f5L%vqH!kgd28bjTqF*>nD zyg4+fp?x_1(ibtp&%Iz(P{?zW+!od63+IZ;PVSNHFA?JG;GbJY@9%&t9B@Nbs^jp0 zVTY&4pRS{7&_3Asd~_AgD7gjun$Cbni-rpz1*CACHY2=!Ws{nHjm~LJdzezNMhd#$ z^_R^K(;MKKpzqOs{s)Nwxy|CXQ?wQ`9*v<-##;&2^X`WpsV+7WL1 z(dyId^RAeem6%dqYN1^B^Md31BiK2z6CFpZHhcsLK>M2Fbpr=LbDc>jdw4|dT4)-P z0iDzA{q6FOKanrM2}DAu=9x13q;IoWa~lT0$^G2s%Op>h#y)@&r6Rsjf(Y>WC@&;l z*-1_wTT5l1(+*Kw>A%@QaVJ?**`Vm4pzq}yJVQvB05@K#r zgCjqR+j6G1PUA%;7f(J1_A$Lu3$;H-V;&OHXt@fQ2&$#z+Wkx8A9SaImF*z<-hbb8@dOnYV@MG9L(ek9_&NOfyz3lRu2rxhtwd}iwfbz!)UsDByJ1}T? zT4pj_HcPv1Dp8o%^3>ix!Y{BE;^Mw}$PqU*dL0~KX|Owm$z|2=7hdp$#+nPR0k%+0 z_ax8L2nJ>JN;nAv6Uuzy2UWJ#0+(UG@(mjfZ9cxh{}qbTHpqa8xr$(9uTeu6Q*0F% z3BT()nv_wi%O3%0`1SJtZc$NOl93C_21vxX!)eg?`c9U|c^I2Asuns&kt(;ig3g%p zk{E0wl?5Zu@Q9L-t39tOes|Z%ySQv@LejU0ir|G(nc}MevQ98muD)Xc%AG8&EdQ7q zt>6{B7X8r=IW8CnP``CY#cITuLm`w1e-z_X3VeE`MufMSyBFe;dmGjr4=pHumWoKa zC9L{_%|rWSTTr(#P;I!}?8jCBywXh!ZOwwz6k2%c41ffPB@qdr>$ZgvtslI!XKA!wAksnp@TMXT;?Tr~Il7Zk?0sQsXS^)CvoCxxP!){CK*5_8{zw zDBAtmYSkCFKDnP`ka+pj$zx~9Fb!-DtytN?vH&TAs*(pHI^j~p{h^amq9e?{${^`y zuzaWx2AKG(Ftxo)fk4hmz_RvzeEve@p*1|b$cZiBj(EFlc$DwS%4T=ZqvAtrsfoNL zyma3c4d9bQf1g>H13fh2(e&sI!o~l=Vn^r@J)THguk>SBK^orFshp&pJ5<^x3YLx? z_WSd<(tbLMF3oJY)#c~?IAMUcVvfCkb|c(h;k=W*t)%lvU}KvO_Ny!8C=qSK#SRTL zA~YBXrqPBi8{W=G-^|Vg-N?IFI|KX(?ntE=KGijvHF7O#4@Po}Vrnm=Glk57L{-*~grCP(q&g^x{-plwfG@7CM3ipP|~XiNk^ zAkGnOcWOdQl&AKc_?V)Lt-7JprQ~bi$q?jY&Uf?dPvG-G>d?DuY&TI9*# zXqrxWr%e*++j4BIv)(3`+f%*$&amF!<-2`Mi@ooX&>>JUEx^{H_4%laKa=lUA^Q}aUt@zhd|C~I9?Cn{gX|c9W^TJWCT&u0Xa4)EOscjaoq>~&9XhewtWo>z zev`{z@PRN#yY;M#2meyBnP(E6{OJ?B678)UodHL%i-VI-(iT@d(`!d~CjSj2dpr~W z3f~wY#GHDiOIzt#RLoX#)&Jg-hZ<9#!^CfS^NDZOZX@!T0jwfzrLegry{x);j2-8r z4ZM!H&s`QC>*k75O480DUQU^F@VR}F}3y4{;cu-@U=RNI2`K$ z*;g-25-&;3#>{>_YDwwsne)Iq=H(#a+$q8MBc*QJCO#v8N>R~3Fn7REWW`+!L;>7^=+rfVue6{5>K(&h8hFy{MFvRywWR*TF+@E%GvzXD2+rjxM4xyFxa=G>u#l62#Dl|M z&ixb^R_U4;^ z{U4_#-Co~A|Eb3N=WBDO9upeMYL2Sk2nZ!#oNo68N7YW+z3Y{8MWCix6LOw*e)f7f zi%<8=G?bxeHrM+Y2NeH4`|uIm_peE@%lAsI@}cl!p6(6N z-SsZAOpJckB2jV8#2zp=Q=44a+ks}?v4c3oLP*)d+9bBUvD>O#L{3m6@Qx||9TBVU z&R_lvGCT{_>i#rWq+pd&~ch(nD49;(q=mm z2xQ@Pa_YOAdEa3laQ+Hp$p)g8&9jGECcW^MgT-(w6a*^nlP?0@m!7z2hzFwSHt83` zfu%@n6`c7v=(aK6nEaV4W9}%3c+&q&{TF|eG-VJHO zJ{iyLGj}-HX>8rdBey%oL&qa=tD=H&QoXTKVb3sWnbg6{=A5++?>3| zGSzs%;Ec8;GQOro{m0^`kR`q|McKxZs4r6rHP=B;pPtar_hxAfui&4;e1&1btSSyrlXO&qnGaRE<&pJcZ&!!_q%=C>Mv?W zicm4;=dwMs*u*SNdZ08`sXkS`RR|ZXhFYh19WAQ%@x)S9bD+C^=S{k%wrsH2^wR|d zl1`gT)VF=vo3HlXef_M(@Q|c7=2R>-3Q7&f`9FhTjk{BR;f#@NZXe!PRnyZ}n-T5dzdbJixg{3>fKZ2Jwe=i!8NnAy;IJoDW}P z>3PU2(b|2voNDHyhc1@e-;;Bjwlwav=n=rD;EJup27hVd?c&10+{l#N+6&VPPmYqG zFJc==!#CF75~$#zA;Wf~SiR;d_JEY45}CWQWwl4Qybp3=K9+=KazXfA1oI zy`nr-54+QFN870N_elrm1@g$GCcPvjoj?$@*@|t{O;JN zpLIJ%v9aCPhi^cG-|27lkKFDJCsWGdiB^1IaHswAHF4X8y7h)`TX=QtCowfOYa89% z^24iT{-`fsbZBIaQvFtXo(xO=|K~9+E=k)o{k^N#7e^jqfUmzt5a#FXgkU5@0@|(E z=FB;!dJA&C>10=l@5wNuCN{iX^H#C4i4jvNZD~`5JfzoyJXtm2nPdngGm2ec;122p??s;T-Y5Ha>9T|pQaSFlx395xRqgvp*+ID|cG#^(MI3*8A`R z>#q0VvnAE@voVV_Ym58fMpE(yzusMS1V@9m&FJ@21=|tftmP&I19-%?jkz0Z#E5mo zrtT|lG_x16Of$i{@~n8f_LV(LxPa{qZJL=bJMU14z*qnCcY-6GZCJR5+Dvsq!ifQ% zM0K;y_j?1n7l%Dk8=h^yRo@WbcXnoIx+q<|F-3)45TEW!U_z6|(44*9t}e}>5pziw z7_0d1NJMRIQ+_Bq37(jFV;?A%&l_5JdRuHbzVK41k;#{X{#n1Uj2g)%-R%TUzw@~O z{wKjhijnDC#D+o9Q}J{KnLbY0A|a)PnR1W3#XXSE9b7bfq{`RHM>sNsy5jG+pSX&_ zQ!b_$eLvFq1+oG}Z#dfbq{J4zzIj()ev~h8)y3{zvqhHH;xe5#z7rJk7wzf?hwhO` z*p(YY7743*$HZms-gEJkJsF9c4nC$__V}7eHqsT{*Vwe2MrrKXU*b|`9TT;0qPzsq z3lFEM&OQ_P+_b&|bEsM#q`I$w^~}%G$9qSwv2?mQI5h>&Gcl0W_YLE8#}m|($5(m> zFBgf2SMD5J#w#No#0JbHbFU=tg?{$6L*^)t6iMhmxP<|*R+iVEYTkdC+%V+BEA_k7 zBkk(Ln!ehG9C-9XZrDwo1OsgKD}X*$p7VE_CgS`%v;W!R#^EDS{oIGlJ9BOweSW-B zGM?yHRSUejxi^{?JR+_fxoa!EMU>lL_%Hs$Jh%3y%t&^?MnjR^^SKERQfDt3;|jn@ z&g3LVM?)gq413%Ed(P4S=d;z*0ss27-gkv$V1%86MxylXK<*zv7 z(N_BB#2$ZAj6UEmo2}@8O1=jlWBq4(PtR@?sX>`>w%>>GDpdEgBZ{yfU(6`rwqCXF z8@jjmQu2$ii}_4bGXo$GeR4{RXinmx6j=(F;`K27N#9%a%wt@4dp)%hA@{2{bgsTh zD51BdlK5ixC-oW4WcLrd$gihLg(bw~)8o=_<3-sn-9^KzC39e2NPM}yQ;6#?201H#253;V8=sS-8S49 z*{LhC2v26lChSJTTW^3lL0MS_aY}OTWHQ=;>D_ngo#JWkOZV!i#pMRCXQX>XzeBm5 z$zt#pT?fUczVksS^_sW?^XY2;Jj>>64c&(s&fpV;o-1C0S|O>K;?$%IkN3~k_SlPWI1l%)-pF6t$Ufya#0l-QM34ISCFhADAXT=d~-RQ-N@@1kqcU{{n! z8u#_bosqg`Jr~Qn#bw3}H!Qb{dPz6YEy4Xay;p)XTf`klTy7_>zS!UvQDT~s{MFSD zqr6vp>5qK6IkA@a4*a%@YIMPq;*z|q-&VsbILCiU$fNkcJCrz5$+q`xy)dmM0uA}M z*6&nnKmVx*PQw0tmbH9N=*r5082QdSK)>thf9J=48OzcV5 z4^q!+^|`4#dB#rOQZfex8C+P1wJ&7Io!vU-a(?iDmI~FokvwT2E3GapU(U^> z--XeKG5fitYJJ~&_yohDMK-MJa+S}WXfF4hy7@f;xDzpY`-xbvjD9EP0ZOc_t=Htb z1E6vb{hDe2^}k%l8$!ni#E)PTg6ez^JF!HiCj$bKm5KZLwR!fw@M5 zvD-|p(DWVbMS#*i=E4LSIc=OL>@^iB4R7$5C~?K2(xCB6CFbO9CDp>N^T)$J7?~VU ziT`RkpwAOCQwm~#8KmSlC$#+HbXq1{RS|`&aFMa$9^3}FVjHF2eqWHYH$+~E? zdnxZ+7w2#9MMf}W_B|2tj>RhX3)aK-JLP4>&y*6e>l_}8C-pro;yOHJ5$2VwJ0*(W zOCa+@kJ)|Ud6GTG{mfckbm;{BM*I9&(0XVn!OW{<{UL^>EO_vsd=9(A!6juntRwpM zh#SE6vl0QmQ_cm(G-5pun*8LUg>(}4aVl^7n(pv|a=mvn{4%+(8ZYej3YyxBvl5nV ztp<753^Uz2I}5)K@JAWeXZ$xx+-``|KwMRG8Z6o7s5$neZxlHi#vz5}+qRg+2=_}hq@5p1Uy!i5ijcxX z8wvn+T3e#Hjv=qWgYc1vUZSNU3q}Gk$CP17qiMhuJ;lb$VMH)`^(wfmvD87z3XngL z0_2XAS!%QhUx82K%PTH;dxIFzuSCIZ-W4rI$4DE2Q=)FcPz%$%+M45Ea!${{t4+2Z!zD7&E zpRm?1898I$vGArN zR<8&F7APCdn(`qXjs&~azEf&l6Z{@0huZ0#z)~83XkQF>xnPE+Dc9ky=bW8#;B;x- z+GFOLOeC3fP`Ds48)@9pRkeF+q3k}_Y~{a$X!kpl!5h)p7LDHa-~2lJk^8+_W8QBf z)<3LbM&7jOF<1!Dx=2AF(}_ou(o335MiXGbvAw@SI|VbA@@!We4+%b547AKjR(7+n zFtWmzGw4#^v4NO@cHItFK`{|xj?-#nSkum*wBV{aj{%^@Aj}345ar^Ms++{-oY07( zpYoN$Wx9gbbY0UwKcv(M6xVozg%L!b5;%2^0bduD$Y6{z|DOp2U?RTKmPmvkB+y}} zmX_BP`K+m|+zFRj+EP^DPa;wIo&w$fP2XTuj(%h>nNM?grihAOS``PEMm~zwJ6zu{ zZo`)5G=8q{li);{sg;qRVwnNBdZIJA%f$SmR9+anmum>P&Dg3XXj_yO{k<_Cc}&E8 zzLFy=bl)EjG;zHj=aP?i5s$)mbJDx!W3i3`+EYuMRKcyy<}+o^RqOre!{6iPe$k_L zyeI*`eArQCxHt9K{!h5!-!VuOS3Rp?W8WGqw$ z(|ZZmVpXZ1xMR@gR&JX0dA0kWUTl7>7Lfs8s}hKwZtlR%@anQhElQ}IBwI`)C<9Fe zX1pro>JM?c+q1iV_}7c!JZSV&dirsFEgn6g7uXJI z0Y6-WUkcJ}jO&#j@|a{%koEkLv`sN9Or{20PFM~NW4%#KZSBI03a>nlL~tHZzzJZ_ zfWJ_!x27WTnk=l~4i;DW?r`H`#*fHD~gyAoKL z_e=X8f-mAaE7S8#`0YU)_o9az9k+}9{YsL;5BnPjT=!@d{|j0FUL(Efvz#tk#U_I3 zd2OK#XJ?V?kQv5NNnXd)$q~3k>x|aufe2o|3nSw`vk0kOttPTVr9MwE_u5BEmb-iG z+uNV)9T#4k3VW32S97$={(Um{_tMi^eC%(Bv~k=B57a-HSRGw*XL8KAtMPopB&z6# zl7(=YHlziN7_LLQE2W2n9ZW2Cw4+RGOv}c;Jmy9G1aNB8itF*iZI&C%`1dN%xof+xb7{0JDEVt_)wyfNBvog2E)$P^>w+S1?J>If@Hx>vMGf2=6vJ!JK zw+^8zrC!a=J4wVkw;wi_EVY@xArhTnJDspLq>rK_alae6wk&gQKWVdfqR;j*AeL*h zlJvuDLr!v`8Vp&Ua~-2=-$H<&*!r~5SB{({65gA-r&TiLh^*ZuEO^tLVOP50g) z4Y5x8Pv)<7b=pKqekh+ypH{rq?R3Wwd!KM+9Pq3R@6QqD^5}4fjBJCz;ZDi^{cdp& z4WZMH(dUCtquF*lFvmBtrfj>d7G`@MuY|ZTpj(DTJ~-#CYUt@bqE%b*_KNJH22C`_N>&w%T1%V8yu#zh}RS3@WHr zQ|O-qElJLDqmn8j7~u4|7y&!8;Ja_@TMs!=PawGABM2>vsSQa45=l_z)@j(j) zX?$8tgTYgTRJ}OxlfC-(GWXkF^>6!9C4re#-5u9&zERl^@gG&~Qs%01_N1btCtsAX z)Rl4*C)MJZ+?YeF=iOmnwf(5vwmmjf6db5;$}ROl>J7t7yPip*!LAMce~s7}i}4mx z1n*yPA3okip=w_n4NEx6?^Q}inLbn4W;;dKdkKJ9Z0B1KL#==^lDXA?4gE0Ho7FaQ zTSR`^FLZh(`QA`Z#V#)4FE|Mn|GnbR80AjMnCaR zUGVr%LFQIJXVbM_Nf&m9t1w-7r6ld);1#|S4}i0Xb4U%fQ0m|8rkc2$6nNg?Csf+K zPnXZ_&Am2}V~cPuN)1m>nhc6X+w+r)BzWMsU_{725_s=XL8&0D3Tv|tWn6mkopHl9 zh7hR0-zHeSjhqsz=;AdXgZnf61ou{clKz|~ig*y720<&LC$5~Xv6~06`)>siWoEgq zuG3l6oZNFsXHE%It|^06CX?-c3y(c!s^SW^rj#q;H7<{Dq$}zA(744d2F)mcXQtz& zq*$$2W~Z2ZQwzN&-_ja3Ha8sbL3Dbyl+IZ z#N?vWK59HHtpCv~~ zHDnrddbfCj-D?6soXxbF4Gr*wujlbXy2@_;k`XsNrs=(Ewt?U-M*~^7=6vKkOVdqr z4|sJzUnWjOhLfux@HH%?9ZJW2T2+J&un3zj zxL@1`9Zm0ii>zcDKPlyk#e)(U-j%ef#$i3l&XKq(`B9*|fC)-Z!26lT{CxEQyJK!| zFc%)YZ`P#c{E*}kIE{L3dX`2F0-rr|62){Y8NC-`Ha7Y6+Pza}1s_?>0Fb(M5X9|* zMgj$O>+@Jd1uH<~ay#}@u`4@p`|(mEfE^=19GfdRD8F&LFm-^amutNpRH0rzDuB`>i1Uy#N#^srL~%y9&VyOt2) z`MG7^pm!or#Y<%+>RD5*DP7RlY@qIdkvVsRZWD$xC2@*^7jirWo2?4N@&xy78bH?4 zFra|J-heIam(r{Z=MkPezz*~^JA$J-eOPG==Cqo|ySqJT?k=67nR7z;pJ=Lu;`ai= zf6F+)q_7ni_^%@7?lnTlgd1JT`7TLgr5czU$AqZJXVZ6d^0l+h-^~C)c_&My>;OOC z68X`cdKI=$|t6VR^zaliFhOC4B*E!HmDauO zvW)Gh`Igg+h?@RJk{=BJiU3drVu4{+LEzxohVdcIurERiUmQHm@G`;!J`PI)(o67@ zqf52tzF{iY4NkW)Ze+Zat#sAt`>){E*$0lAitqRK#97R0pJYfg6nUbfMqrD}fsD`D z8h;o`VCkCDH}ktNldTB=;>aC8sA1^1vN@0kU-e`^^&+y4XzQpYWqKxS5)L4$Khuz5 z{KC1=jMprWk+WNZJle3qv^8Cn7^QtpTGWdRAo~I)pRFoMbG~C&7qGJ=RjfeIAhjWl zO>X@0y6so&;usG1{@1t-f6G7TQwpCxwY0!XLrtVgScGt(_qf za(|((L6=0%C2NLDp6ZN(z^!Dy64|p*ku+69^K)_QF zXhcsLu{u&;b!acly|IO{r)~!%qMMmbfkUT;rN+&@w;HU zQj6bocaJzig6X&C$)4P0N~5&1&|Xk1E2(=smG+VOq+WH=$PfO}`eJfE*n|A^>eRyM zYO!Md${v&KJTlNp1njQZ!~%j@1I33eK82SJ5@(w*jJD`hD2A-tX`|uYyToZJ;b+%b zN^skUKzK4Sje#?FPhQ)Pp*m$=|JUK*_wH{D8bWwJ5Y_GNa) zZMZ;<1ycaJt)>}jmcgM~v{n}{Hh2%V6AR&9oMiJYAfoHgCyZZw(7(VXY*ss)c?5PX z2^=xN_K4ZhDnlKuI6ank+;u|%$;x1_=ywgTBh}(NyIi!CS--Ul{|Gxou9IW+-GgH$ zE|<5cy4)q?Sl`h$F({<;8N6ju$EJAANu{eKQ1UNui-}&*jZN)NGApzXai#mvRyNgy zkH}(+7gMKsCr;UM@)?sF_~PX5H^LG`J9w|E%zJCoO6DYN=vzshAHW(B$Z5cun&dEy zXfySz_e7>M!b|7gI7V+@Nrzq-c$GkCiv%Vj)0sNT(lv_~zkC<4!RL z3(xtlgKOK&$I^pBNpa)24+0tud;CU~yV3Fk`w2V=nVuq$SmH*U-~pcBRG;n93vCBm zQEM+B&F0;Q#bPJIO@68$e6}?V^myuiSoG1^(V;<@r!UG%nVYxf{7}jT8*(})7+jAU zGJ_{igs=SU${U`>*t=xCVomqJG5-%seA>hL0)Jj%gSMG-md_Ntc{-A zo_ch&RlK37yjPXBZyQr&W@=^Mu@Da7OGr4ig;zrQ*1M>UM6Dq3Ty@jOL-FH!qrLp~ zhCXTP(h``PnX*c59UJkTvw-oDd};}c4=?crB1j4VXQNf6Y>M$D&1X+-IK75B+N_Qa+Z%UkWB1;f34M#B+E%BS$nuGcL^^`A%A6wv!wHh+WzMT zB}3jS5s$}aaL?+Y6ZUPCn=fAtK_9D%XD(+;#ygtj&_@Vf>KDqI! zCu45@S)_kjklQr_HTpdLhuUp_mVRrd1#cf-C?h9$FuM?_o#5!lVCo0^iOCKk>vMT( z3XPbY#NYlROLD1B2s{n?b|1D-L8FYn^v|e#__9d1u)wSyj4%q9GRn}AYiAFQ{Fb@S z+IU)ULb62R%l#n1KwJ}4xM?%&X}Ko|XuIZOK`It*=1(v6 z%KnQ8>0^Pb9kX2iZ8dz`t%&V6gLu zB7xxG_CzK%laEY}UJ8%^96LuSp@?;Iz{%PvKXw2$&=Ib)XSbc&EIs_W8<4~A)nWli zyZ<6_()O@^uaQ#gJh9S$@96-Pf0FPlwjj^$N6y0^$w(e>#u=41LQDD)@!n zI5F0m=>6^d*9HD)n4c^ElOtR4jg^+_vf0LvC;Ygd$GB=@>_gO@i%lP{4ohs0u2^UJ zKyNSo{8_E6b})MG2fHJctKcsK+(eu48snl@p{s}jK9VjJ1+~i}1sxpM zk)-wjAQ@&8eyAsZv%N+f9JxB9f@z5mRJ9#J@5Ca3u2`UVxKLY*gdD4QBIDg>gPjOh$M>ypbqKeV2Or}j zH@K$eQ9mjfUWz2-#HU0TPLv~kv|#@v@!*8$Q!EPsQfF2r0TI(I!PuX>4*29j~ z_iB~D%GgoNZ6N!xHg4ja)$xwKt$12>S6OGE!N(^KClGqig@z3c3J%6MPsxZCq}$VZ z2L{9vp2e)Jdq~3GlXX!XK6}!uT2r7Az7vZ3Mq{f&FL$uQ9iC(!s42Z4(wdt6Ho{N^ zBQllac7{`Rf>hT}!!F-U=&24dX+AsM(RQAB(Z_D`W1=#3^k1LJ)mMGtzB!+B2B5Ys z?mt;!UIf^gB!H;)*z#Dg{qGPNp5@AbxZs5%*6JdU{*SNL7qzB;>#Y>jwq`Jy@7YUD zR4MD_`Rxt;>%s3MM<@IAF8Q2m-6M%|tuP)9^md#cP&A{fOoUpV>kA@sKf$+%UfhVm z82{2+*(sUaIeR~>?}K%>kBV<^W%K$GtvLSPD*$c(GHfDha*;5V50$gcL`YTj^{0ny zoK|ovEXt8?UWq&h_fJDZ7}lC0YMeML^^CN!t7Tw4DX+tEYhY(r{lMaQA7W8!Xhj>c z*Tf5NBmLZWluPWcsp`r`q_LTSjx(?0_H2o39B6hA{R$)@>m|wOK3%_v9SEv(hKMz)Qm!mXdc-fBR8RABe>!??UnY0V^w6@QC9?)1 zmdCif@~Fch?VLNsa8kc~B9fl4)tbDniHSs}@=>iZ%pIFxdH&XQg`E9U*%k2teYBKI zZZws#o~y`cvT73X$0PNjMdZwFp^C5u#XDfRsx@?myeF>3&*lDHInczSfaczPvrSfl zIlbQ)BW_P0-hC!k8)D+S@PYj$VgN$#anGT~w$|{Ul`$b2)STR&s*=1x^VC=)^|h3v zUvGVCwTd+pa2i;Dl96}AK8-lD1|_@gbNQu{ zH!_LFs~589=Y6B|wU_HOaEor+TYk_8r#1am4kmU5AJp^iv*>}*EPd9}+axBRxbQSQcevpuekfgmtDDAIu+qD@&pVeYynX2Pk4q{~tFhS+emD!Ysndz!fENYG zcVCH>tHmd@zRddl36al?$HoW)(>q!@mG;`UK8pn@5cog$N_k^{fcvsDFVA+E-vg@K zz_s*fm(|dQ4o^o;skzM#heJ5cAXy}R2|od53Iss4?GwM0Hy*);X38TYenm>+i-;m& z1n>}}G8#(#r^C+ZJN-R~Vv~936X}R%MA}@>H-7TQ`qLWS{C%$3$MWq*bkQS$!T<{E zfmpTaXXP9HqIwrk!h1?vzal(*UINX-cZc?smwGcDmT^kNpoE>wbS@OVg~J=vW@gaY z$t5C`?r%8$gg02}WQ-`tCt=cvlTQ&WgW13{4q|{4FOsx4Vy=tuZ5}Qc9SIZyROnJk zp2yh7I9xV+!s~!_0O5m)53s%?$a`g!m87;q-1mRNc{$j~V{u!w90*Z0HXs39yMu~m) zvmP|HTbbA1dPMyhkaliDuzIZV5SXCI+J#DG0^18mla_M-t$ENi&s5mK&z9(~cLNY2 z=)2VD(E3b9*NpebKrU97&uy!wTZrK^B>j|jH^nFdc!(P%c7HS5dR3^1qCppf_U8ye zg=#5jO|j|fZHp{#J8jz-9%Glb?Rb!^@U_O(blKbOO_@{+*DJa62EH@nwV2=hj9utD zm>GfNt=(3r^+mOH_Qkvag8Ca^`Uj4^S3{Ah#{f=J2~dP-X?O{Z_>BY-Wr4Q{373j8 zo%c>8ARAoq1q5!yxkt0jw#4wk2o=TQ`?dB&#)KAq~hikSlAP~l; z&TyvPJpmpFK!%-!x-ScY)3Da&p}q%2;)`leus+LRhgfv$ViD-M_mTigx|kEww($by zR!g#bA$pbkgZA)*VWFp9j&78EzUR8;1p&!}z>(6$O;p0|l~4Iu!=u?LOBaP^e`~#n zx{t9fi-@I4siJ%~2?LJ%P`BwKU7Cr-di}M_vE(boPoiWz6jG{ zD8+FZsKHNf2c?kTG?sT6s2(XN!^-lTTpHo0HO)c0#JRzB{rN&bNlye6%~kvkG9r&c zQxRi`y0GQIZDPxi=)Xc7?x^Lju3eV;fv=8sy=QC&nmC&CM;j zXSST&FbnnPIwOPLANn0l=KFgo{XZ-&d89u#emIr);*%n&=)!JDN z>m#`?uc&SL*qK5)O=E1(HTDcGzB=+~cOe>7Mnju;!Xoor#bLrPRjIIaF9t2@&oU;9 zfVU%FDpRw28)6NQ!h-(QADbF6m%H-3bcLGl_h}LZaYs=nL-9v!>4a zrd}lY5&-~9V9;or#rO9~P(^RO5)TLq%`o!C^?L6?ZyX~HqCEiYP_#ZZpZ}e5+S}u9 z&YXEUGCyYSTI7TNkIGu|TQa!_VH5(;Kl#Y-N=Pt~f{em!ds+kUUC#7o8W@{$jqNYK zdLd1AY6Y2wPa>?g@28^yG#UU8;3f|MI{AMug#Z5ne((E#XpnW;$o;wR UitnrlZu;iLF&ndYM?E6{2jO2F=>Px# literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/BootReceiver.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/BootReceiver.kt new file mode 100644 index 0000000..cdfeb19 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/BootReceiver.kt @@ -0,0 +1,49 @@ +package com.zaneschepke.wireguardautotunnel + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.zaneschepke.wireguardautotunnel.repository.Repository +import com.zaneschepke.wireguardautotunnel.service.foreground.Action +import com.zaneschepke.wireguardautotunnel.service.foreground.ServiceTracker +import com.zaneschepke.wireguardautotunnel.service.foreground.WireGuardConnectivityWatcherService +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.Settings +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.TunnelConfig +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import javax.inject.Inject + +@AndroidEntryPoint +class BootReceiver : BroadcastReceiver() { + + @Inject + lateinit var settingsRepo : Repository + + @OptIn(DelicateCoroutinesApi::class) + override fun onReceive(context: Context, intent: Intent) { + if (intent.action == Intent.ACTION_BOOT_COMPLETED) { + GlobalScope.launch { + try { + val settings = settingsRepo.getAll() + if (!settings.isNullOrEmpty()) { + val setting = settings[0] + if (setting.isAutoTunnelEnabled && setting.defaultTunnel != null) { + val defaultTunnel = TunnelConfig.from(setting.defaultTunnel!!) + ServiceTracker.actionOnService( + Action.START, context, + WireGuardConnectivityWatcherService::class.java, + mapOf(context.resources.getString(R.string.tunnel_extras_key) to + defaultTunnel.id.toString()) + ) + } + } + } finally { + cancel() + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/WireGuardAutoTunnel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/WireGuardAutoTunnel.kt new file mode 100644 index 0000000..bf8a51d --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/WireGuardAutoTunnel.kt @@ -0,0 +1,21 @@ +package com.zaneschepke.wireguardautotunnel + +import android.app.Application +import com.zaneschepke.wireguardautotunnel.repository.Repository +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.Settings +import dagger.hilt.android.HiltAndroidApp +import timber.log.Timber +import javax.inject.Inject + +@HiltAndroidApp +class WireGuardAutoTunnel : Application() { + + @Inject + lateinit var settingsRepo : Repository + + override fun onCreate() { + super.onCreate() + if(BuildConfig.DEBUG) Timber.plant(Timber.DebugTree()) + settingsRepo.init() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/BoxModule.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/BoxModule.kt new file mode 100644 index 0000000..45a74f0 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/BoxModule.kt @@ -0,0 +1,40 @@ +package com.zaneschepke.wireguardautotunnel.module + +import android.content.Context +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.MyObjectBox +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.Settings +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.TunnelConfig +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import io.objectbox.Box +import io.objectbox.BoxStore +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +class BoxModule { + + @Provides + @Singleton + fun provideBoxStore(@ApplicationContext context : Context) : BoxStore { + return MyObjectBox.builder() + .androidContext(context.applicationContext) + .build() + } + + @Provides + @Singleton + fun provideBoxForSettings(store : BoxStore) : Box { + return store.boxFor(Settings::class.java) + } + + @Provides + @Singleton + fun provideBoxForTunnels(store : BoxStore) : Box { + return store.boxFor(TunnelConfig::class.java) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/RepositoryModule.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/RepositoryModule.kt new file mode 100644 index 0000000..4626425 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/RepositoryModule.kt @@ -0,0 +1,25 @@ +package com.zaneschepke.wireguardautotunnel.module + +import com.zaneschepke.wireguardautotunnel.repository.Repository +import com.zaneschepke.wireguardautotunnel.repository.SettingsBox +import com.zaneschepke.wireguardautotunnel.repository.TunnelBox +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.Settings +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.TunnelConfig +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +abstract class RepositoryModule { + + @Binds + @Singleton + abstract fun provideSettingsRepository(settingsBox: SettingsBox) : Repository + + @Binds + @Singleton + abstract fun provideTunnelRepository(tunnelBox: TunnelBox) : Repository +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/ServiceModule.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/ServiceModule.kt new file mode 100644 index 0000000..59f6644 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/ServiceModule.kt @@ -0,0 +1,29 @@ +package com.zaneschepke.wireguardautotunnel.module + +import com.zaneschepke.wireguardautotunnel.service.network.MobileDataService +import com.zaneschepke.wireguardautotunnel.service.network.NetworkService +import com.zaneschepke.wireguardautotunnel.service.network.WifiService +import com.zaneschepke.wireguardautotunnel.service.notification.NotificationService +import com.zaneschepke.wireguardautotunnel.service.notification.WireGuardNotification +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ServiceComponent +import dagger.hilt.android.scopes.ServiceScoped + +@Module +@InstallIn(ServiceComponent::class) +abstract class ServiceModule { + + @Binds + @ServiceScoped + abstract fun provideNotificationService(wireGuardNotification: WireGuardNotification) : NotificationService + + @Binds + @ServiceScoped + abstract fun provideWifiService(wifiService: WifiService) : NetworkService + + @Binds + @ServiceScoped + abstract fun provideMobileDataService(mobileDataService : MobileDataService) : NetworkService +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt new file mode 100644 index 0000000..6e75ac3 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/module/TunnelModule.kt @@ -0,0 +1,31 @@ +package com.zaneschepke.wireguardautotunnel.module + +import android.content.Context +import com.wireguard.android.backend.Backend +import com.wireguard.android.backend.GoBackend +import com.zaneschepke.wireguardautotunnel.service.tunnel.VpnService +import com.zaneschepke.wireguardautotunnel.service.tunnel.WireGuardTunnel +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +class TunnelModule { + + @Provides + @Singleton + fun provideBackend(@ApplicationContext context : Context) : Backend { + return GoBackend(context) + } + + @Provides + @Singleton + fun provideVpnService(backend: Backend) : VpnService { + return WireGuardTunnel(backend) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/Repository.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/Repository.kt new file mode 100644 index 0000000..4f1b59f --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/Repository.kt @@ -0,0 +1,16 @@ +package com.zaneschepke.wireguardautotunnel.repository + +import kotlinx.coroutines.flow.Flow + +interface Repository { + suspend fun save(t : T) + suspend fun saveAll(t : List) + suspend fun getById(id : Long) : T? + suspend fun getAll() : List? + suspend fun delete(t : T) : Boolean? + suspend fun count() : Long? + + val itemFlow : Flow> + + fun init() +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/SettingsBox.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/SettingsBox.kt new file mode 100644 index 0000000..0ba02d3 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/SettingsBox.kt @@ -0,0 +1,63 @@ +package com.zaneschepke.wireguardautotunnel.repository + +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.Settings +import io.objectbox.Box +import io.objectbox.BoxStore +import io.objectbox.kotlin.awaitCallInTx +import io.objectbox.kotlin.toFlow +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.launch +import javax.inject.Inject + + +class SettingsBox @Inject constructor(private val box : Box, private val boxStore : BoxStore) : Repository { + + @OptIn(ExperimentalCoroutinesApi::class) + override val itemFlow = box.query().build().subscribe().toFlow() + + override fun init() { + CoroutineScope(Dispatchers.IO).launch { + if(getAll().isNullOrEmpty()) { + save(Settings()) + } + } + } + + override suspend fun save(t : Settings) { + boxStore.awaitCallInTx { + box.put(t) + } + } + + override suspend fun saveAll(t : List) { + boxStore.awaitCallInTx { + box.put(t) + } + } + + override suspend fun getById(id: Long): Settings? { + return boxStore.awaitCallInTx { + box[id] + } + } + + override suspend fun getAll(): List? { + return boxStore.awaitCallInTx { + box.all + } + } + + override suspend fun delete(t : Settings): Boolean? { + return boxStore.awaitCallInTx { + box.remove(t) + } + } + + override suspend fun count() : Long? { + return boxStore.awaitCallInTx { + box.count() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/TunnelBox.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/TunnelBox.kt new file mode 100644 index 0000000..ea845da --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/repository/TunnelBox.kt @@ -0,0 +1,57 @@ +package com.zaneschepke.wireguardautotunnel.repository + +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.TunnelConfig +import io.objectbox.Box +import io.objectbox.BoxStore +import io.objectbox.kotlin.awaitCallInTx +import io.objectbox.kotlin.toFlow +import kotlinx.coroutines.ExperimentalCoroutinesApi +import timber.log.Timber +import javax.inject.Inject + +class TunnelBox @Inject constructor(private val box : Box,private val boxStore : BoxStore) : Repository { + + @OptIn(ExperimentalCoroutinesApi::class) + override val itemFlow = box.query().build().subscribe().toFlow() + override fun init() { + + } + + override suspend fun save(t : TunnelConfig) { + Timber.d("Saving tunnel config") + boxStore.awaitCallInTx { + box.put(t) + } + + } + + override suspend fun saveAll(t : List) { + boxStore.awaitCallInTx { + box.put(t) + } + } + + override suspend fun getById(id: Long): TunnelConfig? { + return boxStore.awaitCallInTx { + box[id] + } + } + + override suspend fun getAll(): List? { + return boxStore.awaitCallInTx { + box.all + } + } + + override suspend fun delete(t : TunnelConfig): Boolean? { + return boxStore.awaitCallInTx { + box.remove(t) + } + } + + override suspend fun count() : Long? { + return boxStore.awaitCallInTx { + box.count() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/Action.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/Action.kt new file mode 100644 index 0000000..1ccbfdf --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/Action.kt @@ -0,0 +1,6 @@ +package com.zaneschepke.wireguardautotunnel.service.foreground + +enum class Action { + START, + STOP +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ForegroundService.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ForegroundService.kt new file mode 100644 index 0000000..b1ffe6c --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ForegroundService.kt @@ -0,0 +1,62 @@ +package com.zaneschepke.wireguardautotunnel.service.foreground + +import android.app.Service +import android.content.Intent +import android.os.Bundle +import android.os.IBinder +import timber.log.Timber + + +open class ForegroundService : Service() { + + private var isServiceStarted = false + + override fun onBind(intent: Intent): IBinder? { + // We don't provide binding, so return null + return null + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + Timber.d("onStartCommand executed with startId: $startId") + if (intent != null) { + val action = intent.action + Timber.d("using an intent with action $action") + when (action) { + Action.START.name -> startService(intent.extras) + Action.STOP.name -> stopService(intent.extras) + else -> Timber.d("This should never happen. No action in the received intent") + } + } else { + Timber.d( + "with a null intent. It has been probably restarted by the system." + ) + } + // by returning this we make sure the service is restarted if the system kills the service + return START_STICKY + } + + + override fun onDestroy() { + super.onDestroy() + Timber.d("The service has been destroyed") + } + + protected open fun startService(extras : Bundle?) { + if (isServiceStarted) return + Timber.d("Starting ${this.javaClass.simpleName}") + isServiceStarted = true + ServiceTracker.setServiceState(this, ServiceState.STARTED, this.javaClass) + } + + protected open fun stopService(extras : Bundle?) { + Timber.d("Stopping ${this.javaClass.simpleName}") + try { + stopForeground(STOP_FOREGROUND_REMOVE) + stopSelf() + } catch (e: Exception) { + Timber.d("Service stopped without being started: ${e.message}") + } + isServiceStarted = false + ServiceTracker.setServiceState(this, ServiceState.STOPPED, this.javaClass) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceState.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceState.kt new file mode 100644 index 0000000..2671b2c --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceState.kt @@ -0,0 +1,6 @@ +package com.zaneschepke.wireguardautotunnel.service.foreground + +enum class ServiceState { + STARTED, + STOPPED, +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceTracker.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceTracker.kt new file mode 100644 index 0000000..8dadca9 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/ServiceTracker.kt @@ -0,0 +1,52 @@ +package com.zaneschepke.wireguardautotunnel.service.foreground + +import android.app.Application +import android.app.Service +import android.content.Context +import android.content.Intent +import android.content.SharedPreferences +import com.zaneschepke.wireguardautotunnel.R + +object ServiceTracker { + fun setServiceState(context: Context, state: ServiceState, cls : Class) { + val sharedPrefs = getPreferences(context) + sharedPrefs.edit().let { + it.putString(cls.simpleName, state.name) + it.apply() + } + } + + private fun getServiceState(context: Context, cls : Class): ServiceState { + val sharedPrefs = getPreferences(context) + val value = sharedPrefs.getString(cls.simpleName, ServiceState.STOPPED.name) + return ServiceState.valueOf(value!!) + } + + private fun getPreferences(context: Context): SharedPreferences { + return context.getSharedPreferences(context.resources.getString(R.string.foreground_file), 0) + } + + fun actionOnService(action: Action, application: Application, cls : Class, extras : Map? = null) { + if (getServiceState(application, cls) == ServiceState.STOPPED && action == Action.STOP) return + val intent = Intent(application, cls).also { + it.action = action.name + extras?.forEach {(k, v) -> + it.putExtra(k, v) + } + } + intent.component?.javaClass + application.startService(intent) + } + + fun actionOnService(action: Action, context: Context, cls : Class, extras : Map? = null) { + if (getServiceState(context, cls) == ServiceState.STOPPED && action == Action.STOP) return + val intent = Intent(context, cls).also { + it.action = action.name + extras?.forEach {(k, v) -> + it.putExtra(k, v) + } + } + intent.component?.javaClass + context.startService(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardConnectivityWatcherService.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardConnectivityWatcherService.kt new file mode 100644 index 0000000..e476fbe --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardConnectivityWatcherService.kt @@ -0,0 +1,220 @@ +package com.zaneschepke.wireguardautotunnel.service.foreground + +import android.app.AlarmManager +import android.app.Application +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.os.PowerManager +import android.os.SystemClock +import com.wireguard.android.backend.Tunnel +import com.zaneschepke.wireguardautotunnel.R +import com.zaneschepke.wireguardautotunnel.repository.Repository +import com.zaneschepke.wireguardautotunnel.service.network.MobileDataService +import com.zaneschepke.wireguardautotunnel.service.network.NetworkService +import com.zaneschepke.wireguardautotunnel.service.network.NetworkStatus +import com.zaneschepke.wireguardautotunnel.service.network.WifiService +import com.zaneschepke.wireguardautotunnel.service.notification.NotificationService +import com.zaneschepke.wireguardautotunnel.service.tunnel.VpnService +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.Settings +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + +@AndroidEntryPoint +class WireGuardConnectivityWatcherService : ForegroundService() { + + @Inject + lateinit var wifiService : NetworkService + + @Inject + lateinit var mobileDataService : NetworkService + + @Inject + lateinit var settingsRepo: Repository + + @Inject + lateinit var notificationService : NotificationService + + @Inject + lateinit var vpnService : VpnService + + private lateinit var watcherJob : Job; + private lateinit var setting : Settings + private lateinit var tunnelId: String + + private var connecting = false + private var disconnecting = false + private var isWifiConnected = false + private var isMobileDataConnected = false + + private var wakeLock: PowerManager.WakeLock? = null + private val tag = this.javaClass.name; + + + override fun startService(extras: Bundle?) { + super.startService(extras) + val tunnelId = extras?.getString(getString(R.string.tunnel_extras_key)) + if (tunnelId != null) { + this.tunnelId = tunnelId + } + // we need this lock so our service gets not affected by Doze Mode + initWakeLock() + cancelWatcherJob() + startWatcherNotification() + if(this::tunnelId.isInitialized) { + startWatcherJob() + } else { + stopService(extras) + } + } + + override fun stopService(extras: Bundle?) { + super.stopService(extras) + wakeLock?.let { + if (it.isHeld) { + it.release() + } + } + cancelWatcherJob() + stopVPN() + stopSelf() + } + + private fun startWatcherNotification() { + val notification = notificationService.createNotification( + channelId = getString(R.string.watcher_channel_id), + channelName = getString(R.string.watcher_channel_name), + title = getString(R.string.watcher_notification_title), + description = getString(R.string.watcher_notification_text)) + super.startForeground(1, notification) + } + + //try to start task again if killed + override fun onTaskRemoved(rootIntent: Intent) { + Timber.d("Task Removed called") + val restartServiceIntent = Intent(applicationContext, this::class.java).also { + it.setPackage(packageName) + }; + val restartServicePendingIntent: PendingIntent = PendingIntent.getService(this, 1, restartServiceIntent, + PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE); + applicationContext.getSystemService(Context.ALARM_SERVICE); + val alarmService: AlarmManager = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager; + alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePendingIntent); + } + + private fun initWakeLock() { + wakeLock = + (getSystemService(Context.POWER_SERVICE) as PowerManager).run { + newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "$tag::lock").apply { + acquire() + } + } + } + + private fun cancelWatcherJob() { + if(this::watcherJob.isInitialized) { + watcherJob.cancel() + } + } + + @OptIn(DelicateCoroutinesApi::class) + private fun startWatcherJob() { + watcherJob = GlobalScope.launch { + val settings = settingsRepo.getAll(); + if(!settings.isNullOrEmpty()) { + setting = settings[0] + } + if(setting.isTunnelOnMobileDataEnabled) { + GlobalScope.launch { + watchForMobileDataConnectivityChanges() + } + } + watchForWifiConnectivityChanges() + } + } + + private suspend fun watchForMobileDataConnectivityChanges() { + mobileDataService.networkStatus.collect { + when(it) { + is NetworkStatus.Available -> { + Timber.d("Gained Mobile data connection") + isMobileDataConnected = true + } + is NetworkStatus.CapabilitiesChanged -> { + isMobileDataConnected = true + Timber.d("Mobile data capabilities changed") + if(!isWifiConnected && setting.isTunnelOnMobileDataEnabled + && vpnService.getState() == Tunnel.State.DOWN) + startVPN() + } + is NetworkStatus.Unavailable -> { + isMobileDataConnected = false + if(!isWifiConnected && vpnService.getState() == Tunnel.State.UP) stopVPN() + Timber.d("Lost mobile data connection") + } + } + } + } + + private suspend fun watchForWifiConnectivityChanges() { + wifiService.networkStatus.collect { + when (it) { + is NetworkStatus.Available -> { + Timber.d("Gained Wi-Fi connection") + isWifiConnected = true + } + is NetworkStatus.CapabilitiesChanged -> { + isWifiConnected = true + if (!connecting && !disconnecting) { + val ssid = wifiService.getNetworkName(it.networkCapabilities); + Timber.d("SSID: $ssid") + if ((setting.trustedNetworkSSIDs?.contains(ssid) == false) && vpnService.getState() == Tunnel.State.DOWN) { + Timber.d("Starting VPN Tunnel for untrusted network: $ssid") + startVPN() + } else if (!disconnecting && vpnService.getState() == Tunnel.State.UP && (setting.trustedNetworkSSIDs?.contains( + ssid + ) == true) + ) { + Timber.d("Stopping VPN Tunnel for trusted network with ssid: $ssid") + stopVPN() + } + } + } + is NetworkStatus.Unavailable -> { + isWifiConnected = false + Timber.d("Lost Wi-Fi connection") + if(setting.isTunnelOnMobileDataEnabled && vpnService.getState() == Tunnel.State.DOWN + && isMobileDataConnected) startVPN() + } + } + } + } + private fun startVPN() { + if(!connecting) { + connecting = true + ServiceTracker.actionOnService( + Action.START, + this.applicationContext as Application, + WireGuardTunnelService::class.java, + mapOf(getString(R.string.tunnel_extras_key) to tunnelId)) + connecting = false + } + } + private fun stopVPN() { + if(!disconnecting) { + disconnecting = true + ServiceTracker.actionOnService( + Action.STOP, + this.applicationContext as Application, + WireGuardTunnelService::class.java + ) + disconnecting = false + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardTunnelService.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardTunnelService.kt new file mode 100644 index 0000000..513d98f --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground/WireGuardTunnelService.kt @@ -0,0 +1,76 @@ +package com.zaneschepke.wireguardautotunnel.service.foreground + +import android.os.Bundle +import com.wireguard.android.backend.Tunnel +import com.zaneschepke.wireguardautotunnel.R +import com.zaneschepke.wireguardautotunnel.service.notification.NotificationService +import com.zaneschepke.wireguardautotunnel.service.tunnel.VpnService +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.TunnelConfig +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch +import timber.log.Timber +import javax.inject.Inject + +@AndroidEntryPoint +class WireGuardTunnelService : ForegroundService() { + + @Inject + lateinit var vpnService : VpnService + + @Inject + lateinit var notificationService : NotificationService + + private lateinit var job : Job + + @OptIn(DelicateCoroutinesApi::class) + override fun startService(extras : Bundle?) { + super.startService(extras) + val tunnelConfigString = extras?.getString(getString(R.string.tunnel_extras_key)) + cancelJob() + job = GlobalScope.launch { + if(tunnelConfigString != null) { + try { + val tunnelConfig = TunnelConfig.from(tunnelConfigString) + val state = vpnService.startTunnel(tunnelConfig) + if (state == Tunnel.State.UP) { + launchVpnConnectedNotification(tunnelConfig.name) + } + } catch (e : Exception) { + Timber.e("Problem starting tunnel: ${e.message}") + stopService(extras) + } + } else { + Timber.e("Tunnel config null") + } + } + } + + override fun stopService(extras : Bundle?) { + super.stopService(extras) + CoroutineScope(Dispatchers.IO).launch() { + vpnService.stopTunnel() + } + cancelJob() + stopSelf() + } + + private fun launchVpnConnectedNotification(tunnelName : String) { + val notification = notificationService.createNotification( + channelId = getString(R.string.vpn_channel_id), + channelName = getString(R.string.vpn_channel_name), + title = getString(R.string.tunnel_start_title), + description = "${getString(R.string.tunnel_start_text)} $tunnelName" + ) + super.startForeground(1, notification) + } + private fun cancelJob() { + if(this::job.isInitialized) { + job.cancel() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/BaseNetworkService.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/BaseNetworkService.kt new file mode 100644 index 0000000..cdf5151 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/BaseNetworkService.kt @@ -0,0 +1,117 @@ +package com.zaneschepke.wireguardautotunnel.service.network + +import android.app.Service +import android.content.Context +import android.net.ConnectivityManager +import android.net.Network +import android.net.NetworkCapabilities +import android.net.NetworkRequest +import android.net.wifi.SupplicantState +import android.net.wifi.WifiInfo +import android.net.wifi.WifiManager +import android.os.Build +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.map +import javax.inject.Inject + + +abstract class BaseNetworkService>(val context: Context, networkCapability : Int) : NetworkService { + private val connectivityManager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + + private val wifiManager = + context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager + + override val networkStatus = callbackFlow { + val networkStatusCallback = when (Build.VERSION.SDK_INT) { + in Build.VERSION_CODES.S..Int.MAX_VALUE -> { + object : ConnectivityManager.NetworkCallback( + FLAG_INCLUDE_LOCATION_INFO + ) { + + override fun onAvailable(network: Network) { + trySend(NetworkStatus.Available(network)) + } + + override fun onLost(network: Network) { + trySend(NetworkStatus.Unavailable(network)) + } + + override fun onCapabilitiesChanged( + network: Network, + networkCapabilities: NetworkCapabilities + ) { + trySend(NetworkStatus.CapabilitiesChanged(network, networkCapabilities)) + } + } + } + else -> { + object : ConnectivityManager.NetworkCallback() { + + override fun onAvailable(network: Network) { + trySend(NetworkStatus.Available(network)) + } + + override fun onLost(network: Network) { + trySend(NetworkStatus.Unavailable(network)) + } + + override fun onCapabilitiesChanged( + network: Network, + networkCapabilities: NetworkCapabilities + ) { + trySend(NetworkStatus.CapabilitiesChanged(network, networkCapabilities)) + } + } + } + } + val request = NetworkRequest.Builder() + .addTransportType(networkCapability) + .build() + connectivityManager.registerNetworkCallback(request, networkStatusCallback) + + awaitClose { + connectivityManager.unregisterNetworkCallback(networkStatusCallback) + } + } + + + override fun getNetworkName(networkCapabilities: NetworkCapabilities): String? { + var ssid : String? = getWifiNameFromCapabilities(networkCapabilities) + if((Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) || (Build.VERSION.SDK_INT == Build.VERSION_CODES.R)) { + val info = wifiManager.connectionInfo + if (info.supplicantState === SupplicantState.COMPLETED) { + ssid = info.ssid + } + } + return ssid?.trim('"') + } + + + companion object { + private fun getWifiNameFromCapabilities(networkCapabilities: NetworkCapabilities) : String? { + val info : WifiInfo + if(networkCapabilities.transportInfo is WifiInfo) { + info = networkCapabilities.transportInfo as WifiInfo + } else { + return null + } + return info.ssid + } + } +} + +inline fun Flow.map( + crossinline onUnavailable: suspend (network : Network) -> Result, + crossinline onAvailable: suspend (network : Network) -> Result, + crossinline onCapabilitiesChanged: suspend (network : Network, networkCapabilities : NetworkCapabilities) -> Result, +): Flow = map { status -> + when (status) { + is NetworkStatus.Unavailable -> onUnavailable(status.network) + is NetworkStatus.Available -> onAvailable(status.network) + is NetworkStatus.CapabilitiesChanged -> onCapabilitiesChanged(status.network, status.networkCapabilities) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/MobileDataService.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/MobileDataService.kt new file mode 100644 index 0000000..df61c52 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/MobileDataService.kt @@ -0,0 +1,10 @@ +package com.zaneschepke.wireguardautotunnel.service.network + +import android.content.Context +import android.net.NetworkCapabilities +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +class MobileDataService @Inject constructor(@ApplicationContext context: Context) : + BaseNetworkService(context, NetworkCapabilities.TRANSPORT_CELLULAR) { +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkService.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkService.kt new file mode 100644 index 0000000..fb25515 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkService.kt @@ -0,0 +1,10 @@ +package com.zaneschepke.wireguardautotunnel.service.network + +import android.net.NetworkCapabilities +import kotlinx.coroutines.flow.Flow + +interface NetworkService { + fun getNetworkName(networkCapabilities: NetworkCapabilities) : String? + val networkStatus : Flow + +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkStatus.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkStatus.kt new file mode 100644 index 0000000..ab895a8 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/NetworkStatus.kt @@ -0,0 +1,10 @@ +package com.zaneschepke.wireguardautotunnel.service.network + +import android.net.Network +import android.net.NetworkCapabilities + +sealed class NetworkStatus { + class Available(val network : Network) : NetworkStatus() + class Unavailable(val network : Network) : NetworkStatus() + class CapabilitiesChanged(val network : Network, val networkCapabilities : NetworkCapabilities) : NetworkStatus() +} diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/WifiService.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/WifiService.kt new file mode 100644 index 0000000..bbdf0a7 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network/WifiService.kt @@ -0,0 +1,10 @@ +package com.zaneschepke.wireguardautotunnel.service.network + +import android.content.Context +import android.net.NetworkCapabilities +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +class WifiService @Inject constructor(@ApplicationContext context: Context) : + BaseNetworkService(context, NetworkCapabilities.TRANSPORT_WIFI) { +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/NotificationService.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/NotificationService.kt new file mode 100644 index 0000000..6ae0082 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/NotificationService.kt @@ -0,0 +1,16 @@ +package com.zaneschepke.wireguardautotunnel.service.notification + +import android.app.Notification +import android.app.NotificationManager + +interface NotificationService { + fun createNotification( + channelId: String, + channelName: String, + title: String, + description: String, + importance: Int = NotificationManager.IMPORTANCE_HIGH, + vibration: Boolean = true, + lights: Boolean = true + ): Notification +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/WireGuardNotification.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/WireGuardNotification.kt new file mode 100644 index 0000000..8b62978 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification/WireGuardNotification.kt @@ -0,0 +1,60 @@ +package com.zaneschepke.wireguardautotunnel.service.notification + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.graphics.Color +import com.zaneschepke.wireguardautotunnel.R +import com.zaneschepke.wireguardautotunnel.ui.MainActivity +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +class WireGuardNotification @Inject constructor(@ApplicationContext private val context: Context) : NotificationService { + + private val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager; + + override fun createNotification( + channelId: String, + channelName: String, + title: String, + description: String, + importance: Int, + vibration: Boolean, + lights: Boolean + ) : Notification { + val channel = NotificationChannel( + channelId, + channelName, + importance + ).let { + it.description = title + it.enableLights(lights) + it.lightColor = Color.RED + it.enableVibration(vibration) + it.vibrationPattern = longArrayOf(100, 200, 300, 400, 500, 400, 300, 200, 400) + it + } + notificationManager.createNotificationChannel(channel) + val pendingIntent: PendingIntent = + Intent(context, MainActivity::class.java).let { notificationIntent -> + PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE) + } + + val builder: Notification.Builder = + Notification.Builder( + context, + channelId + ) + + return builder + .setContentTitle(title) + .setContentText(description) + .setContentIntent(pendingIntent) + .setShowWhen(true) + .setSmallIcon(R.mipmap.ic_launcher_foreground) + .build() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/VpnService.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/VpnService.kt new file mode 100644 index 0000000..91be50c --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/VpnService.kt @@ -0,0 +1,13 @@ +package com.zaneschepke.wireguardautotunnel.service.tunnel + +import com.wireguard.android.backend.Tunnel +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.TunnelConfig +import kotlinx.coroutines.flow.SharedFlow + +interface VpnService : Tunnel { + suspend fun startTunnel(tunnelConfig : TunnelConfig) : Tunnel.State + suspend fun stopTunnel() + val state : SharedFlow + val tunnelName : SharedFlow + fun getState() : Tunnel.State +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/WireGuardTunnel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/WireGuardTunnel.kt new file mode 100644 index 0000000..56b8a79 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/WireGuardTunnel.kt @@ -0,0 +1,65 @@ +package com.zaneschepke.wireguardautotunnel.service.tunnel + +import com.wireguard.android.backend.Backend +import com.wireguard.android.backend.BackendException +import com.wireguard.android.backend.Tunnel +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.TunnelConfig +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import timber.log.Timber +import javax.inject.Inject + + +class WireGuardTunnel @Inject constructor(private val backend : Backend) : VpnService { + + private val _tunnelName = MutableStateFlow("") + override val tunnelName get() = _tunnelName.asStateFlow() + private val _state = MutableSharedFlow( + replay = 1, + onBufferOverflow = BufferOverflow.SUSPEND, + extraBufferCapacity = 1) + override val state get() = _state.asSharedFlow() + + override suspend fun startTunnel(tunnelConfig: TunnelConfig) : Tunnel.State{ + try { + if(getState() == Tunnel.State.UP && _tunnelName.value != tunnelConfig.name) { + stopTunnel() + } + _tunnelName.emit(tunnelConfig.name) + val config = TunnelConfig.configFromQuick(tunnelConfig.wgQuick) + val state = backend.setState( + this, Tunnel.State.UP, config) + _state.emit(state) + return state; + } catch (e : Exception) { + Timber.e("Failed to start tunnel with error: ${e.message}") + return Tunnel.State.DOWN + } + } + + override fun getName(): String { + return _tunnelName.value + } + + override suspend fun stopTunnel() { + try { + if(getState() == Tunnel.State.UP) { + val state = backend.setState(this, Tunnel.State.DOWN, null) + _state.emit(state) + } + } catch (e : BackendException) { + Timber.e("Failed to stop tunnel with error: ${e.message}") + } + } + + override fun getState(): Tunnel.State { + return backend.getState(this) + } + + override fun onStateChange(state : Tunnel.State) { + _state.tryEmit(state) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/Settings.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/Settings.kt new file mode 100644 index 0000000..d802e65 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/Settings.kt @@ -0,0 +1,14 @@ +package com.zaneschepke.wireguardautotunnel.service.tunnel.model + +import io.objectbox.annotation.Entity +import io.objectbox.annotation.Id + +@Entity +data class Settings( + @Id + var id : Long = 0, + var isAutoTunnelEnabled : Boolean = false, + var isTunnelOnMobileDataEnabled : Boolean = false, + var trustedNetworkSSIDs : MutableList = mutableListOf(), + var defaultTunnel : String? = null +) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/TunnelConfig.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/TunnelConfig.kt new file mode 100644 index 0000000..7e865b4 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model/TunnelConfig.kt @@ -0,0 +1,36 @@ +package com.zaneschepke.wireguardautotunnel.service.tunnel.model + +import com.wireguard.config.Config +import io.objectbox.annotation.ConflictStrategy +import io.objectbox.annotation.Entity +import io.objectbox.annotation.Id +import io.objectbox.annotation.Unique +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import java.io.InputStream + + +@Entity +@Serializable +data class TunnelConfig( + @Id + var id : Long = 0, + @Unique(onConflict = ConflictStrategy.REPLACE) + var name : String, + var wgQuick : String +) { + override fun toString(): String { + return Json.encodeToString(serializer(), this) + } + + companion object { + fun from(string : String) : TunnelConfig { + return Json.decodeFromString(string) + } + fun configFromQuick(wgQuick: String): Config { + val inputStream: InputStream = wgQuick.byteInputStream() + val reader = inputStream.bufferedReader(Charsets.UTF_8) + return Config.parse(reader) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/MainActivity.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/MainActivity.kt new file mode 100644 index 0000000..61c21cf --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/MainActivity.kt @@ -0,0 +1,168 @@ +package com.zaneschepke.wireguardautotunnel.ui + +import android.Manifest +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.provider.Settings +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.compose.setContent +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.slideInHorizontally +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import com.google.accompanist.navigation.animation.AnimatedNavHost +import com.google.accompanist.navigation.animation.composable +import com.google.accompanist.navigation.animation.rememberAnimatedNavController +import com.google.accompanist.permissions.ExperimentalPermissionsApi +import com.google.accompanist.permissions.isGranted +import com.google.accompanist.permissions.rememberPermissionState +import com.wireguard.android.backend.GoBackend +import com.zaneschepke.wireguardautotunnel.R +import com.zaneschepke.wireguardautotunnel.ui.common.PermissionRequestFailedScreen +import com.zaneschepke.wireguardautotunnel.ui.common.navigation.BottomNavBar +import com.zaneschepke.wireguardautotunnel.ui.screens.main.MainScreen +import com.zaneschepke.wireguardautotunnel.ui.screens.settings.SettingsScreen +import com.zaneschepke.wireguardautotunnel.ui.screens.support.SupportScreen +import com.zaneschepke.wireguardautotunnel.ui.theme.TransparentSystemBars +import com.zaneschepke.wireguardautotunnel.ui.theme.WireguardAutoTunnelTheme +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class MainActivity : AppCompatActivity() { + + @OptIn(ExperimentalAnimationApi::class, ExperimentalMaterial3Api::class, + ExperimentalPermissionsApi::class + ) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + val navController = rememberAnimatedNavController() + WireguardAutoTunnelTheme { + TransparentSystemBars() + + val snackbarHostState = remember { SnackbarHostState() } + + val notificationPermissionState = + rememberPermissionState(Manifest.permission.POST_NOTIFICATIONS) + + fun requestNotificationPermission() { + if (!notificationPermissionState.status.isGranted && Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + notificationPermissionState.launchPermissionRequest() + } + } + + var vpnIntent by remember { mutableStateOf(GoBackend.VpnService.prepare(this)) } + val vpnActivityResultState = rememberLauncherForActivityResult( + ActivityResultContracts.StartActivityForResult(), + onResult = { + val accepted = (it.resultCode == RESULT_OK) + if (accepted) { + vpnIntent = null + } + }) + LaunchedEffect(vpnIntent) { + if (vpnIntent != null) { + vpnActivityResultState.launch(vpnIntent) + } else requestNotificationPermission() + } + + Scaffold(snackbarHost = { SnackbarHost(snackbarHostState) }, + bottomBar = if (vpnIntent == null && notificationPermissionState.status.isGranted) { + { BottomNavBar(navController, Routes.navItems) } + } else { + {} + }, + ) + { padding -> + if (vpnIntent != null) { + PermissionRequestFailedScreen( + padding = padding, + onRequestAgain = { vpnActivityResultState.launch(vpnIntent) }, + message = getString(R.string.vpn_permission_required), + getString(R.string.retry) + ) + return@Scaffold + } + if (!notificationPermissionState.status.isGranted) { + PermissionRequestFailedScreen( + padding = padding, + onRequestAgain = { + val intentSettings = + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intentSettings.data = + Uri.fromParts("package", this.packageName, null) + startActivity(intentSettings); + }, + message = getString(R.string.notification_permission_required), + getString(R.string.open_settings) + ) + return@Scaffold + } + AnimatedNavHost(navController, startDestination = Routes.Main.name) { + composable(Routes.Main.name, enterTransition = { + when (initialState.destination.route) { + Routes.Settings.name, Routes.Support.name -> + slideInHorizontally( + initialOffsetX = { -1000 }, + animationSpec = tween(500) + ) + + else -> { + fadeIn(animationSpec = tween(2000)) + } + } + }) { + MainScreen(padding = padding, snackbarHostState = snackbarHostState) + } + composable(Routes.Settings.name, enterTransition = { + when (initialState.destination.route) { + Routes.Main.name -> + slideInHorizontally( + initialOffsetX = { 1000 }, + animationSpec = tween(500) + ) + + Routes.Support.name -> { + slideInHorizontally( + initialOffsetX = { -1000 }, + animationSpec = tween(500) + ) + } + + else -> { + fadeIn(animationSpec = tween(2000)) + } + } + }) { SettingsScreen(padding = padding, snackbarHostState = snackbarHostState, navController = navController) } + composable(Routes.Support.name, enterTransition = { + when (initialState.destination.route) { + Routes.Settings.name, Routes.Main.name -> + slideInHorizontally( + initialOffsetX = { 1000 }, + animationSpec = tween(500) + ) + + else -> { + fadeIn(animationSpec = tween(2000)) + } + } + }) { SupportScreen(padding = padding) } + } + } + } + } + } +} diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Routes.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Routes.kt new file mode 100644 index 0000000..6a66bfb --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/Routes.kt @@ -0,0 +1,34 @@ +package com.zaneschepke.wireguardautotunnel.ui + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Home +import androidx.compose.material.icons.rounded.QuestionMark +import androidx.compose.material.icons.rounded.Settings +import com.zaneschepke.wireguardautotunnel.ui.common.navigation.BottomNavItem + +enum class Routes { + Main, + Settings, + Support; + + + companion object { + val navItems = listOf( + BottomNavItem( + name = "Tunnels", + route = Main.name, + icon = Icons.Rounded.Home, + ), + BottomNavItem( + name = "Settings", + route = Settings.name, + icon = Icons.Rounded.Settings, + ), + BottomNavItem( + name = "Support", + route = Support.name, + icon = Icons.Rounded.QuestionMark, + ) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/ViewState.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/ViewState.kt new file mode 100644 index 0000000..0acdf53 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/ViewState.kt @@ -0,0 +1,9 @@ +package com.zaneschepke.wireguardautotunnel.ui + +data class ViewState( + val showSnackbarMessage : Boolean = false, + val snackbarMessage : String = "", + val snackbarActionText : String = "", + val onSnackbarActionClick : () -> Unit = {}, + val isLoading : Boolean = false +) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ClickableIconButton.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ClickableIconButton.kt new file mode 100644 index 0000000..6644796 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/ClickableIconButton.kt @@ -0,0 +1,31 @@ +package com.zaneschepke.wireguardautotunnel.ui.common + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector + +@Composable +fun ClickableIconButton(onIconClick : () -> Unit, text : String, icon : ImageVector, enabled : Boolean) { + Button(onClick = {}, + enabled = enabled + ) { + Text(text) + Spacer(modifier = Modifier.size(ButtonDefaults.IconSpacing)) + Icon( + imageVector = icon, + contentDescription = "Delete", + modifier = Modifier.size(ButtonDefaults.IconSize).clickable { + if(enabled) { + onIconClick() + } + } + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/PermissionRequestFailedScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/PermissionRequestFailedScreen.kt new file mode 100644 index 0000000..090c374 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/PermissionRequestFailedScreen.kt @@ -0,0 +1,35 @@ +package com.zaneschepke.wireguardautotunnel.ui.common + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import kotlinx.coroutines.launch + +@Composable +fun PermissionRequestFailedScreen(padding : PaddingValues, onRequestAgain : () -> Unit, message : String, buttonText : String ) { + val scope = rememberCoroutineScope() + Column(horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(padding)) { + Text(message, textAlign = TextAlign.Center, modifier = Modifier.padding(15.dp)) + Button(onClick = { + scope.launch { + onRequestAgain() + } + }) { + Text(buttonText) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/RowListItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/RowListItem.kt new file mode 100644 index 0000000..e3d5203 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/RowListItem.kt @@ -0,0 +1,41 @@ +package com.zaneschepke.wireguardautotunnel.ui.common + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp + +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun RowListItem(text : String, onHold : () -> Unit, rowButton : @Composable() () -> Unit ) { + Box( + modifier = Modifier + .combinedClickable( + onClick = { + + }, + onLongClick = { + onHold() + } + ) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(14.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(text) + rowButton() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavBar.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavBar.kt new file mode 100644 index 0000000..d99c3a2 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavBar.kt @@ -0,0 +1,42 @@ +package com.zaneschepke.wireguardautotunnel.ui.common.navigation + +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.text.font.FontWeight +import androidx.navigation.NavController +import androidx.navigation.compose.currentBackStackEntryAsState + +@Composable +fun BottomNavBar(navController : NavController, bottomNavItems : List) { + + val backStackEntry = navController.currentBackStackEntryAsState() + + NavigationBar( + containerColor = MaterialTheme.colorScheme.background, + ) { + bottomNavItems.forEach { item -> + val selected = item.route == backStackEntry.value?.destination?.route + + NavigationBarItem( + selected = selected, + onClick = { navController.navigate(item.route) }, + label = { + Text( + text = item.name, + fontWeight = FontWeight.SemiBold, + ) + }, + icon = { + Icon( + imageVector = item.icon, + contentDescription = "${item.name} Icon", + ) + } + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavItem.kt new file mode 100644 index 0000000..b721c54 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation/BottomNavItem.kt @@ -0,0 +1,9 @@ +package com.zaneschepke.wireguardautotunnel.ui.common.navigation + +import androidx.compose.ui.graphics.vector.ImageVector + +data class BottomNavItem( + val name: String, + val route: String, + val icon: ImageVector, +) diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt new file mode 100644 index 0000000..20dfe0b --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainScreen.kt @@ -0,0 +1,212 @@ +package com.zaneschepke.wireguardautotunnel.ui.screens.main + +import android.annotation.SuppressLint +import android.widget.Toast +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Add +import androidx.compose.material.icons.rounded.Delete +import androidx.compose.material.icons.rounded.Edit +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FabPosition +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarDuration +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.SnackbarResult +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.hapticfeedback.HapticFeedbackType +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalHapticFeedback +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.wireguard.android.backend.Tunnel +import com.zaneschepke.wireguardautotunnel.R +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.TunnelConfig +import com.zaneschepke.wireguardautotunnel.ui.common.RowListItem +import kotlinx.coroutines.launch + +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun MainScreen(viewModel: MainViewModel = hiltViewModel(), padding : PaddingValues, + snackbarHostState : SnackbarHostState) { + + val haptic = LocalHapticFeedback.current + val context = LocalContext.current + val scope = rememberCoroutineScope() + + val tunnels by viewModel.tunnels.collectAsStateWithLifecycle(mutableListOf()) + val viewState = viewModel.viewState.collectAsStateWithLifecycle() + var showAlertDialog by remember { mutableStateOf(false) } + var selectedTunnel by remember { mutableStateOf(null) } + val settings by viewModel.settings.collectAsStateWithLifecycle() + val state by viewModel.state.collectAsStateWithLifecycle(Tunnel.State.DOWN) + val tunnelName by viewModel.tunnelName.collectAsStateWithLifecycle("") + + + LaunchedEffect(viewState.value) { + if (viewState.value.showSnackbarMessage) { + val result = snackbarHostState.showSnackbar( + message = viewState.value.snackbarMessage, + actionLabel = viewState.value.snackbarActionText, + duration = SnackbarDuration.Long, + ) + when (result) { + SnackbarResult.ActionPerformed -> viewState.value.onSnackbarActionClick + SnackbarResult.Dismissed -> viewState.value.onSnackbarActionClick + } + } + } + + val pickFileLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.GetContent() + ) { file -> + if (file != null) { + viewModel.onTunnelFileSelected(file) + } + } + + Scaffold( + modifier = Modifier.pointerInput(Unit) { + detectTapGestures(onTap = { + selectedTunnel = null + }) + }, + floatingActionButtonPosition = FabPosition.End, + floatingActionButton = { + FloatingActionButton( + modifier = Modifier.padding(bottom = 90.dp), + onClick = { + pickFileLauncher.launch("*/*") + }, + containerColor = MaterialTheme.colorScheme.secondary, + shape = RoundedCornerShape(16.dp), + ) { + Icon( + imageVector = Icons.Rounded.Add, + contentDescription = "Add Tunnel", + tint = Color.DarkGray, + ) + } + } + ) { + if (tunnels.isEmpty()) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + Text(text = stringResource(R.string.no_tunnels), fontStyle = FontStyle.Italic) + } + } + Column( + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.Top, + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + + LazyColumn(modifier = Modifier.fillMaxSize()) { + items(tunnels.toList()) { tunnel -> + RowListItem(text = tunnel.name, onHold = { + if (state == Tunnel.State.UP && tunnel.name == tunnelName) { + scope.launch { + viewModel.showSnackBarMessage(context.resources.getString(R.string.turn_off_tunnel)) + } + return@RowListItem + } + haptic.performHapticFeedback(HapticFeedbackType.LongPress) + selectedTunnel = tunnel; + }, rowButton = { + if (tunnel.id == selectedTunnel?.id) { + Row() { + IconButton(onClick = { + showAlertDialog = true + }) { + Icon(Icons.Rounded.Edit, "Edit") + } + IconButton(onClick = { viewModel.onDelete(tunnel) }) { + Icon(Icons.Rounded.Delete, "Delete") + } + } + } else { + Switch( + checked = (state == Tunnel.State.UP && tunnel.name == tunnelName), + onCheckedChange = { checked -> + if (checked) viewModel.onTunnelStart(tunnel) else viewModel.onTunnelStop() + } + ) + } + }) + } + } + if (showAlertDialog && selectedTunnel != null) { + AlertDialog(onDismissRequest = { + showAlertDialog = false + }, confirmButton = { + Button(onClick = { + if (tunnels.any { it.name == selectedTunnel?.name }) { + Toast.makeText(context, context.resources.getString(R.string.tunnel_exists), Toast.LENGTH_LONG) + .show() + return@Button + } + viewModel.onEditTunnel(selectedTunnel!!) + showAlertDialog = false + }) { + Text("Save") + } + }, + title = { Text("Tunnel Edit") }, text = { + OutlinedTextField( + value = selectedTunnel!!.name, + onValueChange = { + selectedTunnel = selectedTunnel!!.copy( + name = it + ) + }, + label = { Text("Tunnel Name") }, + modifier = Modifier.padding(start = 15.dp, top = 5.dp), + maxLines = 1, + ) + }) + } + } + } +} diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt new file mode 100644 index 0000000..da9ed9d --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main/MainViewModel.kt @@ -0,0 +1,159 @@ +package com.zaneschepke.wireguardautotunnel.ui.screens.main + +import android.annotation.SuppressLint +import android.app.Application +import android.content.Context +import android.net.Uri +import android.provider.OpenableColumns +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.wireguard.config.Config +import com.zaneschepke.wireguardautotunnel.R +import com.zaneschepke.wireguardautotunnel.repository.Repository +import com.zaneschepke.wireguardautotunnel.service.foreground.Action +import com.zaneschepke.wireguardautotunnel.service.foreground.ServiceTracker +import com.zaneschepke.wireguardautotunnel.service.foreground.WireGuardConnectivityWatcherService +import com.zaneschepke.wireguardautotunnel.service.foreground.WireGuardTunnelService +import com.zaneschepke.wireguardautotunnel.service.tunnel.VpnService +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.Settings +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.TunnelConfig +import com.zaneschepke.wireguardautotunnel.ui.ViewState +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + + +@HiltViewModel +class MainViewModel @Inject constructor(private val application : Application, + private val tunnelRepo : Repository, + private val settingsRepo : Repository, + private val vpnService: VpnService +) : ViewModel() { + + private val _viewState = MutableStateFlow(ViewState()) + val viewState get() = _viewState.asStateFlow() + val tunnels get() = tunnelRepo.itemFlow + val state get() = vpnService.state + val tunnelName get() = vpnService.tunnelName + private val _settings = MutableStateFlow(Settings()) + val settings get() = _settings.asStateFlow() + + private val defaultConfigName = "tunnel${(Math.random() * 1000).toInt()}" + + + init { + viewModelScope.launch { + settingsRepo.itemFlow.collect { + val settings = it.first() + _settings.emit(settings) + } + } + } + + fun onDelete(tunnel : TunnelConfig) { + viewModelScope.launch { + if(tunnelRepo.count() == 1L) { + ServiceTracker.actionOnService( Action.STOP, application, WireGuardConnectivityWatcherService::class.java) + val settings = settingsRepo.getAll() + if(!settings.isNullOrEmpty()) { + val setting = settings[0] + setting.defaultTunnel = null + setting.isAutoTunnelEnabled = false + settingsRepo.save(setting) + } + } + tunnelRepo.delete(tunnel) + } + } + + + fun onEditTunnel(tunnel: TunnelConfig) { + viewModelScope.launch { + tunnelRepo.save(tunnel) + val settings = settingsRepo.getAll() + if(!settings.isNullOrEmpty() && settings[0].defaultTunnel != null) { + val setting = settings[0] + val defaultTunnelConfig = TunnelConfig.from(setting.defaultTunnel!!) + if(defaultTunnelConfig.id == tunnel.id) { + setting.defaultTunnel = tunnel.toString() + settingsRepo.save(setting) + } + } + } + } + + fun onTunnelStart(tunnelConfig : TunnelConfig) = viewModelScope.launch { + ServiceTracker.actionOnService( Action.START, application, WireGuardTunnelService::class.java, + mapOf(application.resources.getString(R.string.tunnel_extras_key) to tunnelConfig.toString())) + } + + fun onTunnelStop() { + ServiceTracker.actionOnService( Action.STOP, application, WireGuardTunnelService::class.java) + } + + fun onTunnelFileSelected(uri : Uri) { + val fileName = getFileName(application.applicationContext, uri) + val extension = getFileExtensionFromFileName(fileName) + if(extension != ".conf") { + viewModelScope.launch { + showSnackBarMessage(application.resources.getString(R.string.file_extension_message)) + } + return + } + val stream = application.applicationContext.contentResolver.openInputStream(uri) + stream ?: return + val bufferReader = stream.bufferedReader(charset = Charsets.UTF_8) + val config = Config.parse(bufferReader) + val tunnelName = getNameFromFileName(fileName) + viewModelScope.launch { + tunnelRepo.save(TunnelConfig(name = tunnelName, wgQuick = config.toWgQuickString())) + } + stream.close() + } + + @SuppressLint("Range") + private fun getFileName(context: Context, uri: Uri): String { + if (uri.scheme == "content") { + val cursor = context.contentResolver.query(uri, null, null, null, null) + cursor ?: return defaultConfigName + cursor.use { + if(cursor.moveToFirst()) { + return cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)) + } + } + } + return defaultConfigName + } + + suspend fun showSnackBarMessage(message : String) { + _viewState.emit(_viewState.value.copy( + showSnackbarMessage = true, + snackbarMessage = message, + snackbarActionText = "Okay", + onSnackbarActionClick = { + viewModelScope.launch { + dismissSnackBar() + } + } + )) + delay(3000) + dismissSnackBar() + } + + private suspend fun dismissSnackBar() { + _viewState.emit(_viewState.value.copy( + showSnackbarMessage = false + )) + } + + private fun getNameFromFileName(fileName : String) : String { + return fileName.substring(0 , fileName.lastIndexOf('.') ) + } + + private fun getFileExtensionFromFileName(fileName : String) : String { + return fileName.substring(fileName.lastIndexOf('.')) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt new file mode 100644 index 0000000..9586fdd --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt @@ -0,0 +1,290 @@ +package com.zaneschepke.wireguardautotunnel.ui.screens.settings + +import android.Manifest +import android.content.Intent +import android.net.Uri +import android.provider.Settings +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.rounded.LocationOff +import androidx.compose.material.icons.rounded.Map +import androidx.compose.material3.Button +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.SnackbarDuration +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.SnackbarResult +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.navigation.NavController +import com.google.accompanist.permissions.ExperimentalPermissionsApi +import com.google.accompanist.permissions.isGranted +import com.google.accompanist.permissions.rememberPermissionState +import com.zaneschepke.wireguardautotunnel.R +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.TunnelConfig +import com.zaneschepke.wireguardautotunnel.ui.Routes +import com.zaneschepke.wireguardautotunnel.ui.common.ClickableIconButton +import com.zaneschepke.wireguardautotunnel.ui.common.PermissionRequestFailedScreen +import kotlinx.coroutines.launch + +@OptIn(ExperimentalMaterial3Api::class, ExperimentalPermissionsApi::class, + ExperimentalLayoutApi::class +) +@Composable +fun SettingsScreen( + viewModel: SettingsViewModel = hiltViewModel(), + padding: PaddingValues, + navController: NavController, + snackbarHostState: SnackbarHostState = remember { SnackbarHostState() } +) { + + val scope = rememberCoroutineScope() + val context = LocalContext.current + var expanded by remember { mutableStateOf(false) } + val viewState by viewModel.viewState.collectAsStateWithLifecycle() + val settings by viewModel.settings.collectAsStateWithLifecycle() + val trustedSSIDs by viewModel.trustedSSIDs.collectAsStateWithLifecycle() + val tunnels by viewModel.tunnels.collectAsStateWithLifecycle(mutableListOf()) + val backgroundLocationState = + rememberPermissionState(Manifest.permission.ACCESS_BACKGROUND_LOCATION) + var currentText by remember { mutableStateOf("") } + + LaunchedEffect(viewState) { + if (viewState.showSnackbarMessage) { + val result = snackbarHostState.showSnackbar( + message = viewState.snackbarMessage, + actionLabel = viewState.snackbarActionText, + duration = SnackbarDuration.Long, + ) + when (result) { + SnackbarResult.ActionPerformed -> viewState.onSnackbarActionClick + SnackbarResult.Dismissed -> viewState.onSnackbarActionClick + } + } + } + if(!backgroundLocationState.status.isGranted) { + Column(horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Top, + modifier = Modifier + .fillMaxSize() + .padding(padding)) { + Icon(Icons.Rounded.LocationOff, contentDescription = "Map", modifier = Modifier.padding(30.dp).size(128.dp)) + Text(stringResource(R.string.prominent_background_location_title), textAlign = TextAlign.Center, modifier = Modifier.padding(30.dp), fontSize = 20.sp) + Text(stringResource(R.string.prominent_background_location_message), textAlign = TextAlign.Center, modifier = Modifier.padding(30.dp), fontSize = 15.sp) + //Spacer(modifier = Modifier.weight(1f)) + Row( + modifier = Modifier + .fillMaxWidth() + .padding(30.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceEvenly + ) { + Button(onClick = { + navController.navigate(Routes.Main.name) + }) { + Text("No thanks") + } + Button(onClick = { + scope.launch { + val intentSettings = + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intentSettings.data = + Uri.fromParts("package", context.packageName, null) + context.startActivity(intentSettings) + } + }) { + Text("Turn on") + } + } + } + return + } + + if (tunnels.isEmpty()) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + Text( + stringResource(R.string.one_tunnel_required), + textAlign = TextAlign.Center, + modifier = Modifier.padding(15.dp), + fontStyle = FontStyle.Italic + ) + } + return + } + + Column( + horizontalAlignment = Alignment.Start, + verticalArrangement = Arrangement.Top, + modifier = Modifier + .fillMaxSize() + .padding(padding) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(14.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(stringResource(R.string.enable_auto_tunnel)) + Switch( + checked = settings.isAutoTunnelEnabled, + onCheckedChange = { + scope.launch { + viewModel.toggleAutoTunnel() + } + } + ) + } + Text( + stringResource(id = R.string.select_tunnel), + textAlign = TextAlign.Center, + modifier = Modifier.padding(15.dp, bottom = 5.dp, top = 5.dp) + ) + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { + if(!settings.isAutoTunnelEnabled) { + expanded = !expanded }}, + modifier = Modifier.padding(start = 15.dp, top = 5.dp, bottom = 10.dp), + ) { + TextField( + enabled = !settings.isAutoTunnelEnabled, + value = settings.defaultTunnel?.let { + TunnelConfig.from(it).name } + ?: "", + readOnly = true, + modifier = Modifier.menuAnchor(), + label = { Text(stringResource(R.string.tunnels)) }, + onValueChange = { }, + trailingIcon = { + ExposedDropdownMenuDefaults.TrailingIcon( + expanded = expanded + ) + } + ) + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { + expanded = false + } + ) { + tunnels.forEach() { tunnel -> + DropdownMenuItem( + onClick = { + scope.launch { + viewModel.onDefaultTunnelSelected(tunnel) + } + expanded = false + }, + text = { Text(text = tunnel.name) } + ) + } + } + } + Text( + stringResource(R.string.trusted_ssid), + textAlign = TextAlign.Center, + modifier = Modifier.padding(15.dp, bottom = 5.dp, top = 5.dp) + ) + FlowRow( + modifier = Modifier.padding(15.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + trustedSSIDs.forEach { ssid -> + ClickableIconButton(onIconClick = { + scope.launch { + viewModel.onDeleteTrustedSSID(ssid) + } + }, text = ssid, icon = Icons.Filled.Close, enabled = !settings.isAutoTunnelEnabled) + } + } + OutlinedTextField( + enabled = !settings.isAutoTunnelEnabled, + value = currentText, + onValueChange = { currentText = it }, + label = { Text(stringResource(R.string.add_trusted_ssid)) }, + modifier = Modifier.padding(start = 15.dp, top = 5.dp), + maxLines = 1, + keyboardOptions = KeyboardOptions( + capitalization = KeyboardCapitalization.None, + imeAction = ImeAction.Done + ), + keyboardActions = KeyboardActions( + onDone = { + scope.launch { + if (currentText.isNotEmpty()) { + viewModel.onSaveTrustedSSID(currentText) + currentText = "" + } + } + } + ), + ) + Row( + modifier = Modifier + .fillMaxWidth() + .padding(14.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(stringResource(R.string.tunnel_mobile_data)) + Switch( + enabled = !settings.isAutoTunnelEnabled, + checked = settings.isTunnelOnMobileDataEnabled, + onCheckedChange = { + scope.launch { + viewModel.onToggleTunnelOnMobileData() + } + } + ) + } + } +} + + diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsViewModel.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsViewModel.kt new file mode 100644 index 0000000..cc39543 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsViewModel.kt @@ -0,0 +1,121 @@ +package com.zaneschepke.wireguardautotunnel.ui.screens.settings + +import android.app.Application +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.zaneschepke.wireguardautotunnel.R +import com.zaneschepke.wireguardautotunnel.repository.Repository +import com.zaneschepke.wireguardautotunnel.service.foreground.Action +import com.zaneschepke.wireguardautotunnel.service.foreground.ServiceTracker +import com.zaneschepke.wireguardautotunnel.service.foreground.WireGuardConnectivityWatcherService +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.Settings +import com.zaneschepke.wireguardautotunnel.service.tunnel.model.TunnelConfig +import com.zaneschepke.wireguardautotunnel.ui.ViewState +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class SettingsViewModel @Inject constructor(private val application : Application, + private val tunnelRepo : Repository, private val settingsRepo : Repository +) : ViewModel() { + + private val _trustedSSIDs = MutableStateFlow(emptyList()) + val trustedSSIDs = _trustedSSIDs.asStateFlow() + private val _settings = MutableStateFlow(Settings()) + val settings get() = _settings.asStateFlow() + val tunnels get() = tunnelRepo.itemFlow + private val _viewState = MutableStateFlow(ViewState()) + val viewState get() = _viewState.asStateFlow() + + init { + viewModelScope.launch { + settingsRepo.itemFlow.collect { + val settings = it.first() + _settings.emit(settings) + _trustedSSIDs.emit(settings.trustedNetworkSSIDs.toList()) + } + } + } + + suspend fun onSaveTrustedSSID(ssid: String) { + val trimmed = ssid.trim() + if (!_settings.value.trustedNetworkSSIDs.contains(trimmed)) { + _settings.value.trustedNetworkSSIDs.add(trimmed) + settingsRepo.save(_settings.value) + } else { + showSnackBarMessage("SSID already exists.") + } + } + + suspend fun onDefaultTunnelSelected(tunnelConfig: TunnelConfig) { + settingsRepo.save(_settings.value.copy( + defaultTunnel = tunnelConfig.toString() + )) + } + + suspend fun onToggleTunnelOnMobileData() { + settingsRepo.save(_settings.value.copy( + isTunnelOnMobileDataEnabled = !_settings.value.isTunnelOnMobileDataEnabled + )) + } + + suspend fun onDeleteTrustedSSID(ssid: String) { + _settings.value.trustedNetworkSSIDs.remove(ssid) + settingsRepo.save(_settings.value) + } + + suspend fun toggleAutoTunnel() { + if(_settings.value.defaultTunnel.isNullOrEmpty() && !_settings.value.isAutoTunnelEnabled) { + showSnackBarMessage("Please select a tunnel first") + return + } + if(_settings.value.isAutoTunnelEnabled) { + actionOnWatcherService(Action.STOP) + } else { + actionOnWatcherService(Action.START) + } + settingsRepo.save(_settings.value.copy( + isAutoTunnelEnabled = !_settings.value.isAutoTunnelEnabled + )) + } + + private fun actionOnWatcherService(action : Action) { + when(action) { + Action.START -> { + if(_settings.value.defaultTunnel != null) { + val defaultTunnel = _settings.value.defaultTunnel + ServiceTracker.actionOnService( + action, application, + WireGuardConnectivityWatcherService::class.java, + mapOf(application.resources.getString(R.string.tunnel_extras_key) to defaultTunnel.toString())) + } + } + Action.STOP -> { + ServiceTracker.actionOnService( Action.STOP, application, + WireGuardConnectivityWatcherService::class.java) + } + } + } + + private suspend fun showSnackBarMessage(message : String) { + _viewState.emit(_viewState.value.copy( + showSnackbarMessage = true, + snackbarMessage = message, + snackbarActionText = "Okay", + onSnackbarActionClick = { + viewModelScope.launch { + dismissSnackBar() + } + } + )) + } + + private suspend fun dismissSnackBar() { + _viewState.emit(_viewState.value.copy( + showSnackbarMessage = false + )) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt new file mode 100644 index 0000000..7237e05 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt @@ -0,0 +1,73 @@ +package com.zaneschepke.wireguardautotunnel.ui.screens.support + +import android.content.Intent +import android.net.Uri +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.zaneschepke.wireguardautotunnel.R + +@Composable +fun SupportScreen(padding : PaddingValues) { + + val context = LocalContext.current + + fun openWebPage(url: String) { + val webpage: Uri = Uri.parse(url) + val intent = Intent(Intent.ACTION_VIEW, webpage) + context.startActivity(intent) + } + + Column(horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Top, + modifier = Modifier + .fillMaxSize() + .padding(padding)) { + Text(stringResource(R.string.support_text), textAlign = TextAlign.Center, modifier = Modifier.padding(30.dp), fontSize = 15.sp) + Row( + modifier = Modifier + .fillMaxWidth() + .padding(14.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceEvenly + ) { + IconButton(onClick = { + openWebPage(context.resources.getString(R.string.discord_url)) + }) { + Icon(imageVector = ImageVector.vectorResource(R.drawable.discord), "Discord") + } + IconButton(onClick = { + openWebPage(context.resources.getString(R.string.github_url)) + }) { + Icon(imageVector = ImageVector.vectorResource(R.drawable.github), "Github") + } + } + Spacer(modifier = Modifier.weight(1f)) + Text(stringResource(id = R.string.privacy_policy), style = TextStyle(textDecoration = TextDecoration.Underline), + modifier = Modifier.clickable { + openWebPage(context.resources.getString(R.string.privacy_policy_url)) + }) + Text("App version: ${com.zaneschepke.wireguardautotunnel.BuildConfig.VERSION_NAME}", Modifier.padding(25.dp)) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Color.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Color.kt new file mode 100644 index 0000000..ca25516 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Color.kt @@ -0,0 +1,12 @@ +package com.zaneschepke.wireguardautotunnel.ui.theme + +import androidx.compose.ui.graphics.Color + +val Purple80 = Color(0xFFD0BCFF) +val PurpleGrey80 = Color(0xFFCCC2DC) +val Pink80 = Color(0xFF492532) +val virdigris = Color(0xFF5BC0BE) + +val Purple40 = Color(0xFF6650a4) +val PurpleGrey40 = Color(0xFF625b71) +val Pink40 = Color(0xFFFFFFFF) \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Theme.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Theme.kt new file mode 100644 index 0000000..78e4480 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Theme.kt @@ -0,0 +1,80 @@ +package com.zaneschepke.wireguardautotunnel.ui.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.core.view.WindowCompat + +private val DarkColorScheme = darkColorScheme( + //primary = Purple80, + primary = virdigris, + secondary = virdigris, + // secondary = PurpleGrey80, + tertiary = virdigris + //tertiary = Pink80 +) + +private val LightColorScheme = lightColorScheme( + primary = Purple40, + secondary = PurpleGrey40, + tertiary = Pink40 + + /* Other default colors to override + background = Color(0xFFFFFBFE), + surface = Color(0xFFFFFBFE), + onPrimary = Color.White, + onSecondary = Color.White, + onTertiary = Color.White, + onBackground = Color(0xFF1C1B1F), + onSurface = Color(0xFF1C1B1F), + */ +) + +@Composable +fun WireguardAutoTunnelTheme( + //force dark theme + darkTheme : Boolean = true, + //darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + //turning off dynamic color for now + dynamicColor: Boolean = false, + content: @Composable () -> Unit +) { + + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + + darkTheme -> DarkColorScheme + else -> LightColorScheme + } + val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as Activity).window + WindowCompat.setDecorFitsSystemWindows(window, false) + window.statusBarColor = Color.Transparent.toArgb() + window.navigationBarColor = Color.Transparent.toArgb() + WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightStatusBars = !darkTheme + WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightNavigationBars = !darkTheme + } + } + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/TransparentSystemBars.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/TransparentSystemBars.kt new file mode 100644 index 0000000..64242c6 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/TransparentSystemBars.kt @@ -0,0 +1,22 @@ +package com.zaneschepke.wireguardautotunnel.ui.theme + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.ui.graphics.Color +import com.google.accompanist.systemuicontroller.rememberSystemUiController + +@Composable +fun TransparentSystemBars() { + val systemUiController = rememberSystemUiController() + val useDarkIcons = !isSystemInDarkTheme() + + DisposableEffect(systemUiController, useDarkIcons) { + systemUiController.setSystemBarsColor( + color = Color.Transparent, + darkIcons = useDarkIcons + ) + + onDispose {} + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Type.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Type.kt new file mode 100644 index 0000000..e7a1e29 --- /dev/null +++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme/Type.kt @@ -0,0 +1,34 @@ +package com.zaneschepke.wireguardautotunnel.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ +) \ No newline at end of file diff --git a/app/src/main/res/drawable/discord.xml b/app/src/main/res/drawable/discord.xml new file mode 100644 index 0000000..df43339 --- /dev/null +++ b/app/src/main/res/drawable/discord.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/github.xml b/app/src/main/res/drawable/github.xml new file mode 100644 index 0000000..32f8254 --- /dev/null +++ b/app/src/main/res/drawable/github.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..52206777aa3245f61ae885e0825057c0550c2f0e GIT binary patch literal 2004 zcmV;_2P^neNk&G@2LJ$9MM6+kP&iD#2LJ#sN5ByfRfmGMZJ3%r>|F>EF#*}5s2`8% z(Y0{0{g0&l%5BfNf`6&WWd2;`|9Mu?$Q~z%SS55=LIW-C5QLl62G(t@ZEF&DcWYB6$Ocw&D5>dLftJdp za+iuQgAJhT*f#-m^Z#EbDUF;9?(XjH?(TZ-?k?-QwJhz-htqO|J!{hpU3vD)1i2tO0WS z_W^{YWTb>NveAU(cM)z?I3;*~qz(;`Uk4ZA;YM__(P>8Jgp*xPrZEHo0Lwrb1ItQazE9(}vrgvpUY|cKYSv z=T|iaByDWN<=G{O{BK}r^2(|%FGHOlkwc@mq}gYqPRheLh-~uHBvh#A#w$14lrkPm z8D_s!??{ZRP}XJg1BjYqIR#g{fSMCI1=k@pr!mUp-U2sUbFRlLrdJf)bZCmN#1_m# zY`oTGbFViLnEE5(ofSu@R`_WVi(YQoTzsHnB_r}zzV=o)nuNT$NS8~PMlQr1u))Su zsyxk&SB$yY$o87@Gx?bGC#&y{v88em;4-m^0=7oi*qw=gldtLCGT~q1P5Adx5=o0~ zFxktV%v|?7-9u)4+I~x(?Ix?!t*0^~au5LN22Kfpf}#!sz0TGwc)c^cW|H5G|DOr| z^T_OvyW-)r9c))fwZ)EiTV@F0#kfMFOydy$4+0KI#+T!xlW5`uD3n>0qU4msjKs{8 zgv`(as6W;5CjNcyK$Lcg3`>+wdiBCH@ESRcoQ=>mch4%Yqg~P=+u6VN_KQfR7;)iGAGl1pt3O# zr;w@x29^>$4i+Ajg|0SU)zUMx7D|W6Sl)bJkxkfmZAOe3QLgqjUzu!#ZUv;6Kn!aM zZX1iB!awbM;#I7?&b_5#m(8nFUsb4P=I2DU8`WO3Jx=-RtKQI29GgYo5FC_xec8(@ zs7T8EFy4rU6V(%cUO8Sd(QO6RCV!g$dfn6kI+W&kkm}LJj#!Unh(v*1rWpV0!f6%(YFW~Me9YEim&!e2RiUTPsFrZrIhtH8{qmt z$No}8v%Y{o2Ljm;mN{AJz=Z$ri9GgFM7CR@`Zix~#ZLP+881aN;|r)}6DR+U7KV>j zI3(2yLc6MJDThA%`s?R39jg(ICt6qJ`lwwtTnm9}i=!B)*0H~5dda>M{J%LKv*(-- zJI~!dCnwjNZU~m0u*krHlmRqo`4XSaEBz#1cQj^bS@H+5!DyE+Cq;I zk^b z7V9d1HyiD%{uYrnb_cfmQE|@vH!GU?@Gq4J9yQtbWf75;*ESK50JysoJU`H-w=UF< z99IAg+blREkC}I~zE-HOvN}nCFKixGdVV-(;j0x5^)WRI1iMLiT(fLCbk$_v>GR=u zzZt*y#{bWF#r#^S^s1EJrYntl`vEIdpO$3#_c0Jl*(CX;rKOz! z)ss7bk8cs5ky)PC-XQ41fHMseIP011am9z^pAS$S@_0yBP4V@_r{u^E{jHMeu|a=- zC_W}9)taq8;no!own8Q1b8>b6JMS5IqVxtNFwI9!l5M_)*BHHa?C(SBoXRP76H?1S z%(0MZNMWi{n*1~srlz)okMsdh00-Pk?)_>Mxaybr0)ln+(KVn-# zo@nuHr~Uu~ctCb)>I-vN*3+EFr6eThOh_}*XrviwBx$4>X*AM|G}`yg_21(az-nLy mIKTlyAOhmfZ|?vb;B$y7K*FoQF<@JrzkPnvRMMS zIKW3lL`O9ACZIa#y-m>)0nt;1V{-qf~j+qR8w+h$Jy-D=y`Pf8)U zyF=uXt-HIsySx8w+e{|Zg--Ng$!2=k6Cg|czj)lR zLg1yc{Q2z=299#v0gzht4I7=p3wuoxc#%@*LuOk3WCK0runKCu20faBaJ!Ol(T*hK zhHQEpl=~mlc@9YBEuTNW5CuvC8UTDIIV3~1eKFhxNnm99`px98Ooac^7$)bV23uop zpaw-;u?PSF@t8wXx5QIG3V|=6js;4xL?3hv_)nvsDpg!@7y=;JO%<_7yaX(fz#mwK zI)|bFszd;m0Gu=0M}j6HpaU1mqSZMZ1%gKxQjm>kI}F$&N#F^PnI+QoTOqPJfKpo^ z7dS4`)>D*uN(|&~u&c_Ff0;MBlI5cm7A;n<(|57?dQJ2wEj*FH!6g>Cu}LPfkO~BL4=zKF%_gEK!u+SZ%OX5npUh< zCCiDG0}WeR)&&`J&}U$o(bWH|<5jTkX)FiloR<$DxuqOaFV(y~nJ<4)rC<1MTKV2@VWw3Lv-&(q+T~8sRXgL$rPUbpU|W zUU9@iFnLv~(Ega~|C+7%!ufuWG8-eX6r>Txya<;*NpRs{$bx0B!(cT92-L)xEZele z&xORrJ`S6vLb%g955kl76bQ~NK4K|zm-zr^eDYZ3bFS-zyy+3rc-j&TI6s~>BRzHMS zCJ^iy*%ZV8T#3Uku)0)S%khSYzX1Sr94d%dzHdw%s~1qFW;Ll?gpVc>zIc)Ww9jSQ z5wv?!5U9%{j$pax12NC>2Z&`iK8TBc9@#*jb~3?+l07X3SgOm^I3&RLIBXk*h)#7P z1xI)Xu}5!VFzrid6s}rj%Ug!8B7YUBb|h{a6F_cvnE=OeG?;0KE8cy8T4H-37TFyP z+B7lL7nHQX!5~CK@L)qCAdTXDEnyZ9SUJ^6 znm-7iwWSecL4+=~a-VW|j_1)AC{eL2Ndzc3DNx1HhVmj!j@j{RmNpI3qy6Rj!5Ztx z$eF`?=Xn5liSUsy&|g(*u#WLZZ{{kb?h{}mkJseJYA9pcD4jPzjW)C8SZO;_mVG&B zg;&P@4`sOWxVe`V#i~|&6w^<9blS=nI}R3SPyhVXsn*?8hzHM)nl6A47vJ=oHEX1< zxzMbe3c&BQ(whT>VJ3K_1)$z};>t{hv5LA6rsYqzQXXWhX3=~q1YqA#Xyw-jA;bWW zazG<_DDiXQ7f{(`033!oNEif z+q7B>jWF;5VB9R;1S;Z~`~O<}{n&n8TEm$^7^6;#1sX$tOi6!2r5M<2kB`mLQg7R) zZ4fodiYB0e-4u^1Z?jDY1~xYOeKTIFVqJp^OP4O$#|xT@SolOmL`qQy3)ikee4|Wt zT&=YtO@pbHoIG+?zi@(&fx1t;s=U=vY^jFQiQ5kFQ{XGZ0ZN+2Qw_wbh=E_G9=^GN zFHu>ZA^-rcT>klxq}5mxqt$Wo>|aqIx&sN|(CqBM68M$NyFwl8qV)8ozO`7imz0!_ zL#_RAX*JS{caAz^t?fu_Io?7di6}kjo4LAC9f_FXCV)WJXW+^M$jN*thz3f;yDH)k zp%7qcLYim@9&AVy@M=m5qkrUbQ>E%>KWX~#okT(P5D%{bJ{UA5p(qV$!XTQ8;R_-7 zkpbG-#7Cltw?U-oF3K3WsvoyZ&1$8GJcjb{YVkAJ!8p7zD*8)>!%M>H9zY5hMXQ%> z0E$MCcshLv^X)N&S>h2E0N^m*mrw*9OME5!ON9$H#UpJ1K!h#67vbcz{K+Q%zQXjA zrw@uQ3)(o|2LSwVR3XdW4Z-dU#p4OkVdzk{q! zkbLyzM)yGuEJ3_JeH}_*OK@F_^5p<<_N3<~Otb{}QAk_0*vzsZ?+ z!UoKyyC`Y=S4MtuQha}TJm!)nm1hMJz@0PV|3v#A<1xP^+weO0YCZk$089&G~JYgklo@g?P+P zf)F=iFo5i(qZ0*^1Rj@3I357IYqGqzeRo0fo2mNYlaNd)^!xHT_7Dl1xKzUO=yiEq z)3FBxN(X&IETQ?{-*)G9?CY4#Xr_X%{fZC__8jjX%7ySux)ySux)&vAD@ zV@Hbn&+q^LPakNu@m4?sHX%h2QUoQCS~MZq4~GWqWY7fHwU*HXF=Td#++8BgDPfUkX_~dnZI)F4z(ZQP5IIpC}JRBog8I7x41u`=b2k&2Wm*XQB3Fpa@=LB&BNAoxP**k$=hZr*5UA!;0p!<62w@(r z>%z)t9!~d(d~YF~6XwD6z_R1IP$9YdN=^vy|0TIf)TdB65)g3}j?)|_^KiL2P5v@p z+LLuI)2-DAuaU2a1a>&R99bFXh0cV-L}TB_u(mARvv;U6(^S49@=L(LL8rpx{gY1! z!D(;O%a~Rx5!4P|*Wko1Mb;+hPvk3Hh_RcSAS!zvp&HS=0?Ymsg8YPszltyHd&Gxh?fuSow$W71elw?BOi2ae2rr1yMf8&#}t)0h>K+;3+Vx zu1d3=>|&!mCBjQWzhp?1=ft_&bjMq9wgrtkhIk0T@Sy1BkP-ku;Sk!RwM#C|SJ596 z?kyp{66E&_{QCv{`9gmr@=Fq3?Vsy^*x|3Y$tRv48B-NKIYK6_59}IW3pRh)0D#Im zQK!0^c%@gXd6h0@y}^n*MJXkM6_rh*PGfaxueROQrl;C>RnL|(t5V`JYt|-DJ1p}{ zAgYncIqgY(=Hap<>zlmprvcjo0FG5^L8MD~OTNuwf$ z1@!ZFQYq)ZZZf(#dKW1l{T;0{C~8!)HNW=ZBW&<~he?(Vvh|);65l*xMtRxVp9gII zu!ASZ!NG$cAf|LvaOXfR5`ZtR2!W*5jpB-F39-S8eq#b(s zZNBtSKo(a0K47!Q4Wyik$?IN1H_L|IB#XqayUf^j=2cFf(1v|61}hkt{}RBRpmZYu zW{P%(g!MiGi~J9er7)J^yrx11(XGiRW!>MM)lN2If&?Q$I6*oq3>P765S_Ktl6{>z zD)Yf4yiT^g?cQ1nzy)Af6d0u(1(-=V=nz`=)uF^Ihq$^=LI#z!tO?NXV=Rm`XU95~@u#`9O$*L>bAp7M|vFLGmW9 zg$BYHqz<=22o2}er+Q03no_EX8KHOv1- zW9Ri%h_C6A>>Y;?l5So$@4e_uUf8+x;?Rtnw@I zl7no0-FkkMM2+YnQ;sD04QPyORh|=^%083X7ms05mre$yO4s>g+kY7o9xl#uJs@&TX=#+wC9nGigpX?Mc4Oa5$L`H|9fV+}l0G)dvt`^z(QyS@xXBg_WC@vx5vOh4Is+ zU>?k8DYV#1bMr}myp$^kSyT!L5xOP+V#&3$lndK@={T9{U8JFQjch}d#(0Q|wIXLm zJ#m&0M+0kQn*EjWpZP+3rN2z1yL2S}X)M_uQ`tWgjkm2;Y;^2&>0As78NH0Pk458-41pEt+teUyo%Y7e) zj9Ft11Z3}|H=#Z|U4XTwIWW!cP_D#0-_F1ppKHmlTX1TI&?DUYM>&c7i&C>~sEp`^ z+uDZ`Jz9#;gq*&4R;uPY88?v889e|~RfY38IHNz*#(+hEu_00X~lM;de3K6D$?vai)( z=S~KMoJQnKAU3*P@wIeL0ZgbgI~pGKD5Iv2ygDx)n3+&M5!pukI~dl5&B@Oj@~mi_*Dv zz_>IHthCUEZN89iYZJ>XG*R3+t*x_#`1<+|>|o$7094bAp}cD`mX~HaRzj2s{BVq> zjfSXBwtD;zABIp|#pHEW(aZC~3+;`o5TVD81SRC|5Mf6#@hspwEaU2i8CP?%u?@d9RxB`CYG+ zquOpLTmy`+8%8^U7Z*UhmENp=aWat5WZ#?jSe3~Z-1J8y&u@gWytXR;zt2H?CBX-f zNvb3>5l17EIF|~bbDxN^6|O@Cp8l#rbZVUt0>}eQGu*0Dtr3&S8-X3o=nURfbMrYYD70Svjk9UgL|4QW`andy5r59TPM0b&DAz| zY*(78(WOFg5eCQswBtr%hKCnN^hEt!+tvHd4W6Lr;?rU(x!QAm-plOL`F9bZ*QsKX z%M?>r`%fmS*8~4ti~OKoCz{L??%S`^i2bGbw>z)&t24D!tTw|jK5H}FG=yRnh$2}% zimJv!$#CPWdjZfnJkJ)CQD`jhO?iG}-;dtf z^0;?T8TqBwb40}}@N`=5@qgbx8=!Gf0}LBrI?@KWR(Q_+f208>hhKEj?Zg>an7&^#H7odksD^s;#igNw!_LgO+Bm(U0q2Sb(#VA!^8 z*f4?E$#%~knA-pV$R@UJ8&{-j-}48?Ro3WEfZY85*Ev}PcXxNEba!`mcXxL=iTuyq zWx3ezpGl~$TG)Vx{surdVGKGJ zaCgd7{}#Da5N+EoB-Q_~m6U?Y%S)+yY}>YN+eTFx3|K^^|1UQEp8#x10wzDA9`g~9 zBS7~Y4hS-PJodWEpI?AyI2cNFz;-WtQNR2DfoF-1WdA|3P6;qAf>A_|Ci|56s@KMH znqh)~6VI5tRQ6^S@m?A4ePSy-r_Ed@a}8u->m2(sO1?Vh|1%idMy14?r8VulFj|=Evn!{(U1B2h;Ur-y28J91 zV9Jmfm3px?Di_AcFfo?07&%IeLjxz`0-k2L6dRp@#K9stBNFI+<|+V;m>fpM-)%@y znCSiLJr=R3{VtQ30l(;q_5mJ2>Gavd2_uv1?^EaY=yL5VpSuICi-i;6D6u-LsA>d- zi#33&ZlSLy3J}qxemNB!#~2_8f+Zr6*_QF66G0S3;<6-Efe%x*{D)7?N1~CPlG~lf zS?k8*@r-SnY?+x+-OB?O3sfGVfCZ6NH-Umn+qIr(X1}0vuuA|mIx?}#k-em$&>$9p zlwnkCDDq(niW^(-%S2zHv~dIgvKr<7GY=_kw-lYm;>-@21zNog+HYL;*W zFRS00_@b73XN~Gr7+#nJA`d|AV3Wv!aKI7LZEa02v*m&F<3Kn>>#}#LAc76C8YYe? zYw-b4w%kK!#*2&vG8(VA`nOdP7q6(@%}BqzlE#_(vcP$)C<|NxvuYn=YCfGK7Y*3u0b0!;1?on e(REB;y+!YEab!Dz5j4T6Z;y`LSMs6iS8Pg*JY-e? literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..106e0e13cc5996f9e412a6277c365a55550b330d GIT binary patch literal 1926 zcmV;12YL8XNk&F~2LJ$9MM6+kP&iC+2LJ#sYrq;1HPN;9|Mca|eZ;nt+O}=mw(T6- z=FBnvzwa-;fn1OFckexG?S0zhH|S3HX`|8=FJii^wPUu^#kmICcDk%oPAYY?(wViZ zL6vIyu(QqDMrYeem7H$6X_MBr*`_pZVpgssg>2il)3!=}vVUWCm?K-Z&OTC@p}ow^ z%*;$r%pkdqBuSFII;#X9Ay+8~ZQHi7c`|3)wr$(C-A#a+ ze1MX4A@*7zUGomf$xZN?0Ku1WqTgBa3c<-na3h`RWi}EF1bZfQe}&}@0;x&x3?FuH zRuK&dcIEVwY&&Bm|4R^WyO>3SO$nWR1j`8i11^-iQve8_3r@$0yq_SOA#w(icH{Ym zrj=^z6Racn0{}S+Pp_aQxF%R%(My6EnWVHZDQ77nw*Z0tKx@r~mq$|f+El2_>TBr8_=TmTU5DT$@t!9*@I9f239cRr0P|Uj*lP~HL1jq52lUn;!{)msrILQ54~sK6Y9(CT?Gyu9*oaITovtP1i&IVYxTxX8sDO6H%$?3W4z&emFRS$Ce^^WzM7^MlVuWk|8TCCQ{Oi z8F6jm>%`U=Az3|-UmU>&OA$OmOotw)BfMM@<%%p5S*>2WV+5?2Do2c9)|mZa4wdqO zOo^`#fcQp5l#3(SVW~Bcrt$2oG8>%`S7RW#JSEY!imKM&Sfl8rm(s7{4#$wkB4$>M zhg-P{AYGPU0D!nUk(J^ImRL$+4}yO+BL;}6Rdf}d!H-{R`tztN`*5nxK03Sok*fjl zj*9?F`sWJ3u6uF><18h(D~rl7N22P?!>Rt?qqd(n$7%b~k)zl!2MpZAg$1MvUIMV^ zuAEfc+)@NHb^L<*-#}`gT7TV~)}9_|y%NlzCoa`w9!~emi@RIHRA_tkN;UvRLB_}vw4`vmRb9-hK@!R#)>Eh#gUu7L=5A zbQaZnxw`)kCwx&FwEFCD`n+&q5}SmT3cxQ(nw*rZgu;rT?!ukcQUnjpC5+2?B}c>b zcJbo0|KNiuvmFeQ+C~;5SjG9}%0Se-oNE6+zz%%!;;`g_j58x2*syTZ$7f zQrTiff_vr+2Coa)ZR92?5{BUY1mYWK4@#=-%@vUhC)QeXR|rz z?=6O4va-o(|6^i#bvAi-eyzc?LtY~_RIl(0RSGa^T(sM zUyp^W7>HaH^ob2uw)qpm2~B2#k6++tiKuYPW=W%pomSMm21z4i8IkjXKEa(dk#PG^ z!lWF*UjSJt!!(x833owzi6CH5a2hH*6)+1xil&3*>kgewm@yp$FmQ~r)y!d{4+HQG z_*s|?rrpJBq~_Yor$i64SCTS|rMzSO1{uC{JL%UJA%n|1^f{4yFJo@6jJwyg=|#PzotK9*6$q*a`eBn=o!R z&~7VfYAbu*o7ih^Yvvm_yEFvuKI*1{jatJELsbvSmkW(c$cMFt83me`ViC z|D%aDD-tV3u=2_)CrAcvuW#@rVS6b%U+G!s=Mo-nf#9pqX{zk~{HyeG6rOJVe5SH{ z(MyD+-KevSo0a{7lTF!wMS_{@XilTll$ebK7s@0cPn4t$!583d7pIQOD_uxYNqbh( MZk0*0tH~@60R0}G`2YX_ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..c388f6dae5a66dd7133c1c43af5f493e7a735579 GIT binary patch literal 2242 zcmV;z2tD^wNk&Gx2mkZJ3xp?HvjcF#*l+iB`GU z{x_2H$9uQCvpXZ<2?=R}R_MQiyBld|JNP%iLwc7}1QAvIo{e$wnUoIh3Lv}`8`DBT14|`|@XYBo4*t zBX%{Y~f&bDoOkFCv|_2QVBr3|--%yKfVfCjj(4{L%BsNgh! zM-=m>hnx-^I*lZ-{|ApikZt1+@>?!d{mcB*U;r#xt}Gh9FJnHm*|rc)B}|BR(bbvt&dEKg+-jz{};aX!q7 zXx~<8{RxPd5o#!c-b1G$N%(rKmasjSOpq*PtJ&|VvhT<7It$`h8hK9F^zgnz6zT6w zPjk1bt;j2b2Md&ml}ssEIJ`5X(X6DuS#ds&;Q0SL1rJy3j}4-Jg`Byf7CMTA+KxU5 z3Sv}cbQzR-ebQz`di9Rcm7xg(01O0-3IJfk=*fP5Hhe5}7e4@O2pO*pbqH!RptX3GgOz|9K&{7Q+)ytVt!8v5;bOtb z#^68zfW)LqmWD|H@K(yqV5X4CfRRA17689QrM@$u$txVCv2AI*4GBQ?=LI1ahF>xj zp&SBZ000-N%4<*b?-T9k6h3$YVvt<*l1vmn3J@yS3V>U_622Ocz~5etTTb^>7)$dK za>{Nk0FWzqs6+780ayU-MR##=W6MIhRY2>~#v zuUxLQvtVz?r?~Iu0N+gFsUx*@SZx6BlRa7YegVI01o#Wg4Wv+uD89D{Kn=bba_#Iy z?SvKO$GkHGz-NK|HqUGUns9w zB@WpU_sz)Oc61DCj(tQeCIvwV3KRHcq6i(HACZ2KSjM(wp5n~G~w>TnFW9bb7B|sc}O5J`C|wee+{alSf8eh0?>2x;=kMdgCoJC*+>wr`i90r z079S#KpU=jZ->P4IYz+Rit~>0VGP1lUwPJIo=hpQq3S#+O=hI}W2S$m2v zKIPY!bFl!xBx;K|KbbUhTIQP1;bd6_$9d9tu|Ci6+JK2;CJR?T^F%sw!!dy(xQ+x0xlR`sgv5Bk^Ec}qq=68wHoPpjghIlm)g+R@=N5s^ zj%~wJfi61ZFD&>hFarP~xLRNd)CevvAbpwn4;0D#H))1t4a*$!7)V8Gp?QDj{DgiT znPcE^7NN9CWx~OQk^+z^HID@h2}H<^ZYZk5mu@r^p@+s22p-E@H6D^at<$#@9BRAN z7MvWYNbo{9h&36nALvTwteS5&{EiWX{yNoVQ{rb^91J*<@OJQ9%1_r#(c)duM zpFcV$NR+48mM5EFQD3?wTgnG>D33XidBGqktqQa-0EK}ClSHnwWw*8_@@tZbAmGUl z%N#ZYhG#XUrV5oL&o;O@1gYtub8ck5S|pCDNwcQytJQtd2%@|hPjBcKYyNlOn5K>11Zgg(2u9@w>uHn;ifq#+@)JfE(1i>HKQptvuc&2?3Aj}g zO-#X@rZ7oW`!O`t#2|e?(ZsFV)gI+LPQEw-lVF~+>I+Mo0=Q9AxB(!&p0yeX76+~4 zNIWhR1SG2|v)nt}63t`Us`{zbHTEsJO=jB7sjZ9SgsVRrR4zhyKz9x(M?2 z%+|9nKdjkJFdMw|xWqq~TLju*U(X2GjE2XkQ_t1Q?)CHyZn|Y-E)mz53mp04Ze1df Q3Dna|FWs`0M)6J<0KA+ky8r+H literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..2dddd0313fbe47649a26f3bd19e022d9b439ad86 GIT binary patch literal 2728 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 O>pytM>i)0$zdmieM{+&@ literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..c89a4abd0e7daace668cc1a0b61de43fff99bf6e GIT binary patch literal 5030 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..bf191eb8171c41c8f46e66be48b647099254f843 GIT binary patch literal 4246 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..0a5390f963768a0a39cfa58f6d30e1d0d199509e GIT binary patch literal 7718 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..b8e72301e0f7b7f4efaf60a6eb7fee52662a62c9 GIT binary patch literal 5854 zcmV<479r_UNk&H2761TOMM6+kP&iD=761S*zrZgLRfpQPZJ7A~yIa~G5fgx?%M~cQ z60zrDv(4bSqwz}rziN`38(HQRGcz*{Gc)zHhM9SqnVFgS=H7Gu=e+NpbHt1ji5dF_ z#7xslb|=!CjhGc_s!PnNiX)0t)uKqh>PR6oD`UnkF+@|_v6w=7#Vj4Mv|ZKWOvVsH zW=Pu*awhmyDL4BHwoJl_oXII<%s0T38N`YlI%mEL-+>@ zjdt&zZP!V$wrjiUj2UO!wry;OFp|t5(tp9Y>;DAMi2!Vtq+@eF-cjgL{V(I3uXVI+~_p)(A;6c3k$4M#*fpt_3t z@PLJ``a|&WI$RGEO-8nd25v-*0}QMLjuwK2SJmO*0Si<0RqcH!pxOtBXc03us1||; zUdpLpLei;vRWI5IDKLg4Nl;d=ztR${!kOFyZX`*vRaN=6yZ`4tR00tV5eI;C+uAW_ zY}+%jZQD-jbY^8ce?YxmC7o?sm0f=tJQF|j8OSu{{p>)EqA%pC02MPv|JqN~hXs@Yf@+gr@u zHY8-xh?W1iy~kR4wjDHZck34`Sh{jZW106@GtaW$z|%D8A`!BxZSWRr=T_mieSj{4 zqbq?XF}L-j&0YgX@&x?RaR4-B(94Dpn(|4}O>!Zi5Lh91H94hdS~hyVYFL=0}e0K0CH`cl^P9*X0~>KdglWyv@ez(HV-1Khes>q}WOqis6_ z(6-K$B`b2_B9QH{Ml5eYevwWe}Py1J&tT+h90iqy?F1q7;{Q|A; z_AkFsX&4J=C2o0jE%=kLQ9b(qZ9&%G@2@;lX^1||Wi@7c<`mL59D*@4Rj0C>02|kP zw=P926cGa$a_TcZb9I$DHR9=Ok7a+qty}VRkDiY#D#lUh#i^DclmZb^V?GcQczJ?K zp2%ajDn|lR#!{Gj)Uz2wqJS98TWF*D>U<$E{+F)TN{jxeFrNebwDRP^YK~_JFVbe3 zx-hUCLqUb7-`~{FUZ4M;_p}d-s4*CcaelOtx=r!&HE2Yjs0Im)oftWdC80t5Z=+$S zb6oxZex4iDvM&%3t@`5BeRe*3qfGSS6zi20Mk4 z`s(x)ue$s~=H9J-+Ra^;weMB|LwM>pbMn`3P&QJ={`tSP*jkwk86c`bhPTwSYvz#* zQ4=6C+kzW)$XAfrk_Y5EF;Lu%b#K%f&m4O-v4f>mENC_mjq0H@U-`Fc+Q&7y>z??1Pw2TP@X`}}?uk9T zN#FKRdACbvJ{s3!e_b_5eM9aV=g0RbNJ5#pvE&F0RBjliXd6&siBJPqK|)9FI+cGOm1r)mT3sc1t!*ahS;@$lo4(ynExqK_Mx9q3^8hw} z?1DOkbPnSh#XYWPLhqEmY5mg#X85_5!WGu0j=bR{x6G6fF$A6ydl5A3O@FpH%s(%q zSm4Ht9I)WQUP*1s71kz$Qy7O3c0p_cTKll{YVOs{je(E+%Bb^8+sa{*NZC0lDWkcY zywa+(YttyCp+iHb#x70WZp=7LF?q9_Q&C)}h^`Ub<6P`@-o`JD35RZBt%PGTEAATa zTl+~ex)&=_7)=BO5v6-&#!%jJUKjSJ&rm!cc;OgrK07GuT0Z}EF6JKN_D*5PvI$uU zY%XQW3S$z`%xz+Pa(ewR*H^!3OPiu7wzAo|vDe(ns0(Q$F(|NE+%=xJ|J2MZJp5BQ zE;A+DM_sBH!Y$`@;YgeaoE!KOlo2^i;kR?w zxZl6Gtb!Cw6Aq8S)JF@yp*U2r;G!WaGFHZzNO?zdkRW9=Mf2oUM$Q);gE+_( zt{!(iuDhy&6Gu^Pb(C>O@lP9&F)-uL{bz8N5QG2>9q!_r3VVb0=Q&T0Ac{KDRw=AM zgKB)u+=4PtMUy=EO!K0;<;IpjF9wmU*Wj+PeYKOJLIY{lIn-(3L!_=3;BVD=q-kk4 zDPwNCtC6@Y#;9B6Pc`fU?5-Wvyta{iORA51aQZD7bbUka8t}X4qu|C~g~B#r*ExoB z#Ep#X7}ha_LlFBQmJx~xo6VT&%=NPJY3bF%>$MuC$ga<#Ecs(4A%-TJ;q(%jjo;lJ zlIp^VMlM%EHLq>_Qw$}8AwPq=`u%Iu!B8N+mzmGj9&dn(&(Ju1^%56`!9qA^!$wZ$ z_>J$iPrUUkhp%}hzMLQqXzjC8C<;|1VXCpqOsXgxQy0mZ41V&w+?Dca%q%?o6V))+ z`llN((<{b=pSriM4~p7rj2H)@k*s_yzYSH7_|$t*y-8}k#GqL}vZzVGek0jwJ zOf;2dvM11YsWP3Xr@EJ=hx8jzoyXW|;xJS_;!}rVpgUKMZ6Mi%0dL%ijl`p`C>?2+gr)E_+EyW$KQ`lQHw+6RUS0a?-a2 z0P?gZU*aRB##e-w)to%~IC4kTrqh~eKGeX@J{UNdE{V&={noo-BC+=6g8}okyY2<6 z_v~o+Q2@}>TSAJZc+F6NHGeMLNmQW-yX!?0hM;eA`wW^_awIN0@sO&rOaSIPz5^HU z1#6C{7CML$+uUpe(yX_Y1FMiU&mbv0GjQ2E8jggDBoy2%0KVlfJh^)B!Ge>z zEdV%GG%eX7Gya^$nZCTz6qnZ>=dS-5g4m|LC%h`kG|gWO1QDls@;FWIs3PGUX9M6j zKDZB9eIfw>Yot9t^QTWjY|zXUZX3r(KMNB} zFC^VbYD^>m^!NAM5@Es32LKa#>M@AcBDzGNVVr-ffZLAys0@bL2SGYf*~J8aQ*|Zl z2mt2|5+M3~@%AifCi3_=uEPyg<1hell9iF^j|2e7ZHau+iVtMz@_lta$H8Hkg<-Ig zZ@U0s5_gZm(*OWG7t!m89&uP|T+b)tx|6VG;eo8^S^>Z{K9&W`{vh&7DtabhCk~Q# zJAv!^Zg-HNO6bfd0IYUBWaj;$;G#+7kx=|ZcG7OjdD>4?iKPR;C_|7nsRaPYZ%Op_ zqEAY89L?a;vHU^-z<}TVu|#e$#kXOn z;#>mvP5l0yp3KrG8=v}ouW($2&Fr6gY+t?F2|V{}yv8d4K*~!_>GHkQQ`5Od_=~Hs zvW1)RKuTL>MR5K;C{uoKI_C&U{%Kh8RP3kyc>vx=ScUx_+Yw6 z?;n+P`WH}6v9+RGj-Jgi+1SERybvEKKxXKGW~0pl2IEj^CVkt=DKTF=Z-1U1kpvr# zB8{MEL|z%{>>#le_mYNTa)BWwW@v{h22hdTb2k+3k;feI=h_7$-fdFXrJOAF z(zB{>qf@$(Q)8DVZW|}=-0FhLS_IjOZ9uz_4q-=Lpj(s&ddBfi;*;VkYuV-@Ls34o z>UaP@n({k+WsR|Oia7Ewe&ASNW07$D zw@sogwpwY3wa0Q4qW4C{VWiBK>8p(3M$*3fdfRPtEm!eP;hpqi9&z2`x8QVOWldJ~qj&=7NX`XJY{oA9MNNj?7CfC-B7&q!ERpGJ2LTCK(}` zk=fB`q=lw;XBHqj(TC=Zv3>P_5mU--foKKt220Ji)sj4I(1NZ>OLk0yh$e;}?kmNfU;SaN$tr=Rxm1OAxI z&087GyO)z!oljXqFR6;U@LsOCwtJz#$=p67D6sjkWjRyWS;>i#doX&`v3)j=^xgS8 zqKSg&6!!PZ<<{6OMR8%(CDe(4$HuGa6%)_Zlbu^88aur(qmnBHJObJFUjh{d((E-1 z+$||>Npz62Krar;#t6TKIOU7SP7Fb!vCC)zCg&QJS3YA-G=zRBM7J1h$oE6Uj#^gc zm74l-Ogg6U3Y1<-6&d?y{}&<-v45gf(rh^XPOr(}%dY|ava55c#@N1oiIv)SwaNUG zKN;Is6E&*_O^>HYj3Z&tw3ffdGup~Cr5XUTEXzQ=R+{q|xjfOm$PykOcm_rY;Z+gl zO@^b*AFg-3i@Dp~jM*zBP8E2O5VF&qf_G9nGHPMhHHK=Gm7-Iphu+=pcDK7CxmD*d z)`dMH>1Mz?aJ*+>;7oF%F)$w)@!o%(Q9co0d4&>B`BtC z1$6@%h>V9q%R}04U|`IzI;%c4qKKmS7oC$Pc-qQoRSZdzh8boUltO5p2T4!(9>7De zt7joQSP^c^i|3TVJzXgoe`b6Q%}?%Xz@PrYF2~)>X1ewD*L}ACD8F`!Q>1k0pp|7=L56Po zW2ZqgWS)XzYn4FKZf>?gX%rJy7R+-OZ;6I@)Iq|!;7=}dnS-DFlVp+G#W%EYJD;hfq%Yzv#u%O1_h!P5K)M0~=gOgmIicQJF4N)ARfwXFMoh+s< z6HoMDy$JcWc{x3CiFPz7hn<{n`^C_*w=p7YCEhz+zjo>jou(T&Tz=gcSfi3f;h-a$pQc#cL>!8$s&HuFo=lv z>XmT=8VwGf0zv>Lf88fkiFV=#BE?oRy3?SKZ9M$QcSt}Ue>^42p_%N5p zm~7@WM(-zkY;&)LXN~rjjs{>&n=h>+-6v(BGohclH zO{8yEfb0N_^F3~fO1i}MG(Va^T z6LSy$M06YR>LgXBYZMS7@M@K2Q$x0}BJvcH)(OytJ_Mr)dj|4an0xeV1oxrGN3Gi1@rObqWwV0Mj@vZ#md;jq(?tkJ$Fmy>)#M zKyW!nLsk~p+NysFbTDJ04-JE89)aKaNj5Ioc`eIa7YHR7@aLb7g`t}}Ek2&F2Eqwm zVG$Ze28!4 zO3=)D2fo>(I#H^jdZL<@-HMgT7=bSi27m={%Xq5#p((0@Q+_509RX|v0OjQfkO%El zQ;Pa}2WTUJX%XarAn|3CQ!QDqItxjhqX3`6q$-64t7_8^)okomm~g5S@FBt=c?8G+ zle?W19sTI|6{@GVfWu&v3j%=J11}0dUvY}ok9?>bY2j3uaB5oMS=lovGCRAe6T`FU;-^(`S3lL10N1vmrlC445Owx;)|f4o$% z1{OgDufqS;@-XStUw&lfhuO>s2D1GKkODfu74W)TB52ZSsya(`d9JVjZpG`>;#70U zf9f>CDgW&FK5vxo&`k1;fW9*4u`YxD9T>W otq^t*Yx4ffjYbyojmFFU+*lEsh9cHlqk-015t_cDf%H%p0VAt84FCWD literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..dae95ed873f77c0e88a56b5880539a0d0741908e GIT binary patch literal 8314 zcmV-=AcfyjNk&F;AOHYYMM6+kP&iCwAOHX_ufb~&RSV;`jU0*nmwjn>FMT6o0{W3g znc(cT<`f#URW#7VgJ>j@#v~eSMrh)c&uvxzzh$?SIh27)bhqXn-ANAJv%9;ykG=Qr zUWTp8@r=3Vt3r_k6WCbhDh3pMRzAn!s3od8$AJBSD!fnG;)!w z%|)h@+Bt87C3PGuFJho`6?93HR%gY}>YJ zSNDE*cxthebM_o_?bvo|D)QO3Z8o`)Bsr24177fxcDbhx-;|dGNVZM8%8PB=wr$(C zZQHhO+fKf1+qR800eGfuTQ*0|4_PxaGc&VT8lI6?3=Xu}mpgU``9c`${;Zqx$KQogeXQOiDsLgi95G}=qrOZ`bweT4~^F(d7BUEkd zYBRS>X)2%>9CO*cKqKT`okLAwr#s@ zcT0{WIgTU%1oW3~)i|G1nGtXU0U+SK|ErIk1*`=!fH8oRE*ty+DOIv_?*(k5%%`<= z6F`Cg1OEs95BwkaKk$Fx|G@u&{{#OA{tsL@!^KF1a|N>k<}$D(8T&SiH{#Suq_`pm zVAcQ-LKuMm$im4pK`R<-5(%V)@yLSV*pkyiQ*Qu1WDLM}1gwVGk>RtVZVGt=a1b1> zc&x~*IekK@0Xh^LGAmwX2H;7N0k{uCD z;@SuiQKLR23|!3`j4g#B%lIH?xZrk8k+kd_Mi}hr^Q9~#k2dgx<92Ldr1}uX7&w75Fz^r7m6M}OEvyhY#9rMF0vs4cA}C^p+>(Bb zqtwBN50+-nE(QQcRyqR%ewDU1L!N{0+GhfvcSZ7Uawao^#KfsiUpaLNai5$g-wh=uxACh9i$dBhxOo@xaCeJP>a~8s0}5uk=13m-68W@ zEbDuom_y*n7i?KlVidGHyjP1zVB`(1{rn^GDm{bnck)byU$Nod53TUE*AZ6eAO{(K z5&LdqJf1a4KgQLt?DIhOI!?3E;Tf9J0(=~4q`*qx)LMiko^{W=>p@wAr)8yIX+fSq z6>tFf$X%%RpFC%{_C94<@J<`y?MS^yjD~$> z)7&m~aq$dP{ZO@ZG+_{$Alic+u`ICjMtIv&&$TWhqA8})R@EDK*5GPjkjGKp7W^Cp zc-ZLR;0Qevgr?{dAAw-;Dr>TJ5KY=g0F)|vv;b^a7QD;JVWuu5`L`c4bAsY#6l`|1 z>=`+*nz9>2L}l9Otiwfzn~9<6z7G6dY_vy+btnC2azu^@1dA@`S)sxd?@)FcJBtQt zTNZ3BIoP!&DLjuRw3JC_VNq}ylJiM{(q@!wxvMyFYR;>rfYu@=yzw$!bhLLdHxU)w zhf9vY2uZzCB!}ndjbzcS5|64XjWPWgtx4%xgA7^LmyGbXp|7g zCSW+uFvAAJsz8t4?SfRKaZ!QNyYRJVaLy-F+M? zDK#Paw=EXk>R+Pf5MS!tRs@DBK$B&`*0hCXvH_#j6J1Nx8KTMQG`KJIPt(Vj=RA26<2j6&NWD!4@h2hNFSgH%d%Q65eV@U`}7;wBUJYQ_vY&= z-RlVVgKlkC9W}LA)J9e-0b@tyH0AV~L{xYljRYxb%&5RRB>A`T_Qs5tfFL58Y#q89 z5($>Idu_>fG@_QOR^8IZMER(uDWg0JAB3O~{WrPz051#kjq74)nf3~XwURXXI3%xW zQZ_jmk|NuP0I2a)%c`xf2q@5{w=Q=R-8bI^Ii_Ed424 zR*4Z_mZGh;vVd1*2@C;XFv~5^#G$fXRV?^N5Nc++vaEw85>lW+Utij^joug>8Y(D> zqIeOrKy5+UpZ$Yxg=nLVB%rMXmi_=tEIS5p%c>MT&9a2mCJ>HMavns~pst75XtUBe%Y+x~e>E2*ts;O5!LsjN(Oga3M7L1Rjg3zr7Xy;W&{q*KuFEKKms8`xO2D zsQKpRxrmn~2N=ha4%qszj0S9dRN0Gdfk({%z|)d4OI8X7X`y$4`mZgYbVMi5nod2k zM||>}*#DoIURqY*GX@yM^65bCM3#ks+=;5xx2-lJ0pP!`xkhk+CR#qJgbr72w24S3@QR)Xe;WU0Z%qkx5g)4|aS!gPx zz~2+g9KgYt_69WPp~}te3s&z7H&d!qes?pgdg{M^wxFnGU6XcEWEv$nC&;1%5h?`p%`q zT=JD|h^vV~+q8Z#;756Z-xmmr`s9Np|<57?uKFmFcg5?^XlM4B7YM z(tdC=#czerR#5T7Ln!{gW4`{#naefXh+Lb=l#zilX-O(hLudFa;JcYxNdn$i4Itmb zDuB0s7|Cy@mlw1Aq~9Kb@&AtM&LwxkXFhp(dGW~!sUZn^B&adOO&8ur!sPTQkax8jH5BFYd7`2Odb7g@A9NKUuu@<@i zTiN3^ZCz7ewWd>#?1}&P5nQ`>`Yf4C)A`+^6DMFeOP3ni`Sw9ntEeHjHfZPu2F&vi zdwzji_R2BoI*6uNqgx4?En3-L3zJ8=k2kqGuWx+Bb;y`IJ|cdW9AF&F7Z4E@8%7Eg zel!tLl`)JJN`DJkSr5Pi(@w16r2f5Rj`aQ&M8v7h6N_BwPY-^1y9GvaDLM{CYle_a zvkct`@Hk(QSsB6B^yFzNywsh_98PfF!VSrs$e9nnt=lmImS_2gY$B?N!ike3gRERr zhLK86NoE&D!OoMNi%_Z0{V1)t>@v$%_;BMTruh1hInoDDNDXfBHsE$xL`zaPKG{0z z_7M)HTk_)Pni!TMH8@saq`uukR2?FbrdWqx31b6W8a!S;=ulCkR~EUJPcGb=KEKGA zTRpjOo2wZmU^J7^b;0Ue!KJP+3}HML=~&v)eQ-ZTWk23zGJ_j%>(OGDGL_!jxJ}Fe z2C%6Kd~Iba8cUniX4JqtJq`?jS7hr@QL*noGMDxQ+{AHRzGRAge{f3%FpriFN0uH* z%~3tO)zC@)`;j@E;C~vwd}MxyTLOS>X{mQxqvl#7bF9MU5{gdr%tt0yh0>pFGRJiN z;?@tq8)&J@+Jy7f5&_cE4at=HbW@?;Yn#kx^{l}wI2M3)X$bgMY;8hGX0+^9Lq~T1 zktzStrh?-$k}-Gd#B1FE`fKPLk+sdWHS&Auu&e^i7kzZuCFehY*DV7G44|QIVP$Mx580Fv-23 zYNG&>w6hYjcrg;~Hi!;Q1Wzw$=p)`kRV@x= z^h%(aOe`m1bxSqsi|Vc!=lB{f9q;R^d>jC#KAM5tI*rxUHR@mL#(jDqPRsvqv@#0n z_7ms&$56Eiz%-X;nv>Pfb~^f#=$URinDUr7Ywknc=x&^dGq@i&SoH<~+txKxWp~uV zZ|7U~Dks0S=yU={A>KI7Pt1IJag4;@^P0m-=*EWk>O!31y}F_7b^u$RRxX&Y7q#Wd zBty@h^!;wwZ*IJ5%{mXd^wHeDj^)~QLq>lT=la8VcVncFE{yEqg;C!+v7edEEEFsc z*wKp2p_STX`6~?7^=-nohw$mfn*DkF&wCpQWLdPbcH651JoeSg*X-9ndm9eSrj;js z*Y-$w2YvNf-;Dg>1#im%<8_SyTV(xvncJX~E?|^ZBQ@>s9>5Qy4&vpZuky>N?qBe> z46vZkX8GdmkLIJ}e%>zO*W*PI;sH1Y6R>)Il$fesaJ&~KDnYwg^v!l&jc3L z$n(bpWS2j}jSWh2yMSsaiVZPIKc>UAD@`nXT4)u;1Wce7G31Of z^-bJ+!6l|6al_F>p%;%VM@HkDb2zI-TT5yuW2I00ur7w4>IN37MuLc_!WexA_DcxM zkQ|vUB}cWEn(MrK*u~Vy`4-y5JpLXwnKpRc zN&P}o^vaMNiP{x2aP-E8bZ9_C^hPOAT<0KjH1YPv>Z*X+CYv4Qv-9bd6Eo1m!xhcO zbO(}2yMXel!NTvz?_H<<%Tev^tNAV(E<(o}*7fXo{XOR_=Q#>)PbvUKZ(&;!4C6v{{ev zDMNU=?BX@^OPi2=&jV>i&jGp^;=u8G<6;bVtL6Z}twohW4AsD_c?aWS5Vz=;AI{`d^0Q5@_!pa*_slOXY&PJ&)H47Nr|169j!6(B(E=|O zxfoKdTL)f;ZuH7#M6dDImdR}arg$4LT0H~mL|lxbOj?vQ6g6+-7#F~@mR`76uK9>g zJ)F#$A9~F~h$}SnXG=B#kE_~Cy`?x-xN4US@N(w>KfgXKN_I1ngWj1Gv3n%t8;J@)lI!2Z)I3DS*>2KBc(stgwe0c z)XZQ2hf*i(j2xtJwxPDC*Uo``M;Uv9!)PWAz(93?Q$4tdd_@N4y0!%Ee4CKn6Ss|e zx;FqJ3DkKiImullk6)5|Z*HIT^bi0-6R6Vh%G|_yJJ*sfk?-ZP#BPdf*YtOoF^ z*j01|d`TXv&va(t>2U$mL^WhmK+Y1@t|=iJyDz{tmkPj#)*}vgAtKSbHK<+~)$7{w z)K%0vRJ;m66*1ir+W8 zav4W2tU*k$ZSjf3Q;JMML{wr4eo`99X#(S#9&IsS5782)Y(i3e32sHg@wyGEU%9l7 z|D4{d1JQT8qFVRbk{&ZPAuPjOThEI`uvntZ1lvPD{e1h|cb<5|V&aX9cl_&LeNVD! zk@KvLOcY%PQTDBK`!c!B=wUj1p%RH`ie>;nGYTe~9gW-(S*zq^MwJ;&LjV1rVg)N` zL(p^2zyJNZ)}`zEPujJ$h-+PfcV$PeHyyq zDzFVAdO|2a(z{RecfqXD*xZLm2_9NqZ=~uD-YBv35I!khAZ=Z5u=r(+zMX}(_x0n3 z9Ov09iu~xE26aFV^xo?7R!NzCq+tBED6-~K>Z{ql*i zUplbrRj+!C*A9&I(S_kZz0mGqzP)hgM}O;CcG+c*{^qsx5uIF;BYE&F`-8ju%Y!Dp zvtU!7+=D9_063;dj0GN=mwetTz@AuXBt}rJMyBc-%OkXi6)>nrEAa$@M6;P#Y@1C@ zzmS}%aGHgR_6xL=rG@vX5tdbekwW9p^pHb+j-p|}uqc!TyrRZxWhpL~(p4=r?PLJ0 zWksF5EMR*Yy9qf}FmY;@0$NFmLiRL(q1pnjRJfJhLCz>yX+I4lIZLocnfMXFLYm4* zKgQ%(AC^|p!oilQ$T~XL6=f#o0$xXG3K)xA3kh$lii%?p(Nt?}LEq^VCEL*eHlU?` zh2tgXy4Q}qz4@f;AfoJ0Tz;9;2Bd2Vh$aX7r;I24#ffM`Z?4IK0lx$j;A=xeup_&3 zG0|>3i9b45D!7d{q=eqBs}P#P1T3x{;79x9WH$@E@FaZ7a&GIdMU)B5P&%ukV@ytl z6O^(G=vLIOR1l$%9IX@&;GZWAs!?eSBFb)-*Y<`kbUV+Kei`#@%ilvgz&TLiZCndC z;9_2HRIa86cqV+{K!aN-#%oa`(WW5(_UA)H1-2gnWpOGOPLrH%ZuQQ-FY_E|aogb! z5D`6qf*NL#v~5$I{!b29rm@Z#m&HwdfuurOXE!1@*Jd-BGU}?3HMlMOVvXFNKm4em_vEY)7YL$9=%y)83GB~tnJK?j-`14Y*YWGD*5D6)lQ{mM4h1G!|R zM+^AorP>&hvPposkpLp1r7u&>`v9gnl|*8cn?lm5E=BeBPi`3+zs4SB?m|-S2(|_i zBp=z7n#TofeUyl9CCW|X2PRvGV_QOL-Ok7{N08z$u~1y)r;&ZL)yitC;CXk?31}&(g{ZL$e&8r4Ud2fe(M`{%W&?mNS&h3B?8kt5w%^JqS=XugOW2%3~V6z-n&?$eqZ*_?8LOB6d%d*BjLn663w~Ea0|^ zh5{qvRRFds$VE52nXlZB03$Mzo>Q9~AwNSd1{&6#*LRlB&vcXtA$v000I|9$D za|yeQ92d?ypu=mMNraS4|fk@J=kP_DzhtjW75xQt1=a88TQ6U>~}RCSa@ z)xZK5DGhBFZ^Y!lx13h@IK|dML`AmIIYfGTx{rnQ^z`)a_>Oe>S&GWP526Qp4i2#P zQgY(e<;wnuq?Mck&nqS(Dm@RjgO!pahsN#Ds-DzHRSP^)3N0Ziz64WW1CTQp&bCO= z!>@TBL^Nq1jaisXre+jOtfjM%%-j_N@PGZKc=d)guq95^*Q&9Xhc3gTiFkNuX6rbxuMGf%3H zup)7>j18V$spVq~d7I;6A(y;M4QIcLxLC=o!PweU^-}k_@3>gXI$H^q7=VX}a&@j4 z7i$?+10NMUd>3)CnlX}jk(a{mKNc6uS-g_Oik?WR&(e~{2|W5XloG819v2jf*wNM$ z1EolFhCaEa=4`wAJI4T&GX2=IA9l9AR8Zjm!2f~&1OEs95BwkaKk$Fx|G@u&|K|;8 E01HmZuK)l5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..e16ef0b03fa9704ca00bb07a75ff2866d3cbd07b GIT binary patch literal 10402 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 M72vGu^g0t40MXOiGynhq literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..d035176 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,11 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF1c1b20 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..9c1cd0c --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #1C1B20 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..33964d4 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,38 @@ + + WG Tunnel + tunnelConfig + VPN Channel + VPN Notification Channel + Watcher Channel + Watcher Notification Channel + FOREGROUND_FILE + https://github.com/zaneschepke/wgtunnel + https://zaneschepke.github.io/wgtunnel/ + File is not a .conf file + Turn off tunnel before editing + No tunnels added yet! + Tunnel name already exists + https://discord.gg/Ad5fuEts + Watcher Service + Now watching for Wi-Fi state changes + VPN Connected + Connected to tunnel - + VPN permission is required for the app to work properly. + Notifications permission is required for the app to work properly. + Open Settings + Add Trusted SSID + Trusted SSID + Tunnels + Select Tunnel + Enable auto tunneling + Tunnel on mobile data + \"Allow all the time\" location permission is required for retrieving Wi-Fi SSID in the background. Permission is needed for this feature. + Location permission is required for this feature to work properly. + At least one tunnel required to use this feature + "Retry" + View Privacy Policy + Okay + This feature requires background location permission to enable Wi-Fi SSID monitoring even while the application is closed. For more details, please see the Privacy Policy linked on the Support screen. + Background Location Disclosure + Thank you for using WG Tunnel! If you are experiencing issues with the app, please reach out on Discord or create an issue on Github. I will try to address the issue as quickly as possible. Thank you! + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..9414a53 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 0000000..fa0f996 --- /dev/null +++ b/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000..9ee9997 --- /dev/null +++ b/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/test/java/com/zaneschepke/wireguardautotunnel/ExampleUnitTest.kt b/app/src/test/java/com/zaneschepke/wireguardautotunnel/ExampleUnitTest.kt new file mode 100644 index 0000000..0dcc33d --- /dev/null +++ b/app/src/test/java/com/zaneschepke/wireguardautotunnel/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.zaneschepke.wireguardautotunnel + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/asset/main_screen.png b/asset/main_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..09b9a2e1b417c42fb1dce02cd9987477fb84964b GIT binary patch literal 42320 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 PTCS|1Azvi-GWdT1HBeo* literal 0 HcmV?d00001 diff --git a/asset/settings_screen.png b/asset/settings_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..3bbe5da0191d47ae92593bd3a9c69188603967a2 GIT binary patch literal 77006 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..48218f7 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Apr 24 22:46:45 EDT 2023 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..ac1b06f --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/index.html b/index.html new file mode 100644 index 0000000..e00722a --- /dev/null +++ b/index.html @@ -0,0 +1,47 @@ + + + + + + + Document + + + +Privacy Policy +============== + +WG Tunnel provides an alternative Android client app for network tunnels using the WireGuard Protocol. + +Information you provide +----------------------- + +No information provided to the App is transmitted to me or anyone else. +The App does not collect information for purposes of our collection. Your +data is not collected. + +Background Location +------------------------ + +This application does collect location information (specifically Wi-Fi ssid name) in the background +for the auto tunnel feature. This information is not stored or transmitted but is simple collected +by the app to determine whether or not to turn on the VPN. + +Updates to this document +------------------------ + +I will keep this document up-to-date. Your continued use of WG Tunnel confirms +your acceptance of this Privacy Policy. + +Contact Me +---------- + +If you have questions about this Privacy Policy, please contact me +zanecschepke@gmail.com or Discord (invite link on this repository). + + +Effective as of May 24, 2023 +Updated May 24, 2023 + + + diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..6844a38 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "WG Tunnel" +include(":app") + \ No newline at end of file

8}K^5no?5vqYPoPY-MY;L@?*LJH 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 o7hnej^3?hN-2VT=babT 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 z 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Ί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 Jl%4l|_+JaG@1+0$ literal 0 HcmV?d00001 diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..ee73e07 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,20 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + val objectBoxVersion by extra("3.5.1") + val hiltVersion by extra("2.44") + val accompanistVersion by extra("0.31.2-alpha") + + dependencies { + classpath("io.objectbox:objectbox-gradle-plugin:$objectBoxVersion") + classpath("com.google.gms:google-services:4.3.15") + classpath("com.google.firebase:firebase-crashlytics-gradle:2.9.5") + } +} + +plugins { + id("com.android.application") version "8.2.0-alpha07" apply false + id("org.jetbrains.kotlin.android") version "1.8.21" apply false + id("com.google.dagger.hilt.android") version "2.44" apply false + kotlin("plugin.serialization") version "1.8.21" apply false +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..1023be8 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,25 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# 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=-Xmx2048m -Dfile.encoding=UTF-8 +# 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 +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true +#enable buildconfig values +android.defaults.buildfeatures.buildconfig=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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