update dio to dio: ^5.5.0+1
update dio to dio: ^5.5.0+1
This commit is contained in:
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
@@ -9,7 +9,7 @@
|
||||
/* Begin PBXBuildFile section */
|
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||
2FD21F1125A363E300F556E0 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FD21F1025A363E300F556E0 /* PacketTunnelProvider.swift */; };
|
||||
2FD21F1625A363E300F556E0 /* PacketTunnel.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 2FD21F0D25A363E300F556E0 /* PacketTunnel.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||
2FD21F1625A363E300F556E0 /* PacketTunnel.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 2FD21F0D25A363E300F556E0 /* PacketTunnel.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||
2FD21F2425A364B700F556E0 /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FD21EF825A363AA00F556E0 /* NetworkExtension.framework */; };
|
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||
3E06F985293FACBB00E04D92 /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FD21F1025A363E300F556E0 /* PacketTunnelProvider.swift */; };
|
||||
@@ -34,8 +34,10 @@
|
||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||
C09C70752C3E5685000F6E01 /* leaf.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0CB10F52C3275EE00A1F217 /* leaf.xcframework */; };
|
||||
C09C70762C3E5685000F6E01 /* leaf.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C0CB10F52C3275EE00A1F217 /* leaf.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
C09CB0812C50A09A0028C461 /* TESWT.m in Sources */ = {isa = PBXBuildFile; fileRef = C09CB0802C50A09A0028C461 /* TESWT.m */; };
|
||||
C0CB10F62C3275EE00A1F217 /* leaf.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0CB10F52C3275EE00A1F217 /* leaf.xcframework */; };
|
||||
DBC6F25A26C78B1D91884CE1 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A9C0075B77637136AF52D8B /* Pods_Runner.framework */; };
|
||||
E2B5FEC68AAAE043A3080A59 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A9C0075B77637136AF52D8B /* Pods_Runner.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
@@ -49,15 +51,15 @@
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
2FD21F0625A363AA00F556E0 /* Embed App Extensions */ = {
|
||||
2FD21F0625A363AA00F556E0 /* Embed Foundation Extensions */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 12;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 13;
|
||||
files = (
|
||||
2FD21F1625A363E300F556E0 /* PacketTunnel.appex in Embed App Extensions */,
|
||||
2FD21F1625A363E300F556E0 /* PacketTunnel.appex in Embed Foundation Extensions */,
|
||||
);
|
||||
name = "Embed App Extensions";
|
||||
name = "Embed Foundation Extensions";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
|
||||
@@ -122,7 +124,9 @@
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
C00A39D82C3E5F9D004E31E4 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
C09CB07F2C50A09A0028C461 /* TESWT.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TESWT.h; sourceTree = "<group>"; };
|
||||
C09CB0802C50A09A0028C461 /* TESWT.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TESWT.m; sourceTree = "<group>"; };
|
||||
C09CB0832C50A0DD0028C461 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
C0CB10F52C3275EE00A1F217 /* leaf.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = leaf.xcframework; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
@@ -143,6 +147,7 @@
|
||||
C0CB10F62C3275EE00A1F217 /* leaf.xcframework in Frameworks */,
|
||||
2FD21F2425A364B700F556E0 /* NetworkExtension.framework in Frameworks */,
|
||||
DBC6F25A26C78B1D91884CE1 /* Pods_Runner.framework in Frameworks */,
|
||||
E2B5FEC68AAAE043A3080A59 /* Pods_Runner.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -235,7 +240,9 @@
|
||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
|
||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
|
||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
|
||||
C00A39D82C3E5F9D004E31E4 /* Runner-Bridging-Header.h */,
|
||||
C09CB0832C50A0DD0028C461 /* Runner-Bridging-Header.h */,
|
||||
C09CB07F2C50A09A0028C461 /* TESWT.h */,
|
||||
C09CB0802C50A09A0028C461 /* TESWT.m */,
|
||||
);
|
||||
path = Runner;
|
||||
sourceTree = "<group>";
|
||||
@@ -277,7 +284,7 @@
|
||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||
buildPhases = (
|
||||
4A4528B4E4B302F57B5EDB65 /* [CP] Check Pods Manifest.lock */,
|
||||
2FD21F0625A363AA00F556E0 /* Embed App Extensions */,
|
||||
2FD21F0625A363AA00F556E0 /* Embed Foundation Extensions */,
|
||||
97C146EA1CF9000F007C117D /* Sources */,
|
||||
97C146EB1CF9000F007C117D /* Frameworks */,
|
||||
97C146EC1CF9000F007C117D /* Resources */,
|
||||
@@ -302,6 +309,7 @@
|
||||
97C146E61CF9000F007C117D /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
BuildIndependentTargetsInParallel = YES;
|
||||
LastSwiftUpdateCheck = 1230;
|
||||
LastUpgradeCheck = 1510;
|
||||
ORGANIZATIONNAME = "";
|
||||
@@ -454,6 +462,7 @@
|
||||
3EA6B280293F6AB900B2BABC /* URL+Helpers.swift in Sources */,
|
||||
3EA6B27F293F6AB500B2BABC /* FileManager+Helpers.swift in Sources */,
|
||||
3EA6B27C293F68B500B2BABC /* VPNManager.swift in Sources */,
|
||||
C09CB0812C50A09A0028C461 /* TESWT.m in Sources */,
|
||||
3E06F989293FAFC600E04D92 /* LeafAdapter.swift in Sources */,
|
||||
3E06F985293FACBB00E04D92 /* PacketTunnelProvider.swift in Sources */,
|
||||
3E06F98C293FB8F600E04D92 /* TunnelConfiguration.swift in Sources */,
|
||||
@@ -514,6 +523,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;
|
||||
@@ -525,6 +535,7 @@
|
||||
ENABLE_BITCODE = NO;
|
||||
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;
|
||||
@@ -582,7 +593,6 @@
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
|
||||
SWIFT_INCLUDE_PATHS = "";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
@@ -735,6 +745,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;
|
||||
@@ -746,6 +757,7 @@
|
||||
ENABLE_BITCODE = NO;
|
||||
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;
|
||||
@@ -793,6 +805,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;
|
||||
@@ -804,6 +817,7 @@
|
||||
ENABLE_BITCODE = NO;
|
||||
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;
|
||||
@@ -863,7 +877,6 @@
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
|
||||
SWIFT_INCLUDE_PATHS = "";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
@@ -909,7 +922,6 @@
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
|
||||
SWIFT_INCLUDE_PATHS = "";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
<?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>PreviewsEnabled</key>
|
||||
<false/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,12 +1 @@
|
||||
//
|
||||
// Runner-Bridging-Header.h
|
||||
// Runner
|
||||
//
|
||||
// Created by Zeus on 2024/7/10.
|
||||
//
|
||||
|
||||
#ifndef Runner_Bridging_Header_h
|
||||
#define Runner_Bridging_Header_h
|
||||
|
||||
#import "GeneratedPluginRegistrant.h"
|
||||
#endif /* Runner_Bridging_Header_h */
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// TESWT.h
|
||||
// Runner
|
||||
//
|
||||
// Created by Zeus on 2024/7/24.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface TESWT : NSObject
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@@ -0,0 +1,12 @@
|
||||
//
|
||||
// TESWT.m
|
||||
// Runner
|
||||
//
|
||||
// Created by Zeus on 2024/7/24.
|
||||
//
|
||||
|
||||
#import "TESWT.h"
|
||||
|
||||
@implementation TESWT
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,119 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
* No error.
|
||||
*/
|
||||
#define ERR_OK 0
|
||||
|
||||
/**
|
||||
* Config path error.
|
||||
*/
|
||||
#define ERR_CONFIG_PATH 1
|
||||
|
||||
/**
|
||||
* Config parsing error.
|
||||
*/
|
||||
#define ERR_CONFIG 2
|
||||
|
||||
/**
|
||||
* IO error.
|
||||
*/
|
||||
#define ERR_IO 3
|
||||
|
||||
/**
|
||||
* Config file watcher error.
|
||||
*/
|
||||
#define ERR_WATCHER 4
|
||||
|
||||
/**
|
||||
* Async channel send error.
|
||||
*/
|
||||
#define ERR_ASYNC_CHANNEL_SEND 5
|
||||
|
||||
/**
|
||||
* Sync channel receive error.
|
||||
*/
|
||||
#define ERR_SYNC_CHANNEL_RECV 6
|
||||
|
||||
/**
|
||||
* Runtime manager error.
|
||||
*/
|
||||
#define ERR_RUNTIME_MANAGER 7
|
||||
|
||||
/**
|
||||
* No associated config file.
|
||||
*/
|
||||
#define ERR_NO_CONFIG_FILE 8
|
||||
|
||||
/**
|
||||
* Starts leaf with options, on a successful start this function blocks the current
|
||||
* thread.
|
||||
*
|
||||
* @note This is not a stable API, parameters will change from time to time.
|
||||
*
|
||||
* @param rt_id A unique ID to associate this leaf instance, this is required when
|
||||
* calling subsequent FFI functions, e.g. reload, shutdown.
|
||||
* @param config_path The path of the config file, must be a file with suffix .conf
|
||||
* or .json, according to the enabled features.
|
||||
* @param auto_reload Enabls auto reloading when config file changes are detected,
|
||||
* takes effect only when the "auto-reload" feature is enabled.
|
||||
* @param multi_thread Whether to use a multi-threaded runtime.
|
||||
* @param auto_threads Sets the number of runtime worker threads automatically,
|
||||
* takes effect only when multi_thread is true.
|
||||
* @param threads Sets the number of runtime worker threads, takes effect when
|
||||
* multi_thread is true, but can be overridden by auto_threads.
|
||||
* @param stack_size Sets stack size of the runtime worker threads, takes effect when
|
||||
* multi_thread is true.
|
||||
* @return ERR_OK on finish running, any other errors means a startup failure.
|
||||
*/
|
||||
int32_t leaf_run_with_options(uint16_t rt_id,
|
||||
const char *config_path,
|
||||
bool auto_reload,
|
||||
bool multi_thread,
|
||||
bool auto_threads,
|
||||
int32_t threads,
|
||||
int32_t stack_size);
|
||||
|
||||
/**
|
||||
* Starts leaf with a single-threaded runtime, on a successful start this function
|
||||
* blocks the current thread.
|
||||
*
|
||||
* @param rt_id A unique ID to associate this leaf instance, this is required when
|
||||
* calling subsequent FFI functions, e.g. reload, shutdown.
|
||||
* @param config_path The path of the config file, must be a file with suffix .conf
|
||||
* or .json, according to the enabled features.
|
||||
* @return ERR_OK on finish running, any other errors means a startup failure.
|
||||
*/
|
||||
int32_t leaf_run(uint16_t rt_id, const char *config_path);
|
||||
|
||||
int32_t leaf_run_with_config_string(uint16_t rt_id, const char *config);
|
||||
|
||||
/**
|
||||
* Reloads DNS servers, outbounds and routing rules from the config file.
|
||||
*
|
||||
* @param rt_id The ID of the leaf instance to reload.
|
||||
*
|
||||
* @return Returns ERR_OK on success.
|
||||
*/
|
||||
int32_t leaf_reload(uint16_t rt_id);
|
||||
|
||||
/**
|
||||
* Shuts down leaf.
|
||||
*
|
||||
* @param rt_id The ID of the leaf instance to reload.
|
||||
*
|
||||
* @return Returns true on success, false otherwise.
|
||||
*/
|
||||
bool leaf_shutdown(uint16_t rt_id);
|
||||
|
||||
/**
|
||||
* Tests the configuration.
|
||||
*
|
||||
* @param config_path The path of the config file, must be a file with suffix .conf
|
||||
* or .json, according to the enabled features.
|
||||
* @return Returns ERR_OK on success, i.e no syntax error.
|
||||
*/
|
||||
int32_t leaf_test_config(const char *config_path);
|
||||
@@ -0,0 +1,4 @@
|
||||
module leaf {
|
||||
header "leaf.h"
|
||||
export *
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b096d095e15e182038fc425ded251522c6a8baa2eb2668d4636df54f5c9915e1
|
||||
size 244040104
|
||||
@@ -0,0 +1,119 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
* No error.
|
||||
*/
|
||||
#define ERR_OK 0
|
||||
|
||||
/**
|
||||
* Config path error.
|
||||
*/
|
||||
#define ERR_CONFIG_PATH 1
|
||||
|
||||
/**
|
||||
* Config parsing error.
|
||||
*/
|
||||
#define ERR_CONFIG 2
|
||||
|
||||
/**
|
||||
* IO error.
|
||||
*/
|
||||
#define ERR_IO 3
|
||||
|
||||
/**
|
||||
* Config file watcher error.
|
||||
*/
|
||||
#define ERR_WATCHER 4
|
||||
|
||||
/**
|
||||
* Async channel send error.
|
||||
*/
|
||||
#define ERR_ASYNC_CHANNEL_SEND 5
|
||||
|
||||
/**
|
||||
* Sync channel receive error.
|
||||
*/
|
||||
#define ERR_SYNC_CHANNEL_RECV 6
|
||||
|
||||
/**
|
||||
* Runtime manager error.
|
||||
*/
|
||||
#define ERR_RUNTIME_MANAGER 7
|
||||
|
||||
/**
|
||||
* No associated config file.
|
||||
*/
|
||||
#define ERR_NO_CONFIG_FILE 8
|
||||
|
||||
/**
|
||||
* Starts leaf with options, on a successful start this function blocks the current
|
||||
* thread.
|
||||
*
|
||||
* @note This is not a stable API, parameters will change from time to time.
|
||||
*
|
||||
* @param rt_id A unique ID to associate this leaf instance, this is required when
|
||||
* calling subsequent FFI functions, e.g. reload, shutdown.
|
||||
* @param config_path The path of the config file, must be a file with suffix .conf
|
||||
* or .json, according to the enabled features.
|
||||
* @param auto_reload Enabls auto reloading when config file changes are detected,
|
||||
* takes effect only when the "auto-reload" feature is enabled.
|
||||
* @param multi_thread Whether to use a multi-threaded runtime.
|
||||
* @param auto_threads Sets the number of runtime worker threads automatically,
|
||||
* takes effect only when multi_thread is true.
|
||||
* @param threads Sets the number of runtime worker threads, takes effect when
|
||||
* multi_thread is true, but can be overridden by auto_threads.
|
||||
* @param stack_size Sets stack size of the runtime worker threads, takes effect when
|
||||
* multi_thread is true.
|
||||
* @return ERR_OK on finish running, any other errors means a startup failure.
|
||||
*/
|
||||
int32_t leaf_run_with_options(uint16_t rt_id,
|
||||
const char *config_path,
|
||||
bool auto_reload,
|
||||
bool multi_thread,
|
||||
bool auto_threads,
|
||||
int32_t threads,
|
||||
int32_t stack_size);
|
||||
|
||||
/**
|
||||
* Starts leaf with a single-threaded runtime, on a successful start this function
|
||||
* blocks the current thread.
|
||||
*
|
||||
* @param rt_id A unique ID to associate this leaf instance, this is required when
|
||||
* calling subsequent FFI functions, e.g. reload, shutdown.
|
||||
* @param config_path The path of the config file, must be a file with suffix .conf
|
||||
* or .json, according to the enabled features.
|
||||
* @return ERR_OK on finish running, any other errors means a startup failure.
|
||||
*/
|
||||
int32_t leaf_run(uint16_t rt_id, const char *config_path);
|
||||
|
||||
int32_t leaf_run_with_config_string(uint16_t rt_id, const char *config);
|
||||
|
||||
/**
|
||||
* Reloads DNS servers, outbounds and routing rules from the config file.
|
||||
*
|
||||
* @param rt_id The ID of the leaf instance to reload.
|
||||
*
|
||||
* @return Returns ERR_OK on success.
|
||||
*/
|
||||
int32_t leaf_reload(uint16_t rt_id);
|
||||
|
||||
/**
|
||||
* Shuts down leaf.
|
||||
*
|
||||
* @param rt_id The ID of the leaf instance to reload.
|
||||
*
|
||||
* @return Returns true on success, false otherwise.
|
||||
*/
|
||||
bool leaf_shutdown(uint16_t rt_id);
|
||||
|
||||
/**
|
||||
* Tests the configuration.
|
||||
*
|
||||
* @param config_path The path of the config file, must be a file with suffix .conf
|
||||
* or .json, according to the enabled features.
|
||||
* @return Returns ERR_OK on success, i.e no syntax error.
|
||||
*/
|
||||
int32_t leaf_test_config(const char *config_path);
|
||||
@@ -0,0 +1,4 @@
|
||||
module leaf {
|
||||
header "leaf.h"
|
||||
export *
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ac6fe5534179bc17f4c486b3964a06e99e6a4902247694137ff1ea534472ac36
|
||||
size 246092480
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:sail/channels/Platform.dart';
|
||||
import 'package:sail/utils/common_util.dart';
|
||||
import 'package:uuvpn/channels/Platform.dart';
|
||||
import 'package:uuvpn/utils/common_util.dart';
|
||||
|
||||
enum VpnStatus {
|
||||
connected(code: 2),
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*后台接口api*/
|
||||
import 'package:sail/common/public.dart';
|
||||
import 'package:uuvpn/common/public.dart';
|
||||
|
||||
class Apis {
|
||||
static String appid = "IPOSih2134KHJKLDIO";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'dart:async';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:sail/common/public.dart';
|
||||
import 'package:uuvpn/common/public.dart';
|
||||
import 'error_interceptor.dart';
|
||||
|
||||
class Http {
|
||||
@@ -19,9 +19,9 @@ class Http {
|
||||
if (dio == null) {
|
||||
// BaseOptions、Options、RequestOptions 都可以配置参数,优先级别依次递增,且可以根据优先级别覆盖参数
|
||||
BaseOptions options = new BaseOptions(
|
||||
connectTimeout: CONNECT_TIMEOUT,
|
||||
connectTimeout: Duration(seconds: CONNECT_TIMEOUT),
|
||||
// 响应流上前后两次接受到数据的间隔,单位为毫秒。
|
||||
receiveTimeout: RECEIVE_TIMEOUT,
|
||||
receiveTimeout: Duration(seconds: RECEIVE_TIMEOUT),
|
||||
headers: {},
|
||||
);
|
||||
if (options.contentType != null &&
|
||||
@@ -64,8 +64,8 @@ class Http {
|
||||
List<Interceptor>? interceptors}) {
|
||||
dio!.options = dio!.options.copyWith(
|
||||
baseUrl: baseUrl,
|
||||
connectTimeout: connectTimeout,
|
||||
receiveTimeout: receiveTimeout,
|
||||
connectTimeout: Duration(seconds: connectTimeout ?? 0),
|
||||
receiveTimeout: Duration(seconds: receiveTimeout ?? 0),
|
||||
);
|
||||
if (interceptors != null && interceptors.isNotEmpty) {
|
||||
dio!.interceptors.addAll(interceptors);
|
||||
|
||||
@@ -14,9 +14,9 @@ class DioHttpException implements Exception {
|
||||
return "$code$message";
|
||||
}
|
||||
|
||||
factory DioHttpException.create(DioError error) {
|
||||
factory DioHttpException.create(DioException error) {
|
||||
switch (error.type) {
|
||||
case DioErrorType.other:
|
||||
case DioExceptionType.unknown:
|
||||
{
|
||||
// 网络异常
|
||||
return BadRequestException(-2, "无网络");
|
||||
@@ -27,7 +27,7 @@ class DioHttpException implements Exception {
|
||||
return BadRequestException(-1, "请求取消");
|
||||
}
|
||||
|
||||
case DioErrorType.connectTimeout:
|
||||
case DioErrorType.connectionTimeout:
|
||||
{
|
||||
return BadRequestException(-1, "连接超时");
|
||||
}
|
||||
@@ -42,7 +42,7 @@ class DioHttpException implements Exception {
|
||||
return BadRequestException(-1, "响应超时");
|
||||
}
|
||||
|
||||
case DioErrorType.response:
|
||||
case DioErrorType.badResponse:
|
||||
{
|
||||
try {
|
||||
int? errCode = error.response!.statusCode;
|
||||
|
||||
@@ -3,16 +3,16 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart' as services;
|
||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:sail/constant/app_strings.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
import 'package:uuvpn/constant/app_strings.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sail/models/app_model.dart';
|
||||
import 'package:sail/models/plan_model.dart';
|
||||
import 'package:sail/models/server_model.dart';
|
||||
import 'package:sail/models/user_subscribe_model.dart';
|
||||
import 'package:sail/router/application.dart';
|
||||
import 'package:sail/router/routers.dart';
|
||||
import 'package:sail/models/user_model.dart';
|
||||
import 'package:uuvpn/models/app_model.dart';
|
||||
import 'package:uuvpn/models/plan_model.dart';
|
||||
import 'package:uuvpn/models/server_model.dart';
|
||||
import 'package:uuvpn/models/user_subscribe_model.dart';
|
||||
import 'package:uuvpn/router/application.dart';
|
||||
import 'package:uuvpn/router/routers.dart';
|
||||
import 'package:uuvpn/models/user_model.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
|
||||
import 'model/UserPreference.dart';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// ignore_for_file: file_names
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sail/resources/app_theme.dart';
|
||||
import 'package:uuvpn/resources/app_theme.dart';
|
||||
|
||||
class ThemeCollection extends ChangeNotifier {
|
||||
/// _colorSwatch method or function take RGB color as argument and after processing
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:fluttertoast/fluttertoast.dart';
|
||||
import 'package:sail/adapters/leaf_ffi/config.dart';
|
||||
import 'package:sail/channels/Platform.dart';
|
||||
import 'package:sail/channels/vpn_manager.dart';
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:sail/constant/app_strings.dart';
|
||||
import 'package:sail/models/base_model.dart';
|
||||
import 'package:sail/models/server_model.dart';
|
||||
import 'package:sail/models/user_model.dart';
|
||||
import 'package:sail/utils/common_util.dart';
|
||||
import 'package:uuvpn/adapters/leaf_ffi/config.dart';
|
||||
import 'package:uuvpn/channels/Platform.dart';
|
||||
import 'package:uuvpn/channels/vpn_manager.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
import 'package:uuvpn/constant/app_strings.dart';
|
||||
import 'package:uuvpn/models/base_model.dart';
|
||||
import 'package:uuvpn/models/server_model.dart';
|
||||
import 'package:uuvpn/models/user_model.dart';
|
||||
import 'package:uuvpn/utils/common_util.dart';
|
||||
|
||||
class AppModel extends BaseModel {
|
||||
VpnManager vpnManager = VpnManager();
|
||||
@@ -174,17 +174,17 @@ class AppModel extends BaseModel {
|
||||
|
||||
void setConfigRule(String tag) async {
|
||||
var proxy = config.proxies?.where((proxies) => proxies.tag == tag);
|
||||
|
||||
|
||||
if (proxy == null || proxy.isEmpty) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
config.rules?.last.target = tag;
|
||||
|
||||
|
||||
print("-----------------config-----------------");
|
||||
print(config);
|
||||
print("-----------------config-----------------");
|
||||
|
||||
|
||||
vpnManager.setTunnelConfiguration(config.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sail/models/page_state.dart';
|
||||
import 'package:sail/utils/common_util.dart';
|
||||
import 'package:uuvpn/models/page_state.dart';
|
||||
import 'package:uuvpn/utils/common_util.dart';
|
||||
|
||||
class BaseModel extends ChangeNotifier {
|
||||
PageState pageState = PageState.loading;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:sail/models/base_model.dart';
|
||||
import 'package:sail/models/user_model.dart';
|
||||
import 'package:sail/service/user_service.dart';
|
||||
import 'package:uuvpn/models/base_model.dart';
|
||||
import 'package:uuvpn/models/user_model.dart';
|
||||
import 'package:uuvpn/service/user_service.dart';
|
||||
|
||||
class LoginModel extends BaseModel {
|
||||
final UserService _userService = UserService();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:sail/entity/plan_entity.dart';
|
||||
import 'package:sail/models/base_model.dart';
|
||||
import 'package:sail/service/plan_service.dart';
|
||||
import 'package:uuvpn/entity/plan_entity.dart';
|
||||
import 'package:uuvpn/models/base_model.dart';
|
||||
import 'package:uuvpn/service/plan_service.dart';
|
||||
|
||||
class PlanModel extends BaseModel {
|
||||
final PlanService _planService = PlanService();
|
||||
|
||||
@@ -2,12 +2,12 @@ import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter_icmp_ping/flutter_icmp_ping.dart';
|
||||
import 'package:sail/constant/app_strings.dart';
|
||||
import 'package:sail/entity/server_entity.dart';
|
||||
import 'package:sail/models/base_model.dart';
|
||||
import 'package:sail/service/server_service.dart';
|
||||
import 'package:sail/utils/shared_preferences_util.dart';
|
||||
import 'package:sail/utils/common_util.dart';
|
||||
import 'package:uuvpn/constant/app_strings.dart';
|
||||
import 'package:uuvpn/entity/server_entity.dart';
|
||||
import 'package:uuvpn/models/base_model.dart';
|
||||
import 'package:uuvpn/service/server_service.dart';
|
||||
import 'package:uuvpn/utils/shared_preferences_util.dart';
|
||||
import 'package:uuvpn/utils/common_util.dart';
|
||||
|
||||
enum PingType { ping, tcp }
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import 'package:sail/constant/app_strings.dart';
|
||||
import 'package:sail/entity/login_entity.dart';
|
||||
import 'package:sail/entity/user_entity.dart';
|
||||
import 'package:sail/models/base_model.dart';
|
||||
import 'package:sail/utils/navigator_util.dart';
|
||||
import 'package:sail/utils/shared_preferences_util.dart';
|
||||
import 'package:uuvpn/constant/app_strings.dart';
|
||||
import 'package:uuvpn/entity/login_entity.dart';
|
||||
import 'package:uuvpn/entity/user_entity.dart';
|
||||
import 'package:uuvpn/models/base_model.dart';
|
||||
import 'package:uuvpn/utils/navigator_util.dart';
|
||||
import 'package:uuvpn/utils/shared_preferences_util.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
class UserModel extends BaseModel {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import 'package:sail/constant/app_strings.dart';
|
||||
import 'package:sail/entity/user_subscribe_entity.dart';
|
||||
import 'package:sail/models/base_model.dart';
|
||||
import 'package:sail/service/user_service.dart';
|
||||
import 'package:sail/utils/shared_preferences_util.dart';
|
||||
import 'package:uuvpn/constant/app_strings.dart';
|
||||
import 'package:uuvpn/entity/user_subscribe_entity.dart';
|
||||
import 'package:uuvpn/models/base_model.dart';
|
||||
import 'package:uuvpn/service/user_service.dart';
|
||||
import 'package:uuvpn/utils/shared_preferences_util.dart';
|
||||
|
||||
class UserSubscribeModel extends BaseModel {
|
||||
UserSubscribeEntity? _userSubscribeEntity;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sail/constant/app_images.dart';
|
||||
import 'package:sail/constant/app_strings.dart';
|
||||
|
||||
import 'package:uuvpn/constant/app_images.dart';
|
||||
import 'package:uuvpn/constant/app_strings.dart';
|
||||
|
||||
class NotFindPage extends StatelessWidget {
|
||||
const NotFindPage({Key? key}) : super(key: key);
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
//ProOnecePage.dart
|
||||
//ignore_for_file: file_names
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:sail/router/application.dart';
|
||||
import 'package:sail/utils/l10n.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
import 'package:uuvpn/router/application.dart';
|
||||
import 'package:uuvpn/utils/l10n.dart';
|
||||
|
||||
import '/model/themeCollection.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
//ignore_for_file: file_names
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:sail/models/app_model.dart';
|
||||
import 'package:sail/models/plan_model.dart';
|
||||
import 'package:sail/models/user_model.dart';
|
||||
import 'package:sail/models/user_subscribe_model.dart';
|
||||
import 'package:sail/utils/l10n.dart';
|
||||
import 'package:sail/utils/navigator_util.dart';
|
||||
import 'package:sail/widgets/logo_bar.dart';
|
||||
import 'package:sail/widgets/my_subscribe.dart';
|
||||
import 'package:sail/widgets/plan_list.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
import 'package:uuvpn/models/app_model.dart';
|
||||
import 'package:uuvpn/models/plan_model.dart';
|
||||
import 'package:uuvpn/models/user_model.dart';
|
||||
import 'package:uuvpn/models/user_subscribe_model.dart';
|
||||
import 'package:uuvpn/utils/l10n.dart';
|
||||
import 'package:uuvpn/utils/navigator_util.dart';
|
||||
import 'package:uuvpn/widgets/logo_bar.dart';
|
||||
import 'package:uuvpn/widgets/my_subscribe.dart';
|
||||
import 'package:uuvpn/widgets/plan_list.dart';
|
||||
|
||||
import '/routes/proRoute.dart';
|
||||
import '/routes/settingsRoute.dart';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:crisp/crisp.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:sail/constant/app_strings.dart';
|
||||
import 'package:uuvpn/constant/app_strings.dart';
|
||||
|
||||
class CrispPage extends StatefulWidget {
|
||||
const CrispPage({Key? key}) : super(key: key);
|
||||
|
||||
@@ -5,31 +5,31 @@ import 'package:flutter/services.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:sail/constant/app_dimens.dart';
|
||||
import 'package:sail/model/themeCollection.dart';
|
||||
import 'package:sail/models/app_model.dart';
|
||||
import 'package:sail/models/plan_model.dart';
|
||||
import 'package:sail/models/server_model.dart';
|
||||
import 'package:sail/models/user_model.dart';
|
||||
import 'package:sail/models/user_subscribe_model.dart';
|
||||
import 'package:sail/pages/accountPage.dart';
|
||||
import 'package:sail/pages/homePage.dart';
|
||||
import 'package:sail/pages/my_profile.dart';
|
||||
import 'package:sail/pages/plan/plan_page.dart';
|
||||
import 'package:sail/pages/proPage.dart';
|
||||
import 'package:sail/pages/server_list.dart';
|
||||
import 'package:sail/router/application.dart';
|
||||
import 'package:sail/routes/OnceNotice.dart';
|
||||
import 'package:sail/routes/proRoute.dart';
|
||||
import 'package:sail/utils/l10n.dart';
|
||||
import 'package:sail/utils/message_util.dart';
|
||||
import 'package:sail/utils/navigator_util.dart';
|
||||
import 'package:sail/widgets/ProgressView.dart';
|
||||
import 'package:sail/widgets/home_widget.dart';
|
||||
import 'package:sail/widgets/power_btn.dart';
|
||||
import 'package:sail/widgets/sail_app_bar.dart';
|
||||
import 'package:sail/utils/common_util.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
import 'package:uuvpn/constant/app_dimens.dart';
|
||||
import 'package:uuvpn/model/themeCollection.dart';
|
||||
import 'package:uuvpn/models/app_model.dart';
|
||||
import 'package:uuvpn/models/plan_model.dart';
|
||||
import 'package:uuvpn/models/server_model.dart';
|
||||
import 'package:uuvpn/models/user_model.dart';
|
||||
import 'package:uuvpn/models/user_subscribe_model.dart';
|
||||
import 'package:uuvpn/pages/accountPage.dart';
|
||||
import 'package:uuvpn/pages/homePage.dart';
|
||||
import 'package:uuvpn/pages/my_profile.dart';
|
||||
import 'package:uuvpn/pages/plan/plan_page.dart';
|
||||
import 'package:uuvpn/pages/proPage.dart';
|
||||
import 'package:uuvpn/pages/server_list.dart';
|
||||
import 'package:uuvpn/router/application.dart';
|
||||
import 'package:uuvpn/routes/OnceNotice.dart';
|
||||
import 'package:uuvpn/routes/proRoute.dart';
|
||||
import 'package:uuvpn/utils/l10n.dart';
|
||||
import 'package:uuvpn/utils/message_util.dart';
|
||||
import 'package:uuvpn/utils/navigator_util.dart';
|
||||
import 'package:uuvpn/widgets/ProgressView.dart';
|
||||
import 'package:uuvpn/widgets/home_widget.dart';
|
||||
import 'package:uuvpn/widgets/power_btn.dart';
|
||||
import 'package:uuvpn/widgets/sail_app_bar.dart';
|
||||
import 'package:uuvpn/utils/common_util.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
|
||||
|
||||
@@ -2,14 +2,14 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_login/flutter_login.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sail/model/themeCollection.dart';
|
||||
import 'package:sail/models/login_model.dart';
|
||||
import 'package:sail/models/user_model.dart';
|
||||
import 'package:sail/router/application.dart';
|
||||
import 'package:sail/service/user_service.dart';
|
||||
import 'package:sail/utils/l10n.dart';
|
||||
import 'package:sail/utils/navigator_util.dart';
|
||||
import 'package:sail/constant/app_strings.dart';
|
||||
import 'package:uuvpn/model/themeCollection.dart';
|
||||
import 'package:uuvpn/models/login_model.dart';
|
||||
import 'package:uuvpn/models/user_model.dart';
|
||||
import 'package:uuvpn/router/application.dart';
|
||||
import 'package:uuvpn/service/user_service.dart';
|
||||
import 'package:uuvpn/utils/l10n.dart';
|
||||
import 'package:uuvpn/utils/navigator_util.dart';
|
||||
import 'package:uuvpn/constant/app_strings.dart';
|
||||
|
||||
class LoginPage extends StatefulWidget {
|
||||
const LoginPage({Key? key}) : super(key: key);
|
||||
|
||||
@@ -2,12 +2,12 @@ import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sail/models/user_model.dart';
|
||||
import 'package:sail/service/user_service.dart';
|
||||
import 'package:sail/utils/l10n.dart';
|
||||
import 'package:sail/utils/navigator_util.dart';
|
||||
import 'package:sail/widgets/bottom_block.dart';
|
||||
import 'package:sail/widgets/profile_widget.dart';
|
||||
import 'package:uuvpn/models/user_model.dart';
|
||||
import 'package:uuvpn/service/user_service.dart';
|
||||
import 'package:uuvpn/utils/l10n.dart';
|
||||
import 'package:uuvpn/utils/navigator_util.dart';
|
||||
import 'package:uuvpn/widgets/bottom_block.dart';
|
||||
import 'package:uuvpn/widgets/profile_widget.dart';
|
||||
|
||||
class MyProfile extends StatefulWidget {
|
||||
const MyProfile({Key? key}) : super(key: key);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:sail/widgets/sliding_cards.dart';
|
||||
import 'package:uuvpn/widgets/sliding_cards.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class PlanPage extends StatelessWidget {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
//ignore_for_file: file_names
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:sail/router/application.dart';
|
||||
import 'package:sail/utils/l10n.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
import 'package:uuvpn/router/application.dart';
|
||||
import 'package:uuvpn/utils/l10n.dart';
|
||||
|
||||
import '/model/themeCollection.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
@@ -2,13 +2,13 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:sail/model/themeCollection.dart';
|
||||
import 'package:sail/models/app_model.dart';
|
||||
import 'package:sail/models/server_model.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
import 'package:uuvpn/model/themeCollection.dart';
|
||||
import 'package:uuvpn/models/app_model.dart';
|
||||
import 'package:uuvpn/models/server_model.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sail/utils/common_util.dart';
|
||||
import 'package:sail/utils/l10n.dart';
|
||||
import 'package:uuvpn/utils/common_util.dart';
|
||||
import 'package:uuvpn/utils/l10n.dart';
|
||||
|
||||
class ServerListPage extends StatefulWidget {
|
||||
const ServerListPage({Key? key}) : super(key: key);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sail/constant/app_strings.dart';
|
||||
import 'package:uuvpn/constant/app_strings.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
|
||||
class WebViewWidget extends StatefulWidget {
|
||||
@@ -37,7 +37,8 @@ class WebViewWidgetState extends State<WebViewWidget> {
|
||||
centerTitle: true,
|
||||
),
|
||||
body: WebView(
|
||||
initialUrl: widget.url?.isEmpty == true ? AppStrings.appName : widget.url,
|
||||
initialUrl:
|
||||
widget.url?.isEmpty == true ? AppStrings.appName : widget.url,
|
||||
javascriptMode: JavascriptMode.unrestricted,
|
||||
onWebViewCreated: (controller) => this.controller = controller,
|
||||
onPageFinished: (url) {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:sail/resources/app_colors.dart';
|
||||
import 'package:sail/resources/app_typography.dart';
|
||||
import 'package:uuvpn/resources/app_colors.dart';
|
||||
import 'package:uuvpn/resources/app_typography.dart';
|
||||
|
||||
ThemeData getApplicationTheme() {
|
||||
return ThemeData(
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'package:fluro/fluro.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sail/utils/l10n.dart';
|
||||
import 'package:uuvpn/utils/l10n.dart';
|
||||
|
||||
class Application {
|
||||
static FluroRouter? router;
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import 'package:fluro/fluro.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sail/pages/accountPage.dart';
|
||||
import 'package:sail/pages/home/home_page.dart';
|
||||
import 'package:sail/pages/404/not_find_page.dart';
|
||||
import 'package:sail/pages/login/login_page.dart';
|
||||
import 'package:sail/pages/plan/plan_page.dart';
|
||||
import 'package:sail/pages/server_list.dart';
|
||||
import 'package:sail/pages/webview_widget.dart';
|
||||
import 'package:uuvpn/pages/accountPage.dart';
|
||||
import 'package:uuvpn/pages/home/home_page.dart';
|
||||
import 'package:uuvpn/pages/404/not_find_page.dart';
|
||||
import 'package:uuvpn/pages/login/login_page.dart';
|
||||
import 'package:uuvpn/pages/plan/plan_page.dart';
|
||||
import 'package:uuvpn/pages/server_list.dart';
|
||||
import 'package:uuvpn/pages/webview_widget.dart';
|
||||
import 'dart:convert';
|
||||
|
||||
/// 入口
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:fluro/fluro.dart';
|
||||
import 'package:sail/router/router_handlers.dart';
|
||||
import 'package:uuvpn/router/router_handlers.dart';
|
||||
|
||||
class Routers {
|
||||
static String home = "/";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// OnceNotice.dart
|
||||
//ignore_for_file: file_names
|
||||
import 'package:sail/pages/ProOnecePage.dart';
|
||||
import 'package:uuvpn/pages/ProOnecePage.dart';
|
||||
|
||||
import '/pages/proPage.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
//ignore_for_file: file_names
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:sail/models/user_model.dart';
|
||||
import 'package:sail/routes/proRoute.dart';
|
||||
import 'package:sail/utils/navigator_util.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
import 'package:uuvpn/models/user_model.dart';
|
||||
import 'package:uuvpn/routes/proRoute.dart';
|
||||
import 'package:uuvpn/utils/navigator_util.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
|
||||
import '../model/themeCollection.dart';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:sail/constant/app_urls.dart';
|
||||
import 'package:sail/entity/plan_entity.dart';
|
||||
import 'package:sail/utils/http_util.dart';
|
||||
import 'package:uuvpn/constant/app_urls.dart';
|
||||
import 'package:uuvpn/entity/plan_entity.dart';
|
||||
import 'package:uuvpn/utils/http_util.dart';
|
||||
|
||||
class PlanService {
|
||||
Future<List<PlanEntity>>? plan() {
|
||||
@@ -10,7 +10,8 @@ class PlanService {
|
||||
}
|
||||
|
||||
Future<PlanEntity>? planDetail(int id) {
|
||||
return HttpUtil.instance?.get(AppUrls.plan, parameters: {'id': id}).then((result) {
|
||||
return HttpUtil.instance
|
||||
?.get(AppUrls.plan, parameters: {'id': id}).then((result) {
|
||||
return PlanEntity.fromMap(result['data']);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:sail/constant/app_urls.dart';
|
||||
import 'package:sail/entity/server_entity.dart';
|
||||
import 'package:sail/utils/http_util.dart';
|
||||
import 'package:uuvpn/constant/app_urls.dart';
|
||||
import 'package:uuvpn/entity/server_entity.dart';
|
||||
import 'package:uuvpn/utils/http_util.dart';
|
||||
|
||||
class ServerService {
|
||||
Future<List<ServerEntity>> server() {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import 'package:sail/constant/app_urls.dart';
|
||||
import 'package:sail/entity/login_entity.dart';
|
||||
import 'package:sail/entity/user_entity.dart';
|
||||
import 'package:sail/entity/user_subscribe_entity.dart';
|
||||
import 'package:sail/utils/http_util.dart';
|
||||
import 'package:uuvpn/constant/app_urls.dart';
|
||||
import 'package:uuvpn/entity/login_entity.dart';
|
||||
import 'package:uuvpn/entity/user_entity.dart';
|
||||
import 'package:uuvpn/entity/user_subscribe_entity.dart';
|
||||
import 'package:uuvpn/utils/http_util.dart';
|
||||
|
||||
class UserService {
|
||||
Future<LoginEntity>? login(Map<String, dynamic> parameters) {
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:sail/constant/app_strings.dart';
|
||||
import 'package:sail/router/application.dart';
|
||||
import 'package:sail/router/routers.dart';
|
||||
import 'package:sail/utils/common_util.dart';
|
||||
import 'package:sail/utils/shared_preferences_util.dart';
|
||||
import 'package:uuvpn/constant/app_strings.dart';
|
||||
import 'package:uuvpn/router/application.dart';
|
||||
import 'package:uuvpn/router/routers.dart';
|
||||
import 'package:uuvpn/utils/common_util.dart';
|
||||
import 'package:uuvpn/utils/shared_preferences_util.dart';
|
||||
|
||||
class HttpUtil {
|
||||
static HttpUtil get instance => _httpUtil;
|
||||
@@ -12,8 +12,8 @@ class HttpUtil {
|
||||
|
||||
HttpUtil() {
|
||||
BaseOptions options = BaseOptions(
|
||||
connectTimeout: 10000,
|
||||
receiveTimeout: 10000,
|
||||
connectTimeout: Duration(seconds: 10000),
|
||||
receiveTimeout: Duration(seconds: 10000),
|
||||
);
|
||||
dio = Dio(options);
|
||||
dio.interceptors
|
||||
@@ -53,10 +53,10 @@ class HttpUtil {
|
||||
Application.navigatorKey.currentState?.pushNamed(Routers.login);
|
||||
}
|
||||
|
||||
return handler.reject(DioError(
|
||||
return handler.reject(DioException(
|
||||
requestOptions: response.requestOptions,
|
||||
response: response,
|
||||
type: DioErrorType.response));
|
||||
type: DioExceptionType.badResponse));
|
||||
}
|
||||
|
||||
return handler.next(response);
|
||||
|
||||
@@ -4,12 +4,12 @@ import 'package:fluro/fluro.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
|
||||
import 'package:sail/pages/accountPage.dart';
|
||||
import 'package:sail/pages/crisp_page.dart';
|
||||
import 'package:sail/pages/plan/plan_page.dart';
|
||||
import 'package:sail/pages/server_list.dart';
|
||||
import 'package:sail/router/application.dart';
|
||||
import 'package:sail/router/routers.dart';
|
||||
import 'package:uuvpn/pages/accountPage.dart';
|
||||
import 'package:uuvpn/pages/crisp_page.dart';
|
||||
import 'package:uuvpn/pages/plan/plan_page.dart';
|
||||
import 'package:uuvpn/pages/server_list.dart';
|
||||
import 'package:uuvpn/router/application.dart';
|
||||
import 'package:uuvpn/router/routers.dart';
|
||||
|
||||
class NavigatorUtil {
|
||||
static goHomePage(BuildContext context) {
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
// import 'package:sail/go_router.dart';
|
||||
// import 'package:uuvpn/go_router.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:sail/resources/app_colors.dart';
|
||||
import 'package:sail/resources/app_routes.dart';
|
||||
import 'package:sail/resources/app_values.dart';
|
||||
import 'package:uuvpn/resources/app_colors.dart';
|
||||
import 'package:uuvpn/resources/app_routes.dart';
|
||||
import 'package:uuvpn/resources/app_values.dart';
|
||||
|
||||
String getDate(String? date) {
|
||||
if (date == null || date.isEmpty) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
|
||||
class ProgressView extends StatelessWidget {
|
||||
const ProgressView({Key? key}) : super(key: key);
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sail/channels/Platform.dart';
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:sail/model/themeCollection.dart';
|
||||
import 'package:sail/models/app_model.dart';
|
||||
import 'package:sail/models/server_model.dart';
|
||||
import 'package:sail/models/user_model.dart';
|
||||
import 'package:sail/utils/l10n.dart';
|
||||
import 'package:sail/utils/navigator_util.dart';
|
||||
import 'package:uuvpn/channels/Platform.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
import 'package:uuvpn/model/themeCollection.dart';
|
||||
import 'package:uuvpn/models/app_model.dart';
|
||||
import 'package:uuvpn/models/server_model.dart';
|
||||
import 'package:uuvpn/models/user_model.dart';
|
||||
import 'package:uuvpn/utils/l10n.dart';
|
||||
import 'package:uuvpn/utils/navigator_util.dart';
|
||||
|
||||
class ConnectionStats extends StatefulWidget {
|
||||
const ConnectionStats({Key? key}) : super(key: key);
|
||||
|
||||
@@ -2,24 +2,24 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:sail/model/themeCollection.dart';
|
||||
import 'package:sail/models/app_model.dart';
|
||||
import 'package:sail/models/plan_model.dart';
|
||||
import 'package:sail/models/server_model.dart';
|
||||
import 'package:sail/models/user_model.dart';
|
||||
import 'package:sail/models/user_subscribe_model.dart';
|
||||
import 'package:sail/resources/app_colors.dart';
|
||||
import 'package:sail/utils/l10n.dart';
|
||||
import 'package:sail/widgets/bottom_block.dart';
|
||||
import 'package:sail/widgets/connection_stats.dart';
|
||||
import 'package:sail/widgets/logo_bar.dart';
|
||||
import 'package:sail/widgets/my_subscribe.dart';
|
||||
import 'package:sail/widgets/plan_list.dart';
|
||||
import 'package:sail/widgets/power_btn.dart';
|
||||
import 'package:sail/widgets/select_location.dart';
|
||||
import 'package:sail/utils/common_util.dart';
|
||||
import 'package:sail/widgets/watermuticicel.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
import 'package:uuvpn/model/themeCollection.dart';
|
||||
import 'package:uuvpn/models/app_model.dart';
|
||||
import 'package:uuvpn/models/plan_model.dart';
|
||||
import 'package:uuvpn/models/server_model.dart';
|
||||
import 'package:uuvpn/models/user_model.dart';
|
||||
import 'package:uuvpn/models/user_subscribe_model.dart';
|
||||
import 'package:uuvpn/resources/app_colors.dart';
|
||||
import 'package:uuvpn/utils/l10n.dart';
|
||||
import 'package:uuvpn/widgets/bottom_block.dart';
|
||||
import 'package:uuvpn/widgets/connection_stats.dart';
|
||||
import 'package:uuvpn/widgets/logo_bar.dart';
|
||||
import 'package:uuvpn/widgets/my_subscribe.dart';
|
||||
import 'package:uuvpn/widgets/plan_list.dart';
|
||||
import 'package:uuvpn/widgets/power_btn.dart';
|
||||
import 'package:uuvpn/widgets/select_location.dart';
|
||||
import 'package:uuvpn/utils/common_util.dart';
|
||||
import 'package:uuvpn/widgets/watermuticicel.dart';
|
||||
|
||||
class HomeWidget extends StatefulWidget {
|
||||
const HomeWidget({Key? key}) : super(key: key);
|
||||
|
||||
@@ -2,13 +2,13 @@ import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:sail/constant/app_strings.dart';
|
||||
import 'package:sail/models/app_model.dart';
|
||||
import 'package:sail/models/user_model.dart';
|
||||
import 'package:sail/models/user_subscribe_model.dart';
|
||||
import 'package:sail/utils/l10n.dart';
|
||||
import 'package:sail/utils/navigator_util.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
import 'package:uuvpn/constant/app_strings.dart';
|
||||
import 'package:uuvpn/models/app_model.dart';
|
||||
import 'package:uuvpn/models/user_model.dart';
|
||||
import 'package:uuvpn/models/user_subscribe_model.dart';
|
||||
import 'package:uuvpn/utils/l10n.dart';
|
||||
import 'package:uuvpn/utils/navigator_util.dart';
|
||||
|
||||
class LogoBar extends StatelessWidget {
|
||||
const LogoBar({
|
||||
|
||||
@@ -3,16 +3,16 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:fluttertoast/fluttertoast.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:sail/entity/user_subscribe_entity.dart';
|
||||
import 'package:sail/model/themeCollection.dart';
|
||||
import 'package:sail/models/app_model.dart';
|
||||
import 'package:sail/models/user_model.dart';
|
||||
import 'package:sail/router/application.dart';
|
||||
import 'package:sail/routes/OnceNotice.dart';
|
||||
import 'package:sail/utils/l10n.dart';
|
||||
import 'package:sail/utils/navigator_util.dart';
|
||||
import 'package:sail/utils/transfer_util.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
import 'package:uuvpn/entity/user_subscribe_entity.dart';
|
||||
import 'package:uuvpn/model/themeCollection.dart';
|
||||
import 'package:uuvpn/models/app_model.dart';
|
||||
import 'package:uuvpn/models/user_model.dart';
|
||||
import 'package:uuvpn/router/application.dart';
|
||||
import 'package:uuvpn/routes/OnceNotice.dart';
|
||||
import 'package:uuvpn/utils/l10n.dart';
|
||||
import 'package:uuvpn/utils/navigator_util.dart';
|
||||
import 'package:uuvpn/utils/transfer_util.dart';
|
||||
|
||||
class MySubscribe extends StatefulWidget {
|
||||
const MySubscribe(
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:sail/entity/plan_entity.dart';
|
||||
import 'package:sail/entity/user_subscribe_entity.dart';
|
||||
import 'package:sail/models/user_model.dart';
|
||||
import 'package:sail/utils/l10n.dart';
|
||||
import 'package:sail/utils/navigator_util.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
import 'package:uuvpn/entity/plan_entity.dart';
|
||||
import 'package:uuvpn/entity/user_subscribe_entity.dart';
|
||||
import 'package:uuvpn/models/user_model.dart';
|
||||
import 'package:uuvpn/utils/l10n.dart';
|
||||
import 'package:uuvpn/utils/navigator_util.dart';
|
||||
|
||||
class PlanList extends StatefulWidget {
|
||||
const PlanList(
|
||||
|
||||
@@ -2,16 +2,16 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:fluttertoast/fluttertoast.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:sail/model/themeCollection.dart';
|
||||
import 'package:sail/models/app_model.dart';
|
||||
import 'package:sail/models/server_model.dart';
|
||||
import 'package:sail/models/user_model.dart';
|
||||
import 'package:sail/utils/l10n.dart';
|
||||
import 'package:sail/utils/message_util.dart';
|
||||
import 'package:sail/utils/navigator_util.dart';
|
||||
import 'package:sail/widgets/watermuticicel.dart';
|
||||
import 'package:sail/widgets/waterrepper.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
import 'package:uuvpn/model/themeCollection.dart';
|
||||
import 'package:uuvpn/models/app_model.dart';
|
||||
import 'package:uuvpn/models/server_model.dart';
|
||||
import 'package:uuvpn/models/user_model.dart';
|
||||
import 'package:uuvpn/utils/l10n.dart';
|
||||
import 'package:uuvpn/utils/message_util.dart';
|
||||
import 'package:uuvpn/utils/navigator_util.dart';
|
||||
import 'package:uuvpn/widgets/watermuticicel.dart';
|
||||
import 'package:uuvpn/widgets/waterrepper.dart';
|
||||
|
||||
class PowerButton extends StatefulWidget {
|
||||
const PowerButton({Key? key}) : super(key: key);
|
||||
|
||||
@@ -3,7 +3,7 @@ import 'dart:ui';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
|
||||
double minHeight = ScreenUtil().setHeight(260);
|
||||
const double iconStartSize = 44;
|
||||
@@ -17,15 +17,19 @@ class RecentConnectionBottomSheet extends StatefulWidget {
|
||||
const RecentConnectionBottomSheet({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
RecentConnectionBottomSheetState createState() => RecentConnectionBottomSheetState();
|
||||
RecentConnectionBottomSheetState createState() =>
|
||||
RecentConnectionBottomSheetState();
|
||||
}
|
||||
|
||||
class RecentConnectionBottomSheetState extends State<RecentConnectionBottomSheet> with SingleTickerProviderStateMixin {
|
||||
class RecentConnectionBottomSheetState
|
||||
extends State<RecentConnectionBottomSheet>
|
||||
with SingleTickerProviderStateMixin {
|
||||
late AnimationController _controller;
|
||||
|
||||
double get maxHeight => MediaQuery.of(context).size.height;
|
||||
|
||||
double? get headerTopMargin => lerp(20, 20 + MediaQuery.of(context).padding.top);
|
||||
double? get headerTopMargin =>
|
||||
lerp(20, 20 + MediaQuery.of(context).padding.top);
|
||||
|
||||
double? get headerFontSize => lerp(14, 24);
|
||||
|
||||
@@ -38,9 +42,12 @@ class RecentConnectionBottomSheetState extends State<RecentConnectionBottomSheet
|
||||
double? get iconSize => lerp(iconStartSize, iconEndSize);
|
||||
|
||||
double? iconTopMargin(int index) =>
|
||||
lerp(iconStartMarginTop, iconEndMarginTop + index * (iconsVerticalSpacing + iconEndSize))! + headerTopMargin!;
|
||||
lerp(iconStartMarginTop,
|
||||
iconEndMarginTop + index * (iconsVerticalSpacing + iconEndSize))! +
|
||||
headerTopMargin!;
|
||||
|
||||
double? iconLeftMargin(int index) => lerp(index * (iconsHorizontalSpacing + iconStartSize), 0);
|
||||
double? iconLeftMargin(int index) =>
|
||||
lerp(index * (iconsHorizontalSpacing + iconStartSize), 0);
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@@ -57,7 +64,8 @@ class RecentConnectionBottomSheetState extends State<RecentConnectionBottomSheet
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
double? lerp(double min, double max) => lerpDouble(min, max, _controller.value);
|
||||
double? lerp(double min, double max) =>
|
||||
lerpDouble(min, max, _controller.value);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -77,7 +85,9 @@ class RecentConnectionBottomSheetState extends State<RecentConnectionBottomSheet
|
||||
padding: const EdgeInsets.symmetric(horizontal: 32),
|
||||
decoration: const BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
colors: [AppColors.themeColor, Colors.pink], begin: Alignment.topLeft, end: Alignment.bottomRight),
|
||||
colors: [AppColors.themeColor, Colors.pink],
|
||||
begin: Alignment.topLeft,
|
||||
end: Alignment.bottomRight),
|
||||
borderRadius: BorderRadius.vertical(top: Radius.circular(32)),
|
||||
),
|
||||
child: Stack(
|
||||
@@ -142,9 +152,11 @@ class RecentConnectionBottomSheetState extends State<RecentConnectionBottomSheet
|
||||
}
|
||||
|
||||
void _handleDragEnd(DragEndDetails details) {
|
||||
if (_controller.isAnimating || _controller.status == AnimationStatus.completed) return;
|
||||
if (_controller.isAnimating ||
|
||||
_controller.status == AnimationStatus.completed) return;
|
||||
|
||||
final double flingVelocity = details.velocity.pixelsPerSecond.dy / maxHeight;
|
||||
final double flingVelocity =
|
||||
details.velocity.pixelsPerSecond.dy / maxHeight;
|
||||
if (flingVelocity < 0.0) {
|
||||
_controller.fling(velocity: math.max(2.0, -flingVelocity));
|
||||
} else if (flingVelocity > 0.0) {
|
||||
@@ -256,7 +268,8 @@ class SheetHeader extends StatelessWidget {
|
||||
final double? fontSize;
|
||||
final double? topMargin;
|
||||
|
||||
const SheetHeader({Key? key, required this.fontSize, required this.topMargin}) : super(key: key);
|
||||
const SheetHeader({Key? key, required this.fontSize, required this.topMargin})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:sail/models/app_model.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
import 'package:uuvpn/models/app_model.dart';
|
||||
|
||||
class SailAppBar extends AppBar {
|
||||
SailAppBar({Key? key, required this.appTitle})
|
||||
: super(key: key);
|
||||
SailAppBar({Key? key, required this.appTitle}) : super(key: key);
|
||||
|
||||
final String appTitle;
|
||||
|
||||
@@ -27,10 +26,12 @@ class SailAppBarState extends State<SailAppBar> {
|
||||
return AppBar(
|
||||
title: Text(
|
||||
widget.appTitle,
|
||||
style: TextStyle(color: _appModel.isOn ? Colors.black : Colors.white, fontWeight: FontWeight.w900),
|
||||
style: TextStyle(
|
||||
color: _appModel.isOn ? Colors.black : Colors.white,
|
||||
fontWeight: FontWeight.w900),
|
||||
),
|
||||
elevation: 0,
|
||||
backgroundColor: _appModel.isOn ? AppColors.yellowColor : AppColors.grayColor
|
||||
);
|
||||
backgroundColor:
|
||||
_appModel.isOn ? AppColors.yellowColor : AppColors.grayColor);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sail/constant/app_colors.dart';
|
||||
import 'package:sail/model/themeCollection.dart';
|
||||
import 'package:sail/models/server_model.dart';
|
||||
import 'package:sail/models/user_model.dart';
|
||||
import 'package:sail/utils/l10n.dart';
|
||||
import 'package:sail/utils/navigator_util.dart';
|
||||
import 'package:uuvpn/constant/app_colors.dart';
|
||||
import 'package:uuvpn/model/themeCollection.dart';
|
||||
import 'package:uuvpn/models/server_model.dart';
|
||||
import 'package:uuvpn/models/user_model.dart';
|
||||
import 'package:uuvpn/utils/l10n.dart';
|
||||
import 'package:uuvpn/utils/navigator_util.dart';
|
||||
|
||||
class SelectLocation extends StatefulWidget {
|
||||
const SelectLocation({
|
||||
|
||||
@@ -3,11 +3,11 @@ import 'dart:math' as math;
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sail/entity/plan_entity.dart';
|
||||
import 'package:sail/models/user_model.dart';
|
||||
import 'package:sail/service/plan_service.dart';
|
||||
import 'package:sail/service/user_service.dart';
|
||||
import 'package:sail/utils/navigator_util.dart';
|
||||
import 'package:uuvpn/entity/plan_entity.dart';
|
||||
import 'package:uuvpn/models/user_model.dart';
|
||||
import 'package:uuvpn/service/plan_service.dart';
|
||||
import 'package:uuvpn/service/user_service.dart';
|
||||
import 'package:uuvpn/utils/navigator_util.dart';
|
||||
|
||||
class SlidingCardsView extends StatefulWidget {
|
||||
const SlidingCardsView({Key? key}) : super(key: key);
|
||||
|
||||
+10
-2
@@ -93,10 +93,18 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: dio
|
||||
sha256: "7d328c4d898a61efc3cd93655a0955858e29a0aa647f0f9e02d59b3bb275e2e8"
|
||||
sha256: e17f6b3097b8c51b72c74c9f071a605c47bcc8893839bd66732457a5ebe73714
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.6"
|
||||
version: "5.5.0+1"
|
||||
dio_web_adapter:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dio_web_adapter
|
||||
sha256: "36c5b2d79eb17cdae41e974b7a8284fec631651d2a6f39a8a2ff22327e90aeac"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
equatable:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: sail
|
||||
description: a proxy client application.
|
||||
name: uuvpn
|
||||
description: ios/android vpn proxy client application.
|
||||
|
||||
# The following line prevents the package from being accidentally published to
|
||||
# pub.dev using `pub publish`. This is preferred for private packages.
|
||||
@@ -32,7 +32,8 @@ dependencies:
|
||||
# Use with the CupertinoIcons class for iOS style icons.
|
||||
another_flushbar: ^1.12.30
|
||||
cupertino_icons: ^1.0.5
|
||||
dio: ^4.0.6
|
||||
# dio: ^4.0.6
|
||||
dio: ^5.5.0+1
|
||||
fluro: ^2.0.3
|
||||
shared_preferences: ^2.0.15
|
||||
webview_flutter: ^3.0.4
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
import 'package:sail/main.dart';
|
||||
import 'package:uuvpn/main.dart';
|
||||
|
||||
void main() {
|
||||
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
|
||||
|
||||
Reference in New Issue
Block a user