diff --git a/.env.sample b/.env.sample
new file mode 100644
index 0000000..db332bb
--- /dev/null
+++ b/.env.sample
@@ -0,0 +1,2 @@
+SENTRY_DSN=
+ENABLE_SENTRY=false
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
new file mode 100644
index 0000000..cf174cb
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -0,0 +1,51 @@
+name: Report a bug
+description: |
+ You detected something wrong on the application.
+labels: ["bug"]
+body:
+ - type: textarea
+ id: steps
+ attributes:
+ label: Steps to reproduce
+ description: Steps to reproduce the problem you are running into.
+ placeholder: |
+ 1. ...
+ 2. ...
+ 3. ...
+ validations:
+ required: true
+ - type: textarea
+ id: expected-results
+ attributes:
+ label: Expected results
+ description: What is expected to happen.
+ validations:
+ required: true
+ - type: textarea
+ id: actual-results
+ attributes:
+ label: Actual results
+ description: What is actually happening.
+ validations:
+ required: true
+ - type: textarea
+ id: screenshots
+ attributes:
+ label: Screenshots or Video
+ description: |
+ Upload any screenshots or video of the bug.
+ value: |
+ Screenshots or video demonstration
+ validations:
+ required: true
+ - type: textarea
+ id: app-os-details
+ attributes:
+ label: App and OS details
+ description: |
+ Some details about the app version and the OS where you are running the application.
+ value: |
+ - App version: (eg: v2.16.0)
+ - Device OS version: (eg: Android 14)
+ validations:
+ required: true
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/feature_request_agh.yml b/.github/ISSUE_TEMPLATE/feature_request_agh.yml
new file mode 100644
index 0000000..55972db
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request_agh.yml
@@ -0,0 +1,32 @@
+name: Request a new feature that has been added to AdGuard Home
+description: |
+ The AdGuard Home team added recently a new feature that you want on the app.
+labels: ["agh feature request"]
+body:
+ - type: textarea
+ id: description
+ attributes:
+ label: Description
+ description: Describe the feature that you want on the app.
+ placeholder: |
+ Write the details here...
+ validations:
+ required: true
+ - type: textarea
+ id: screenshots
+ attributes:
+ label: Screenshots
+ description: Attach some screenshots of where that new feature is located on the web administration panel.
+ placeholder: |
+ Screenshots here.
+ validations:
+ required: true
+ - type: textarea
+ id: version-introduced
+ attributes:
+ label: Version where feature was introduced
+ description: Version of the AdGuard Home server where this feature was introduced.
+ placeholder: |
+ - Version: (eg: v0.107.44)
+ validations:
+ required: true
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/feature_request_app.yml b/.github/ISSUE_TEMPLATE/feature_request_app.yml
new file mode 100644
index 0000000..3cf08e6
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request_app.yml
@@ -0,0 +1,20 @@
+name: Request a new feature or an improvement for the app itself
+description: |
+ You want a new feature for the application, or an improvement for an existing one.
+labels: ["app feature request"]
+body:
+ - type: markdown
+ id: important-info
+ attributes:
+ value: |
+ ℹ️ IMPORTANT INFO ℹ️
+ Please note that if the functionality is related to data representation, it may not be implemented, as AdGuard Home Manager depends on the capabilities of the AdGuard Home API.
+ - type: textarea
+ id: description
+ attributes:
+ label: Description
+ description: Describe the feature that you want on the app.
+ placeholder: |
+ Write the details here...
+ validations:
+ required: true
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml
new file mode 100644
index 0000000..805783f
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/question.yml
@@ -0,0 +1,19 @@
+name: You have a question about the app
+description: |
+ You want ask something that's not related with a feature request or a bug.
+labels: ["question"]
+body:
+ - type: markdown
+ id: important-info
+ attributes:
+ value: |
+ Having problems while adding a connection to a server? Check out [this guide](https://github.com/JGeek00/adguard-home-manager/wiki/Create-a-connection).
+ - type: textarea
+ id: question
+ attributes:
+ label: Question
+ description: Write your question here giving the maximum detail possible.
+ placeholder: |
+ Write your question here...
+ validations:
+ required: true
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 24476c5..e9d1504 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,11 +5,16 @@
*.swp
.DS_Store
.atom/
+.build/
.buildlog/
.history
.svn/
+.swiftpm/
migrate_working_dir/
+# Env
+.env
+
# IntelliJ related
*.iml
*.ipr
@@ -42,3 +47,9 @@ app.*.map.json
/android/app/debug
/android/app/profile
/android/app/release
+
+/debian/packages
+
+untranslated.json
+
+android/app/.cxx
diff --git a/.metadata b/.metadata
index e27f5cc..656c923 100644
--- a/.metadata
+++ b/.metadata
@@ -4,7 +4,7 @@
# This file should be version controlled.
version:
- revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
+ revision: f72efea43c3013323d1b95cff571f3c1caa37583
channel: stable
project_type: app
@@ -13,26 +13,11 @@ project_type: app
migration:
platforms:
- platform: root
- create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
- base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
- - platform: android
- create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
- base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
- - platform: ios
- create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
- base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
+ create_revision: f72efea43c3013323d1b95cff571f3c1caa37583
+ base_revision: f72efea43c3013323d1b95cff571f3c1caa37583
- platform: linux
- create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
- base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
- - platform: macos
- create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
- base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
- - platform: web
- create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
- base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
- - platform: windows
- create_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
- base_revision: e3c29ec00c9c825c891d75054c63fcc46454dca1
+ create_revision: f72efea43c3013323d1b95cff571f3c1caa37583
+ base_revision: f72efea43c3013323d1b95cff571f3c1caa37583
# User provided section
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..fab9821
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,20 @@
+{
+ "editor.formatOnSave": false,
+ "editor.formatOnPaste": false,
+ "editor.formatOnType": false,
+ "editor.defaultFormatter": "Dart-Code.flutter",
+ "dart.lineLength": 120,
+ "[dart]": {
+ "editor.rulers": [
+ 120
+ ],
+ "editor.defaultFormatter": "Dart-Code.dart-code",
+ "editor.formatOnSave": false,
+ "editor.formatOnPaste": false,
+ "editor.formatOnType": false
+ },
+ "cSpell.ignorePaths": [
+ "/pubspec.yaml",
+ "/.github/workflows"
+ ],
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index 8fb6375..1dcbc67 100644
--- a/README.md
+++ b/README.md
@@ -1,22 +1,111 @@
-# AdGuard Home Manager
-AdGuard Home Manager is an unofficial client developed with Flutter.
+
+
+
-[
](https://play.google.com/store/apps/details?id=com.jgeek00.adguard_home_manager)
+
+
+ AdGuard Home Manager is an
+
+ AdGuard Home
+
+ unofficial client developed with Flutter.
+
+
+
+
+
+
+
+
+
+
## Main features
▶ Manage your AdGuard Home server on an easy way.
▶ Supports HTTP and HTTPS connections.
▶ Enable and disable the different protections with only one switch.
▶ Add multiple servers to the app, and manage all of them from here.
-▶ Material You interface with dynamic theming (only Android 12+)
-And more coming...
+▶ See and filter the query logs.
+▶ Manage your filtering lists.
+▶ See the clients list and create a custom configuration for a client.
+▶ Configure the allowed devices, DHCP, DNS or rewrites among others.
+▶ Material You interface with dynamic theming (only Android 12+).
+▶ Full desktop support with builds for macOS, Linux and Windows.
+▶ Responsive UI adapted for landscape displays.
## Privacy policy
-AdGuard Home Manager does not collect any personal user data. All data stored into the application is kept on the user's device.
+Check the privacy policy [here](https://github.com/JGeek00/adguard-home-manager/wiki/Privacy-policy).
## Disclaimer
This is an unofficial application. The AdGuard Home team and the development of the AdGuard Home software is not related in any way with this application.
+## Recommended configuration and lists
+On [this repository](https://github.com/juanico10/Pihole_list) you can find a recommended configuration for AdGuard Home and some lists. Thanks to [juanico10](https://github.com/juanico10).
+
+## Donations
+If you like the project and you want to contribute with the development, you can [become a sponsor on GitHub](https://github.com/sponsors/JGeek00), or you can donate using PayPal.
+
+
+
+## Generate production build
+
+ -
+ Prerequisites
+
+ - Open
pubspec.yaml
and change the version name and the version number.
+ - Run
flutter clean
.
+ - Run
flutter pub get
.
+
+
+ -
+ Android
+
+ - Make sure you have your
key.properties
file at android/
, with all the required values of your signing key correctly set up.
+ - Make sure you have your keystore file at
android/app
.
+ - Run
flutter build apk --release
to compile the APK.
+ - The .apk package is located at
build/app/outputs/flutter-apk/app-release.apk
.
+
+
+ -
+ macOS
+
+ - Run
flutter build macos --release
to compile the production build.
+ - The .app package is located at
build/macos/Build/Products/Release/AdGuard Home Manager.app
.
+
+
+ -
+ Linux
+
+ Prerequisites
+
+ - Install rps by running
dart pub global activate rps --version 0.7.0-dev.6
+
+ Build
+
+ - Open
debian.yaml
file inside debian/ and update the version number
+ - run
rps build linux
+ - The .tar.gz is at
build/linux/x64/release/bundle
+ - The .deb package is at
build/linux/x64/release/debian/
+
+
+
+ -
+ Windows
+
+ - Run
flutter build windows --release
.
+ - Open Inno Setup Compiler application and load the script
+ - The script is located at
windows/innosetup_installer_builder.iss
+ - Update the version number and save the changes
+ - Click on the Compile button
+ - The installer will be generated at
build/windows/aghm_installer.exe
.
+
+
+
+
## Third party libraries
- [provider](https://pub.dev/packages/provider)
- [sqflite](https://pub.dev/packages/sqflite)
@@ -24,7 +113,6 @@ This is an unofficial application. The AdGuard Home team and the development of
- [expandable](https://pub.dev/packages/expandable)
- [package info plus](https://pub.dev/packages/package_info_plus)
- [flutter phoenix](https://pub.dev/packages/flutter_phoenix)
-- [flutter displaymode](https://pub.dev/packages/flutter_displaymode)
- [flutter launcher icons](https://pub.dev/packages/flutter_launcher_icons)
- [flutter native splash](https://pub.dev/packages/flutter_native_splash)
- [intl](https://pub.dev/packages/intl)
@@ -32,10 +120,28 @@ This is an unofficial application. The AdGuard Home team and the development of
- [dynamic color](https://pub.dev/packages/dynamic_color)
- [device info](https://pub.dev/packages/device_info)
- [fl chart](https://pub.dev/packages/fl_chart)
-- [flutter web browser](https://pub.dev/packages/flutter_web_browser)
- [flutter svg](https://pub.dev/packages/flutter_svg)
-- [bottom sheet](https://pub.dev/packages/bottom_sheet)
+- [percent indicator](https://pub.dev/packages/percent_indicator)
+- [flutter markdown](https://pub.dev/packages/flutter_markdown)
+- [markdown](https://pub.dev/packages/markdown)
+- [html](https://pub.dev/packages/html)
+- [flutter html](https://pub.dev/packages/flutter_html)
+- [sqlite3 flutter libs](https://pub.dev/packages/sqlite3_flutter_libs)
+- [sqflite common ffi](https://pub.dev/packages/sqflite_common_ffi)
+- [window size](https://github.com/google/flutter-desktop-embedding)
+- [flutter split view](https://github.com/JGeek00/flutter_split_view) (forked from [here](https://pub.dev/packages/flutter_split_view))
+- [async](https://pub.dev/packages/async)
+- [sentry flutter](https://pub.dev/packages/sentry_flutter)
+- [flutter dotenv](https://pub.dev/packages/flutter_dotenv)
+- [flutter reorderable list](https://pub.dev/packages/flutter_reorderable_list)
+- [pie chart](https://pub.dev/packages/pie_chart)
+- [segmented button slide](https://pub.dev/packages/segmented_button_slide)
+- [timezone](https://pub.dev/packages/timezone)
+- [url launcher](https://pub.dev/packages/url_launcher)
+- [flutter custom tabs](https://pub.dev/packages/flutter_custom_tabs)
+- [shared preferences](https://pub.dev/packages/shared_preferences)
+- [window manager](https://pub.dev/packages/window_manager)
-##### Created by JGeek00
\ No newline at end of file
+##### Created by JGeek00
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 814311b..ab6291c 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -1,3 +1,9 @@
+plugins {
+ id "com.android.application"
+ id "kotlin-android"
+ id "dev.flutter.flutter-gradle-plugin"
+}
+
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
@@ -6,11 +12,6 @@ if (localPropertiesFile.exists()) {
}
}
-def flutterRoot = localProperties.getProperty('flutter.sdk')
-if (flutterRoot == null) {
- throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
-}
-
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
@@ -21,13 +22,16 @@ if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
+def keystoreProperties = new Properties()
+def keystorePropertiesFile = rootProject.file('key.properties')
+if (keystorePropertiesFile.exists()) {
+ keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
+}
android {
- compileSdkVersion flutter.compileSdkVersion
- ndkVersion flutter.ndkVersion
+ namespace "com.jgeek00.adguard_home_manager"
+ compileSdkVersion 35
+ ndkVersion "26.1.10909125"
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
@@ -43,21 +47,25 @@ android {
}
defaultConfig {
- // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.jgeek00.adguard_home_manager"
- // You can update the following values to match your application needs.
- // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
minSdkVersion 26
- targetSdkVersion 33
+ targetSdkVersion 35
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
+ signingConfigs {
+ release {
+ keyAlias keystoreProperties['keyAlias']
+ keyPassword keystoreProperties['keyPassword']
+ storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
+ storePassword keystoreProperties['storePassword']
+ }
+ }
+
buildTypes {
release {
- // TODO: Add your own signing config for the release build.
- // Signing with the debug keys for now, so `flutter run --release` works.
- signingConfig signingConfigs.debug
+ signingConfig signingConfigs.release
}
}
}
@@ -67,5 +75,5 @@ flutter {
}
dependencies {
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20"
}
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index aada37e..603fecc 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,10 +1,22 @@
-
+
+
+
+
+
+
+ android:requestLegacyExternalStorage="true"
+ android:icon="@mipmap/ic_launcher"
+ android:enableOnBackInvokedCallback="true">
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..036d09b
--- /dev/null
+++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index f6f931d..0000000
Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..ee4fa4d
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000..4d52a73
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..29cc5f7
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..ee4fa4d
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 6730672..0000000
Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000..2ae3642
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000..8a39f50
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..16ace9d
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..2ae3642
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index fe7f25b..0000000
Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000..1c206bb
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000..e490246
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..757f194
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..1c206bb
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 75b70bb..0000000
Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..aefe0b6
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000..3599460
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..a642b78
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..aefe0b6
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index d8c30a3..0000000
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..68173f9
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp
new file mode 100644
index 0000000..7d57305
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..2a04fcd
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..68173f9
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml
deleted file mode 100644
index ab98328..0000000
--- a/android/app/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
- #ffffff
-
\ No newline at end of file
diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml
new file mode 100644
index 0000000..c5d5899
--- /dev/null
+++ b/android/app/src/main/res/values/ic_launcher_background.xml
@@ -0,0 +1,4 @@
+
+
+ #FFFFFF
+
\ No newline at end of file
diff --git a/android/build.gradle b/android/build.gradle
index 61a47e7..bc157bd 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,16 +1,3 @@
-buildscript {
- ext.kotlin_version = '1.6.10'
- repositories {
- google()
- mavenCentral()
- }
-
- dependencies {
- classpath 'com.android.tools.build:gradle:7.2.2'
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
- }
-}
-
allprojects {
repositories {
google()
@@ -26,6 +13,6 @@ subprojects {
project.evaluationDependsOn(':app')
}
-task clean(type: Delete) {
+tasks.register("clean", Delete) {
delete rootProject.buildDir
}
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index cb24abd..19cfad9 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
diff --git a/android/key.properties.sample b/android/key.properties.sample
new file mode 100644
index 0000000..b51dc2c
--- /dev/null
+++ b/android/key.properties.sample
@@ -0,0 +1,4 @@
+storePassword= # keystore password #
+keyPassword= # keystore key password #
+keyAlias= # key alias #
+storeFile= # ./keystore-file-name.jks #
\ No newline at end of file
diff --git a/android/settings.gradle b/android/settings.gradle
index 44e62bc..e8481f5 100644
--- a/android/settings.gradle
+++ b/android/settings.gradle
@@ -1,11 +1,26 @@
-include ':app'
+pluginManagement {
+ def flutterSdkPath = {
+ def properties = new Properties()
+ file("local.properties").withInputStream { properties.load(it) }
+ def flutterSdkPath = properties.getProperty("flutter.sdk")
+ assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+ return flutterSdkPath
+ }
+ settings.ext.flutterSdkPath = flutterSdkPath()
-def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
-def properties = new Properties()
+ includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle")
-assert localPropertiesFile.exists()
-localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
+ repositories {
+ google()
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
-def flutterSdkPath = properties.getProperty("flutter.sdk")
-assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
-apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
+plugins {
+ id "dev.flutter.flutter-plugin-loader" version "1.0.0"
+ id "com.android.application" version '8.6.0' apply false
+ id "org.jetbrains.kotlin.android" version "1.8.20" apply false
+}
+
+include ":app"
diff --git a/assets/icon/icon-circle-256.png b/assets/icon/icon-circle-256.png
new file mode 100644
index 0000000..517e26a
Binary files /dev/null and b/assets/icon/icon-circle-256.png differ
diff --git a/assets/icon/icon-circle.ico b/assets/icon/icon-circle.ico
new file mode 100644
index 0000000..e4da1bd
Binary files /dev/null and b/assets/icon/icon-circle.ico differ
diff --git a/assets/icon/icon-circle.png b/assets/icon/icon-circle.png
new file mode 100644
index 0000000..5b39396
Binary files /dev/null and b/assets/icon/icon-circle.png differ
diff --git a/assets/icon/icon-macos.png b/assets/icon/icon-macos.png
new file mode 100755
index 0000000..c201d70
Binary files /dev/null and b/assets/icon/icon-macos.png differ
diff --git a/assets/other/banner.png b/assets/other/banner.png
new file mode 100755
index 0000000..9c5edc4
Binary files /dev/null and b/assets/other/banner.png differ
diff --git a/assets/other/get-github.png b/assets/other/get-github.png
new file mode 100644
index 0000000..f869aa5
Binary files /dev/null and b/assets/other/get-github.png differ
diff --git a/assets/screenshots/linux/clients.png b/assets/screenshots/linux/clients.png
new file mode 100644
index 0000000..5804d46
Binary files /dev/null and b/assets/screenshots/linux/clients.png differ
diff --git a/assets/screenshots/linux/home.png b/assets/screenshots/linux/home.png
new file mode 100644
index 0000000..6666046
Binary files /dev/null and b/assets/screenshots/linux/home.png differ
diff --git a/assets/screenshots/linux/logs.png b/assets/screenshots/linux/logs.png
new file mode 100644
index 0000000..2cf184f
Binary files /dev/null and b/assets/screenshots/linux/logs.png differ
diff --git a/debian/compile_deb.txt b/debian/compile_deb.txt
new file mode 100644
index 0000000..4a18706
--- /dev/null
+++ b/debian/compile_deb.txt
@@ -0,0 +1 @@
+https://pub.dev/packages/flutter_to_debian
\ No newline at end of file
diff --git a/debian/debian.yaml b/debian/debian.yaml
new file mode 100644
index 0000000..43a90f9
--- /dev/null
+++ b/debian/debian.yaml
@@ -0,0 +1,14 @@
+flutter_app:
+ command: AdGuardHomeManager
+ arch: x64
+ parent: /usr/local/lib
+
+control:
+ Package: AdGuardHomeManager
+ Version: 2.20.1
+ Architecture: amd64
+ Essential: no
+ Priority: optional
+ Depends:
+ Maintainer: JGeek00
+ Description: AdGuard Home control app
\ No newline at end of file
diff --git a/debian/gui/adguard-home-manager.desktop b/debian/gui/adguard-home-manager.desktop
new file mode 100644
index 0000000..a011591
--- /dev/null
+++ b/debian/gui/adguard-home-manager.desktop
@@ -0,0 +1,8 @@
+[Desktop Entry]
+Name=AdGuard Home Manager
+Comment=Manage your AdGuard Home server
+Exec=adguard-home-manager
+Icon=${SNAP}/meta/gui/adguard-home-manager.png
+Terminal=false
+Type=Application
+Categories=Utilities;
diff --git a/debian/gui/adguard-home-manager.png b/debian/gui/adguard-home-manager.png
new file mode 100644
index 0000000..5b39396
Binary files /dev/null and b/debian/gui/adguard-home-manager.png differ
diff --git a/devtools_options.yaml b/devtools_options.yaml
new file mode 100644
index 0000000..7e7e7f6
--- /dev/null
+++ b/devtools_options.yaml
@@ -0,0 +1 @@
+extensions:
diff --git a/ios/.gitignore b/ios/.gitignore
old mode 100644
new mode 100755
diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist
old mode 100644
new mode 100755
index 9625e10..7c56964
--- a/ios/Flutter/AppFrameworkInfo.plist
+++ b/ios/Flutter/AppFrameworkInfo.plist
@@ -21,6 +21,6 @@
CFBundleVersion
1.0
MinimumOSVersion
- 11.0
+ 12.0
diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig
old mode 100644
new mode 100755
diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig
old mode 100644
new mode 100755
diff --git a/ios/Podfile b/ios/Podfile
old mode 100644
new mode 100755
index 88359b2..279576f
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
-# platform :ios, '11.0'
+# platform :ios, '12.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
new file mode 100644
index 0000000..2c2d827
--- /dev/null
+++ b/ios/Podfile.lock
@@ -0,0 +1,92 @@
+PODS:
+ - device_info_plus (0.0.1):
+ - Flutter
+ - Flutter (1.0.0)
+ - flutter_custom_tabs_ios (2.0.0):
+ - Flutter
+ - flutter_native_splash (0.0.1):
+ - Flutter
+ - package_info_plus (0.4.5):
+ - Flutter
+ - Sentry/HybridSDK (8.18.0):
+ - SentryPrivate (= 8.18.0)
+ - sentry_flutter (0.0.1):
+ - Flutter
+ - FlutterMacOS
+ - Sentry/HybridSDK (= 8.18.0)
+ - SentryPrivate (8.18.0)
+ - sqflite (0.0.3):
+ - Flutter
+ - FlutterMacOS
+ - sqlite3 (3.45.0):
+ - sqlite3/common (= 3.45.0)
+ - sqlite3/common (3.45.0)
+ - sqlite3/fts5 (3.45.0):
+ - sqlite3/common
+ - sqlite3/perf-threadsafe (3.45.0):
+ - sqlite3/common
+ - sqlite3/rtree (3.45.0):
+ - sqlite3/common
+ - sqlite3_flutter_libs (0.0.1):
+ - Flutter
+ - sqlite3 (~> 3.45.0)
+ - sqlite3/fts5
+ - sqlite3/perf-threadsafe
+ - sqlite3/rtree
+ - store_checker (0.0.1):
+ - Flutter
+
+DEPENDENCIES:
+ - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
+ - Flutter (from `Flutter`)
+ - flutter_custom_tabs_ios (from `.symlinks/plugins/flutter_custom_tabs_ios/ios`)
+ - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
+ - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
+ - sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`)
+ - sqflite (from `.symlinks/plugins/sqflite/darwin`)
+ - sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/ios`)
+ - store_checker (from `.symlinks/plugins/store_checker/ios`)
+
+SPEC REPOS:
+ trunk:
+ - Sentry
+ - SentryPrivate
+ - sqlite3
+
+EXTERNAL SOURCES:
+ device_info_plus:
+ :path: ".symlinks/plugins/device_info_plus/ios"
+ Flutter:
+ :path: Flutter
+ flutter_custom_tabs_ios:
+ :path: ".symlinks/plugins/flutter_custom_tabs_ios/ios"
+ flutter_native_splash:
+ :path: ".symlinks/plugins/flutter_native_splash/ios"
+ package_info_plus:
+ :path: ".symlinks/plugins/package_info_plus/ios"
+ sentry_flutter:
+ :path: ".symlinks/plugins/sentry_flutter/ios"
+ sqflite:
+ :path: ".symlinks/plugins/sqflite/darwin"
+ sqlite3_flutter_libs:
+ :path: ".symlinks/plugins/sqlite3_flutter_libs/ios"
+ store_checker:
+ :path: ".symlinks/plugins/store_checker/ios"
+
+SPEC CHECKSUMS:
+ device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6
+ Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
+ flutter_custom_tabs_ios: 62439c843b2691aae516fd50119a01eb9755fff7
+ flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef
+ package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85
+ Sentry: 8984a4ffb2b9bd2894d74fb36e6f5833865bc18e
+ sentry_flutter: c87a0556eeb6cbf7f9f924d30e878bdedf22d364
+ SentryPrivate: 2f0c9ba4c3fc993f70eab6ca95673509561e0085
+ sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
+ sqlite3: f307b6291c4db7b5086c38d6237446b98a738581
+ sqlite3_flutter_libs: aeb4d37509853dfa79d9b59386a2dac5dd079428
+ store_checker: 359c5051d9ec30ff0a8fa39eb5ec9df021bb745d
+
+PODFILE CHECKSUM: c4c93c5f6502fe2754f48404d3594bf779584011
+
+COCOAPODS: 1.14.3
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
old mode 100644
new mode 100755
index 60ccebe..00edeae
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -3,11 +3,12 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 50;
+ objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 383559CCEF7EC401FF4E76BB /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB935C9D6165ABF70257230F /* Pods_Runner.framework */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
@@ -32,6 +33,9 @@
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 4110AD4C2369445918E538C2 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ 65533F0C0783FDE34AE79B0A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ 69C2CC4A6DE17506FC5C0F13 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
@@ -42,6 +46,7 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ AB935C9D6165ABF70257230F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -49,12 +54,31 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 383559CCEF7EC401FF4E76BB /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
+ 2993EAAAD304F21A540122F4 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 4110AD4C2369445918E538C2 /* Pods-Runner.debug.xcconfig */,
+ 65533F0C0783FDE34AE79B0A /* Pods-Runner.release.xcconfig */,
+ 69C2CC4A6DE17506FC5C0F13 /* Pods-Runner.profile.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
+ 9370585195DE454A70C14564 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ AB935C9D6165ABF70257230F /* Pods_Runner.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
@@ -72,6 +96,8 @@
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
+ 2993EAAAD304F21A540122F4 /* Pods */,
+ 9370585195DE454A70C14564 /* Frameworks */,
);
sourceTree = "";
};
@@ -105,12 +131,14 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
+ AC88B08B893FD4203BC6B5D3 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ 36B299129976598C9F01259D /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@@ -127,7 +155,8 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
- LastUpgradeCheck = 1300;
+ BuildIndependentTargetsInParallel = YES;
+ LastUpgradeCheck = 1430;
ORGANIZATIONNAME = "";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
@@ -169,12 +198,31 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
- 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ 36B299129976598C9F01259D /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
inputPaths = (
+ "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
@@ -185,6 +233,7 @@
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
@@ -197,6 +246,28 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
+ AC88B08B893FD4203BC6B5D3 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -254,6 +325,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -264,6 +336,7 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -272,7 +345,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -290,15 +363,22 @@
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 38Z3B9TJTR;
ENABLE_BITCODE = NO;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = "AdGuard Home";
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.example.adguardHomeManager;
+ PRODUCT_BUNDLE_IDENTIFIER = com.jgeek00.adguardHomeManager;
PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
@@ -326,6 +406,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -336,6 +417,7 @@
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
@@ -350,7 +432,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -381,6 +463,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -391,6 +474,7 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -399,7 +483,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -419,16 +503,23 @@
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 38Z3B9TJTR;
ENABLE_BITCODE = NO;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = "AdGuard Home";
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.example.adguardHomeManager;
+ PRODUCT_BUNDLE_IDENTIFIER = com.jgeek00.adguardHomeManager;
PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
@@ -442,15 +533,22 @@
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 38Z3B9TJTR;
ENABLE_BITCODE = NO;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
INFOPLIST_FILE = Runner/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = "AdGuard Home";
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.example.adguardHomeManager;
+ PRODUCT_BUNDLE_IDENTIFIER = com.jgeek00.adguardHomeManager;
PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
@@ -481,4 +579,4 @@
/* End XCConfigurationList section */
};
rootObject = 97C146E61CF9000F007C117D /* Project object */;
-}
\ No newline at end of file
+}
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
old mode 100644
new mode 100755
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
old mode 100644
new mode 100755
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
old mode 100644
new mode 100755
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
old mode 100644
new mode 100755
index c87d15a..a6b826d
--- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -1,6 +1,6 @@
+
+
diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
old mode 100644
new mode 100755
diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
old mode 100644
new mode 100755
diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@2x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@3x.png
old mode 100644
new mode 100755
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
old mode 100644
new mode 100755
diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard
old mode 100644
new mode 100755
diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard
old mode 100644
new mode 100755
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
old mode 100644
new mode 100755
index f9aeb27..55fe6b7
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -1,53 +1,53 @@
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleDisplayName
- AdGuard Home Manager
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- adguard_home_manager
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- $(FLUTTER_BUILD_NAME)
- CFBundleSignature
- ????
- CFBundleVersion
- $(FLUTTER_BUILD_NUMBER)
- LSRequiresIPhoneOS
-
- UILaunchStoryboardName
- LaunchScreen
- UIMainStoryboardFile
- Main
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UISupportedInterfaceOrientations~ipad
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UIViewControllerBasedStatusBarAppearance
-
- CADisableMinimumFrameDurationOnPhone
-
- UIApplicationSupportsIndirectInputEvents
-
- UIStatusBarHidden
-
-
+
+ CADisableMinimumFrameDurationOnPhone
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ AdGuard Home
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ adguardHomeManager
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ UIApplicationSupportsIndirectInputEvents
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UIStatusBarHidden
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+
diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h
old mode 100644
new mode 100755
diff --git a/l10n.yaml b/l10n.yaml
index 4e6692e..764d005 100644
--- a/l10n.yaml
+++ b/l10n.yaml
@@ -1,3 +1,4 @@
arb-dir: lib/l10n
template-arb-file: app_en.arb
-output-localization-file: app_localizations.dart
\ No newline at end of file
+output-localization-file: app_localizations.dart
+untranslated-messages-file: untranslated.json
\ No newline at end of file
diff --git a/lib/base.dart b/lib/base.dart
deleted file mode 100644
index ed649a0..0000000
--- a/lib/base.dart
+++ /dev/null
@@ -1,62 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:animations/animations.dart';
-import 'package:provider/provider.dart';
-import 'package:flutter/services.dart';
-
-import 'package:adguard_home_manager/widgets/bottom_nav_bar.dart';
-
-import 'package:adguard_home_manager/providers/app_config_provider.dart';
-import 'package:adguard_home_manager/models/app_screen.dart';
-import 'package:adguard_home_manager/config/app_screens.dart';
-import 'package:adguard_home_manager/providers/servers_provider.dart';
-
-class Base extends StatefulWidget {
- const Base({Key? key}) : super(key: key);
-
- @override
- State createState() => _BaseState();
-}
-
-class _BaseState extends State {
- int selectedScreen = 0;
-
- @override
- Widget build(BuildContext context) {
- final serversProvider = Provider.of(context);
- final appConfigProvider = Provider.of(context);
-
- List screens = serversProvider.selectedServer != null
- ? screensServerConnected
- : screensSelectServer;
-
- return AnnotatedRegion(
- value: SystemUiOverlayStyle(
- statusBarColor: Colors.transparent,
- statusBarBrightness: Theme.of(context).brightness == Brightness.light
- ? Brightness.light
- : Brightness.dark,
- statusBarIconBrightness: Theme.of(context).brightness == Brightness.light
- ? Brightness.dark
- : Brightness.light,
- systemNavigationBarColor: Theme.of(context).scaffoldBackgroundColor,
- systemNavigationBarIconBrightness: Theme.of(context).brightness == Brightness.light
- ? Brightness.dark
- : Brightness.light,
- ),
- child: Scaffold(
- body: PageTransitionSwitcher(
- duration: const Duration(milliseconds: 200),
- transitionBuilder: (
- (child, primaryAnimation, secondaryAnimation) => FadeThroughTransition(
- animation: primaryAnimation,
- secondaryAnimation: secondaryAnimation,
- child: child,
- )
- ),
- child: screens[appConfigProvider.selectedScreen].body,
- ),
- bottomNavigationBar: const BottomNavBar(),
- )
- );
- }
-}
\ No newline at end of file
diff --git a/lib/classes/http_client.dart b/lib/classes/http_client.dart
new file mode 100644
index 0000000..d64e1d1
--- /dev/null
+++ b/lib/classes/http_client.dart
@@ -0,0 +1,216 @@
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:adguard_home_manager/models/server.dart';
+
+enum ExceptionType { socket, timeout, handshake, http, unknown }
+
+class HttpResponse {
+ final bool successful;
+ final String? body;
+ final int? statusCode;
+ final ExceptionType? exception;
+
+ const HttpResponse({
+ required this.successful,
+ required this.body,
+ required this.statusCode,
+ this.exception,
+ });
+}
+
+String getConnectionString({
+ required Server server,
+ required String urlPath,
+}) {
+ return "${server.connectionMethod}://${server.domain}${server.port != null ? ':${server.port}' : ""}${server.path ?? ""}/control$urlPath";
+}
+
+class HttpRequestClient {
+ static Future get({
+ required String urlPath,
+ required Server server,
+ int timeout = 10,
+ }) async{
+ final String connectionString = getConnectionString(server: server, urlPath: urlPath);
+ try {
+ HttpClient httpClient = HttpClient();
+ HttpClientRequest request = await httpClient.getUrl(Uri.parse(connectionString));
+ if (server.authToken != null) {
+ request.headers.set('Authorization', 'Basic ${server.authToken}');
+ }
+ HttpClientResponse response = await request.close().timeout(
+ Duration(seconds: timeout)
+ );
+ String reply = await response.transform(utf8.decoder).join();
+ httpClient.close();
+ return HttpResponse(
+ successful: response.statusCode >= 400 ? false : true,
+ body: reply,
+ statusCode: response.statusCode
+ );
+ } on SocketException {
+ return const HttpResponse(
+ successful: false,
+ body: null,
+ statusCode: null,
+ exception: ExceptionType.socket
+ );
+ } on TimeoutException {
+ return const HttpResponse(
+ successful: false,
+ body: null,
+ statusCode: null,
+ exception: ExceptionType.timeout
+ );
+ } on HandshakeException {
+ return const HttpResponse(
+ successful: false,
+ body: null,
+ statusCode: null,
+ exception: ExceptionType.handshake
+ );
+ } on HttpException {
+ return const HttpResponse(
+ successful: false,
+ body: null,
+ statusCode: null,
+ exception: ExceptionType.http
+ );
+ } catch (e) {
+ return const HttpResponse(
+ successful: false,
+ body: null,
+ statusCode: null,
+ exception: ExceptionType.unknown
+ );
+ }
+ }
+
+ static Future post({
+ required String urlPath,
+ required Server server,
+ dynamic body,
+ int timeout = 10,
+ }) async{
+ final String connectionString = getConnectionString(server: server, urlPath: urlPath);
+ try {
+ HttpClient httpClient = HttpClient();
+ HttpClientRequest request = await httpClient.postUrl(Uri.parse(connectionString));
+ if (server.authToken != null) {
+ request.headers.set('Authorization', 'Basic ${server.authToken}');
+ }
+ request.headers.set('content-type', 'application/json');
+ request.add(utf8.encode(json.encode(body)));
+ HttpClientResponse response = await request.close().timeout(
+ Duration(seconds: timeout)
+ );
+ String reply = await response.transform(utf8.decoder).join();
+ httpClient.close();
+ return HttpResponse(
+ successful: response.statusCode >= 400 ? false : true,
+ body: reply,
+ statusCode: response.statusCode
+ );
+ } on SocketException {
+ return const HttpResponse(
+ successful: false,
+ body: null,
+ statusCode: null,
+ exception: ExceptionType.socket
+ );
+ } on TimeoutException {
+ return const HttpResponse(
+ successful: false,
+ body: null,
+ statusCode: null,
+ exception: ExceptionType.timeout
+ );
+ } on HttpException {
+ return const HttpResponse(
+ successful: false,
+ body: null,
+ statusCode: null,
+ exception: ExceptionType.http
+ );
+ } on HandshakeException {
+ return const HttpResponse(
+ successful: false,
+ body: null,
+ statusCode: null,
+ exception: ExceptionType.handshake
+ );
+ } catch (e) {
+ return const HttpResponse(
+ successful: false,
+ body: null,
+ statusCode: null,
+ exception: ExceptionType.unknown
+ );
+ }
+ }
+
+ static Future put({
+ required String urlPath,
+ required Server server,
+ dynamic body,
+ int timeout = 10,
+ }) async{
+ final String connectionString = getConnectionString(server: server, urlPath: urlPath);
+ try {
+ HttpClient httpClient = HttpClient();
+ HttpClientRequest request = await httpClient.putUrl(Uri.parse(connectionString));
+ if (server.authToken != null) {
+ request.headers.set('Authorization', 'Basic ${server.authToken}');
+ }
+ request.headers.set('content-type', 'application/json');
+ request.add(utf8.encode(json.encode(body)));
+ HttpClientResponse response = await request.close().timeout(
+ Duration(seconds: timeout)
+ );
+ String reply = await response.transform(utf8.decoder).join();
+ httpClient.close();
+ return HttpResponse(
+ successful: response.statusCode >= 400 ? false : true,
+ body: reply,
+ statusCode: response.statusCode
+ );
+ } on SocketException {
+ return const HttpResponse(
+ successful: false,
+ body: null,
+ statusCode: null,
+ exception: ExceptionType.socket
+ );
+ } on TimeoutException {
+ return const HttpResponse(
+ successful: false,
+ body: null,
+ statusCode: null,
+ exception: ExceptionType.timeout
+ );
+ } on HttpException {
+ return const HttpResponse(
+ successful: false,
+ body: null,
+ statusCode: null,
+ exception: ExceptionType.http
+ );
+ } on HandshakeException {
+ return const HttpResponse(
+ successful: false,
+ body: null,
+ statusCode: null,
+ exception: ExceptionType.handshake
+ );
+ } catch (e) {
+ return const HttpResponse(
+ successful: false,
+ body: null,
+ statusCode: null,
+ exception: ExceptionType.unknown
+ );
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/classes/process_modal.dart b/lib/classes/process_modal.dart
index 6febebb..ac3db92 100644
--- a/lib/classes/process_modal.dart
+++ b/lib/classes/process_modal.dart
@@ -1,20 +1,14 @@
+import 'package:adguard_home_manager/config/globals.dart';
import 'package:flutter/material.dart';
import 'package:adguard_home_manager/widgets/process_dialog.dart';
class ProcessModal {
- late BuildContext context;
-
- ProcessModal({
- required this.context
- });
-
void open(String message) async {
await Future.delayed(const Duration(seconds: 0), () => {
showDialog(
- context: context,
- builder: (c) {
- context = c;
+ context: globalNavigatorKey.currentContext!,
+ builder: (ctx) {
return ProcessDialog(
message: message,
);
@@ -26,6 +20,6 @@ class ProcessModal {
}
void close() {
- Navigator.pop(context);
+ Navigator.pop(globalNavigatorKey.currentContext!);
}
}
\ No newline at end of file
diff --git a/lib/config/app_screens.dart b/lib/config/app_screens.dart
index 1835dc4..2326e31 100644
--- a/lib/config/app_screens.dart
+++ b/lib/config/app_screens.dart
@@ -1,10 +1,10 @@
import 'package:flutter/material.dart';
-import 'package:adguard_home_manager/screens/filters/filters.dart';
-import 'package:adguard_home_manager/screens/logs/logs.dart';
-import 'package:adguard_home_manager/screens/connect/connect.dart';
-import 'package:adguard_home_manager/screens/home/home.dart';
import 'package:adguard_home_manager/screens/clients/clients.dart';
+import 'package:adguard_home_manager/screens/connect/connect.dart';
+import 'package:adguard_home_manager/screens/filters/filters.dart';
+import 'package:adguard_home_manager/screens/home/home.dart';
+import 'package:adguard_home_manager/screens/logs/logs.dart';
import 'package:adguard_home_manager/screens/settings/settings.dart';
import 'package:adguard_home_manager/models/app_screen.dart';
@@ -13,12 +13,12 @@ List screensSelectServer = [
const AppScreen(
name: "connect",
icon: Icons.link_rounded,
- body: Connect(),
+ child: Connect()
),
const AppScreen(
name: "settings",
icon: Icons.settings_rounded,
- body: Settings()
+ child: Settings()
)
];
@@ -26,26 +26,26 @@ List screensServerConnected = [
const AppScreen(
name: "home",
icon: Icons.home_rounded,
- body: Home(),
+ child: Home()
),
const AppScreen(
name: "clients",
icon: Icons.devices,
- body: Clients()
+ child: Clients()
),
const AppScreen(
name: "logs",
icon: Icons.list_alt_rounded,
- body: Logs(),
+ child: Logs()
),
const AppScreen(
name: "filters",
icon: Icons.shield_rounded,
- body: Filters(),
+ child: Filters()
),
const AppScreen(
name: "settings",
icon: Icons.settings_rounded,
- body: Settings()
+ child: Settings()
)
];
\ No newline at end of file
diff --git a/lib/config/globals.dart b/lib/config/globals.dart
new file mode 100644
index 0000000..a955a77
--- /dev/null
+++ b/lib/config/globals.dart
@@ -0,0 +1,4 @@
+import 'package:flutter/material.dart';
+
+final GlobalKey scaffoldMessengerKey = GlobalKey();
+final GlobalKey globalNavigatorKey = GlobalKey();
\ No newline at end of file
diff --git a/lib/config/home_top_items_default_order.dart b/lib/config/home_top_items_default_order.dart
new file mode 100644
index 0000000..a5a23f0
--- /dev/null
+++ b/lib/config/home_top_items_default_order.dart
@@ -0,0 +1,15 @@
+import 'dart:convert';
+
+import 'package:adguard_home_manager/constants/enums.dart';
+
+final List homeTopItemsDefaultOrder = [
+ HomeTopItems.queriedDomains,
+ HomeTopItems.blockedDomains,
+ HomeTopItems.recurrentClients,
+ HomeTopItems.topUpstreams,
+ HomeTopItems.avgUpstreamResponseTime
+];
+
+final String homeTopItemsDefaultOrderString = jsonEncode(
+ List.from(homeTopItemsDefaultOrder.map((e) => e.name))
+);
\ No newline at end of file
diff --git a/lib/config/minimum_server_version.dart b/lib/config/minimum_server_version.dart
new file mode 100644
index 0000000..f554cb9
--- /dev/null
+++ b/lib/config/minimum_server_version.dart
@@ -0,0 +1,4 @@
+class MinimumServerVersion {
+ static const String stable = "v0.107.28";
+ static const String beta = "v0.108.0-b.33";
+}
\ No newline at end of file
diff --git a/lib/config/sizes.dart b/lib/config/sizes.dart
new file mode 100644
index 0000000..0fc2640
--- /dev/null
+++ b/lib/config/sizes.dart
@@ -0,0 +1 @@
+const double desktopBreakpoint = 1000;
\ No newline at end of file
diff --git a/lib/config/theme.dart b/lib/config/theme.dart
index 9c0e8cc..eba0b9c 100644
--- a/lib/config/theme.dart
+++ b/lib/config/theme.dart
@@ -1,25 +1,8 @@
import 'package:flutter/material.dart';
-Map swatch = {
- 50: const Color.fromRGBO(25, 180, 119, .1),
- 100: const Color.fromRGBO(25, 180, 119, .2),
- 200: const Color.fromRGBO(25, 180, 119, .3),
- 300: const Color.fromRGBO(25, 180, 119, .4),
- 400: const Color.fromRGBO(25, 180, 119, .5),
- 500: const Color.fromRGBO(25, 180, 119, .6),
- 600: const Color.fromRGBO(25, 180, 119, .7),
- 700: const Color.fromRGBO(25, 180, 119, .8),
- 800: const Color.fromRGBO(25, 180, 119, .9),
- 900: const Color.fromRGBO(25, 180, 119, 1),
-};
-
-MaterialColor primaryColor = MaterialColor(0xff19b477, swatch);
-
ThemeData lightTheme(ColorScheme? dynamicColorScheme) => ThemeData(
useMaterial3: true,
- colorScheme: dynamicColorScheme ?? ColorScheme.fromSwatch(primarySwatch: primaryColor),
- primaryColor: dynamicColorScheme != null ? dynamicColorScheme.primary : primaryColor,
- scaffoldBackgroundColor: dynamicColorScheme != null ? dynamicColorScheme.background : Colors.white,
+ colorScheme: dynamicColorScheme,
snackBarTheme: SnackBarThemeData(
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
@@ -27,141 +10,34 @@ ThemeData lightTheme(ColorScheme? dynamicColorScheme) => ThemeData(
),
elevation: 4,
),
- brightness: Brightness.light,
- dialogBackgroundColor: dynamicColorScheme != null ? dynamicColorScheme.surface : Colors.white,
- textTheme: const TextTheme(
- bodyText1: TextStyle(
- color: Colors.black54
- ),
- bodyText2: TextStyle(
- color: Colors.black
- ),
- ),
- floatingActionButtonTheme: FloatingActionButtonThemeData(
- foregroundColor: Colors.white,
- backgroundColor: dynamicColorScheme != null ? dynamicColorScheme.primary : primaryColor
- ),
- textButtonTheme: TextButtonThemeData(
- style: ButtonStyle(
- foregroundColor: MaterialStateProperty.all(
- dynamicColorScheme != null ? dynamicColorScheme.primary : primaryColor
- ),
- overlayColor: MaterialStateProperty.all(
- dynamicColorScheme != null ? dynamicColorScheme.primary.withOpacity(0.1) : primaryColor.withOpacity(0.1)
- ),
- ),
- ),
- dividerColor: Colors.black12,
- listTileTheme: const ListTileThemeData(
+ brightness: Brightness.light, listTileTheme: ListTileThemeData(
tileColor: Colors.transparent,
- iconColor: Color.fromRGBO(138, 138, 138, 1),
+ textColor: dynamicColorScheme != null ? dynamicColorScheme.onSurfaceVariant : const Color.fromRGBO(117, 117, 117, 1),
+ iconColor: dynamicColorScheme != null ? dynamicColorScheme.onSurfaceVariant : const Color.fromRGBO(117, 117, 117, 1),
),
- checkboxTheme: CheckboxThemeData(
- checkColor: MaterialStateProperty.all(Colors.white),
- fillColor: MaterialStateProperty.all(
- dynamicColorScheme != null ? dynamicColorScheme.primary : primaryColor
- ),
+ cardTheme: CardTheme(
+ surfaceTintColor: dynamicColorScheme?.surfaceTint
),
- tabBarTheme: TabBarTheme(
- unselectedLabelColor: Colors.black,
- labelColor: dynamicColorScheme != null ? dynamicColorScheme.primary : primaryColor,
- indicator: UnderlineTabIndicator(
- borderSide: BorderSide(
- color: dynamicColorScheme != null ? dynamicColorScheme.primary : primaryColor,
- width: 2
- )
- )
+ popupMenuTheme: PopupMenuThemeData(
+ surfaceTintColor: dynamicColorScheme?.surfaceTint
),
- radioTheme: RadioThemeData(
- fillColor: MaterialStateProperty.all(
- dynamicColorScheme != null ? dynamicColorScheme.primary : primaryColor
- ),
+ navigationBarTheme: NavigationBarThemeData(
+ surfaceTintColor: dynamicColorScheme?.surfaceTint
),
- androidOverscrollIndicator: AndroidOverscrollIndicator.stretch,
+ dialogTheme: DialogTheme(
+ surfaceTintColor: dynamicColorScheme?.surfaceTint
+ ),
+ // DISABLE PREDICTIVE BACK GESTURE
+ // pageTransitionsTheme: const PageTransitionsTheme(
+ // builders: {
+ // TargetPlatform.android: PredictiveBackPageTransitionsBuilder()
+ // }
+ // )
);
ThemeData darkTheme(ColorScheme? dynamicColorScheme) => ThemeData(
useMaterial3: true,
- colorScheme: dynamicColorScheme ?? ColorScheme.fromSwatch(primarySwatch: primaryColor).copyWith(
- brightness: Brightness.dark
- ),
- primaryColor: dynamicColorScheme != null ? dynamicColorScheme.primary : primaryColor,
- scaffoldBackgroundColor: dynamicColorScheme != null ? dynamicColorScheme.background :const Color.fromRGBO(18, 18, 18, 1),
- dialogBackgroundColor: dynamicColorScheme != null ? dynamicColorScheme.background : const Color.fromRGBO(44, 44, 44, 1),
- navigationBarTheme: NavigationBarThemeData(
- indicatorColor: dynamicColorScheme != null ? dynamicColorScheme.primary : primaryColor,
- ),
- snackBarTheme: SnackBarThemeData(
- contentTextStyle: const TextStyle(
- color: Colors.white
- ),
- behavior: SnackBarBehavior.floating,
- shape: RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(5)
- ),
- elevation: 4,
- ),
- floatingActionButtonTheme: FloatingActionButtonThemeData(
- foregroundColor: Colors.white,
- backgroundColor: dynamicColorScheme != null ? dynamicColorScheme.primary : primaryColor
- ),
- textButtonTheme: TextButtonThemeData(
- style: ButtonStyle(
- foregroundColor: MaterialStateProperty.all(
- dynamicColorScheme != null ? dynamicColorScheme.primary : primaryColor
- ),
- overlayColor: MaterialStateProperty.all(
- dynamicColorScheme != null ? dynamicColorScheme.primary.withOpacity(0.1) : primaryColor.withOpacity(0.1)
- ),
- ),
- ),
- brightness: Brightness.dark,
- textTheme: const TextTheme(
- bodyText1: TextStyle(
- color: Colors.white70
- ),
- bodyText2: TextStyle(
- color: Colors.white
- ),
- ),
- dividerColor: Colors.white12,
- listTileTheme: const ListTileThemeData(
- tileColor: Colors.transparent,
- iconColor: Color.fromRGBO(187, 187, 187, 1),
- ),
- checkboxTheme: CheckboxThemeData(
- checkColor: MaterialStateProperty.all(Colors.white),
- fillColor: MaterialStateProperty.all(
- dynamicColorScheme != null ? dynamicColorScheme.primary : primaryColor
- ),
- ),
- tabBarTheme: TabBarTheme(
- unselectedLabelColor: Colors.white,
- labelColor: dynamicColorScheme != null ? dynamicColorScheme.primary : primaryColor,
- indicator: UnderlineTabIndicator(
- borderSide: BorderSide(
- color: dynamicColorScheme != null ? dynamicColorScheme.primary : primaryColor,
- width: 2
- )
- )
- ),
- radioTheme: RadioThemeData(
- fillColor: MaterialStateProperty.all(
- dynamicColorScheme != null ? dynamicColorScheme.primary : primaryColor
- ),
- ),
- androidOverscrollIndicator: AndroidOverscrollIndicator.stretch
-);
-
-ThemeData lightThemeOldVersions() => ThemeData(
- useMaterial3: true,
- primaryColor: primaryColor,
- appBarTheme: AppBarTheme(
- color: Colors.white,
- foregroundColor: Colors.black,
- elevation: 0,
- surfaceTintColor: primaryColor
- ),
+ colorScheme: dynamicColorScheme,
snackBarTheme: SnackBarThemeData(
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
@@ -169,103 +45,59 @@ ThemeData lightThemeOldVersions() => ThemeData(
),
elevation: 4,
),
- brightness: Brightness.light,
- scaffoldBackgroundColor: Colors.white,
- dialogBackgroundColor: Colors.white,
- textTheme: const TextTheme(
- bodyText1: TextStyle(
- color: Colors.black54
- ),
- bodyText2: TextStyle(
- color: Colors.black
- ),
- ),
- floatingActionButtonTheme: FloatingActionButtonThemeData(
- foregroundColor: Colors.white,
- backgroundColor: primaryColor
- ),
- textButtonTheme: TextButtonThemeData(
- style: ButtonStyle(
- foregroundColor: MaterialStateProperty.all(primaryColor),
- overlayColor: MaterialStateProperty.all(primaryColor.withOpacity(0.1))
- ),
- ),
- elevatedButtonTheme: ElevatedButtonThemeData(
- style: ButtonStyle(
- foregroundColor: MaterialStateProperty.all(primaryColor),
- surfaceTintColor: MaterialStateProperty.all(primaryColor),
- overlayColor: MaterialStateProperty.all(primaryColor.shade50),
- )
- ),
- navigationBarTheme: NavigationBarThemeData(
- surfaceTintColor: primaryColor,
- indicatorColor: primaryColor
- ),
- inputDecorationTheme: InputDecorationTheme(
- floatingLabelStyle: TextStyle(
- color: primaryColor
- ),
- iconColor: Colors.grey,
- focusedBorder: OutlineInputBorder(
- borderRadius: BorderRadius.circular(10),
- borderSide: BorderSide(
- color: primaryColor,
- width: 2
- )
- )
- ),
- textSelectionTheme: TextSelectionThemeData(
- cursorColor: primaryColor
- ),
- dividerColor: Colors.black12,
- listTileTheme: const ListTileThemeData(
+ brightness: Brightness.dark,
+ listTileTheme: ListTileThemeData(
tileColor: Colors.transparent,
- iconColor: Color.fromRGBO(138, 138, 138, 1),
+ textColor: dynamicColorScheme != null ? dynamicColorScheme.onSurfaceVariant : const Color.fromRGBO(187, 187, 187, 1),
+ iconColor: dynamicColorScheme != null ? dynamicColorScheme.onSurfaceVariant : const Color.fromRGBO(187, 187, 187, 1),
),
- checkboxTheme: CheckboxThemeData(
- checkColor: MaterialStateProperty.all(Colors.white),
- fillColor: MaterialStateProperty.all(primaryColor),
+ cardTheme: CardTheme(
+ surfaceTintColor: dynamicColorScheme?.surfaceTint
),
- tabBarTheme: TabBarTheme(
- unselectedLabelColor: Colors.black,
- labelColor: primaryColor,
- indicator: UnderlineTabIndicator(
- borderSide: BorderSide(
- color: primaryColor,
- width: 2
- )
- )
+ popupMenuTheme: PopupMenuThemeData(
+ surfaceTintColor: dynamicColorScheme?.surfaceTint
),
- progressIndicatorTheme: ProgressIndicatorThemeData(
- color: primaryColor
- ),
- indicatorColor: primaryColor,
- radioTheme: RadioThemeData(
- fillColor: MaterialStateProperty.all(primaryColor),
- ),
- androidOverscrollIndicator: AndroidOverscrollIndicator.stretch,
-);
-
-ThemeData darkThemeOldVersions() => ThemeData(
- useMaterial3: true,
- primaryColor: primaryColor,
- scaffoldBackgroundColor: const Color.fromRGBO(18, 18, 18, 1),
navigationBarTheme: NavigationBarThemeData(
- indicatorColor: primaryColor,
- surfaceTintColor: primaryColor
+ surfaceTintColor: dynamicColorScheme?.surfaceTint
),
dialogTheme: DialogTheme(
+ surfaceTintColor: dynamicColorScheme?.surfaceTint
+ ),
+ // DISABLE PREDICTIVE BACK GESTURE
+ // pageTransitionsTheme: const PageTransitionsTheme(
+ // builders: {
+ // TargetPlatform.android: PredictiveBackPageTransitionsBuilder()
+ // }
+ // )
+);
+
+ThemeData lightThemeOldVersions(MaterialColor primaryColor) => ThemeData(
+ useMaterial3: true,
+ colorSchemeSeed: primaryColor,
+ snackBarTheme: SnackBarThemeData(
+ behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(30)
- )
+ borderRadius: BorderRadius.circular(5)
+ ),
+ elevation: 4,
),
- appBarTheme: AppBarTheme(
- color: const Color.fromRGBO(18, 18, 18, 1),
- foregroundColor: Colors.white,
- elevation: 0,
- surfaceTintColor: primaryColor
+ listTileTheme: const ListTileThemeData(
+ tileColor: Colors.transparent,
+ textColor: Color.fromRGBO(117, 117, 117, 1),
+ iconColor: Color.fromRGBO(117, 117, 117, 1),
),
- dialogBackgroundColor: const Color.fromRGBO(44, 44, 44, 1),
+ brightness: Brightness.light,
+ // DISABLE PREDICTIVE BACK GESTURE
+ // pageTransitionsTheme: const PageTransitionsTheme(
+ // builders: {
+ // TargetPlatform.android: PredictiveBackPageTransitionsBuilder()
+ // }
+ // )
+);
+
+ThemeData darkThemeOldVersions(MaterialColor primaryColor) => ThemeData(
+ useMaterial3: true,
+ colorSchemeSeed: primaryColor,
snackBarTheme: SnackBarThemeData(
contentTextStyle: const TextStyle(
color: Colors.white
@@ -276,72 +108,16 @@ ThemeData darkThemeOldVersions() => ThemeData(
),
elevation: 4,
),
- floatingActionButtonTheme: FloatingActionButtonThemeData(
- foregroundColor: Colors.white,
- backgroundColor: primaryColor
- ),
- textButtonTheme: TextButtonThemeData(
- style: ButtonStyle(
- foregroundColor: MaterialStateProperty.all(primaryColor),
- overlayColor: MaterialStateProperty.all(primaryColor.withOpacity(0.1))
- ),
- ),
- elevatedButtonTheme: ElevatedButtonThemeData(
- style: ButtonStyle(
- foregroundColor: MaterialStateProperty.all(primaryColor),
- surfaceTintColor: MaterialStateProperty.all(primaryColor),
- overlayColor: MaterialStateProperty.all(primaryColor.shade50),
- )
- ),
- inputDecorationTheme: InputDecorationTheme(
- floatingLabelStyle: TextStyle(
- color: primaryColor
- ),
- iconColor: Colors.grey,
- focusedBorder: OutlineInputBorder(
- borderRadius: BorderRadius.circular(10),
- borderSide: BorderSide(
- color: primaryColor,
- )
- )
- ),
- textSelectionTheme: TextSelectionThemeData(
- cursorColor: primaryColor
- ),
- brightness: Brightness.dark,
- textTheme: const TextTheme(
- bodyText1: TextStyle(
- color: Colors.white70
- ),
- bodyText2: TextStyle(
- color: Colors.white
- ),
- ),
- dividerColor: Colors.white12,
listTileTheme: const ListTileThemeData(
tileColor: Colors.transparent,
+ textColor: Color.fromRGBO(187, 187, 187, 1),
iconColor: Color.fromRGBO(187, 187, 187, 1),
),
- checkboxTheme: CheckboxThemeData(
- checkColor: MaterialStateProperty.all(Colors.white),
- fillColor: MaterialStateProperty.all(Colors.blue),
- ),
- tabBarTheme: TabBarTheme(
- unselectedLabelColor: Colors.white,
- labelColor: primaryColor,
- indicator: UnderlineTabIndicator(
- borderSide: BorderSide(
- color: primaryColor,
- width: 2
- )
- )
- ),
- progressIndicatorTheme: ProgressIndicatorThemeData(
- color: primaryColor
- ),
- indicatorColor: primaryColor,
- radioTheme: RadioThemeData(
- fillColor: MaterialStateProperty.all(primaryColor),
- ),
- androidOverscrollIndicator: AndroidOverscrollIndicator.stretch
+ brightness: Brightness.dark,
+ // DISABLE PREDICTIVE BACK GESTURE
+ // pageTransitionsTheme: const PageTransitionsTheme(
+ // builders: {
+ // TargetPlatform.android: PredictiveBackPageTransitionsBuilder()
+ // }
+ // )
);
\ No newline at end of file
diff --git a/lib/constants/adguard_green_color.dart b/lib/constants/adguard_green_color.dart
new file mode 100644
index 0000000..2ee7aa5
--- /dev/null
+++ b/lib/constants/adguard_green_color.dart
@@ -0,0 +1,16 @@
+import 'package:flutter/material.dart';
+
+const Map swatch = {
+ 50: Color.fromRGBO(25, 180, 119, .1),
+ 100: Color.fromRGBO(25, 180, 119, .2),
+ 200: Color.fromRGBO(25, 180, 119, .3),
+ 300: Color.fromRGBO(25, 180, 119, .4),
+ 400: Color.fromRGBO(25, 180, 119, .5),
+ 500: Color.fromRGBO(25, 180, 119, .6),
+ 600: Color.fromRGBO(25, 180, 119, .7),
+ 700: Color.fromRGBO(25, 180, 119, .8),
+ 800: Color.fromRGBO(25, 180, 119, .9),
+ 900: Color.fromRGBO(25, 180, 119, 1),
+};
+
+const MaterialColor adguardGreenColor = MaterialColor(0xff19b477, swatch);
\ No newline at end of file
diff --git a/lib/constants/colors.dart b/lib/constants/colors.dart
new file mode 100644
index 0000000..082e258
--- /dev/null
+++ b/lib/constants/colors.dart
@@ -0,0 +1,18 @@
+import 'package:flutter/material.dart';
+
+import 'package:adguard_home_manager/constants/adguard_green_color.dart';
+
+const List colors = [
+ adguardGreenColor,
+ Colors.red,
+ Colors.green,
+ Colors.blue,
+ Colors.yellow,
+ Colors.orange,
+ Colors.brown,
+ Colors.cyan,
+ Colors.purple,
+ Colors.pink,
+ Colors.deepOrange,
+ Colors.indigo
+];
\ No newline at end of file
diff --git a/lib/constants/enums.dart b/lib/constants/enums.dart
new file mode 100644
index 0000000..569db37
--- /dev/null
+++ b/lib/constants/enums.dart
@@ -0,0 +1,3 @@
+enum LoadStatus { loading, loaded, error }
+enum HomeTopItems { queriedDomains, blockedDomains, recurrentClients, topUpstreams, avgUpstreamResponseTime }
+enum CustomRulesSorting { topBottom, bottomTop }
\ No newline at end of file
diff --git a/lib/constants/package_name.dart b/lib/constants/package_name.dart
new file mode 100644
index 0000000..e693d89
--- /dev/null
+++ b/lib/constants/package_name.dart
@@ -0,0 +1,3 @@
+class PackageName {
+ static const String packageName = "com.jgeek00.adguard_home_manager";
+}
\ No newline at end of file
diff --git a/lib/constants/regexps.dart b/lib/constants/regexps.dart
new file mode 100644
index 0000000..e882913
--- /dev/null
+++ b/lib/constants/regexps.dart
@@ -0,0 +1,12 @@
+class Regexps {
+ static final wildcardDomain = RegExp(r'^(\*\.)?(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,10}$');
+ static final domain = RegExp(r'^((?:(?:[a-zA-Z]{1})|(?:[a-zA-Z]{1}[a-zA-Z]{1})|(?:[a-zA-Z]{1}[0-9]{1})|(?:[0-9]{1}[a-zA-Z]{1})|(?:[a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.)+([a-zA-Z]{2,10}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,10})$');
+ static final ipv4Address = RegExp(r'^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)(\.(?!$)|$)){4}$');
+ static final ipv6Address = RegExp(r'(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))');
+ static final subroute = RegExp(r'^\/\b([A-Za-z0-9_\-~/]*)[^\/|\.|\:]$');
+ static final macAddress = RegExp(r'^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$');
+ static final url = RegExp(r'^(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})$');
+ static final certificate = RegExp(r'(-{3,}(\bBEGIN CERTIFICATE\b))|(-{3,}-{3,}(\END CERTIFICATE\b)-{3,})', multiLine: true);
+ static final privateKey = RegExp(r'(-{3,}(\bBEGIN\b).*(PRIVATE KEY\b))|(-{3,}-{3,}(\bEND\b).*(PRIVATE KEY\b)-{3,})', multiLine: true);
+ static final path = RegExp(r'^(\/{0,1}(?!\/))[A-Za-z0-9\/\-_]+(\.([a-zA-Z]+))?$');
+}
\ No newline at end of file
diff --git a/lib/constants/routes_names.dart b/lib/constants/routes_names.dart
new file mode 100644
index 0000000..fa0b07c
--- /dev/null
+++ b/lib/constants/routes_names.dart
@@ -0,0 +1,31 @@
+class RoutesNames {
+ static const String connect = "/connect";
+
+ static const String home = "/home";
+ static const String queriedDomains = "/home/queried-domains";
+ static const String blockedDomains = "/home/blocked-domains";
+ static const String recurrentClients = "/home/recurrent-clients";
+
+ static const String clients = "/clients";
+ static const String clientsList = "/clients/list";
+ static const String clientPlaceholder = "/clients/list/placeholder";
+ static const String client = "/clients/list:id";
+
+ static const String logs = "/logs";
+
+ static const String filters = "/filters";
+
+ static const String settings = "/settings";
+ static const String safeSearch = "/settings/safe-search";
+ static const String accessSettings = "/settings/access-settigs";
+ static const String dhcpSettings = "/settings/dhcp-settings";
+ static const String dnsSettings = "/settings/dns-settings";
+ static const String encryptionSettings = "/settings/encryption-settings";
+ static const String dnsRewrites = "/settings/dns-rewrites";
+ static const String serverUpdates = "/settings/server-updates";
+ static const String serverInfo = "/settings/server-info";
+ static const String customization = "/settings/customization";
+ static const String servers = "/settings/servers";
+ static const String generalSettings = "/settings/general-settings";
+ static const String advancedSettings = "/settings/advanced-settings";
+}
\ No newline at end of file
diff --git a/lib/constants/services.dart b/lib/constants/services.dart
deleted file mode 100644
index a71a5c2..0000000
--- a/lib/constants/services.dart
+++ /dev/null
@@ -1,142 +0,0 @@
-const List