Pull request 62: TRUST-146 change color scheme

Squashed commit of the following:

commit 562504c62272ded627e3d306ae9dc3f128d22487
Author: Konstantin Gorynin <k.goryinin@adguard.com>
Date:   Thu Dec 11 22:23:33 2025 +0200

    delay removed

commit 08edc921bd293db197884a36e8210ce4f87d4e5b
Author: Konstantin Gorynin <k.goryinin@adguard.com>
Date:   Thu Dec 11 21:33:08 2025 +0200

    pictures + lines fix

commit f0d6fadb3d8fece78de9016f1498fc427010f19f
Author: Konstantin Gorynin <k.goryinin@adguard.com>
Date:   Thu Dec 11 20:23:56 2025 +0200

    fixed by review

commit c0d54dd9a6d77d081aab1ce85af0e482323790b6
Author: Konstantin Gorynin <k.goryinin@adguard.com>
Date:   Thu Dec 11 19:59:07 2025 +0200

    package name rollback

commit dad2a5c44e40ceb8e9150c1a0ece3bc22820867f
Author: Konstantin Gorynin <k.goryinin@adguard.com>
Date:   Thu Dec 11 19:58:08 2025 +0200

    renamed app

commit 5cd648d89efb089e9cb32e8209d9a6134c124018
Author: Konstantin Gorynin <k.goryinin@adguard.com>
Date:   Thu Dec 11 19:53:43 2025 +0200

    ios icons update

commit aa41dae057aeee9864c4ee1d6aa0178d0a76cf13
Author: Konstantin Gorynin <k.goryinin@adguard.com>
Date:   Thu Dec 11 19:26:57 2025 +0200

    android icons implemented

commit 80aa0712b54ac8dbc5809e9f350a03772c5ab744
Author: Konstantin Gorynin <k.goryinin@adguard.com>
Date:   Thu Dec 11 17:44:56 2025 +0200

    remove this commit after tests

commit 2b57b400db33db399f988aa8143f9b9481042b75
Author: Konstantin Gorynin <k.goryinin@adguard.com>
Date:   Thu Dec 11 17:35:00 2025 +0200

    theme updated

commit ff4da7ebe6744a2b116d1ceeb49db86c86937cd9
Merge: 88abdfb c354f91
Author: Atlassian Bamboo <bamboo@example.com>
Date:   Wed Dec 10 15:20:36 2025 +0300

    [bamboo] Automated branch merge (from master:c354f91b55fee66d4349a5c99bc3685465aa6917)

commit 88abdfb0840d3d316948da9d2d6e02fe88643a11
Author: Konstantin Gorynin <k.goryinin@adguard.com>
Date:   Wed Dec 10 14:05:20 2025 +0200

    splash screen updated

commit 60a3451c1592ad7fa9ccfe761f539b6380b68fd7
Author: Konstantin Gorynin <k.goryinin@adguard.com>
Date:   Wed Dec 10 13:22:33 2025 +0200

    illustrations updated
This commit is contained in:
Konstantin Gorynin
2025-12-11 23:35:48 +03:00
parent c354f91b55
commit 08ade12b24
110 changed files with 859 additions and 833 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:label="vpn"
android:label="TrustTunnel"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 B

@@ -1,12 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
<item>
<bitmap android:gravity="fill" android:src="@drawable/background"/>
</item>
<item>
<bitmap android:gravity="center" android:src="@drawable/splash"/>
</item>
</layer-list>
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 B

@@ -0,0 +1,21 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="24"
android:viewportHeight="24">
<group android:scaleX="0.5"
android:scaleY="0.5"
android:translateX="6"
android:translateY="6">
<path
android:pathData="M8.645,6.29C5.998,7.845 4.831,10.954 5.619,13.778C5.633,13.828 5.648,13.879 5.663,13.929C5.863,14.814 5.101,15.845 4.088,16.65C5.285,16.157 6.556,15.993 7.232,16.599C7.269,16.637 7.305,16.674 7.343,16.711C9.426,18.774 12.71,19.266 15.357,17.711C18.003,16.155 19.171,13.046 18.383,10.223C18.369,10.172 18.354,10.122 18.339,10.071C18.139,9.186 18.9,8.156 19.913,7.35C18.717,7.843 17.446,8.007 16.77,7.402C16.733,7.364 16.696,7.326 16.659,7.29C14.576,5.227 11.292,4.735 8.645,6.29Z"
android:fillColor="#F6F6F6"/>
<path
android:pathData="M6.911,3.34C10.925,0.981 15.907,1.727 19.066,4.855C19.123,4.911 19.179,4.968 19.234,5.025C20.26,5.944 22.187,5.695 24.002,4.947C22.466,6.169 21.31,7.733 21.613,9.075C21.637,9.151 21.659,9.228 21.681,9.305C22.876,13.587 21.105,18.302 17.091,20.661C13.077,23.02 8.095,22.274 4.936,19.146L4.768,18.975C3.742,18.057 1.815,18.305 0,19.053C1.536,17.831 2.692,16.268 2.389,14.926C2.365,14.849 2.343,14.773 2.321,14.696C1.126,10.414 2.897,5.699 6.911,3.34ZM16.656,7.29C14.573,5.228 11.289,4.735 8.643,6.29C5.996,7.845 4.828,10.954 5.616,13.777C5.63,13.828 5.646,13.879 5.661,13.93C5.861,14.815 5.099,15.845 4.086,16.65C5.282,16.157 6.553,15.993 7.229,16.599C7.266,16.636 7.303,16.674 7.34,16.711C9.423,18.774 12.708,19.266 15.354,17.711C18.001,16.156 19.168,13.046 18.38,10.223C18.366,10.172 18.351,10.122 18.336,10.071C18.136,9.186 18.898,8.156 19.911,7.351C18.715,7.843 17.444,8.007 16.768,7.402C16.731,7.364 16.694,7.327 16.656,7.29Z"
android:fillColor="#315AEF"/>
<path
android:pathData="M14.94,9.875C15.242,10.212 15.242,10.757 14.939,11.094L12.626,13.659C11.833,14.621 11.333,14.621 10.509,13.659L9.061,12.052C8.758,11.716 8.757,11.171 9.059,10.833C9.361,10.496 9.851,10.495 10.155,10.831L11.567,12.398L13.845,9.873C14.148,9.536 14.638,9.537 14.94,9.875Z"
android:fillColor="#315AEF"
android:fillType="evenOdd"/>
</group>
</vector>
@@ -1,12 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
<item>
<bitmap android:gravity="fill" android:src="@drawable/background"/>
</item>
<item>
<bitmap android:gravity="center" android:src="@drawable/splash"/>
</item>
</layer-list>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:forceDarkAllowed">false</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:windowSplashScreenBackground">#E6EAEF</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>
@@ -5,6 +5,10 @@
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:forceDarkAllowed">false</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:forceDarkAllowed">false</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:windowSplashScreenBackground">#E6EAEF</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FFFFFF</color>
</resources>
@@ -5,6 +5,10 @@
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:forceDarkAllowed">false</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

+7
View File
@@ -0,0 +1,7 @@
flutter_native_splash:
color: "#E6EAEF"
image: assets/images/logo_white.png
fullscreen: true
android_12:
color: "#E6EAEF"
image: assets/images/logo_white.png
+6
View File
@@ -614,6 +614,8 @@
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = TrustTunnel;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -799,6 +801,8 @@
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = TrustTunnel;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -825,6 +829,8 @@
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = TrustTunnel;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -1,122 +1,26 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
"filename" : "any.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "dark.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 704 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 762 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

+6
View File
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "background.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 69 B

@@ -1,23 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 B

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 B

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 B

After

Width:  |  Height:  |  Size: 17 KiB

+12 -5
View File
@@ -16,13 +16,19 @@
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
</imageView>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" image="LaunchBackground" translatesAutoresizingMaskIntoConstraints="NO" id="tWc-Dq-wcI"/>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4"></imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="3T2-ad-Qdv"/>
<constraint firstItem="tWc-Dq-wcI" firstAttribute="bottom" secondItem="Ze5-6b-2t3" secondAttribute="bottom" id="RPx-PI-7Xg"/>
<constraint firstItem="tWc-Dq-wcI" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="SdS-ul-q2q"/>
<constraint firstAttribute="trailing" secondItem="tWc-Dq-wcI" secondAttribute="trailing" id="Swv-Gf-Rwn"/>
<constraint firstAttribute="trailing" secondItem="YRO-k0-Ey4" secondAttribute="trailing" id="TQA-XW-tRk"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="bottom" secondItem="Ze5-6b-2t3" secondAttribute="bottom" id="duK-uY-Gun"/>
<constraint firstItem="tWc-Dq-wcI" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="kV7-tw-vXt"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="xPn-NY-SIU"/>
</constraints>
</view>
</viewController>
@@ -32,6 +38,7 @@
</scene>
</scenes>
<resources>
<image name="LaunchImage" width="168" height="185"/>
<image name="LaunchImage" width="1200" height="1200"/>
<image name="LaunchBackground" width="1" height="1"/>
</resources>
</document>
+53 -49
View File
@@ -1,53 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>TrustTunnel</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>TrustTunnel</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>https</string>
</array>
</dict>
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>TrustTunnel</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>TrustTunnel</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>https</string>
</array>
<key>UIStatusBarHidden</key>
<false/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist>
+3 -2
View File
@@ -1,6 +1,7 @@
abstract class AssetImages {
static const dns = '${_path}dns.webp';
static const server = '${_path}server.png';
static const about = '${_path}about.png';
static const privacy = '${_path}privacy.webp';
static const _path = 'assets/images/';
}
+212 -159
View File
@@ -3,176 +3,234 @@ import 'dart:ui';
import 'package:flutter/material.dart';
class CustomColors extends ThemeExtension<CustomColors> {
final Color primary1;
final Color primary2;
final Color primary3;
final Color primary4;
final Color blend1;
final Color blend2;
final Color blend3;
final Color orange1;
final Color orange2;
final Color orange3;
final Color orange4;
final Color red1;
final Color red2;
final Color red3;
final Color red4;
final Color background1;
final Color background2;
final Color background3;
final Color gray1;
final Color gray2;
final Color gray3;
final Color gray4;
final Color contrast1;
final Color contrast2;
final Color contrast3;
final Color contrast4;
final Color staticBlack1;
final Color staticBlack2;
final Color staticBlack3;
final Color staticWhite;
final Color accent;
final Color accentHover;
final Color accentPressed;
final Color accentDisabled;
final Color blend;
final Color blendHover;
final Color blendPressed;
final Color attention;
final Color attentionHover;
final Color attentionPressed;
final Color attentionDisabled;
final Color error;
final Color errorHover;
final Color errorPressed;
final Color errorDisabled;
final Color background;
final Color backgroundAdditional;
final Color backgroundElevated;
final Color backgroundSystem;
final Color backgroundSystemHover;
final Color backgroundSystemPressed;
final Color neutralLight;
final Color neutralLightHover;
final Color neutralLightPressed;
final Color neutralLightDisabled;
final Color neutralDark;
final Color neutralDarkHover;
final Color neutralDarkPressed;
final Color neutralBlack;
final Color neutralDarkDisabled;
final Color neutralBlackHover;
final Color neutralBlackPressed;
final Color neutralBlackDisabled;
final Color specialStaticWhite;
final Color specialStaticWhiteHover;
final Color specialStaticWhitePressed;
final Color specialStaticWhiteDisabled;
final Color staticTransparent;
const CustomColors({
required this.primary1,
required this.primary2,
required this.primary3,
required this.primary4,
required this.blend1,
required this.blend2,
required this.blend3,
required this.orange1,
required this.orange2,
required this.orange3,
required this.orange4,
required this.red1,
required this.red2,
required this.red3,
required this.red4,
required this.background1,
required this.background2,
required this.background3,
required this.gray1,
required this.gray2,
required this.gray3,
required this.gray4,
required this.contrast1,
required this.contrast2,
required this.contrast3,
required this.contrast4,
required this.staticBlack1,
required this.staticBlack2,
required this.staticBlack3,
required this.staticWhite,
required this.accent,
required this.accentHover,
required this.accentPressed,
required this.accentDisabled,
required this.blend,
required this.blendHover,
required this.blendPressed,
required this.attention,
required this.attentionHover,
required this.attentionPressed,
required this.attentionDisabled,
required this.error,
required this.errorHover,
required this.errorPressed,
required this.errorDisabled,
required this.background,
required this.backgroundAdditional,
required this.backgroundElevated,
required this.backgroundSystem,
required this.backgroundSystemHover,
required this.backgroundSystemPressed,
required this.neutralLight,
required this.neutralLightHover,
required this.neutralLightPressed,
required this.neutralLightDisabled,
required this.neutralDark,
required this.neutralDarkHover,
required this.neutralDarkPressed,
required this.neutralDarkDisabled,
required this.neutralBlack,
required this.neutralBlackHover,
required this.neutralBlackPressed,
required this.neutralBlackDisabled,
required this.specialStaticWhite,
required this.specialStaticWhiteHover,
required this.specialStaticWhitePressed,
required this.specialStaticWhiteDisabled,
required this.staticTransparent,
});
@override
CustomColors copyWith({
Color? primary1,
Color? primary2,
Color? primary3,
Color? primary4,
Color? blend1,
Color? blend2,
Color? blend3,
Color? orange1,
Color? orange2,
Color? orange3,
Color? orange4,
Color? red1,
Color? red2,
Color? red3,
Color? red4,
Color? background1,
Color? background2,
Color? background3,
Color? gray1,
Color? gray2,
Color? gray3,
Color? gray4,
Color? contrast1,
Color? contrast2,
Color? contrast3,
Color? contrast4,
Color? staticBlack1,
Color? staticBlack2,
Color? staticBlack3,
Color? staticWhite,
Color? accent,
Color? accentHover,
Color? accentPressed,
Color? accentDisabled,
Color? blend,
Color? blendHover,
Color? blendPressed,
Color? attention,
Color? attentionHover,
Color? attentionPressed,
Color? attentionDisabled,
Color? error,
Color? errorHover,
Color? errorPressed,
Color? errorDisabled,
Color? background,
Color? backgroundAdditional,
Color? backgroundElevated,
Color? backgroundSystem,
Color? backgroundSystemHover,
Color? backgroundSystemPressed,
Color? neutralLight,
Color? neutralLightHover,
Color? neutralLightPressed,
Color? neutralLightDisabled,
Color? neutralDark,
Color? neutralDarkHover,
Color? neutralDarkPressed,
Color? neutralDarkDisabled,
Color? neutralBlack,
Color? neutralBlackHover,
Color? neutralBlackPressed,
Color? neutralBlackDisabled,
Color? specialStaticWhite,
Color? specialStaticWhiteHover,
Color? specialStaticWhitePressed,
Color? specialStaticWhiteDisabled,
Color? staticTransparent,
}) => CustomColors(
primary1: primary1 ?? this.primary1,
primary2: primary2 ?? this.primary2,
primary3: primary3 ?? this.primary3,
primary4: primary4 ?? this.primary4,
blend1: blend1 ?? this.blend1,
blend2: blend2 ?? this.blend2,
blend3: blend3 ?? this.blend3,
orange1: orange1 ?? this.orange1,
orange2: orange2 ?? this.orange2,
orange3: orange3 ?? this.orange3,
orange4: orange4 ?? this.orange4,
red1: red1 ?? this.red1,
red2: red2 ?? this.red2,
red3: red3 ?? this.red3,
red4: red4 ?? this.red4,
background1: background1 ?? this.background1,
background2: background2 ?? this.background2,
background3: background3 ?? this.background3,
gray1: gray1 ?? this.gray1,
gray2: gray2 ?? this.gray2,
gray3: gray3 ?? this.gray3,
gray4: gray4 ?? this.gray4,
contrast1: contrast1 ?? this.contrast1,
contrast2: contrast2 ?? this.contrast2,
contrast3: contrast3 ?? this.contrast3,
contrast4: contrast4 ?? this.contrast4,
staticBlack1: staticBlack1 ?? this.staticBlack1,
staticBlack2: staticBlack2 ?? this.staticBlack2,
staticBlack3: staticBlack3 ?? this.staticBlack3,
staticWhite: staticWhite ?? this.staticWhite,
accent: accent ?? this.accent,
accentHover: accentHover ?? this.accentHover,
accentPressed: accentPressed ?? this.accentPressed,
accentDisabled: accentDisabled ?? this.accentDisabled,
blend: blend ?? this.blend,
blendHover: blendHover ?? this.blendHover,
blendPressed: blendPressed ?? this.blendPressed,
attention: attention ?? this.attention,
attentionHover: attentionHover ?? this.attentionHover,
attentionPressed: attentionPressed ?? this.attentionPressed,
attentionDisabled: attentionDisabled ?? this.attentionDisabled,
error: error ?? this.error,
errorHover: errorHover ?? this.errorHover,
errorPressed: errorPressed ?? this.errorPressed,
errorDisabled: errorDisabled ?? this.errorDisabled,
background: background ?? this.background,
backgroundAdditional: backgroundAdditional ?? this.backgroundAdditional,
backgroundElevated: backgroundElevated ?? this.backgroundElevated,
backgroundSystem: backgroundSystem ?? this.backgroundSystem,
backgroundSystemHover: backgroundSystemHover ?? this.backgroundSystemHover,
backgroundSystemPressed: backgroundSystemPressed ?? this.backgroundSystemPressed,
neutralLight: neutralLight ?? this.neutralLight,
neutralLightHover: neutralLightHover ?? this.neutralLightHover,
neutralLightPressed: neutralLightPressed ?? this.neutralLightPressed,
neutralLightDisabled: neutralLightDisabled ?? this.neutralLightDisabled,
neutralDark: neutralDark ?? this.neutralDark,
neutralDarkHover: neutralDarkHover ?? this.neutralDarkHover,
neutralDarkPressed: neutralDarkPressed ?? this.neutralDarkPressed,
neutralDarkDisabled: neutralDarkDisabled ?? this.neutralDarkDisabled,
neutralBlack: neutralBlack ?? this.neutralBlack,
neutralBlackHover: neutralBlackHover ?? this.neutralBlackHover,
neutralBlackPressed: neutralBlackPressed ?? this.neutralBlackPressed,
neutralBlackDisabled: neutralBlackDisabled ?? this.neutralBlackDisabled,
specialStaticWhite: specialStaticWhite ?? this.specialStaticWhite,
specialStaticWhiteHover: specialStaticWhiteHover ?? this.specialStaticWhiteHover,
specialStaticWhitePressed: specialStaticWhitePressed ?? this.specialStaticWhitePressed,
specialStaticWhiteDisabled: specialStaticWhiteDisabled ?? this.specialStaticWhiteDisabled,
staticTransparent: staticTransparent ?? this.staticTransparent,
);
@override
ThemeExtension<CustomColors> lerp(covariant ThemeExtension<CustomColors>? other, double t) {
if (other is! CustomColors) {
return this;
}
ThemeExtension<CustomColors> lerp(
covariant ThemeExtension<CustomColors>? other,
double t,
) {
if (other is! CustomColors) return this;
return CustomColors(
primary1: Color.lerp(primary1, other.primary1, t)!,
primary2: Color.lerp(primary2, other.primary2, t)!,
primary3: Color.lerp(primary3, other.primary3, t)!,
primary4: Color.lerp(primary4, other.primary4, t)!,
blend1: Color.lerp(blend1, other.blend1, t)!,
blend2: Color.lerp(blend2, other.blend2, t)!,
blend3: Color.lerp(blend3, other.blend3, t)!,
orange1: Color.lerp(orange1, other.orange1, t)!,
orange2: Color.lerp(orange2, other.orange2, t)!,
orange3: Color.lerp(orange3, other.orange3, t)!,
orange4: Color.lerp(orange4, other.orange4, t)!,
red1: Color.lerp(red1, other.red1, t)!,
red2: Color.lerp(red2, other.red2, t)!,
red3: Color.lerp(red3, other.red3, t)!,
red4: Color.lerp(red4, other.red4, t)!,
background1: Color.lerp(background1, other.background1, t)!,
background2: Color.lerp(background2, other.background2, t)!,
background3: Color.lerp(background3, other.background3, t)!,
gray1: Color.lerp(gray1, other.gray1, t)!,
gray2: Color.lerp(gray2, other.gray2, t)!,
gray3: Color.lerp(gray3, other.gray3, t)!,
gray4: Color.lerp(gray4, other.gray4, t)!,
contrast1: Color.lerp(contrast1, other.contrast1, t)!,
contrast2: Color.lerp(contrast2, other.contrast2, t)!,
contrast3: Color.lerp(contrast3, other.contrast3, t)!,
contrast4: Color.lerp(contrast4, other.contrast4, t)!,
staticBlack1: Color.lerp(staticBlack1, other.staticBlack1, t)!,
staticBlack2: Color.lerp(staticBlack2, other.staticBlack2, t)!,
staticBlack3: Color.lerp(staticBlack3, other.staticBlack3, t)!,
staticWhite: Color.lerp(staticWhite, other.staticWhite, t)!,
accent: Color.lerp(accent, other.accent, t)!,
accentHover: Color.lerp(accentHover, other.accentHover, t)!,
accentPressed: Color.lerp(accentPressed, other.accentPressed, t)!,
accentDisabled: Color.lerp(accentDisabled, other.accentDisabled, t)!,
blend: Color.lerp(blend, other.blend, t)!,
blendHover: Color.lerp(blendHover, other.blendHover, t)!,
blendPressed: Color.lerp(blendPressed, other.blendPressed, t)!,
attention: Color.lerp(attention, other.attention, t)!,
attentionHover: Color.lerp(attentionHover, other.attentionHover, t)!,
attentionPressed: Color.lerp(attentionPressed, other.attentionPressed, t)!,
attentionDisabled: Color.lerp(attentionDisabled, other.attentionDisabled, t)!,
error: Color.lerp(error, other.error, t)!,
errorHover: Color.lerp(errorHover, other.errorHover, t)!,
errorPressed: Color.lerp(errorPressed, other.errorPressed, t)!,
errorDisabled: Color.lerp(errorDisabled, other.errorDisabled, t)!,
background: Color.lerp(background, other.background, t)!,
backgroundAdditional: Color.lerp(backgroundAdditional, other.backgroundAdditional, t)!,
backgroundElevated: Color.lerp(backgroundElevated, other.backgroundElevated, t)!,
backgroundSystem: Color.lerp(backgroundSystem, other.backgroundSystem, t)!,
backgroundSystemHover: Color.lerp(backgroundSystemHover, other.backgroundSystemHover, t)!,
backgroundSystemPressed: Color.lerp(backgroundSystemPressed, other.backgroundSystemPressed, t)!,
neutralLight: Color.lerp(neutralLight, other.neutralLight, t)!,
neutralLightHover: Color.lerp(neutralLightHover, other.neutralLightHover, t)!,
neutralLightPressed: Color.lerp(neutralLightPressed, other.neutralLightPressed, t)!,
neutralLightDisabled: Color.lerp(neutralLightDisabled, other.neutralLightDisabled, t)!,
neutralDark: Color.lerp(neutralDark, other.neutralDark, t)!,
neutralDarkHover: Color.lerp(neutralDarkHover, other.neutralDarkHover, t)!,
neutralDarkPressed: Color.lerp(neutralDarkPressed, other.neutralDarkPressed, t)!,
neutralDarkDisabled: Color.lerp(neutralDarkDisabled, other.neutralDarkDisabled, t)!,
neutralBlack: Color.lerp(neutralBlack, other.neutralBlack, t)!,
neutralBlackHover: Color.lerp(neutralBlackHover, other.neutralBlackHover, t)!,
neutralBlackPressed: Color.lerp(neutralBlackPressed, other.neutralBlackPressed, t)!,
neutralBlackDisabled: Color.lerp(neutralBlackDisabled, other.neutralBlackDisabled, t)!,
specialStaticWhite: Color.lerp(specialStaticWhite, other.specialStaticWhite, t)!,
specialStaticWhiteHover: Color.lerp(
specialStaticWhiteHover,
other.specialStaticWhiteHover,
t,
)!,
specialStaticWhitePressed: Color.lerp(
specialStaticWhitePressed,
other.specialStaticWhitePressed,
t,
)!,
specialStaticWhiteDisabled: Color.lerp(
specialStaticWhiteDisabled,
other.specialStaticWhiteDisabled,
t,
)!,
staticTransparent: Color.lerp(staticTransparent, other.staticTransparent, t)!,
);
}
@@ -276,14 +334,12 @@ class CustomTextButtonTheme extends ThemeExtension<CustomTextButtonTheme> {
final TextButtonThemeData attention;
final TextButtonThemeData success;
final TextButtonThemeData iconButton;
final TextButtonThemeData inlineButton;
const CustomTextButtonTheme({
required this.danger,
required this.attention,
required this.success,
required this.iconButton,
required this.inlineButton,
});
@override
@@ -292,13 +348,11 @@ class CustomTextButtonTheme extends ThemeExtension<CustomTextButtonTheme> {
TextButtonThemeData? attention,
TextButtonThemeData? success,
TextButtonThemeData? iconButton,
TextButtonThemeData? inlineButton,
}) => CustomTextButtonTheme(
danger: danger ?? this.danger,
attention: attention ?? this.attention,
success: success ?? this.success,
iconButton: iconButton ?? this.iconButton,
inlineButton: inlineButton ?? this.inlineButton,
);
@override
@@ -315,7 +369,6 @@ class CustomTextButtonTheme extends ThemeExtension<CustomTextButtonTheme> {
attention: TextButtonThemeData.lerp(attention, other.attention, t)!,
success: TextButtonThemeData.lerp(success, other.success, t)!,
iconButton: TextButtonThemeData.lerp(iconButton, other.iconButton, t)!,
inlineButton: TextButtonThemeData.lerp(inlineButton, other.inlineButton, t)!,
);
}
}
+1 -1
View File
@@ -70,7 +70,7 @@
"typeSomething": "Type something",
"deleteServer": "Delete server",
"deleteServerDialogTitle": "Delete server?",
"deleteServerDescription": "{serverName} will be deleted",
"deleteServerDescription": "Server <b>{serverName}</b> will be deleted",
"@deleteServerDescription": {
"placeholders": {
"serverName": {
+1 -1
View File
@@ -70,7 +70,7 @@
"typeSomething": "Type something",
"deleteServer": "Delete server",
"deleteServerDialogTitle": "Delete server?",
"deleteServerDescription": "{serverName} will be deleted",
"deleteServerDescription": "Server <b>{serverName}</b> will be deleted",
"@deleteServerDescription": {
"placeholders": {
"serverName": {
File diff suppressed because it is too large Load Diff
+5 -1
View File
@@ -2,6 +2,7 @@ import 'dart:ui';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:flutter_native_splash/flutter_native_splash.dart';
import 'package:vpn/di/common/initialization_result.dart';
import 'package:vpn/di/factory/bloc_factory.dart';
import 'package:vpn/di/factory/dependency_factory.dart';
@@ -14,7 +15,8 @@ abstract class InitializationHelper {
class InitializationHelperIo extends InitializationHelper {
@override
Future<InitializationResult> init() async {
WidgetsFlutterBinding.ensureInitialized();
final bindings = WidgetsFlutterBinding.ensureInitialized();
FlutterNativeSplash.preserve(widgetsBinding: bindings);
await _updateDeviceOrientation();
final dependenciesFactory = DependencyFactoryImpl();
@@ -29,6 +31,8 @@ class InitializationHelperIo extends InitializationHelper {
final initialVpnState = await repositoryFactory.vpnRepository.requestState();
FlutterNativeSplash.remove();
return InitializationResult(
dependenciesFactory: dependenciesFactory,
blocFactory: blocFactory,
@@ -27,7 +27,6 @@ abstract class NavigationScreenUtils {
(e) => NavigationRailDestination(
icon: CustomIcon.medium(
icon: e['icon'] as IconData,
color: context.colors.contrast1,
),
label: Text(
e['label'].toString(),
@@ -45,7 +44,6 @@ abstract class NavigationScreenUtils {
(e) => NavigationDestination(
icon: CustomIcon.medium(
icon: e['icon'] as IconData,
color: context.colors.contrast1,
),
label: e['label'].toString(),
),
@@ -19,24 +19,26 @@ class _NavigationScreenState extends State<NavigationScreen> {
@override
Widget build(BuildContext context) => Scaffold(
backgroundColor: context.colors.background2,
backgroundColor: context.colors.backgroundSystem,
body: context.isMobileBreakpoint
? _getContent()
: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ValueListenableBuilder(
valueListenable: _selectedTabNotifier,
builder: (context, index, _) => CustomNavigationRail(
selectedIndex: index,
onDestinationSelected: _onDestinationSelected,
destinations: NavigationScreenUtils.getNavigationRailDestinations(context),
: SafeArea(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ValueListenableBuilder(
valueListenable: _selectedTabNotifier,
builder: (context, index, _) => CustomNavigationRail(
selectedIndex: index,
onDestinationSelected: _onDestinationSelected,
destinations: NavigationScreenUtils.getNavigationRailDestinations(context),
),
),
),
Expanded(
child: _getContent(),
),
],
Expanded(
child: _getContent(),
),
],
),
),
bottomNavigationBar: context.isMobileBreakpoint
? ValueListenableBuilder(
@@ -59,13 +59,13 @@ class RoutingCard extends StatelessWidget {
children: [
CustomIcon.medium(
icon: AssetIcons.delete,
color: context.colors.red1,
color: context.colors.error,
),
const SizedBox(width: 12),
Text(
context.ln.deleteProfile,
style: context.textTheme.bodyLarge?.copyWith(
color: context.colors.red1,
color: context.colors.error,
),
),
],
@@ -41,13 +41,13 @@ class RoutingDetailsScreenAppBarAction extends StatelessWidget {
children: [
CustomIcon.medium(
icon: AssetIcons.delete,
color: context.colors.red1,
color: context.colors.error,
),
const SizedBox(width: 12),
Text(
context.ln.deleteAllRules,
style: context.textTheme.bodyLarge?.copyWith(
color: context.colors.red1,
color: context.colors.error,
),
),
],
@@ -16,7 +16,7 @@ class ServerDetailsScreenAppBarAction extends StatelessWidget {
builder: (context, state) => state.isEditing
? CustomIconButton.square(
icon: AssetIcons.delete,
color: context.colors.red1,
color: context.colors.error,
size: 24,
onPressed: () => _showDeleteDialog(
context,
@@ -37,9 +37,6 @@ class _ServersCardState extends State<ServersCard> {
title: widget.server.name,
titleStyle: context.textTheme.titleSmall,
subtitle: widget.server.ipAddress,
subtitleStyle: context.textTheme.bodyMedium?.copyWith(
color: context.colors.gray1,
),
onTileTap: () => _pushServerDetailsScreen(
context,
server: widget.server,
@@ -32,7 +32,6 @@ class ServersCardConnectionButton extends StatelessWidget {
icon: AssetIcons.update,
onPressed: onPressed,
size: 24,
color: context.colors.staticWhite,
selected: true,
),
)
@@ -40,7 +39,6 @@ class ServersCardConnectionButton extends StatelessWidget {
icon: AssetIcons.powerSettingsNew,
onPressed: onPressed,
size: 24,
color: context.colors.staticWhite,
selected: vpnManagerState == VpnState.connected,
),
);
@@ -14,16 +14,18 @@ class ServersEmptyPlaceholder extends StatelessWidget {
Widget build(BuildContext context) => DefaultPage(
title: context.ln.serversEmptyTitle,
descriptionText: context.ln.serversEmptyDescription,
imagePath: AssetImages.dns,
imagePath: AssetImages.server,
imageSize: const Size.square(248),
buttonText: context.ln.create,
onButtonPressed: () => _pushServerDetailsScreen(context),
alignment: Alignment.center,
);
void _pushServerDetailsScreen(BuildContext context) => context.push(
const ServerDetailsPopUp(),
).then(
void _pushServerDetailsScreen(BuildContext context) => context
.push(
const ServerDetailsPopUp(),
)
.then(
(_) => context.read<ServersBloc>().add(
const ServersEvent.fetch(),
),
@@ -20,7 +20,7 @@ class AboutScreen extends StatelessWidget {
builder: (context, snapshot) => DefaultPage(
title: context.ln.vpnOss,
descriptionText: snapshot.data,
imagePath: AssetImages.privacy,
imagePath: AssetImages.about,
imageSize: const Size.square(248),
alignment: Alignment.center,
),
@@ -27,7 +27,6 @@ class CustomElevatedButton extends StatelessWidget {
label: Text(label),
icon: CustomIcon.medium(
icon: icon,
color: context.theme.elevatedButtonTheme.style?.foregroundColor?.resolve({}) ?? context.colors.staticWhite,
),
),
),
@@ -27,7 +27,6 @@ class CustomFilledButton extends StatelessWidget {
label: Text(label),
icon: CustomIcon.medium(
icon: icon,
color: context.theme.filledButtonTheme.style?.foregroundColor?.resolve({}) ?? context.colors.staticWhite,
),
),
),
@@ -49,7 +49,7 @@ class CustomFloatingActionButton extends StatelessWidget {
final theme = Theme.of(context).floatingActionButtonTheme;
final iconWidget = CustomIcon.medium(
icon: icon,
color: theme.foregroundColor ?? context.colors.primary1,
color: theme.foregroundColor ?? context.colors.accent,
);
final Widget button = switch (type) {
+2 -3
View File
@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:vpn/common/extensions/context_extensions.dart';
import 'package:vpn/view/custom_icon.dart';
class CustomIconButton extends StatefulWidget {
@@ -124,7 +123,7 @@ class _CustomIconButtonState extends State<CustomIconButton> {
return CustomIcon.medium(
icon: widget.icon!,
color: widget.onPressed == null ? context.colors.contrast4 : widget.color,
color: widget.color,
);
}
@@ -139,7 +138,7 @@ class _CustomIconButtonState extends State<CustomIconButton> {
return CustomIcon(
icon: widget.selectedIcon!,
size: widget.width ?? widget.height,
color: widget.onPressed == null ? context.colors.contrast4 : widget.color,
color: widget.color,
);
}
}
+1 -3
View File
@@ -37,9 +37,7 @@ class _OutlinedButtonSvgState extends State<CustomOutlinedButton> {
valueListenable: _statesController,
builder: (context, value, child) => CustomIcon.medium(
icon: widget.icon,
color:
context.theme.outlinedButtonTheme.style?.foregroundColor?.resolve(value) ?? context.colors.staticWhite,
),
),
),
),
),

Some files were not shown because too many files have changed in this diff Show More