Showing preview only (3,297K chars total). Download the full file or copy to clipboard to get everything.
Repository: chen08209/FlClash
Branch: main
Commit: 672eaccd35dc
Files: 437
Total size: 13.4 MB
Directory structure:
gitextract__scuca8o/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ └── feature_request.yml
│ ├── release_template.md
│ └── workflows/
│ └── build.yaml
├── .gitignore
├── .gitmodules
├── .metadata
├── .run/
│ └── main.dart.run.xml
├── CHANGELOG.md
├── LICENSE
├── README.md
├── README_zh_CN.md
├── analysis_options.yaml
├── android/
│ ├── .gitignore
│ ├── app/
│ │ ├── build.gradle.kts
│ │ ├── google-services.json
│ │ ├── proguard-rules.pro
│ │ └── src/
│ │ ├── debug/
│ │ │ └── AndroidManifest.xml
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin/
│ │ │ │ └── com/
│ │ │ │ └── follow/
│ │ │ │ └── clash/
│ │ │ │ ├── Application.kt
│ │ │ │ ├── BroadcastReceiver.kt
│ │ │ │ ├── Ext.kt
│ │ │ │ ├── MainActivity.kt
│ │ │ │ ├── Service.kt
│ │ │ │ ├── State.kt
│ │ │ │ ├── TempActivity.kt
│ │ │ │ ├── TileService.kt
│ │ │ │ ├── models/
│ │ │ │ │ ├── Package.kt
│ │ │ │ │ └── State.kt
│ │ │ │ └── plugins/
│ │ │ │ ├── AppPlugin.kt
│ │ │ │ ├── ServicePlugin.kt
│ │ │ │ └── TilePlugin.kt
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ └── ic_launcher_foreground.xml
│ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ ├── ic_launcher.xml
│ │ │ │ └── ic_launcher_round.xml
│ │ │ ├── values/
│ │ │ │ ├── ic_launcher_background.xml
│ │ │ │ └── styles.xml
│ │ │ ├── values-night/
│ │ │ │ └── styles.xml
│ │ │ ├── values-night-v27/
│ │ │ │ └── styles.xml
│ │ │ ├── values-v27/
│ │ │ │ └── styles.xml
│ │ │ └── xml/
│ │ │ ├── file_paths.xml
│ │ │ └── network_security_config.xml
│ │ └── profile/
│ │ └── AndroidManifest.xml
│ ├── build.gradle.kts
│ ├── common/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── follow/
│ │ │ └── clash/
│ │ │ └── common/
│ │ │ ├── Components.kt
│ │ │ ├── Enums.kt
│ │ │ ├── Ext.kt
│ │ │ ├── GlobalState.kt
│ │ │ ├── Service.kt
│ │ │ └── Utils.kt
│ │ └── res/
│ │ └── values/
│ │ └── strings.xml
│ ├── core/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ ├── cpp/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── core.cpp
│ │ │ ├── jni_helper.cpp
│ │ │ └── jni_helper.h
│ │ └── java/
│ │ └── com/
│ │ └── follow/
│ │ └── clash/
│ │ └── core/
│ │ ├── Core.kt
│ │ ├── InvokeInterface.kt
│ │ └── TunInterface.kt
│ ├── gradle/
│ │ ├── libs.versions.toml
│ │ └── wrapper/
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ ├── service/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ ├── aidl/
│ │ │ └── com/
│ │ │ └── follow/
│ │ │ └── clash/
│ │ │ └── service/
│ │ │ ├── IAckInterface.aidl
│ │ │ ├── ICallbackInterface.aidl
│ │ │ ├── IEventInterface.aidl
│ │ │ ├── IRemoteInterface.aidl
│ │ │ ├── IResultInterface.aidl
│ │ │ ├── IVoidInterface.aidl
│ │ │ └── models/
│ │ │ ├── AccessControl.aidl
│ │ │ ├── NotificationParams.aidl
│ │ │ └── VpnOptions.aidl
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── follow/
│ │ │ └── clash/
│ │ │ └── service/
│ │ │ ├── CommonService.kt
│ │ │ ├── FilesProvider.kt
│ │ │ ├── IBaseService.kt
│ │ │ ├── RemoteService.kt
│ │ │ ├── State.kt
│ │ │ ├── VpnService.kt
│ │ │ ├── models/
│ │ │ │ ├── NotificationParams.kt
│ │ │ │ ├── Traffic.kt
│ │ │ │ └── VpnOptions.kt
│ │ │ └── modules/
│ │ │ ├── Module.kt
│ │ │ ├── ModuleLoader.kt
│ │ │ ├── NetworkObserveModule.kt
│ │ │ ├── NotificationModule.kt
│ │ │ └── SuspendModule.kt
│ │ └── res/
│ │ └── drawable/
│ │ ├── ic.xml
│ │ └── ic_service.xml
│ └── settings.gradle.kts
├── arb/
│ ├── intl_en.arb
│ ├── intl_ja.arb
│ ├── intl_ru.arb
│ └── intl_zh_CN.arb
├── assets/
│ └── data/
│ ├── ASN.mmdb
│ └── GEOIP.metadb
├── build.yaml
├── core/
│ ├── action.go
│ ├── bride.c
│ ├── bride.go
│ ├── bride.h
│ ├── common.go
│ ├── constant.go
│ ├── go.mod
│ ├── go.sum
│ ├── hub.go
│ ├── lib.go
│ ├── main.go
│ ├── main_cgo.go
│ ├── platform/
│ │ ├── limit.go
│ │ └── procfs.go
│ ├── server.go
│ └── tun/
│ └── tun.go
├── distribute_options.yaml
├── lib/
│ ├── application.dart
│ ├── common/
│ │ ├── app_localizations.dart
│ │ ├── archive.dart
│ │ ├── cache.dart
│ │ ├── color.dart
│ │ ├── common.dart
│ │ ├── compute.dart
│ │ ├── constant.dart
│ │ ├── context.dart
│ │ ├── converter.dart
│ │ ├── datetime.dart
│ │ ├── dav_client.dart
│ │ ├── file.dart
│ │ ├── fixed.dart
│ │ ├── function.dart
│ │ ├── future.dart
│ │ ├── hive.dart
│ │ ├── http.dart
│ │ ├── icons.dart
│ │ ├── indexing.dart
│ │ ├── iterable.dart
│ │ ├── keyboard.dart
│ │ ├── launch.dart
│ │ ├── link.dart
│ │ ├── lock.dart
│ │ ├── measure.dart
│ │ ├── migration.dart
│ │ ├── mixin.dart
│ │ ├── navigation.dart
│ │ ├── navigator.dart
│ │ ├── network.dart
│ │ ├── num.dart
│ │ ├── package.dart
│ │ ├── path.dart
│ │ ├── picker.dart
│ │ ├── preferences.dart
│ │ ├── print.dart
│ │ ├── protocol.dart
│ │ ├── proxy.dart
│ │ ├── render.dart
│ │ ├── request.dart
│ │ ├── scroll.dart
│ │ ├── snowflake.dart
│ │ ├── store.dart
│ │ ├── string.dart
│ │ ├── system.dart
│ │ ├── task.dart
│ │ ├── text.dart
│ │ ├── theme.dart
│ │ ├── tray.dart
│ │ ├── utils.dart
│ │ ├── window.dart
│ │ └── yaml.dart
│ ├── controller.dart
│ ├── core/
│ │ ├── controller.dart
│ │ ├── core.dart
│ │ ├── event.dart
│ │ ├── interface.dart
│ │ ├── lib.dart
│ │ └── service.dart
│ ├── database/
│ │ ├── database.dart
│ │ ├── generated/
│ │ │ └── database.g.dart
│ │ ├── links.dart
│ │ ├── profiles.dart
│ │ ├── rules.dart
│ │ └── scripts.dart
│ ├── enum/
│ │ └── enum.dart
│ ├── features/
│ │ ├── features.dart
│ │ └── overwrite/
│ │ ├── overwrite.dart
│ │ └── rule.dart
│ ├── l10n/
│ │ ├── intl/
│ │ │ ├── messages_all.dart
│ │ │ ├── messages_en.dart
│ │ │ ├── messages_ja.dart
│ │ │ ├── messages_ru.dart
│ │ │ └── messages_zh_CN.dart
│ │ └── l10n.dart
│ ├── main.dart
│ ├── manager/
│ │ ├── android_manager.dart
│ │ ├── app_manager.dart
│ │ ├── connectivity_manager.dart
│ │ ├── core_manager.dart
│ │ ├── hotkey_manager.dart
│ │ ├── manager.dart
│ │ ├── proxy_manager.dart
│ │ ├── status_manager.dart
│ │ ├── theme_manager.dart
│ │ ├── tile_manager.dart
│ │ ├── tray_manager.dart
│ │ ├── vpn_manager.dart
│ │ └── window_manager.dart
│ ├── models/
│ │ ├── app.dart
│ │ ├── clash_config.dart
│ │ ├── common.dart
│ │ ├── config.dart
│ │ ├── core.dart
│ │ ├── generated/
│ │ │ ├── app.freezed.dart
│ │ │ ├── clash_config.freezed.dart
│ │ │ ├── clash_config.g.dart
│ │ │ ├── common.freezed.dart
│ │ │ ├── common.g.dart
│ │ │ ├── config.freezed.dart
│ │ │ ├── config.g.dart
│ │ │ ├── core.freezed.dart
│ │ │ ├── core.g.dart
│ │ │ ├── profile.freezed.dart
│ │ │ ├── profile.g.dart
│ │ │ ├── state.freezed.dart
│ │ │ └── state.g.dart
│ │ ├── models.dart
│ │ ├── profile.dart
│ │ └── state.dart
│ ├── pages/
│ │ ├── editor.dart
│ │ ├── error.dart
│ │ ├── home.dart
│ │ ├── pages.dart
│ │ └── scan.dart
│ ├── plugins/
│ │ ├── app.dart
│ │ ├── service.dart
│ │ └── tile.dart
│ ├── providers/
│ │ ├── app.dart
│ │ ├── config.dart
│ │ ├── database.dart
│ │ ├── generated/
│ │ │ ├── app.g.dart
│ │ │ ├── config.g.dart
│ │ │ ├── database.g.dart
│ │ │ └── state.g.dart
│ │ ├── providers.dart
│ │ └── state.dart
│ ├── state.dart
│ ├── views/
│ │ ├── about.dart
│ │ ├── access.dart
│ │ ├── application_setting.dart
│ │ ├── backup_and_restore.dart
│ │ ├── config/
│ │ │ ├── advanced.dart
│ │ │ ├── config.dart
│ │ │ ├── dns.dart
│ │ │ ├── general.dart
│ │ │ ├── network.dart
│ │ │ ├── rules.dart
│ │ │ └── scripts.dart
│ │ ├── connection/
│ │ │ ├── connections.dart
│ │ │ ├── item.dart
│ │ │ └── requests.dart
│ │ ├── dashboard/
│ │ │ ├── dashboard.dart
│ │ │ └── widgets/
│ │ │ ├── intranet_ip.dart
│ │ │ ├── memory_info.dart
│ │ │ ├── network_detection.dart
│ │ │ ├── network_speed.dart
│ │ │ ├── outbound_mode.dart
│ │ │ ├── quick_options.dart
│ │ │ ├── start_button.dart
│ │ │ ├── traffic_usage.dart
│ │ │ └── widgets.dart
│ │ ├── developer.dart
│ │ ├── hotkey.dart
│ │ ├── logs.dart
│ │ ├── profiles/
│ │ │ ├── add.dart
│ │ │ ├── edit.dart
│ │ │ ├── overwrite.dart
│ │ │ └── profiles.dart
│ │ ├── proxies/
│ │ │ ├── card.dart
│ │ │ ├── common.dart
│ │ │ ├── list.dart
│ │ │ ├── providers.dart
│ │ │ ├── proxies.dart
│ │ │ ├── setting.dart
│ │ │ └── tab.dart
│ │ ├── resources.dart
│ │ ├── theme.dart
│ │ ├── tools.dart
│ │ └── views.dart
│ └── widgets/
│ ├── activate_box.dart
│ ├── animate_grid.dart
│ ├── animated_cross_slide.dart
│ ├── bar_chart.dart
│ ├── builder.dart
│ ├── button.dart
│ ├── card.dart
│ ├── chip.dart
│ ├── color_scheme_box.dart
│ ├── container.dart
│ ├── dialog.dart
│ ├── disabled_mask.dart
│ ├── donut_chart.dart
│ ├── effect.dart
│ ├── fade_box.dart
│ ├── float_layout.dart
│ ├── grid.dart
│ ├── icon.dart
│ ├── inherited.dart
│ ├── input.dart
│ ├── keep_scope.dart
│ ├── line_chart.dart
│ ├── list.dart
│ ├── loading.dart
│ ├── notification.dart
│ ├── null_status.dart
│ ├── open_container.dart
│ ├── palette.dart
│ ├── pop_scope.dart
│ ├── popup.dart
│ ├── scaffold.dart
│ ├── scroll.dart
│ ├── setting.dart
│ ├── sheet.dart
│ ├── side_sheet.dart
│ ├── subscription_info_view.dart
│ ├── super_grid.dart
│ ├── tab.dart
│ ├── text.dart
│ ├── theme.dart
│ ├── view.dart
│ ├── wave.dart
│ └── widgets.dart
├── linux/
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── flutter/
│ │ ├── CMakeLists.txt
│ │ ├── generated_plugin_registrant.cc
│ │ ├── generated_plugin_registrant.h
│ │ └── generated_plugins.cmake
│ ├── packaging/
│ │ ├── appimage/
│ │ │ └── make_config.yaml
│ │ ├── deb/
│ │ │ └── make_config.yaml
│ │ └── rpm/
│ │ └── make_config.yaml
│ └── runner/
│ ├── CMakeLists.txt
│ ├── main.cc
│ ├── my_application.cc
│ └── my_application.h
├── macos/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── Flutter-Debug.xcconfig
│ │ ├── Flutter-Release.xcconfig
│ │ └── GeneratedPluginRegistrant.swift
│ ├── Podfile
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── MainMenu.xib
│ │ ├── Configs/
│ │ │ ├── AppInfo.xcconfig
│ │ │ ├── Debug.xcconfig
│ │ │ ├── Release.xcconfig
│ │ │ └── Warnings.xcconfig
│ │ ├── DebugProfile.entitlements
│ │ ├── Info.plist
│ │ ├── MainFlutterWindow.swift
│ │ └── Release.entitlements
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ ├── Runner.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ ├── RunnerTests/
│ │ └── RunnerTests.swift
│ └── packaging/
│ └── dmg/
│ └── make_config.yaml
├── plugins/
│ ├── proxy/
│ │ ├── .gitignore
│ │ ├── .metadata
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── analysis_options.yaml
│ │ ├── lib/
│ │ │ ├── proxy.dart
│ │ │ ├── proxy_method_channel.dart
│ │ │ └── proxy_platform_interface.dart
│ │ ├── pubspec.yaml
│ │ └── windows/
│ │ ├── .gitignore
│ │ ├── CMakeLists.txt
│ │ ├── include/
│ │ │ └── proxy/
│ │ │ └── proxy_plugin_c_api.h
│ │ ├── proxy_plugin.cpp
│ │ ├── proxy_plugin.h
│ │ ├── proxy_plugin_c_api.cpp
│ │ └── test/
│ │ └── proxy_plugin_test.cpp
│ └── window_ext/
│ ├── .gitignore
│ ├── .metadata
│ ├── CHANGELOG.md
│ ├── LICENSE
│ ├── README.md
│ ├── analysis_options.yaml
│ ├── lib/
│ │ ├── window_ext.dart
│ │ ├── window_ext_listener.dart
│ │ └── window_ext_manager.dart
│ ├── macos/
│ │ ├── Classes/
│ │ │ └── WindowExtPlugin.swift
│ │ └── window_ext.podspec
│ ├── pubspec.yaml
│ └── windows/
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── include/
│ │ └── window_ext/
│ │ └── window_ext_plugin_c_api.h
│ ├── test/
│ │ └── window_ext_plugin_test.cpp
│ ├── window_ext_plugin.cpp
│ ├── window_ext_plugin.h
│ └── window_ext_plugin_c_api.cpp
├── pubspec.yaml
├── release_telegram.py
├── services/
│ └── helper/
│ ├── Cargo.toml
│ ├── build.rs
│ └── src/
│ ├── main.rs
│ └── service/
│ ├── hub.rs
│ ├── mod.rs
│ └── windows.rs
├── setup.dart
└── windows/
├── .gitignore
├── CMakeLists.txt
├── flutter/
│ ├── CMakeLists.txt
│ ├── generated_plugin_registrant.cc
│ ├── generated_plugin_registrant.h
│ └── generated_plugins.cmake
├── packaging/
│ └── exe/
│ ├── ChineseSimplified.isl
│ ├── inno_setup.iss
│ └── make_config.yaml
└── runner/
├── CMakeLists.txt
├── Runner.rc
├── flutter_window.cpp
├── flutter_window.h
├── main.cpp
├── resource.h
├── runner.exe.manifest
├── utils.cpp
├── utils.h
├── win32_window.cpp
└── win32_window.h
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: 问题反馈 / Bug report
title: "[BUG] "
description: 反馈你遇到的问题 / Report the issue you are experiencing
body:
- type: markdown
attributes:
value: |
## 在提交问题之前,请确认以下事项:
1. 请务必给issue填写一个简洁明了的标题,以便他人快速检索
2. 请确保[已有的问题](https://github.com/chen08209/FlClash/issues?q=is%3Aissue) 中没有人提交过相似issue,否则请在已有的issue下进行讨论
3. 请务必按照模板规范详细描述问题,否则issue将会被直接关闭
## Before submitting the issue, please make sure of the following checklist:
1. Please be sure to fill in a concise and clear title for the issue so that others can quickly search
2. Please make sure there is no similar issue in the [existing issues](https://github.com/chen08209/FlClash/issues?q=is%3Aissue), otherwise please discuss under the existing issue
3. Please describe the problem in detail according to the template specification, otherwise issue will be closed directly.
- type: textarea
id: description
attributes:
label: 问题描述 / Describe the bug
description: 详细清晰地描述你遇到的问题,并配合截图 / Describe the problem you encountered in detail and clearly, and provide screenshots
validations:
required: true
- type: textarea
attributes:
label: 软件版本 / Version
description: 请提供FlClash的具体版本 / Please provide the specific version of FlClash.
validations:
required: true
- type: textarea
attributes:
label: 复现步骤 / To Reproduce
description: 请提供复现问题的步骤 / Steps to reproduce the behavior
validations:
required: true
- type: dropdown
attributes:
label: 操作系统 / OS
options:
- Android
- Windows
- MacOS
- Linux
validations:
required: true
- type: input
attributes:
label: 操作系统版本 / OS Version
description: 请提供你的操作系统版本,Linux请额外提供桌面环境及窗口系统 / Please provide your OS version, for Linux, please also provide the desktop environment and window system
validations:
required: true
- type: textarea
attributes:
label: 日志(勿上传日志文件,请粘贴日志内容) / Log (Do not upload the log file, paste the log content directly)
description: 请提供完整或相关部分的Debug日志(请在“软件左侧菜单”->“设置”->“日志等级”调整到debug / Please provide a complete or relevant Debug log (please adjust it to debug in the left menu of software-> Settings-> Log Level)
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
contact_links:
- name: 讨论交流 / Communication
url: https://t.me/+G-veVtwBOl4wODc1
about: 在 Telegram 群组中与其他用户讨论交流 / Communicate with other users in the Telegram group
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: 功能请求 / Feature request
title: "[Feature] "
description: 提出你的功能请求 / Propose your feature request
body:
- type: markdown
attributes:
value: |
## 在提交问题之前,请确认以下事项:
1. 请务必给issue填写一个简洁明了的标题,以便他人快速检索
2. 请确保[已有的问题](https://github.com/chen08209/FlClash/issues?q=is%3Aissue) 中没有人提交过相似issue,否则请在已有的issue下进行讨论
3. 请务必按照模板规范详细描述问题,否则issue将会被直接关闭
## Before submitting the issue, please make sure of the following checklist:
1. Please be sure to fill in a concise and clear title for the issue so that others can quickly search
2. Please make sure there is no similar issue in the [existing issues](https://github.com/chen08209/FlClash/issues?q=is%3Aissue), otherwise please discuss under the existing issue
3. Please describe the problem in detail according to the template specification, otherwise issue will be closed directly.
- type: textarea
id: description
attributes:
label: 功能描述 / Feature description
description: 详细清晰地描述你的功能请求 / A clear and concise description of what the feature is
validations:
required: true
- type: textarea
attributes:
label: 使用场景 / Use case
description: 请描述你的功能请求的使用场景 / Please describe the use case of your feature request
validations:
required: true
- type: checkboxes
id: os-labels
attributes:
label: 适用系统 / Target OS
description: 请选择该功能适用的操作系统(至少选择一个) / Please select the operating system(s) for this feature request (select at least one)
options:
- label: Android
- label: Windows
- label: MacOS
- label: Linux
validations:
required: true
================================================
FILE: .github/release_template.md
================================================
<div align=center>
[](https://img.shields.io/github/downloads/chen08209/FlClash/vVERSION/)
</div>
**Download based on your OS:**
<div align=left>
<table>
<thead align=left>
<tr>
<th>OS</th>
<th>Download</th>
</tr>
</thead>
<tbody align=left>
<tr>
<td>Android</td>
<td>
<a href="https://github.com/chen08209/FlClash/releases/download/vVERSION/FlClash-VERSION-android-arm64-v8a.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=android"></a><br>
<a href="https://github.com/chen08209/FlClash/releases/download/vVERSION/FlClash-VERSION-android-armeabi-v7a.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=android"></a><br>
<a href="https://github.com/chen08209/FlClash/releases/download/vVERSION/FlClash-VERSION-android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=android"></a>
</td>
</tr>
<tr>
<td>Windows</td>
<td>
<a href="https://github.com/chen08209/FlClash/releases/download/vVERSION/FlClash-VERSION-windows-amd64-setup.exe"><img src="https://img.shields.io/badge/Setup-x64-2d7d9a.svg?logo=windows"></a><br>
<a href="https://github.com/chen08209/FlClash/releases/download/vVERSION/FlClash-VERSION-windows-amd64.zip"><img src="https://img.shields.io/badge/Portable-x64-67b7d1.svg?logo=windows"></a>
</td>
</tr>
<tr>
<td>macOS</td>
<td>
<a href="https://github.com/chen08209/FlClash/releases/download/vVERSION/FlClash-VERSION-macos-arm64.dmg"><img src="https://img.shields.io/badge/DMG-Apple%20Silicon-%23000000.svg?logo=apple"></a><br>
<a href="https://github.com/chen08209/FlClash/releases/download/vVERSION/FlClash-VERSION-macos-amd64.dmg"><img src="https://img.shields.io/badge/DMG-Intel%20X64-%2300A9E0.svg?logo=apple"></a><br>
</td>
</tr>
<tr>
<td>Linux</td>
<td>
<a href="https://github.com/chen08209/FlClash/releases/download/vVERSION/FlClash-VERSION-linux-amd64.AppImage"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=linux"> </a><br>
<a href="https://github.com/chen08209/FlClash/releases/download/vVERSION/FlClash-VERSION-linux-amd64.deb"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=debian"> </a><br>
<a href="https://github.com/chen08209/FlClash/releases/download/vVERSION/FlClash-VERSION-linux-amd64.deb"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=redhat"> </a>
</td>
</tr>
</tbody>
</table>
</div>
<div dir="ltr">
**List of all changes:** [ChangeLog](https://github.com/chen08209/FlClash/blob/main/CHANGELOG.md)
</div>
================================================
FILE: .github/workflows/build.yaml
================================================
name: build
on:
push:
tags:
- 'v*'
env:
IS_STABLE: ${{ !contains(github.ref, '-') }}
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
include:
- platform: android
os: ubuntu-latest
- platform: windows
os: Windows-2022
arch: amd64
- platform: linux
os: ubuntu-22.04
arch: amd64
- platform: macos
os: macos-15-intel
arch: amd64
- platform: macos
os: macos-latest
arch: arm64
# - platform: windows
# os: windows-11-arm
# arch: arm64
- platform: linux
os: ubuntu-24.04-arm
arch: arm64
steps:
- name: Setup rust
if: startsWith(matrix.os, 'windows-11-arm')
run: |
Invoke-WebRequest -Uri "https://win.rustup.rs/aarch64" -OutFile rustup-init.exe
.\rustup-init.exe -y --default-toolchain stable
$cargoPath = "$env:USERPROFILE\.cargo\bin"
Add-Content $env:GITHUB_PATH $cargoPath
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Android Signing
if: startsWith(matrix.platform,'android')
run: |
echo "${{ secrets.KEYSTORE }}" | base64 --decode > android/app/keystore.jks
echo "${{ secrets.SERVICE_JSON }}" | base64 --decode > android/app/google-services.json
echo "keyAlias=${{ secrets.KEY_ALIAS }}" >> android/local.properties
echo "storePassword=${{ secrets.STORE_PASSWORD }}" >> android/local.properties
echo "keyPassword=${{ secrets.KEY_PASSWORD }}" >> android/local.properties
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.24.0'
cache-dependency-path: |
core/go.sum
- name: Setup Flutter
if: ${{ !(startsWith(matrix.os, 'windows-11-arm') || startsWith(matrix.os, 'ubuntu-24.04-arm')) }}
uses: subosito/flutter-action@v2
with:
channel: stable
flutter-version: 3.35.7
cache: true
- name: Setup Flutter With Other
if: startsWith(matrix.os, 'windows-11-arm') || startsWith(matrix.os, 'ubuntu-24.04-arm')
uses: subosito/flutter-action@v2
with:
channel: master
flutter-version: 3.35.7
cache: true
- name: Get Flutter Dependency
run: |
flutter --version
flutter pub get
- name: Setup
run: dart setup.dart ${{ matrix.platform }} ${{ matrix.arch && format('--arch {0}', matrix.arch) }} ${{ env.IS_STABLE == 'true' && '--env stable' || '' }}
- name: Upload
uses: actions/upload-artifact@v4
with:
name: artifact-${{ matrix.platform }}${{ matrix.arch && format('-{0}', matrix.arch) }}
path: ./dist
overwrite: true
changelog:
runs-on: ubuntu-latest
needs: [ build ]
steps:
- name: Checkout
uses: actions/checkout@v4
if: ${{ env.IS_STABLE == 'true' }}
with:
fetch-depth: 0
ref: refs/heads/main
- name: Generate
if: ${{ env.IS_STABLE == 'true' }}
run: |
last_ver=$(grep -m1 '^## ' CHANGELOG.md 2>/dev/null | sed 's/^## //')
tags=($(git tag --merged HEAD --sort=-creatordate))
temp="NEW_CHANGELOG.md" > "$temp"
for i in "${!tags[@]}"; do
curr="${tags[i]}"
[[ "$curr" == "$last_ver" ]] && break
prev="${tags[i+1]}"
range="${prev:+$prev..}$curr"
echo -e "## $curr\n" >> "$temp"
git log --no-merges --pretty=format:"%B" "$range" | \
awk '!/Update changelog/ && NF {print "- " $0 "\n"}' >> "$temp"
done
[ -f CHANGELOG.md ] && cat CHANGELOG.md >> "$temp"
mv "$temp" CHANGELOG.md
- name: Commit
if: ${{ env.IS_STABLE == 'true' }}
run: |
git add CHANGELOG.md
if ! git diff --cached --quiet; then
echo "Commit pushing"
git config --local user.email "chen08209@gmail.com"
git config --local user.name "chen08209"
git commit -m "Update changelog"
git push
if [ $? -eq 0 ]; then
echo "Push succeeded"
else
echo "Push failed"
exit 1
fi
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
upload:
permissions: write-all
needs: [ build ]
runs-on: ubuntu-latest
services:
telegram-bot-api:
image: aiogram/telegram-bot-api:latest
env:
TELEGRAM_API_ID: ${{ secrets.TELEGRAM_API_ID }}
TELEGRAM_API_HASH: ${{ secrets.TELEGRAM_API_HASH }}
ports:
- 8081:8081
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Download
uses: actions/download-artifact@v4
with:
path: ./dist/
pattern: artifact-*
merge-multiple: true
- name: Generate release.md
run: |
tags=($(git tag --merged HEAD --sort=-creatordate))
preTag=$(curl -s "https://api.github.com/repos/chen08209/FlClash/releases/latest" | \
sed -nE 's/.*"tag_name": "([^"]+)".*/\1/p')
[ -z "$preTag" ] && preTag=""
out="release.md" > "$out"
for i in "${!tags[@]}"; do
curr="${tags[i]}"
[[ "$curr" == "$preTag" ]] && break
prev="${tags[i+1]}"
range="${prev:+$prev..}$curr"
git log --no-merges --pretty=format:"%B" "$range" | \
awk '!/Update changelog/ && NF {print "- " $0 "\n"}' >> "$out"
done
- name: Push to telegram
env:
TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
TAG: ${{ github.ref_name }}
RUN_ID: ${{ github.run_id }}
run: |
python -m pip install --upgrade pip
pip install requests
python release_telegram.py
- name: Patch release.md
run: |
version=$(echo "${{ github.ref_name }}" | sed 's/^v//')
sed "s|VERSION|$version|g" ./.github/release_template.md >> release.md
- name: Generate sha256
if: env.IS_STABLE == 'true'
run: |
cd ./dist
for file in $(find . -type f -not -name "*.sha256"); do
sha256sum "$file" > "${file}.sha256"
done
- name: Release
if: ${{ env.IS_STABLE == 'true' }}
uses: softprops/action-gh-release@v2
with:
files: ./dist/*
body_path: './release.md'
- name: Create Fdroid Source Dir
if: ${{ env.IS_STABLE == 'true' }}
run: |
mkdir -p ./tmp
cp ./dist/*android-arm64-v8a* ./tmp/ || true
echo "Files copied successfully"
- name: Push to fdroid repo
if: ${{ env.IS_STABLE == 'true' }}
uses: cpina/github-action-push-to-another-repository@v1.7.2
env:
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
with:
source-directory: ./tmp/
destination-github-username: chen08209
destination-repository-name: FlClash-fdroid-repo
user-name: 'github-actions[bot]'
user-email: 'github-actions[bot]@users.noreply.github.com'
target-branch: main
commit-message: Update from ${{ github.ref_name }}
target-directory: /tmp/
================================================
FILE: .gitignore
================================================
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.build/
.buildlog/
.history
.svn/
.swiftpm/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
.vscode/
# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
/build/
/dist/
# Symbolication related
app.*.symbols
# Obfuscation related
app.*.map.json
#AI generated
CLAUDE.md
/.claude
# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release
/android/**/.cxx
/android/**/build
/android/common/**/.**/
/android/common/local.*
/android/core/**/includes/
/android/core/**/cmake-build-*/
/android/core/**/jniLibs/
#FlClash
/libclash/
/android/app/src/main/jniLibs/
/services/helper/target
/macos/**/Package.resolved
devtools_options.yaml
# FVM Version Cache
.fvm/
.fvmrc
================================================
FILE: .gitmodules
================================================
[submodule "core/Clash.Meta"]
path = core/Clash.Meta
url = git@github.com:chen08209/Clash.Meta.git
branch = FlClash
[submodule "plugins/flutter_distributor"]
path = plugins/flutter_distributor
url = git@github.com:chen08209/flutter_distributor.git
branch = FlClash
[submodule "plugins/tray_manager"]
path = plugins/tray_manager
url = git@github.com:chen08209/tray_manager.git
branch = main
================================================
FILE: .metadata
================================================
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: "adc901062556672b4138e18a4dc62a4be8f4b3c2"
channel: "stable"
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
- platform: windows
create_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
base_revision: adc901062556672b4138e18a4dc62a4be8f4b3c2
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'
================================================
FILE: .run/main.dart.run.xml
================================================
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="main.dart" type="FlutterRunConfigurationType" factoryName="Flutter">
<option name="additionalArgs" value="--dart-define-from-file env.json" />
<option name="filePath" value="$PROJECT_DIR$/lib/main.dart" />
<method v="2" />
</configuration>
</component>
================================================
FILE: CHANGELOG.md
================================================
## v0.8.92
- Add sqlite store
- Optimize android quick action
- Optimize backup and restore
- Optimize more details
## v0.8.91
- Fix windows some issues
- Optimize overwrite handle
- Optimize access control page
- Optimize some details
## v0.8.90
- Fix android tile service
- Support append system DNS
- Fix some issues
- Update changelog
## v0.8.89
- Fix some issues
- Optimize Windows service mode
- Update core
- Update changelog
## v0.8.88
- Add android separates the core process
- Support core status check and force restart
- Optimize proxies page and access page
- Update flutter and pub dependencies
- Update go version
- Optimize more details
- Update changelog
## v0.8.87
- Optimize desktop view
- Optimize logs, requests, connection pages
- Optimize windows tray auto hide
- Optimize some details
- Update core
- Update changelog
## v0.8.86
- Fix windows tun issues
- Optimize android get system dns
- Optimize more details
- Update changelog
## v0.8.85
- Support override script
- Support proxies search
- Support svg display
- Optimize config persistence
- Add some scenes auto close connections
- Update core
- Optimize more details
## v0.8.84
- Fix windows service verify issues
- Update changelog
## v0.8.83
- Add windows server mode start process verify
- Add linux deb dependencies
- Add backup recovery strategy select
- Support custom text scaling
- Optimize the display of different text scale
- Optimize windows setup experience
- Optimize startTun performance
- Optimize android tv experience
- Optimize default option
- Optimize computed text size
- Optimize hyperOS freeform window
- Add developer mode
- Update core
- Optimize more details
- Add issues template
- Update changelog
## v0.8.82
- Optimize android vpn performance
- Add custom primary color and color scheme
- Add linux nad windows arm release
- Optimize requests and logs page
- Fix map input page delete issues
- Update changelog
## v0.8.81
- Add rule override
- Update core
- Optimize more details
- Update changelog
## v0.8.80
- Optimize dashboard performance
- Fix some issues
- Fix unselected proxy group delay issues
- Fix asn url issues
- Update changelog
## v0.8.79
- Fix tab delay view issues
- Fix tray action issues
- Fix get profile redirect client ua issues
- Fix proxy card delay view issues
- Add Russian, Japanese adaptation
- Fix some issues
- Update changelog
## v0.8.78
- Fix list form input view issues
- Fix traffic view issues
- Update changelog
## v0.8.77
- Optimize performance
- Update core
- Optimize core stability
- Fix linux tun authority check error
- Fix some issues
- Fix scroll physics error
- Update changelog
## v0.8.75
- Add windows storage corruption detection
- Fix core crash caused by windows resource manager restart
- Optimize logs, requests, access to pages
- Fix macos bypass domain issues
- Update changelog
## v0.8.74
- Fix some issues
- Update changelog
## v0.8.73
- Update popup menu
- Add file editor
- Fix android service issues
- Optimize desktop background performance
- Optimize android main process performance
- Optimize delay test
- Optimize vpn protect
- Update changelog
## v0.8.72
- Update core
- Fix some issues
- Update changelog
## v0.8.71
- Remake dashboard
- Optimize theme
- Optimize more details
- Update flutter version
- Update changelog
## v0.8.70
- Support better window position memory
- Add windows arm64 and linux arm64 build script
- Optimize some details
## v0.8.69
- Remake desktop
- Optimize change proxy
- Optimize network check
- Fix fallback issues
- Optimize lots of details
- Update change.yaml
- Fix android tile issues
- Fix windows tray issues
- Support setting bypassDomain
- Update flutter version
- Fix android service issues
- Fix macos dock exit button issues
- Add route address setting
- Optimize provider view
- Update changelog
- Update CHANGELOG.md
## v0.8.67
- Add android shortcuts
- Fix init params issues
- Fix dynamic color issues
- Optimize navigator animate
- Optimize window init
- Optimize fab
- Optimize save
## v0.8.66
- Fix the collapse issues
- Add fontFamily options
## v0.8.65
- Update core version
- Update flutter version
- Optimize ip check
- Optimize url-test
## v0.8.64
- Update release message
- Init auto gen changelog
- Fix windows tray issues
- Fix urltest issues
- Add auto changelog
- Fix windows admin auto launch issues
- Add android vpn options
- Support proxies icon configuration
- Optimize android immersion display
- Fix some issues
- Optimize ip detection
- Support android vpn ipv6 inbound switch
- Support log export
- Optimize more details
- Fix android system dns issues
- Optimize dns default option
- Fix some issues
- Update readme
## v0.8.60
- Fix build error2
- Fix build error
- Support desktop hotkey
- Support android ipv6 inbound
- Support android system dns
- fix some bugs
## v0.8.59
- Fix delete profile error
## v0.8.58
- Fix submit error 2
- Fix submit error
- Optimize DNS strategy
- Fix the problem that the tray is not displayed in some cases
- Optimize tray
- Update core
- Fix some error
## v0.8.57
- Fix tun update issues
- Add DNS override
- Fixed some bugs
- Optimize more detail
- Add Hosts override
## v0.8.56
- fix android tip error
- fix windows auto launch error
## v0.8.55
- Fix windows tray issues
- Optimize windows logic
- Optimize app logic
- Support windows administrator auto launch
- Support android close vpn
## v0.8.53
- Change flutter version
- Support profiles sort
- Support windows country flags display
- Optimize proxies page and profiles page columns
## v0.8.52
- Update flutter version
- Update version
- Update timeout time
- Update access control page
- Fix bug
## v0.8.51
- Optimize provider page
- Optimize delay test
- Support local backup and recovery
- Fix android tile service issues
## v0.8.49
- Fix linux core build error
- Add proxy-only traffic statistics
- Update core
- Optimize more details
- Merge pull request #140 from txyyh/main
- 添加自建 F-Droid 仓库相关 workflow
- Rename readme fingerprint
- Rename workflow deploy repo name
- Add download guide to README
- Add push release files to fdroid-repo
## v0.8.48
- Optimize proxies page
- Fix ua issues
- Optimize more details
## v0.8.47
- Fix windows build error
## v0.8.46
- Update app icon
- Fix desktop backup error
- Optimize request ua
- Change android icon
- Optimize dashboard
## v0.8.44
- Remove request validate certificate
- Sync core
## v0.8.43
- Fix windows error
## v0.8.42
- Fix setup.dart error
- Fix android system proxy not effective
- Add macos arm64
## v0.8.41
- Optimize proxies page
- Support mouse drag scroll
- Adjust desktop ui
- Revert "Fix android vpn issues"
- This reverts commit 891977408e6938e2acd74e9b9adb959c48c79988.
## v0.8.40
- Fix android vpn issues
- Fix android vpn issues
- Rollback partial modification
## v0.8.39
- Fix the problem that ui can't be synchronized when android vpn is occupied by an external
- Override default socksPort,port
## v0.8.38
- Fix fab issues
## v0.8.37
- Update version
- Fix the problem that vpn cannot be started in some cases
- Fix the problem that geodata url does not take effect
## v0.8.36
- Update ua
- Fix change outbound mode without check ip issues
- Separate android ui and vpn
- Fix url validate issues 2
- Add android hidden from the recent task
- Add geoip file
- Support modify geoData URL
## v0.8.35
- Fix url validate issues
- Fix check ip performance problem
- Optimize resources page
## v0.8.34
- Add ua selector
- Support modify test url
- Optimize android proxy
- Fix the error that async proxy provider could not selected the proxy
## v0.8.33
- Fix android proxy error
- Fix submit error
- Add windows tun
- Optimize android proxy
- Optimize change profile
- Update application ua
- Optimize delay test
## v0.8.32
- Fix android repeated request notification issues
## v0.8.31
- Fix memory overflow issues
## v0.8.30
- Optimize proxies expansion panel 2
- Fix android scan qrcode error
## v0.8.29
- Optimize proxies expansion panel
- Fix text error
## v0.8.28
- Optimize proxy
- Optimize delayed sorting performance
- Add expansion panel proxies page
- Support to adjust the proxy card size
- Support to adjust proxies columns number
- Fix autoRun show issues
- Fix Android 10 issues
- Optimize ip show
## v0.8.26
- Add intranet IP display
- Add connections page
- Add search in connections, requests
- Add keyword search in connections, requests, logs
- Add basic viewing editing capabilities
- Optimize update profile
## v0.8.25
- Update version
- Fix the problem of excessive memory usage in traffic usage.
- Add lightBlue theme color
- Fix start unable to update profile issues
- Fix flashback caused by process
## v0.8.23
- Add build version
- Optimize quick start
- Update system default option
## v0.8.22
- Update build.yml
- Fix android vpn close issues
- Add requests page
- Fix checkUpdate dark mode style error
- Fix quickStart error open app
- Add memory proxies tab index
- Support hidden group
- Optimize logs
- Fix externalController hot load error
## v0.8.21
- Add tcp concurrent switch
- Add system proxy switch
- Add geodata loader switch
- Add external controller switch
- Add auto gc on trim memory
- Fix android notification error
## v0.8.20
- Fix ipv6 error
- Fix android udp direct error
- Add ipv6 switch
- Add access all selected button
- Remove android low version splash
## v0.8.19
- Update version
- Add allowBypass
- Fix Android only pick .text file issues
## v0.8.18
- Fix search issues
## v0.8.17
- Fix LoadBalance, Relay load error
- Fix build.yml4
- Fix build.yml3
- Fix build.yml2
- Fix build.yml
- Add search function at access control
- Fix the issues with the profile add button to cover the edit button
- Adapt LoadBalance and Relay
- Add arm
- Fix android notification icon error
## v0.8.16
- Add one-click update all profiles
- Add expire show
## v0.8.15
- Temp remove tun mode
- Remove macos in workflow
- Change go version
## v0.8.14
- Update Version
- Fix tun unable to open
## v0.8.13
- Optimize delay test2
- Optimize delay test
- Add check ip
- add check ip request
## v0.8.12
- Fix the problem that the download of remote resources failed after GeodataMode was turned on, which caused the
application to flash back.
- Fix edit profile error
- Fix quickStart change proxy error
- Fix core version
## v0.8.10
- Fix core version
## v0.8.9
- Update file_picker
- Add resources page
- Optimize more detail
- Add access selected sorted
- Fix notification duplicate creation issue
- Fix AccessControl click issue
## v0.8.7
- Fix Workflow
- Fix Linux unable to open
- Update README.md 3
- Create LICENSE
- Update README.md 2
- Update README.md
- Optimize workFlow
## v0.8.6
- optimize checkUpdate
## v0.8.5
- Fix submit error
## v0.8.4
- add WebDAV
- add Auto check updates
- Optimize more details
- optimize delayTest
## v0.8.2
- upgrade flutter version
## v0.8.1
- Update kernel
- Add import profile via QR code image
## v0.8.0
- Add compatibility mode and adapt clash scheme.
## v0.7.14
- update Version
- Reconstruction application proxy logic
## v0.7.13
- Fix Tab destroy error
## v0.7.12
- Optimize repeat healthcheck
## v0.7.11
- Optimize Direct mode ui
## v0.7.10
- Optimize Healthcheck
- Remove proxies position animation, improve performance
- Add Telegram Link
- Update healthcheck policy
- New Check URLTest
- Fix the problem of invalid auto-selection
## v0.7.8
- New Async UpdateConfig
- add changeProfileDebounce
- Update Workflow
- Fix ChangeProfile block
- Fix Release Message Error
## v0.7.7
- Update Selector 2
## v0.7.6
- Update Version
- Fix Proxies Select Error
## v0.7.5
- Fix the problem that the proxy group is empty in global mode.
- Fix the problem that the proxy group is empty in global mode.
## v0.7.4
- Add ProxyProvider2
## v0.7.3
- Add ProxyProvider
- Update Version
- Update ProxyGroup Sort
- Fix Android quickStart VpnService some problems
## v0.7.1
- Update version
- Set Android notification low importance
- Fix the issue that VpnService can't be closed correctly in special cases
- Fix the problem that TileService is not destroyed correctly in some cases
- Adjust tab animation defaults
- Add Telegram in README_zh_CN.md
- Add Telegram
## v0.7.0
- update mobile_scanner
- Initial commit
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
<div>
[**简体中文**](README_zh_CN.md)
</div>
## FlClash
[](https://github.com/chen08209/FlClash/releases/)[](https://github.com/chen08209/FlClash/releases/)[](LICENSE)
[](https://t.me/FlClash)
A multi-platform proxy client based on ClashMeta, simple and easy to use, open-source and ad-free.
on Desktop:
<p style="text-align: center;">
<img alt="desktop" src="snapshots/desktop.gif">
</p>
on Mobile:
<p style="text-align: center;">
<img alt="mobile" src="snapshots/mobile.gif">
</p>
## Features
✈️ Multi-platform: Android, Windows, macOS and Linux
💻 Adaptive multiple screen sizes, Multiple color themes available
💡 Based on Material You Design, [Surfboard](https://github.com/getsurfboard/surfboard)-like UI
☁️ Supports data sync via WebDAV
✨ Support subscription link, Dark mode
## Use
### Linux
⚠️ Make sure to install the following dependencies before using them
```bash
sudo apt-get install libayatana-appindicator3-dev
sudo apt-get install libkeybinder-3.0-dev
```
### Android
Support the following actions
```bash
com.follow.clash.action.START
com.follow.clash.action.STOP
com.follow.clash.action.TOGGLE
```
## Download
<a href="https://chen08209.github.io/FlClash-fdroid-repo/repo?fingerprint=789D6D32668712EF7672F9E58DEEB15FBD6DCEEC5AE7A4371EA72F2AAE8A12FD"><img alt="Get it on F-Droid" src="snapshots/get-it-on-fdroid.svg" width="200px"/></a> <a href="https://github.com/chen08209/FlClash/releases"><img alt="Get it on GitHub" src="snapshots/get-it-on-github.svg" width="200px"/></a>
## Build
1. Update submodules
```bash
git submodule update --init --recursive
```
2. Install `Flutter` and `Golang` environment
3. Build Application
- android
1. Install `Android SDK` , `Android NDK`
2. Set `ANDROID_NDK` environment variables
3. Run Build script
```bash
dart .\setup.dart android
```
- windows
1. You need a windows client
2. Install `Gcc`,`Inno Setup`
3. Run build script
```bash
dart .\setup.dart windows --arch <arm64 | amd64>
```
- linux
1. You need a linux client
2. Run build script
```bash
dart .\setup.dart linux --arch <arm64 | amd64>
```
- macOS
1. You need a macOS client
2. Run build script
```bash
dart .\setup.dart macos --arch <arm64 | amd64>
```
## Star
The easiest way to support developers is to click on the star (⭐) at the top of the page.
<p style="text-align: center;">
<a href="https://api.star-history.com/svg?repos=chen08209/FlClash&Date">
<img alt="start" width=50% src="https://api.star-history.com/svg?repos=chen08209/FlClash&Date"/>
</a>
</p>
================================================
FILE: README_zh_CN.md
================================================
<div>
[**English**](README.md)
</div>
## FlClash
[](https://github.com/chen08209/FlClash/releases/)[](https://github.com/chen08209/FlClash/releases/)[](LICENSE)
[](https://t.me/FlClash)
基于ClashMeta的多平台代理客户端,简单易用,开源无广告。
on Desktop:
<p style="text-align: center;">
<img alt="desktop" src="snapshots/desktop.gif">
</p>
on Mobile:
<p style="text-align: center;">
<img alt="mobile" src="snapshots/mobile.gif">
</p>
## Features
✈️ 多平台: Android, Windows, macOS and Linux
💻 自适应多个屏幕尺寸,多种颜色主题可供选择
💡 基本 Material You 设计, 类[Surfboard](https://github.com/getsurfboard/surfboard)用户界面
☁️ 支持通过WebDAV同步数据
✨ 支持一键导入订阅, 深色模式
## Use
### Linux
⚠️ 使用前请确保安装以下依赖
```bash
sudo apt-get install libayatana-appindicator3-dev
sudo apt-get install libkeybinder-3.0-dev
```
### Android
支持下列操作
```bash
com.follow.clash.action.START
com.follow.clash.action.STOP
com.follow.clash.action.TOGGLE
```
## Download
<a href="https://chen08209.github.io/FlClash-fdroid-repo/repo?fingerprint=789D6D32668712EF7672F9E58DEEB15FBD6DCEEC5AE7A4371EA72F2AAE8A12FD"><img alt="Get it on F-Droid" src="snapshots/get-it-on-fdroid.svg" width="200px"/></a> <a href="https://github.com/chen08209/FlClash/releases"><img alt="Get it on GitHub" src="snapshots/get-it-on-github.svg" width="200px"/></a>
## Build
1. 更新 submodules
```bash
git submodule update --init --recursive
```
2. 安装 `Flutter` 以及 `Golang` 环境
3. 构建应用
- android
1. 安装 `Android SDK` , `Android NDK`
2. 设置 `ANDROID_NDK` 环境变量
3. 运行构建脚本
```bash
dart .\setup.dart android
```
- windows
1. 你需要一个windows客户端
2. 安装 `Gcc`,`Inno Setup`
3. 运行构建脚本
```bash
dart .\setup.dart windows --arch <arm64 | amd64>
```
- linux
1. 你需要一个linux客户端
2. 运行构建脚本
```bash
dart .\setup.dart linux --arch <arm64 | amd64>
```
- macOS
1. 你需要一个macOS客户端
2. 运行构建脚本
```bash
dart .\setup.dart macos --arch <arm64 | amd64>
```
## Star History
支持开发者的最简单方式是点击页面顶部的星标(⭐)。
<p style="text-align: center;">
<a href="https://api.star-history.com/svg?repos=chen08209/FlClash&Date">
<img alt="start" width=50% src="https://api.star-history.com/svg?repos=chen08209/FlClash&Date"/>
</a>
</p>
================================================
FILE: analysis_options.yaml
================================================
include: package:flutter_lints/flutter.yaml
analyzer:
exclude:
- lib/l10n/intl/**
errors:
invalid_annotation_target: ignore
linter:
rules:
prefer_single_quotes: true
================================================
FILE: android/.gitignore
================================================
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties
**/*.keystore
**/*.jks
================================================
FILE: android/app/build.gradle.kts
================================================
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import java.util.Properties
plugins {
id("com.android.application")
id("kotlin-android")
id("dev.flutter.flutter-gradle-plugin")
id("com.google.gms.google-services")
id("com.google.firebase.crashlytics")
}
val localPropertiesFile = rootProject.file("local.properties")
val localProperties = Properties().apply {
if (localPropertiesFile.exists()) {
localPropertiesFile.inputStream().use { load(it) }
}
}
val mStoreFile: File = file("keystore.jks")
val mStorePassword: String? = localProperties.getProperty("storePassword")
val mKeyAlias: String? = localProperties.getProperty("keyAlias")
val mKeyPassword: String? = localProperties.getProperty("keyPassword")
val isRelease =
mStoreFile.exists() && mStorePassword != null && mKeyAlias != null && mKeyPassword != null
android {
namespace = "com.follow.clash"
compileSdk = libs.versions.compileSdk.get().toInt()
ndkVersion = libs.versions.ndkVersion.get()
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
defaultConfig {
applicationId = "com.follow.clash"
minSdk = flutter.minSdkVersion
targetSdk = libs.versions.targetSdk.get().toInt()
versionCode = flutter.versionCode
versionName = flutter.versionName
}
signingConfigs {
if (isRelease) {
create("release") {
storeFile = mStoreFile
storePassword = mStorePassword
keyAlias = mKeyAlias
keyPassword = mKeyPassword
}
}
}
packaging {
jniLibs {
useLegacyPackaging = true
}
}
buildTypes {
debug {
isMinifyEnabled = false
applicationIdSuffix = ".dev"
}
release {
isMinifyEnabled = true
isShrinkResources = true
if (isRelease) {
signingConfig = signingConfigs.getByName("release")
} else {
signingConfig = signingConfigs.getByName("debug")
applicationIdSuffix = ".dev"
}
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
)
}
}
}
kotlin {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_17)
}
}
flutter {
source = "../.."
}
dependencies {
implementation(project(":service"))
implementation(project(":common"))
implementation(libs.core.splashscreen)
implementation(libs.gson)
implementation(libs.smali.dexlib2) {
exclude(group = "com.google.guava", module = "guava")
}
implementation(platform(libs.firebase.bom))
implementation(libs.firebase.crashlytics.ndk)
implementation(libs.firebase.analytics)
}
================================================
FILE: android/app/google-services.json
================================================
{
"project_info": {
"project_number": "000000000000",
"project_id": "dev"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:000000000000:android:0000000000000000",
"android_client_info": {
"package_name": "com.follow.clash"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "0"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:000000000000:android:0000000000000000",
"android_client_info": {
"package_name": "com.follow.clash.debug"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "0"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:000000000000:android:0000000000000000",
"android_client_info": {
"package_name": "com.follow.clash.dev"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "0"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
]
}
================================================
FILE: android/app/proguard-rules.pro
================================================
-keep class com.follow.clash.models.**{ *; }
-keep class com.follow.clash.service.models.**{ *; }
================================================
FILE: android/app/src/debug/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<application
android:icon="@mipmap/ic_launcher"
android:label="FlClash Debug"
tools:replace="android:label">
<service
android:name=".TileService"
android:label="FlClash Debug"
tools:replace="android:label" />
</application>
</manifest>
================================================
FILE: android/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.software.leanback"
android:required="false" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<application
android:name=".Application"
android:banner="@mipmap/ic_banner"
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_launcher"
android:label="FlClash">
<activity
android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:exported="true"
android:hardwareAccelerated="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:windowSoftInputMode="adjustResize">
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="clash" />
<data android:scheme="clashmeta" />
<data android:scheme="flclash" />
<data android:host="install-config" />
</intent-filter>
</activity>
<activity
android:name=".TempActivity"
android:excludeFromRecents="true"
android:exported="true"
android:theme="@style/TransparentTheme">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="${applicationId}.action.START" />
</intent-filter>
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="${applicationId}.action.STOP" />
</intent-filter>
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="${applicationId}.action.TOGGLE" />
</intent-filter>
</activity>
<service
android:name=".TileService"
android:exported="true"
android:icon="@drawable/ic"
android:label="FlClash"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
<meta-data
android:name="android.service.quicksettings.TOGGLEABLE_TILE"
android:value="true" />
</service>
<receiver
android:name=".BroadcastReceiver"
android:enabled="true"
android:exported="true"
android:permission="${applicationId}.permission.RECEIVE_BROADCASTS">
<intent-filter>
<action android:name="${applicationId}.intent.action.SERVICE_CREATED" />
<action android:name="${applicationId}.intent.action.SERVICE_DESTROYED" />
</intent-filter>
</receiver>
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>
================================================
FILE: android/app/src/main/kotlin/com/follow/clash/Application.kt
================================================
package com.follow.clash
import android.app.Application
import android.content.Context
import com.follow.clash.common.GlobalState
class Application : Application() {
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
GlobalState.init(this)
}
}
================================================
FILE: android/app/src/main/kotlin/com/follow/clash/BroadcastReceiver.kt
================================================
package com.follow.clash
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.follow.clash.common.BroadcastAction
import com.follow.clash.common.GlobalState
import com.follow.clash.common.action
import kotlinx.coroutines.launch
class BroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
when (intent?.action) {
BroadcastAction.SERVICE_CREATED.action -> {
GlobalState.log("Receiver service created")
GlobalState.launch {
State.handleStartServiceAction()
}
}
BroadcastAction.SERVICE_DESTROYED.action -> {
GlobalState.log("Receiver service destroyed")
GlobalState.launch {
State.handleStopServiceAction()
}
}
}
}
}
================================================
FILE: android/app/src/main/kotlin/com/follow/clash/Ext.kt
================================================
package com.follow.clash
import android.app.Application
import android.content.Context.MODE_PRIVATE
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.os.Build
import android.os.Handler
import android.os.Looper
import android.widget.Toast
import androidx.core.graphics.drawable.toBitmap
import com.follow.clash.common.GlobalState
import com.follow.clash.models.SharedState
import com.google.gson.Gson
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodChannel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.withContext
import java.io.File
import java.io.FileOutputStream
import java.util.concurrent.TimeUnit
import kotlin.coroutines.resume
private const val ICON_TTL_DAYS = 1L
val Application.sharedState: SharedState
get() {
try {
val sp = getSharedPreferences("FlutterSharedPreferences", MODE_PRIVATE)
val res = sp.getString("flutter.sharedState", "")
return Gson().fromJson(res, SharedState::class.java)
} catch (_: Exception) {
return SharedState()
}
}
private var lastToast: Toast? = null
fun Application.showToast(text: String?) {
Handler(Looper.getMainLooper()).post {
lastToast?.cancel()
lastToast = Toast.makeText(this, text, Toast.LENGTH_LONG).apply {
show()
}
}
}
suspend fun PackageManager.getPackageIconPath(packageName: String): String =
withContext(Dispatchers.IO) {
val cacheDir = GlobalState.application.cacheDir
val iconDir = File(cacheDir, "icons").apply { mkdirs() }
return@withContext try {
val pkgInfo = getPackageInfo(packageName, 0)
val lastUpdateTime = pkgInfo.lastUpdateTime
val iconFile = File(iconDir, "${packageName}_${lastUpdateTime}.webp")
if (iconFile.exists() && !isExpired(iconFile)) {
return@withContext iconFile.absolutePath
}
iconDir.listFiles { f -> f.name.startsWith("${packageName}_") }?.forEach(File::delete)
val icon = getApplicationIcon(packageName)
saveDrawableToFile(icon, iconFile)
iconFile.absolutePath
} catch (_: Exception) {
val defaultIconFile = File(iconDir, "default_icon.webp")
if (!defaultIconFile.exists()) {
saveDrawableToFile(defaultActivityIcon, defaultIconFile)
}
defaultIconFile.absolutePath
}
}
private suspend fun saveDrawableToFile(drawable: Drawable, file: File) {
val bitmap = withContext(Dispatchers.Default) {
drawable.toBitmap(width = 128, height = 128)
}
try {
val format = when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> {
Bitmap.CompressFormat.WEBP_LOSSY
}
else -> {
Bitmap.CompressFormat.WEBP
}
}
FileOutputStream(file).use { fos ->
bitmap.compress(format, 90, fos)
}
} finally {
if (!bitmap.isRecycled) bitmap.recycle()
}
}
private fun isExpired(file: File): Boolean {
val now = System.currentTimeMillis()
val age = now - file.lastModified()
return age > TimeUnit.DAYS.toMillis(ICON_TTL_DAYS)
}
suspend fun <T> MethodChannel.awaitResult(
method: String, arguments: Any? = null
): T? = withContext(Dispatchers.Main) {
suspendCancellableCoroutine { continuation ->
invokeMethod(method, arguments, object : MethodChannel.Result {
override fun success(result: Any?) {
@Suppress("UNCHECKED_CAST") continuation.resume(result as T?)
}
override fun error(code: String, message: String?, details: Any?) {
continuation.resume(null)
}
override fun notImplemented() {
continuation.resume(null)
}
})
}
}
inline fun <reified T : FlutterPlugin> FlutterEngine.plugin(): T? {
return plugins.get(T::class.java) as T?
}
fun <T> MethodChannel.invokeMethodOnMainThread(
method: String, arguments: Any? = null, callback: ((Result<T>) -> Unit)? = null
) {
Handler(Looper.getMainLooper()).post {
invokeMethod(method, arguments, object : MethodChannel.Result {
override fun success(result: Any?) {
@Suppress("UNCHECKED_CAST") callback?.invoke(Result.success(result as T))
}
override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {
val exception = Exception("MethodChannel error: $errorCode - $errorMessage")
callback?.invoke(Result.failure(exception))
}
override fun notImplemented() {
val exception = NotImplementedError("Method not implemented: $method")
callback?.invoke(Result.failure(exception))
}
})
}
}
================================================
FILE: android/app/src/main/kotlin/com/follow/clash/MainActivity.kt
================================================
package com.follow.clash
import android.os.Bundle
import com.follow.clash.common.GlobalState
import com.follow.clash.plugins.AppPlugin
import com.follow.clash.plugins.ServicePlugin
import com.follow.clash.plugins.TilePlugin
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
class MainActivity : FlutterActivity(),
CoroutineScope by CoroutineScope(SupervisorJob() + Dispatchers.Default) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
flutterEngine.plugins.add(AppPlugin())
flutterEngine.plugins.add(ServicePlugin())
flutterEngine.plugins.add(TilePlugin())
State.flutterEngine = flutterEngine
}
override fun onDestroy() {
GlobalState.launch {
Service.setEventListener(null)
}
State.flutterEngine = null
super.onDestroy()
}
}
================================================
FILE: android/app/src/main/kotlin/com/follow/clash/Service.kt
================================================
package com.follow.clash
import com.follow.clash.common.GlobalState
import com.follow.clash.common.ServiceDelegate
import com.follow.clash.common.formatString
import com.follow.clash.common.intent
import com.follow.clash.service.IAckInterface
import com.follow.clash.service.ICallbackInterface
import com.follow.clash.service.IEventInterface
import com.follow.clash.service.IRemoteInterface
import com.follow.clash.service.IResultInterface
import com.follow.clash.service.IVoidInterface
import com.follow.clash.service.RemoteService
import com.follow.clash.service.models.NotificationParams
import com.follow.clash.service.models.VpnOptions
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException
object Service {
private val delegate by lazy {
ServiceDelegate<IRemoteInterface>(
RemoteService::class.intent, ::handleServiceDisconnected
) {
IRemoteInterface.Stub.asInterface(it)
}
}
var onServiceDisconnected: ((String) -> Unit)? = null
private fun handleServiceDisconnected(message: String) {
onServiceDisconnected?.let {
it(message)
}
}
fun bind() {
delegate.bind()
}
fun unbind() {
delegate.unbind()
}
suspend fun invokeAction(data: String, cb: ((result: String) -> Unit)?): Result<Unit> {
val res = mutableListOf<ByteArray>()
return delegate.useService {
it.invokeAction(
data, object : ICallbackInterface.Stub() {
override fun onResult(
result: ByteArray?, isSuccess: Boolean, ack: IAckInterface?
) {
res.add(result ?: byteArrayOf())
ack?.onAck()
if (isSuccess) {
cb?.let { cb ->
cb(res.formatString())
}
}
}
})
}
}
suspend fun quickSetup(
initParamsString: String,
setupParamsString: String,
onStarted: (() -> Unit)?,
onResult: ((result: String) -> Unit)?,
): Result<Unit> {
val res = mutableListOf<ByteArray>()
return delegate.useService {
it.quickSetup(
initParamsString,
setupParamsString,
object : ICallbackInterface.Stub() {
override fun onResult(
result: ByteArray?, isSuccess: Boolean, ack: IAckInterface?
) {
res.add(result ?: byteArrayOf())
ack?.onAck()
if (isSuccess) {
onResult?.let { cb ->
cb(res.formatString())
}
}
}
},
object : IVoidInterface.Stub() {
override fun invoke() {
onStarted?.let { onStarted ->
onStarted()
}
}
}
)
}
}
suspend fun setEventListener(
cb: ((result: String?) -> Unit)?
): Result<Unit> {
val results = HashMap<String, MutableList<ByteArray>>()
return delegate.useService {
it.setEventListener(
when (cb != null) {
true -> object : IEventInterface.Stub() {
override fun onEvent(
id: String, data: ByteArray?, isSuccess: Boolean, ack: IAckInterface?
) {
if (results[id] == null) {
results[id] = mutableListOf()
}
results[id]?.add(data ?: byteArrayOf())
ack?.onAck()
if (isSuccess) {
cb(results[id]?.formatString())
results.remove(id)
}
}
}
false -> null
})
}
}
suspend fun updateNotificationParams(
params: NotificationParams
): Result<Unit> {
return delegate.useService {
it.updateNotificationParams(params)
}
}
suspend fun setCrashlytics(
enable: Boolean
): Result<Unit> {
return delegate.useService {
it.setCrashlytics(enable)
}
}
private suspend fun awaitIResultInterface(
block: (IResultInterface) -> Unit
): Long = suspendCancellableCoroutine { continuation ->
val callback = object : IResultInterface.Stub() {
override fun onResult(time: Long) {
if (continuation.isActive) {
continuation.resume(time)
}
}
}
try {
block(callback)
} catch (e: Exception) {
GlobalState.log("awaitIResultInterface $e")
if (continuation.isActive) {
continuation.resumeWithException(e)
}
}
}
suspend fun startService(options: VpnOptions, runTime: Long): Long {
return delegate.useService {
awaitIResultInterface { callback ->
it.startService(options, runTime, callback)
}
}.getOrNull() ?: 0L
}
suspend fun stopService(): Long {
return delegate.useService {
awaitIResultInterface { callback ->
it.stopService(callback)
}
}.getOrNull() ?: 0L
}
suspend fun getRunTime(): Long {
return delegate.useService {
it.runTime
}.getOrNull() ?: 0L
}
}
================================================
FILE: android/app/src/main/kotlin/com/follow/clash/State.kt
================================================
package com.follow.clash
import android.net.VpnService
import com.follow.clash.common.GlobalState
import com.follow.clash.models.SharedState
import com.follow.clash.plugins.AppPlugin
import com.follow.clash.plugins.TilePlugin
import com.follow.clash.service.models.NotificationParams
import com.google.gson.Gson
import io.flutter.embedding.engine.FlutterEngine
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
enum class RunState {
START, PENDING, STOP
}
object State {
val runLock = Mutex()
var runTime: Long = 0
var sharedState: SharedState = SharedState()
val runStateFlow: MutableStateFlow<RunState> = MutableStateFlow(RunState.STOP)
var flutterEngine: FlutterEngine? = null
val appPlugin: AppPlugin?
get() = flutterEngine?.plugin<AppPlugin>()
val tilePlugin: TilePlugin?
get() = flutterEngine?.plugin<TilePlugin>()
suspend fun handleToggleAction() {
var action: (suspend () -> Unit)?
runLock.withLock {
action = when (runStateFlow.value) {
RunState.PENDING -> null
RunState.START -> ::handleStopServiceAction
RunState.STOP -> ::handleStartServiceAction
}
}
action?.invoke()
}
suspend fun handleSyncState() {
runLock.withLock {
try {
Service.bind()
runTime = Service.getRunTime()
val runState = when (runTime == 0L) {
true -> RunState.STOP
false -> RunState.START
}
runStateFlow.tryEmit(runState)
} catch (_: Exception) {
runStateFlow.tryEmit(RunState.STOP)
}
}
}
suspend fun handleStartServiceAction() {
runLock.withLock {
if (runStateFlow.value != RunState.STOP) {
return
}
tilePlugin?.handleStart()
if (flutterEngine != null) {
return
}
startServiceWithPref()
}
}
suspend fun handleStopServiceAction() {
runLock.withLock {
if (runStateFlow.value != RunState.START) {
return
}
tilePlugin?.handleStop()
if (flutterEngine != null) {
return
}
GlobalState.application.showToast(sharedState.stopTip)
handleStopService()
}
}
fun handleStartService() {
val appPlugin = flutterEngine?.plugin<AppPlugin>()
if (appPlugin != null) {
appPlugin.requestNotificationsPermission {
startService()
}
return
}
startService()
}
private fun startServiceWithPref() {
GlobalState.launch {
runLock.withLock {
if (runStateFlow.value != RunState.STOP) {
return@launch
}
sharedState = GlobalState.application.sharedState
setupAndStart()
}
}
}
suspend fun syncState() {
GlobalState.setCrashlytics(sharedState.crashlytics)
Service.updateNotificationParams(
NotificationParams(
title = sharedState.currentProfileName,
stopText = sharedState.stopText,
onlyStatisticsProxy = sharedState.onlyStatisticsProxy
)
)
Service.setCrashlytics(sharedState.crashlytics)
}
private suspend fun setupAndStart() {
Service.bind()
syncState()
GlobalState.application.showToast(sharedState.startTip)
val initParams = mutableMapOf<String, Any>()
initParams["home-dir"] = GlobalState.application.filesDir.path
initParams["version"] = android.os.Build.VERSION.SDK_INT
val initParamsString = Gson().toJson(initParams)
val setupParamsString = Gson().toJson(sharedState.setupParams)
Service.quickSetup(
initParamsString,
setupParamsString,
onStarted = {
startService()
},
onResult = {
if (it.isNotEmpty()) {
GlobalState.application.showToast(it)
}
},
)
}
private fun startService() {
GlobalState.launch {
runLock.withLock {
if (runStateFlow.value != RunState.STOP) {
return@launch
}
try {
runStateFlow.tryEmit(RunState.PENDING)
val options = sharedState.vpnOptions ?: return@launch
appPlugin?.let {
it.prepare(options.enable) {
runTime = Service.startService(options, runTime)
runStateFlow.tryEmit(RunState.START)
}
} ?: run {
val intent = VpnService.prepare(GlobalState.application)
if (intent != null) {
return@launch
}
runTime = Service.startService(options, runTime)
runStateFlow.tryEmit(RunState.START)
}
} finally {
if (runStateFlow.value == RunState.PENDING) {
runStateFlow.tryEmit(RunState.STOP)
}
}
}
}
}
fun handleStopService() {
GlobalState.launch {
runLock.withLock {
if (runStateFlow.value != RunState.START) {
return@launch
}
try {
runStateFlow.tryEmit(RunState.PENDING)
runTime = Service.stopService()
runStateFlow.tryEmit(RunState.STOP)
} finally {
if (runStateFlow.value == RunState.PENDING) {
runStateFlow.tryEmit(RunState.START)
}
}
}
}
}
}
================================================
FILE: android/app/src/main/kotlin/com/follow/clash/TempActivity.kt
================================================
package com.follow.clash
import android.app.Activity
import android.os.Bundle
import com.follow.clash.common.QuickAction
import com.follow.clash.common.action
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
class TempActivity : Activity(),
CoroutineScope by CoroutineScope(SupervisorJob() + Dispatchers.Default) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
when (intent.action) {
QuickAction.START.action -> {
launch {
State.handleStartServiceAction()
}
}
QuickAction.STOP.action -> {
launch {
State.handleStopServiceAction()
}
}
QuickAction.TOGGLE.action -> {
launch {
State.handleToggleAction()
}
}
}
finish()
}
}
================================================
FILE: android/app/src/main/kotlin/com/follow/clash/TileService.kt
================================================
package com.follow.clash
import android.annotation.SuppressLint
import android.os.Build
import android.service.quicksettings.Tile
import android.service.quicksettings.TileService
import com.follow.clash.common.QuickAction
import com.follow.clash.common.quickIntent
import com.follow.clash.common.toPendingIntent
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
class TileService : TileService() {
private var scope: CoroutineScope? = null
private fun updateTile(runState: RunState) {
if (qsTile != null) {
qsTile.state = when (runState) {
RunState.START -> Tile.STATE_ACTIVE
RunState.PENDING -> Tile.STATE_UNAVAILABLE
RunState.STOP -> Tile.STATE_INACTIVE
}
qsTile.updateTile()
}
}
override fun onStartListening() {
super.onStartListening()
scope?.cancel()
scope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
scope?.launch {
State.handleSyncState()
State.runStateFlow.collect {
updateTile(it)
}
}
}
@SuppressLint("StartActivityAndCollapseDeprecated")
private fun handleToggle() {
val intent = QuickAction.TOGGLE.quickIntent
val pendingIntent = intent.toPendingIntent
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
startActivityAndCollapse(pendingIntent)
} else {
@Suppress("DEPRECATION") startActivityAndCollapse(intent)
}
}
override fun onClick() {
super.onClick()
handleToggle()
}
override fun onStopListening() {
scope?.cancel()
super.onStopListening()
}
}
================================================
FILE: android/app/src/main/kotlin/com/follow/clash/models/Package.kt
================================================
package com.follow.clash.models
data class Package(
val packageName: String,
val label: String,
val system: Boolean,
val internet: Boolean,
val lastUpdateTime: Long,
)
================================================
FILE: android/app/src/main/kotlin/com/follow/clash/models/State.kt
================================================
package com.follow.clash.models
import com.follow.clash.service.models.VpnOptions
import com.google.gson.annotations.SerializedName
data class SharedState(
val startTip: String = "Starting VPN...",
val stopTip: String = "Stopping VPN...",
val crashlytics: Boolean = true,
val currentProfileName: String = "FlClash",
val stopText: String = "Stop",
val onlyStatisticsProxy: Boolean = false,
val vpnOptions: VpnOptions? = null,
val setupParams: SetupParams? = null,
)
data class SetupParams(
@SerializedName("test-url")
val testUrl: String,
@SerializedName("selected-map")
val selectedMap: Map<String, String>,
)
================================================
FILE: android/app/src/main/kotlin/com/follow/clash/plugins/AppPlugin.kt
================================================
package com.follow.clash.plugins
import android.Manifest
import android.app.Activity
import android.app.ActivityManager
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.pm.ComponentInfo
import android.content.pm.PackageManager
import android.net.VpnService
import android.os.Build
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.content.ContextCompat.getSystemService
import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.graphics.drawable.IconCompat
import com.android.tools.smali.dexlib2.dexbacked.DexBackedDexFile
import com.follow.clash.R
import com.follow.clash.common.Components
import com.follow.clash.common.GlobalState
import com.follow.clash.common.QuickAction
import com.follow.clash.common.quickIntent
import com.follow.clash.getPackageIconPath
import com.follow.clash.models.Package
import com.follow.clash.showToast
import com.google.gson.Gson
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.Result
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.File
import java.lang.ref.WeakReference
import java.util.zip.ZipFile
class AppPlugin : FlutterPlugin, MethodChannel.MethodCallHandler, ActivityAware {
companion object {
const val VPN_PERMISSION_REQUEST_CODE = 1001
const val NOTIFICATION_PERMISSION_REQUEST_CODE = 1002
}
private var activityRef: WeakReference<Activity>? = null
private lateinit var channel: MethodChannel
private lateinit var scope: CoroutineScope
private var vpnPrepareCallback: (suspend () -> Unit)? = null
private var requestNotificationCallback: (() -> Unit)? = null
private val packages = mutableListOf<Package>()
private val skipPrefixList = listOf(
"com.google",
"com.android.chrome",
"com.android.vending",
"com.microsoft",
"com.apple",
"com.zhiliaoapp.musically", // Banned by China
)
private val chinaAppPrefixList = listOf(
"com.tencent",
"com.alibaba",
"com.umeng",
"com.qihoo",
"com.ali",
"com.alipay",
"com.amap",
"com.sina",
"com.weibo",
"com.vivo",
"com.xiaomi",
"com.huawei",
"com.taobao",
"com.secneo",
"s.h.e.l.l",
"com.stub",
"com.kiwisec",
"com.secshell",
"com.wrapper",
"cn.securitystack",
"com.mogosec",
"com.secoen",
"com.netease",
"com.mx",
"com.qq.e",
"com.baidu",
"com.bytedance",
"com.bugly",
"com.miui",
"com.oppo",
"com.coloros",
"com.iqoo",
"com.meizu",
"com.gionee",
"cn.nubia",
"com.oplus",
"andes.oplus",
"com.unionpay",
"cn.wps"
)
private val chinaAppRegex by lazy {
("(" + chinaAppPrefixList.joinToString("|").replace(".", "\\.") + ").*").toRegex()
}
private var isBlockNotification: Boolean = false
override fun onMethodCall(call: MethodCall, result: Result) {
when (call.method) {
"moveTaskToBack" -> {
activityRef?.get()?.moveTaskToBack(true)
result.success(true)
}
"updateExcludeFromRecents" -> {
val value = call.argument<Boolean>("value")
updateExcludeFromRecents(value)
result.success(true)
}
"initShortcuts" -> {
initShortcuts(call.arguments as String)
result.success(true)
}
"getPackages" -> {
scope.launch {
result.success(getPackagesToJson())
}
}
"getChinaPackageNames" -> {
scope.launch {
result.success(getChinaPackageNames())
}
}
"getPackageIcon" -> {
handleGetPackageIcon(call, result)
}
"tip" -> {
val message = call.argument<String>("message")
tip(message)
result.success(true)
}
else -> {
result.notImplemented()
}
}
}
private fun handleGetPackageIcon(call: MethodCall, result: Result) {
scope.launch {
val packageName = call.argument<String>("packageName")
if (packageName == null) {
result.success("")
return@launch
}
val path = GlobalState.application.packageManager.getPackageIconPath(packageName)
result.success(path)
}
}
private fun initShortcuts(label: String) {
val shortcut = with(ShortcutInfoCompat.Builder(GlobalState.application, "toggle")) {
setShortLabel(label)
setIcon(
IconCompat.createWithResource(
GlobalState.application,
R.mipmap.ic_launcher_round,
)
)
setIntent(QuickAction.TOGGLE.quickIntent)
build()
}
ShortcutManagerCompat.setDynamicShortcuts(
GlobalState.application, listOf(shortcut)
)
}
private fun tip(message: String?) {
GlobalState.application.showToast(message)
}
@Suppress("DEPRECATION")
private fun updateExcludeFromRecents(value: Boolean?) {
val am = getSystemService(GlobalState.application, ActivityManager::class.java)
val task = am?.appTasks?.firstOrNull {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
it.taskInfo.taskId == activityRef?.get()?.taskId
} else {
it.taskInfo.id == activityRef?.get()?.taskId
}
}
when (value) {
true -> task?.setExcludeFromRecents(value)
false -> task?.setExcludeFromRecents(value)
null -> task?.setExcludeFromRecents(false)
}
}
private fun getPackages(): List<Package> {
val packageManager = GlobalState.application.packageManager
if (packages.isNotEmpty()) return packages
packageManager?.getInstalledPackages(PackageManager.GET_META_DATA or PackageManager.GET_PERMISSIONS)
?.filter {
it.packageName != GlobalState.application.packageName && it.packageName != "android"
}?.map {
Package(
packageName = it.packageName,
label = it.applicationInfo?.loadLabel(packageManager).toString(),
system = (it.applicationInfo?.flags?.and(ApplicationInfo.FLAG_SYSTEM)) != 0,
lastUpdateTime = it.lastUpdateTime,
internet = it.requestedPermissions?.contains(Manifest.permission.INTERNET) == true
)
}?.let { packages.addAll(it) }
return packages
}
private suspend fun getPackagesToJson(): String {
return withContext(Dispatchers.Default) {
Gson().toJson(getPackages())
}
}
private suspend fun getChinaPackageNames(): String {
return withContext(Dispatchers.Default) {
val packages: List<String> =
getPackages().map { it.packageName }.filter { isChinaPackage(it) }
Gson().toJson(packages)
}
}
fun requestNotificationsPermission(callBack: () -> Unit) {
requestNotificationCallback = callBack
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
val permission = ContextCompat.checkSelfPermission(
GlobalState.application, Manifest.permission.POST_NOTIFICATIONS
)
if (permission == PackageManager.PERMISSION_GRANTED || isBlockNotification) {
invokeRequestNotificationCallback()
return
}
activityRef?.get()?.let {
ActivityCompat.requestPermissions(
it,
arrayOf(Manifest.permission.POST_NOTIFICATIONS),
NOTIFICATION_PERMISSION_REQUEST_CODE
)
}
return
} else {
invokeRequestNotificationCallback()
}
}
fun invokeRequestNotificationCallback() {
requestNotificationCallback?.invoke()
requestNotificationCallback = null
}
fun prepare(needPrepare: Boolean, callBack: (suspend () -> Unit)) {
vpnPrepareCallback = callBack
if (!needPrepare) {
invokeVpnPrepareCallback()
return
}
val intent = VpnService.prepare(GlobalState.application)
if (intent != null) {
activityRef?.get()?.startActivityForResult(intent, VPN_PERMISSION_REQUEST_CODE)
return
}
invokeVpnPrepareCallback()
}
fun invokeVpnPrepareCallback() {
GlobalState.launch {
vpnPrepareCallback?.invoke()
vpnPrepareCallback = null
}
}
@Suppress("DEPRECATION")
private fun isChinaPackage(packageName: String): Boolean {
val packageManager = GlobalState.application.packageManager ?: return false
skipPrefixList.forEach {
if (packageName == it || packageName.startsWith("$it.")) return false
}
val packageManagerFlags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
PackageManager.MATCH_UNINSTALLED_PACKAGES or PackageManager.GET_ACTIVITIES or PackageManager.GET_SERVICES or PackageManager.GET_RECEIVERS or PackageManager.GET_PROVIDERS
} else {
PackageManager.GET_UNINSTALLED_PACKAGES or PackageManager.GET_ACTIVITIES or PackageManager.GET_SERVICES or PackageManager.GET_RECEIVERS or PackageManager.GET_PROVIDERS
}
if (packageName.matches(chinaAppRegex)) {
return true
}
try {
val packageInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
packageManager.getPackageInfo(
packageName, PackageManager.PackageInfoFlags.of(packageManagerFlags.toLong())
)
} else {
packageManager.getPackageInfo(
packageName, packageManagerFlags
)
}
mutableListOf<ComponentInfo>().apply {
packageInfo.services?.let { addAll(it) }
packageInfo.activities?.let { addAll(it) }
packageInfo.receivers?.let { addAll(it) }
packageInfo.providers?.let { addAll(it) }
}.forEach {
if (it.name.matches(chinaAppRegex)) return true
}
packageInfo.applicationInfo?.publicSourceDir?.let {
ZipFile(File(it)).use {
for (packageEntry in it.entries()) {
if (packageEntry.name.startsWith("firebase-")) return false
}
for (packageEntry in it.entries()) {
if (!(packageEntry.name.startsWith("classes") && packageEntry.name.endsWith(
".dex"
))
) {
continue
}
if (packageEntry.size > 15000000) {
return true
}
val input = it.getInputStream(packageEntry).buffered()
val dexFile = try {
DexBackedDexFile.fromInputStream(null, input)
} catch (e: Exception) {
return false
}
for (clazz in dexFile.classes) {
val clazzName =
clazz.type.substring(1, clazz.type.length - 1).replace("/", ".")
.replace("$", ".")
if (clazzName.matches(chinaAppRegex)) return true
}
}
}
}
} catch (_: Exception) {
return false
}
return false
}
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
scope = CoroutineScope(Dispatchers.Default)
channel =
MethodChannel(flutterPluginBinding.binaryMessenger, "${Components.PACKAGE_NAME}/app")
channel.setMethodCallHandler(this)
}
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
channel.setMethodCallHandler(null)
scope.cancel()
}
override fun onAttachedToActivity(binding: ActivityPluginBinding) {
activityRef = WeakReference(binding.activity)
binding.addActivityResultListener(::onActivityResult)
binding.addRequestPermissionsResultListener(::onRequestPermissionsResultListener)
}
override fun onDetachedFromActivityForConfigChanges() {
activityRef = null
}
override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
activityRef = WeakReference(binding.activity)
}
override fun onDetachedFromActivity() {
channel.invokeMethod("exit", null)
activityRef = null
}
private fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean {
if (requestCode == VPN_PERMISSION_REQUEST_CODE) {
if (resultCode == FlutterActivity.RESULT_OK) {
invokeVpnPrepareCallback()
}
}
return true
}
private fun onRequestPermissionsResultListener(
requestCode: Int, permissions: Array<String>, grantResults: IntArray
): Boolean {
if (requestCode == NOTIFICATION_PERMISSION_REQUEST_CODE) {
isBlockNotification = true
}
invokeRequestNotificationCallback()
return true
}
}
================================================
FILE: android/app/src/main/kotlin/com/follow/clash/plugins/ServicePlugin.kt
================================================
package com.follow.clash.plugins
import com.follow.clash.RunState
import com.follow.clash.Service
import com.follow.clash.State
import com.follow.clash.common.Components
import com.follow.clash.invokeMethodOnMainThread
import com.follow.clash.models.SharedState
import com.google.gson.Gson
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Semaphore
import kotlinx.coroutines.sync.withPermit
class ServicePlugin : FlutterPlugin, MethodChannel.MethodCallHandler,
CoroutineScope by CoroutineScope(SupervisorJob() + Dispatchers.Default) {
private lateinit var flutterMethodChannel: MethodChannel
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
flutterMethodChannel = MethodChannel(
flutterPluginBinding.binaryMessenger, "${Components.PACKAGE_NAME}/service"
)
flutterMethodChannel.setMethodCallHandler(this)
}
override fun onDetachedFromEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
flutterMethodChannel.setMethodCallHandler(null)
}
override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) = when (call.method) {
"init" -> {
handleInit(result)
}
"shutdown" -> {
handleShutdown(result)
}
"invokeAction" -> {
handleInvokeAction(call, result)
}
"getRunTime" -> {
handleGetRunTime(result)
}
"syncState" -> {
handleSyncState(call, result)
}
"start" -> {
handleStart(result)
}
"stop" -> {
handleStop(result)
}
else -> {
result.notImplemented()
}
}
private fun handleInvokeAction(call: MethodCall, result: MethodChannel.Result) {
launch {
val data = call.arguments<String>()!!
Service.invokeAction(data) {
result.success(it)
}
}
}
private fun handleShutdown(result: MethodChannel.Result) {
Service.unbind()
result.success(true)
}
private fun handleStart(result: MethodChannel.Result) {
State.handleStartService()
result.success(true)
}
private fun handleStop(result: MethodChannel.Result) {
State.handleStopService()
result.success(true)
}
val semaphore = Semaphore(10)
fun handleSendEvent(value: String?) {
launch(Dispatchers.Main) {
semaphore.withPermit {
flutterMethodChannel.invokeMethod("event", value)
}
}
}
private fun onServiceDisconnected(message: String) {
State.runStateFlow.tryEmit(RunState.STOP)
flutterMethodChannel.invokeMethodOnMainThread<Any>("crash", message)
}
private fun handleSyncState(call: MethodCall, result: MethodChannel.Result) {
val data = call.arguments<String>()!!
State.sharedState = Gson().fromJson(data, SharedState::class.java)
launch {
State.syncState()
result.success("")
}
}
fun handleInit(result: MethodChannel.Result) {
Service.bind()
launch {
Service.setEventListener {
handleSendEvent(it)
}.onSuccess {
result.success("")
}.onFailure {
result.success(it.message)
}
}
Service.onServiceDisconnected = ::onServiceDisconnected
}
private fun handleGetRunTime(result: MethodChannel.Result) {
launch {
State.handleSyncState()
result.success(State.runTime)
}
}
}
================================================
FILE: android/app/src/main/kotlin/com/follow/clash/plugins/TilePlugin.kt
================================================
package com.follow.clash.plugins
import com.follow.clash.common.Components
import com.follow.clash.invokeMethodOnMainThread
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
class TilePlugin : FlutterPlugin, MethodChannel.MethodCallHandler {
private lateinit var channel: MethodChannel
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
channel =
MethodChannel(flutterPluginBinding.binaryMessenger, "${Components.PACKAGE_NAME}/tile")
channel.setMethodCallHandler(this)
}
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
channel.setMethodCallHandler(null)
}
fun handleStart() {
channel.invokeMethodOnMainThread<Any>("start", null)
}
fun handleStop() {
channel.invokeMethodOnMainThread<Any>("stop", null)
}
override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {}
}
================================================
FILE: android/app/src/main/res/drawable/ic_launcher_foreground.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="240"
android:viewportHeight="240">
<group android:scaleX="0.924"
android:scaleY="0.924"
android:translateX="9.12"
android:translateY="9.12">
<group android:scaleX="0.63461536"
android:scaleY="0.63461536"
android:translateX="45.96154"
android:translateY="43.846153">
<path
android:pathData="M60.65,89.6L154.18,35.6A18,18 107.59,0 1,178.77 42.19L178.77,42.19A18,18 107.59,0 1,172.18 66.78L78.65,120.78A18,18 106.67,0 1,54.06 114.19L54.06,114.19A18,18 106.67,0 1,60.65 89.6z"
android:fillColor="#6666FB"/>
<path
android:pathData="M84.65,131.17L131.42,104.17A18,18 107.83,0 1,156 110.76L156,110.76A18,18 107.83,0 1,149.42 135.35L102.65,162.35A18,18 106.67,0 1,78.06 155.76L78.06,155.76A18,18 106.67,0 1,84.65 131.17z"
android:fillColor="#336AB6"/>
<path
android:pathData="M108.65,172.74L108.65,172.74A18,18 116.03,0 1,133.24 179.33L133.24,179.33A18,18 116.03,0 1,126.65 203.92L126.65,203.92A18,18 116.03,0 1,102.06 197.33L102.06,197.33A18,18 116.03,0 1,108.65 172.74z"
android:fillColor="#5CA8E9"/>
</group>
</group>
</vector>
================================================
FILE: android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
<?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"/>
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
================================================
FILE: android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
================================================
<?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"/>
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
================================================
FILE: android/app/src/main/res/values/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FAFAFA</color>
</resources>
================================================
FILE: android/app/src/main/res/values/styles.xml
================================================
<?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">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
</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>
<style name="TransparentTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
</resources>
================================================
FILE: android/app/src/main/res/values-night/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- 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">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
</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>
================================================
FILE: android/app/src/main/res/values-night-v27/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
<item name="android:windowFullscreen">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:windowSplashScreenBackground" tools:targetApi="s">#121212</item>
<item name="android:windowSplashScreenAnimatedIcon" tools:targetApi="s">@drawable/ic_launcher_foreground</item>
<item name="postSplashScreenTheme">@style/NormalTheme</item>
</style>
</resources>
================================================
FILE: android/app/src/main/res/values-v27/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
<item name="android:windowFullscreen">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:windowSplashScreenBackground" tools:targetApi="s">@color/ic_launcher_background</item>
<item name="android:windowSplashScreenAnimatedIcon" tools:targetApi="s">@drawable/ic_launcher_foreground</item>
<item name="postSplashScreenTheme">@style/NormalTheme</item>
</style>
</resources>
================================================
FILE: android/app/src/main/res/xml/file_paths.xml
================================================
<paths>
<files-path
name="files"
path="."/>
</paths>
================================================
FILE: android/app/src/main/res/xml/network_security_config.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<network-security-config xmlns:tools="http://schemas.android.com/tools"
tools:ignore="AcceptsUserCertificates">
<base-config>
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</base-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">localhost</domain>
<domain includeSubdomains="true">127.0.0.1</domain>
</domain-config>
</network-security-config>
================================================
FILE: android/app/src/profile/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
================================================
FILE: android/build.gradle.kts
================================================
allprojects {
repositories {
google()
mavenCentral()
}
}
val newBuildDir: Directory =
rootProject.layout.buildDirectory
.dir("../../build")
.get()
rootProject.layout.buildDirectory.value(newBuildDir)
subprojects {
val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
project.layout.buildDirectory.value(newSubprojectBuildDir)
}
subprojects {
project.evaluationDependsOn(":app")
}
tasks.register<Delete>("clean") {
delete(rootProject.layout.buildDirectory)
}
================================================
FILE: android/common/.gitignore
================================================
/build
================================================
FILE: android/common/build.gradle.kts
================================================
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
id("com.android.library")
id("org.jetbrains.kotlin.android")
}
android {
namespace = "com.follow.clash.common"
compileSdk = libs.versions.compileSdk.get().toInt()
defaultConfig {
minSdk = 21
consumerProguardFiles("consumer-rules.pro")
}
buildTypes {
release {
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
kotlin {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_17)
}
}
dependencies {
implementation(libs.androidx.core)
implementation(libs.gson)
implementation(platform(libs.firebase.bom))
implementation(libs.firebase.crashlytics.ndk)
implementation(libs.firebase.analytics)
}
================================================
FILE: android/common/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<permission
android:name="${applicationId}.permission.RECEIVE_BROADCASTS"
android:protectionLevel="signature" />
<uses-permission android:name="${applicationId}.permission.RECEIVE_BROADCASTS" />
</manifest>
================================================
FILE: android/common/src/main/java/com/follow/clash/common/Components.kt
================================================
package com.follow.clash.common
import android.content.ComponentName
object Components {
const val PACKAGE_NAME = "com.follow.clash"
val MAIN_ACTIVITY =
ComponentName(GlobalState.packageName, "${PACKAGE_NAME}.MainActivity")
val TEMP_ACTIVITY =
ComponentName(GlobalState.packageName, "${PACKAGE_NAME}.TempActivity")
val BROADCAST_RECEIVER =
ComponentName(GlobalState.packageName, "${PACKAGE_NAME}.BroadcastReceiver")
}
================================================
FILE: android/common/src/main/java/com/follow/clash/common/Enums.kt
================================================
package com.follow.clash.common
import com.google.gson.annotations.SerializedName
enum class QuickAction {
STOP,
START,
TOGGLE,
}
enum class BroadcastAction {
SERVICE_CREATED,
SERVICE_DESTROYED,
}
enum class AccessControlMode {
@SerializedName("acceptSelected")
ACCEPT_SELECTED,
@SerializedName("rejectSelected")
REJECT_SELECTED,
}
================================================
FILE: android/common/src/main/java/com/follow/clash/common/Ext.kt
================================================
package com.follow.clash.common
import android.annotation.SuppressLint
import android.app.ActivityManager
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.Service
import android.content.BroadcastReceiver
import android.content.ComponentName
import android.content.Context
import android.content.Context.RECEIVER_NOT_EXPORTED
import android.content.Intent
import android.content.IntentFilter
import android.content.ServiceConnection
import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE
import android.os.Build
import android.os.Handler
import android.os.IBinder
import android.os.Looper
import android.os.RemoteException
import android.util.Log
import androidx.core.content.getSystemService
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.retryWhen
import kotlinx.coroutines.withContext
import java.nio.charset.Charset
import kotlin.reflect.KClass
//fun Context.startForegroundServiceCompat(intent: Intent?) {
// if (Build.VERSION.SDK_INT >= 26) {
// startForegroundService(intent)
// } else {
// startService(intent)
// }
//}
val KClass<*>.intent: Intent
get() = Intent(GlobalState.application, this.java)
fun Service.startForegroundCompat(id: Int, notification: Notification) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
startForeground(id, notification, FOREGROUND_SERVICE_TYPE_SPECIAL_USE)
} else {
startForeground(id, notification)
}
}
val ComponentName.intent: Intent
get() = Intent().apply {
setComponent(this@intent)
setPackage(GlobalState.packageName)
}
val QuickAction.action: String
get() = "${GlobalState.application.packageName}.action.${this.name}"
val QuickAction.quickIntent: Intent
get() = Components.TEMP_ACTIVITY.intent.apply {
action = this@quickIntent.action
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
}
val BroadcastAction.action: String
get() = "${GlobalState.application.packageName}.intent.action.${this.name}"
val Context.processName: String?
get() {
val pid = android.os.Process.myPid()
val activityManager = getSystemService<ActivityManager>()
activityManager?.runningAppProcesses?.find { it.pid == pid }?.let {
return it.processName
}
return null
}
val BroadcastAction.quickIntent: Intent
get() = Components.BROADCAST_RECEIVER.intent.apply {
action = this@quickIntent.action
}
fun BroadcastAction.sendBroadcast() {
val intent = Intent().apply {
action = this@sendBroadcast.action
Log.d("[sendBroadcast]", "$action")
setPackage(GlobalState.packageName)
}
GlobalState.application.sendBroadcast(
intent, GlobalState.RECEIVE_BROADCASTS_PERMISSIONS
)
}
val Intent.toPendingIntent: PendingIntent
get() = PendingIntent.getActivity(
GlobalState.application,
0,
this,
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)
fun Service.startForeground(notification: Notification) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val manager = getSystemService(NotificationManager::class.java)
var channel = manager?.getNotificationChannel(GlobalState.NOTIFICATION_CHANNEL)
if (channel == null) {
channel = NotificationChannel(
GlobalState.NOTIFICATION_CHANNEL,
"SERVICE_CHANNEL",
NotificationManager.IMPORTANCE_LOW
)
manager?.createNotificationChannel(channel)
}
}
startForegroundCompat(GlobalState.NOTIFICATION_ID, notification)
}
@SuppressLint("UnspecifiedRegisterReceiverFlag")
fun Context.registerReceiverCompat(
receiver: BroadcastReceiver,
filter: IntentFilter,
) = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
registerReceiver(receiver, filter, RECEIVER_NOT_EXPORTED)
} else {
registerReceiver(receiver, filter)
}
fun Context.receiveBroadcastFlow(
configure: IntentFilter.() -> Unit,
): Flow<Intent> = callbackFlow {
val filter = IntentFilter().apply(configure)
val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (context == null || intent == null) return
trySend(intent)
}
}
registerReceiverCompat(receiver, filter)
awaitClose { unregisterReceiver(receiver) }
}
inline fun <reified T : IBinder> Context.bindServiceFlow(
intent: Intent,
flags: Int = Context.BIND_AUTO_CREATE,
maxRetries: Int = 10,
retryDelayMillis: Long = 200L
): Flow<Pair<IBinder?, String>> = callbackFlow {
val connection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, binder: IBinder?) {
if (binder != null) {
try {
@Suppress("UNCHECKED_CAST") val casted = binder as? T
if (casted != null) {
trySend(Pair(casted, ""))
} else {
trySend(Pair(null, "Binder is not of type ${T::class.java}"))
}
} catch (e: RemoteException) {
trySend(Pair(null, "Failed to link to death: ${e.message}"))
}
} else {
trySend(Pair(null, "Binder empty"))
}
}
override fun onServiceDisconnected(name: ComponentName?) {
trySend(Pair(null, "Service disconnected"))
}
}
val success = withContext(Dispatchers.Main) {
bindService(intent, connection, flags)
}
if (!success) {
throw IllegalStateException("bindService() failed, will retry")
}
awaitClose {
Handler(Looper.getMainLooper()).post {
unbindService(connection)
trySend(Pair(null, ""))
}
}
}.retryWhen { cause, attempt ->
if (attempt < maxRetries && cause is Exception) {
delay(retryDelayMillis)
true
} else {
false
}
}
val Long.formatBytes: String
get() {
val units = arrayOf("B", "KB", "MB", "GB", "TB")
var size = this.toDouble()
var unitIndex = 0
while (size >= 1024 && unitIndex < units.size - 1) {
size /= 1024
unitIndex++
}
return if (unitIndex == 0) {
"${size.toLong()}${units[unitIndex]}"
} else {
"%.1f${units[unitIndex]}".format(size)
}
}
fun String.chunkedForAidl(charset: Charset = Charsets.UTF_8): List<ByteArray> {
val allBytes = toByteArray(charset)
val total = allBytes.size
val maxBytes = when {
total <= 100 * 1024 -> total
total <= 1024 * 1024 -> 64 * 1024
total <= 10 * 1024 * 1024 -> 128 * 1024
else -> 256 * 1024
}
val result = mutableListOf<ByteArray>()
var index = 0
while (index < total) {
val end = minOf(index + maxBytes, total)
result.add(allBytes.copyOfRange(index, end))
index = end
}
return result
}
fun <T : List<ByteArray>> T.formatString(charset: Charset = Charsets.UTF_8): String {
val totalSize = this.sumOf { it.size }
val combined = ByteArray(totalSize)
var offset = 0
forEach { byteArray ->
byteArray.copyInto(combined, offset)
offset += byteArray.size
}
return String(combined, charset)
}
================================================
FILE: android/common/src/main/java/com/follow/clash/common/GlobalState.kt
================================================
package com.follow.clash.common
import android.app.Application
import android.util.Log
import com.google.firebase.FirebaseApp
import com.google.firebase.crashlytics.FirebaseCrashlytics
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
object GlobalState : CoroutineScope by CoroutineScope(Dispatchers.Default) {
const val NOTIFICATION_CHANNEL = "FlClash"
const val NOTIFICATION_ID = 1
val packageName: String
get() = application.packageName
val RECEIVE_BROADCASTS_PERMISSIONS: String
get() = "${packageName}.permission.RECEIVE_BROADCASTS"
private var _application: Application? = null
val application: Application
get() = _application!!
fun log(text: String) {
Log.d("[FlClash]", text)
}
fun init(application: Application) {
_application = application
}
fun setCrashlytics(enable: Boolean) {
_application?.let {
FirebaseApp.initializeApp(it)
FirebaseCrashlytics.getInstance().isCrashlyticsCollectionEnabled = enable
if (enable) {
log("init crashlytics ${it.processName}")
}
}
}
}
================================================
FILE: android/common/src/main/java/com/follow/clash/common/Service.kt
================================================
package com.follow.clash.common
import android.content.Intent
import android.os.IBinder
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlinx.coroutines.withTimeout
import java.util.concurrent.atomic.AtomicBoolean
class ServiceDelegate<T>(
private val intent: Intent,
private val onServiceDisconnected: ((String) -> Unit)? = null,
private val interfaceCreator: (IBinder) -> T,
) : CoroutineScope by CoroutineScope(SupervisorJob() + Dispatchers.Default) {
private val _bindingState = AtomicBoolean(false)
private var _serviceState = MutableStateFlow<Pair<T?, String>?>(null)
val serviceState: StateFlow<Pair<T?, String>?> = _serviceState
private var job: Job? = null
private fun handleBind(data: Pair<IBinder?, String>) {
data.first?.let {
_serviceState.value = Pair(interfaceCreator(it), data.second)
} ?: run {
_serviceState.value = Pair(null, data.second)
unbind()
onServiceDisconnected?.invoke(data.second)
_bindingState.set(false)
}
}
fun bind() {
if (_bindingState.compareAndSet(false, true)) {
job?.cancel()
job = null
_serviceState.value = null
job = launch {
runCatching {
GlobalState.application.bindServiceFlow<IBinder>(intent)
.collect { handleBind(it) }
}
}
}
}
suspend inline fun <R> useService(
timeoutMillis: Long = 5000, crossinline block: suspend (T) -> R
): Result<R> {
return runCatching {
withTimeout(timeoutMillis) {
val state = serviceState.filterNotNull().first()
state.first?.let {
withContext(Dispatchers.Default) {
block(it)
}
} ?: throw Exception(state.second)
}
}
}
fun unbind() {
if (_bindingState.compareAndSet(true, false)) {
job?.cancel()
job = null
_serviceState.value = null
}
}
}
================================================
FILE: android/common/src/main/java/com/follow/clash/common/Utils.kt
================================================
package com.follow.clash.common
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
fun tickerFlow(delayMillis: Long, initialDelayMillis: Long = delayMillis): Flow<Unit> = flow {
delay(initialDelayMillis)
while (true) {
emit(Unit)
delay(delayMillis)
}
}
================================================
FILE: android/common/src/main/res/values/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="FlClash">FlClash</string>
</resources>
================================================
FILE: android/core/.gitignore
================================================
/build
================================================
FILE: android/core/build.gradle.kts
================================================
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
id("com.android.library")
id("org.jetbrains.kotlin.android")
}
android {
namespace = "com.follow.clash.core"
compileSdk = libs.versions.compileSdk.get().toInt()
ndkVersion = libs.versions.ndkVersion.get()
defaultConfig {
minSdk = libs.versions.minSdk.get().toInt()
}
sourceSets {
getByName("main") {
jniLibs.srcDirs("src/main/jniLibs")
}
}
externalNativeBuild {
cmake {
path("src/main/cpp/CMakeLists.txt")
version = "3.22.1"
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
buildTypes {
release {
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}
kotlin {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_17)
}
}
dependencies {
implementation(libs.annotation.jvm)
}
val copyNativeLibs by tasks.register<Copy>("copyNativeLibs") {
doFirst {
delete("src/main/jniLibs")
}
from("../../libclash/android")
into("src/main/jniLibs")
doLast {
val includesDir = file("src/main/jniLibs/includes")
val targetDir = file("src/main/cpp/includes")
if (includesDir.exists()) {
copy {
from(includesDir)
into(targetDir)
}
delete(includesDir)
}
}
}
afterEvaluate {
tasks.named("preBuild") {
dependsOn(copyNativeLibs)
}
}
================================================
FILE: android/core/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
================================================
FILE: android/core/src/main/cpp/CMakeLists.txt
================================================
cmake_minimum_required(VERSION 3.22.1)
project("core")
message("CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR}")
message("CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE}")
if (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
add_compile_options(-O3 -flto -g0 -fno-exceptions -fno-rtti)
add_link_options(-flto -Wl,--gc-sections,--strip-all)
endif ()
set(LIB_CLASH_PATH "${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libclash.so")
message("LIB_CLASH_PATH ${LIB_CLASH_PATH}")
if (EXISTS ${LIB_CLASH_PATH})
message("Found libclash.so for ABI ${ANDROID_ABI}")
add_compile_definitions(LIBCLASH)
include_directories(${CMAKE_SOURCE_DIR}/../cpp/includes/${ANDROID_ABI})
link_directories(${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
add_library(${CMAKE_PROJECT_NAME} SHARED
jni_helper.cpp
core.cpp)
target_link_libraries(${CMAKE_PROJECT_NAME}
clash)
else ()
message("Not found libclash.so for ABI ${ANDROID_ABI}")
add_library(${CMAKE_PROJECT_NAME} SHARED
jni_helper.cpp
core.cpp)
target_link_libraries(${CMAKE_PROJECT_NAME})
endif ()
================================================
FILE: android/core/src/main/cpp/core.cpp
================================================
#include <jni.h>
#ifdef LIBCLASH
#include "jni_helper.h"
#include "libclash.h"
#include "bride.h"
extern "C"
JNIEXPORT void JNICALL
Java_com_follow_clash_core_Core_startTun(JNIEnv *env, jobject thiz, jint fd, jobject cb,
jstring stack, jstring address, jstring dns) {
const auto interface = new_global(cb);
startTUN(interface, fd, get_string(stack), get_string(address), get_string(dns));
}
extern "C"
JNIEXPORT void JNICALL
Java_com_follow_clash_core_Core_stopTun(JNIEnv *env, jobject thiz) {
stopTun();
}
extern "C"
JNIEXPORT void JNICALL
Java_com_follow_clash_core_Core_forceGC(JNIEnv *env, jobject thiz) {
forceGC();
}
extern "C"
JNIEXPORT void JNICALL
Java_com_follow_clash_core_Core_updateDNS(JNIEnv *env, jobject thiz, jstring dns) {
updateDns(get_string(dns));
}
extern "C"
JNIEXPORT void JNICALL
Java_com_follow_clash_core_Core_invokeAction(JNIEnv *env, jobject thiz, jstring data, jobject cb) {
const auto interface = new_global(cb);
invokeAction(interface, get_string(data));
}
extern "C"
JNIEXPORT void JNICALL
Java_com_follow_clash_core_Core_setEventListener(JNIEnv *env, jobject thiz, jobject cb) {
if (cb != nullptr) {
const auto interface = new_global(cb);
setEventListener(interface);
} else {
setEventListener(nullptr);
}
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_follow_clash_core_Core_getTraffic(JNIEnv *env, jobject thiz,
const jboolean only_statistics_proxy) {
return new_string(getTraffic(only_statistics_proxy));
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_follow_clash_core_Core_getTotalTraffic(JNIEnv *env, jobject thiz,
const jboolean only_statistics_proxy) {
return new_string(getTotalTraffic(only_statistics_proxy));
}
extern "C"
JNIEXPORT void JNICALL
Java_com_follow_clash_core_Core_suspended(JNIEnv *env, jobject thiz, jboolean suspended) {
suspend(suspended);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_follow_clash_core_Core_quickSetup(JNIEnv *env, jobject thiz, jstring init_params_string,
jstring setup_params_string, jobject cb) {
const auto interface = new_global(cb);
quickSetup(interface, get_string(init_params_string), get_string(setup_params_string));
}
static jmethodID m_tun_interface_protect;
static jmethodID m_tun_interface_resolve_process;
static jmethodID m_invoke_interface_result;
static void release_jni_object_impl(void *obj) {
ATTACH_JNI();
del_global(static_cast<jobject>(obj));
}
static void free_string_impl(char *str) {
free(str);
}
static void call_tun_interface_protect_impl(void *tun_interface, const int fd) {
ATTACH_JNI();
env->CallVoidMethod(static_cast<jobject>(tun_interface),
m_tun_interface_protect,
fd);
}
static char *
call_tun_interface_resolve_process_impl(void *tun_interface, const int protocol,
const char *source,
const char *target,
const int uid) {
ATTACH_JNI();
const auto packageName = reinterpret_cast<jstring>(env->CallObjectMethod(
static_cast<jobject>(tun_interface),
m_tun_interface_resolve_process,
protocol,
new_string(source),
new_string(target),
uid));
return get_string(packageName);
}
static void call_invoke_interface_result_impl(void *invoke_interface, const char *data) {
ATTACH_JNI();
env->CallVoidMethod(static_cast<jobject>(invoke_interface),
m_invoke_interface_result,
new_string(data));
}
extern "C"
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM *vm, void *) {
JNIEnv *env = nullptr;
if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK) {
return JNI_ERR;
}
initialize_jni(vm, env);
const auto c_tun_interface = find_class("com/follow/clash/core/TunInterface");
const auto c_invoke_interface = find_class("com/follow/clash/core/InvokeInterface");
m_tun_interface_protect = find_method(c_tun_interface, "protect", "(I)V");
m_tun_interface_resolve_process = find_method(c_tun_interface, "resolverProcess",
"(ILjava/lang/String;Ljava/lang/String;I)Ljava/lang/String;");
m_invoke_interface_result = find_method(c_invoke_interface, "onResult",
"(Ljava/lang/String;)V");
protect_func = &call_tun_interface_protect_impl;
resolve_process_func = &call_tun_interface_resolve_process_impl;
result_func = &call_invoke_interface_result_impl;
release_object_func = &release_jni_object_impl;
free_string_func = &free_string_impl;
return JNI_VERSION_1_6;
}
#else
extern "C"
JNIEXPORT void JNICALL
Java_com_follow_clash_core_Core_startTun(JNIEnv *env, jobject thiz, jint fd, jobject cb,
jstring stack, jstring address, jstring dns) {
}
extern "C"
JNIEXPORT void JNICALL
Java_com_follow_clash_core_Core_stopTun(JNIEnv *env, jobject thiz) {
}
extern "C"
JNIEXPORT void JNICALL
Java_com_follow_clash_core_Core_invokeAction(JNIEnv *env, jobject thiz, jstring data, jobject cb) {
}
extern "C"
JNIEXPORT void JNICALL
Java_com_follow_clash_core_Core_forceGC(JNIEnv *env, jobject thiz) {
}
extern "C"
JNIEXPORT void JNICALL
Java_com_follow_clash_core_Core_updateDNS(JNIEnv *env, jobject thiz, jstring dns) {
}
extern "C"
JNIEXPORT void JNICALL
Java_com_follow_clash_core_Core_setEventListener(JNIEnv *env, jobject thiz, jobject cb) {
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_follow_clash_core_Core_getTraffic(JNIEnv *env, jobject thiz,
const jboolean only_statistics_proxy) {
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_follow_clash_core_Core_getTotalTraffic(JNIEnv *env, jobject thiz,
const jboolean only_statistics_proxy) {
}
extern "C"
JNIEXPORT void JNICALL
Java_com_follow_clash_core_Core_suspended(JNIEnv *env, jobject thiz, jboolean suspended) {
}
extern "C"
JNIEXPORT void JNICALL
Java_com_follow_clash_core_Core_quickSetup(JNIEnv *env, jobject thiz, jstring init_params_string,
jstring setup_params_string, jobject cb) {
}
#endif
================================================
FILE: android/core/src/main/cpp/jni_helper.cpp
================================================
#include "jni_helper.h"
#include <cstdlib>
#include <malloc.h>
#include <cstring>
static JavaVM *global_vm;
static jclass c_string;
static jmethodID m_new_string;
static jmethodID m_get_bytes;
void initialize_jni(JavaVM *vm, JNIEnv *env) {
global_vm = vm;
c_string = reinterpret_cast<jclass>(new_global(find_class("java/lang/String")));
m_new_string = find_method(c_string, "<init>", "([B)V");
m_get_bytes = find_method(c_string, "getBytes", "()[B");
}
JavaVM *global_java_vm() {
return global_vm;
}
char *jni_get_string(JNIEnv *env, jstring str) {
const auto array = reinterpret_cast<jbyteArray>(env->CallObjectMethod(str, m_get_bytes));
const int length = env->GetArrayLength(array);
const auto content = static_cast<char *>(malloc(length + 1));
env->GetByteArrayRegion(array, 0, length, reinterpret_cast<jbyte *>(content));
content[length] = 0;
return content;
}
jstring jni_new_string(JNIEnv *env, const char *str) {
const auto length = static_cast<int>(strlen(str));
const auto array = env->NewByteArray(length);
env->SetByteArrayRegion(array, 0, length, reinterpret_cast<const jbyte *>(str));
return reinterpret_cast<jstring>(env->NewObject(c_string, m_new_string, array));
}
int jni_catch_exception(JNIEnv *env) {
const int result = env->ExceptionCheck();
if (result) {
env->ExceptionDescribe();
env->ExceptionClear();
}
return result;
}
void jni_attach_thread(scoped_jni *jni) {
JavaVM *vm = global_java_vm();
if (vm->GetEnv(reinterpret_cast<void **>(&jni->env), JNI_VERSION_1_6) == JNI_OK) {
jni->require_release = 0;
return;
}
if (vm->AttachCurrentThread(&jni->env, nullptr) != JNI_OK) {
abort();
}
jni->require_release = 1;
}
void jni_detach_thread(const scoped_jni *env) {
JavaVM *vm = global_java_vm();
if (env->require_release) {
vm->DetachCurrentThread();
}
}
void release_string(char **str) {
free(*str);
}
================================================
FILE: android/core/src/main/cpp/jni_helper.h
================================================
#pragma once
#include <jni.h>
struct scoped_jni {
JNIEnv *env;
int require_release;
};
extern void initialize_jni(JavaVM *vm, JNIEnv *env);
extern jstring jni_new_string(JNIEnv *env, const char *str);
extern char *jni_get_string(JNIEnv *env, jstring str);
extern int jni_catch_exception(JNIEnv *env);
extern void jni_attach_thread(scoped_jni *jni);
extern void jni_detach_thread(const scoped_jni *env);
extern void release_string( char **str);
#define ATTACH_JNI() __attribute__((unused, cleanup(jni_detach_thread))) \
scoped_jni _jni{}; \
jni_attach_thread(&_jni); \
JNIEnv *env = _jni.env
#define scoped_string __attribute__((cleanup(release_string))) char*
#define find_class(name) env->FindClass(name)
#define find_method(cls, name, signature) env->GetMethodID(cls, name, signature)
#define new_global(obj) env->NewGlobalRef(obj)
#define del_global(obj) env->DeleteGlobalRef(obj)
#define get_string(jstr) jni_get_string(env, jstr)
#define new_string(cstr) jni_new_string(env, cstr)
================================================
FILE: android/core/src/main/java/com/follow/clash/core/Core.kt
================================================
package com.follow.clash.core
import java.net.InetAddress
import java.net.InetSocketAddress
import java.net.URL
data object Core {
private external fun startTun(
fd: Int,
cb: TunInterface,
stack: String,
address: String,
dns: String,
)
external fun forceGC(
)
external fun updateDNS(
dns: String,
)
private fun parseInetSocketAddress(address: String): InetSocketAddress {
val url = URL("https://$address")
return InetSocketAddress(InetAddress.getByName(url.host), url.port)
}
fun startTun(
fd: Int,
protect: (Int) -> Boolean,
resolverProcess: (protocol: Int, source: InetSocketAddress, target: InetSocketAddress, uid: Int) -> String,
stack: String,
address: String,
dns: String,
) {
startTun(
fd,
object : TunInterface {
override fun protect(fd: Int) {
protect(fd)
}
override fun resolverProcess(
protocol: Int,
source: String,
target: String,
uid: Int
): String {
return resolverProcess(
protocol,
parseInetSocketAddress(source),
parseInetSocketAddress(target),
uid,
)
}
},
stack,
address,
dns
)
}
external fun suspended(
suspended: Boolean,
)
private external fun invokeAction(
data: String,
cb: InvokeInterface
)
fun invokeAction(
data: String,
cb: (result: String?) -> Unit
) {
invokeAction(
data,
object : InvokeInterface {
override fun onResult(result: String?) {
cb(result)
}
},
)
}
private external fun setEventListener(cb: InvokeInterface?)
fun callSetEventListener(
cb: ((result: String?) -> Unit)?
) {
when (cb != null) {
true -> setEventListener(
object : InvokeInterface {
override fun onResult(result: String?) {
cb(result)
}
},
)
false -> setEventListener(null)
}
}
fun quickSetup(
initParamsString: String,
setupParamsString: String,
cb: (result: String?) -> Unit,
) {
quickSetup(
initParamsString,
setupParamsString,
object : InvokeInterface {
override fun onResult(result: String?) {
cb(result)
}
},
)
}
private external fun quickSetup(
initParamsString: String,
setupParamsString: String,
cb: InvokeInterface
)
external fun stopTun()
external fun getTraffic(onlyStatisticsProxy: Boolean): String
external fun getTotalTraffic(onlyStatisticsProxy: Boolean): String
init {
System.loadLibrary("core")
}
}
================================================
FILE: android/core/src/main/java/com/follow/clash/core/InvokeInterface.kt
================================================
package com.follow.clash.core
import androidx.annotation.Keep
@Keep
interface InvokeInterface {
fun onResult(result: String?)
}
================================================
FILE: android/core/src/main/java/com/follow/clash/core/TunInterface.kt
================================================
package com.follow.clash.core
import androidx.annotation.Keep
@Keep
interface TunInterface {
fun protect(fd: Int)
fun resolverProcess(protocol: Int, source: String, target: String, uid: Int): String
}
================================================
FILE: android/gradle/libs.versions.toml
================================================
[versions]
#agp = "8.10.1"
firebaseBom = "34.2.0"
minSdk = "23"
targetSdk = "36"
compileSdk = "36"
ndkVersion = "28.0.13004108"
coreKtx = "1.17.0"
annotationJvm = "1.9.1"
coreSplashscreen = "1.0.1"
gson = "2.13.1"
kotlin = "2.2.10"
smaliDexlib2 = "3.0.9"
firebaseCrashlyticsKtx = "20.0.1"
firebaseCommonKtx = "22.0.0"
[libraries]
build-kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
androidx-core = { module = "androidx.core:core-ktx", version.ref = "coreKtx" }
annotation-jvm = { module = "androidx.annotation:annotation-jvm", version.ref = "annotationJvm" }
core-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "coreSplashscreen" }
firebase-analytics = { module = "com.google.firebase:firebase-analytics" }
firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBom" }
firebase-crashlytics-ndk = { module = "com.google.firebase:firebase-crashlytics-ndk" }
gson = { module = "com.google.code.gson:gson", version.ref = "gson" }
smali-dexlib2 = { module = "com.android.tools.smali:smali-dexlib2", version.ref = "smaliDexlib2" }
firebase-crashlytics-ktx = { group = "com.google.firebase", name = "firebase-crashlytics-ktx", version.ref = "firebaseCrashlyticsKtx" }
firebase-common-ktx = { group = "com.google.firebase", name = "firebase-common-ktx", version.ref = "firebaseCommonKtx" }
================================================
FILE: android/gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip
================================================
FILE: android/gradle.properties
================================================
org.gradle.jvmargs=-Xmx4G
android.useAndroidX=true
android.enableJetifier=true
================================================
FILE: android/service/.gitignore
================================================
/build
================================================
FILE: android/service/build.gradle.kts
================================================
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
id("com.android.library")
id("org.jetbrains.kotlin.android")
id("kotlin-parcelize")
}
android {
namespace = "com.follow.clash.service"
compileSdk = 36
defaultConfig {
minSdk = libs.versions.minSdk.get().toInt()
}
buildFeatures {
aidl = true
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
buildTypes {
release {
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}
kotlin {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_17)
}
}
dependencies {
implementation(project(":core"))
implementation(project(":common"))
implementation(libs.gson)
implementation(libs.androidx.core)
}
================================================
FILE: android/service/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application>
<service
android:name=".VpnService"
android:exported="false"
android:foregroundServiceType="specialUse"
android:permission="android.permission.BIND_VPN_SERVICE"
android:process=":remote">
<intent-filter>
<action android:name="android.net.VpnService" />
</intent-filter>
<property
android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
android:value="vpn" />
</service>
<service
android:name=".CommonService"
android:exported="false"
android:foregroundServiceType="specialUse"
android:process=":remote">
<property
android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
android:value="proxy" />
</service>
<service
android:name=".RemoteService"
android:enabled="true"
android:exported="false"
android:process=":remote" />
<provider
android:name=".FilesProvider"
android:authorities="${applicationId}.files"
android:exported="true"
android:grantUriPermissions="true"
android:permission="android.permission.MANAGE_DOCUMENTS"
android:process=":remote">
<intent-filter>
<action android:name="android.content.action.DOCUMENTS_PROVIDER" />
</intent-filter>
</provider>
</application>
</manifest>
================================================
FILE: android/service/src/main/aidl/com/follow/clash/service/IAckInterface.aidl
================================================
// IAckInterface.aidl
package com.follow.clash.service;
import com.follow.clash.service.IAckInterface;
interface IAckInterface {
oneway void onAck();
}
================================================
FILE: android/service/src/main/aidl/com/follow/clash/service/ICallbackInterface.aidl
================================================
// ICallbackInterface.aidl
package com.follow.clash.service;
import com.follow.clash.service.IAckInterface;
interface ICallbackInterface {
oneway void onResult(in byte[] data,in boolean isSuccess, in IAckInterface ack);
}
================================================
FILE: android/service/src/main/aidl/com/follow/clash/service/IEventInterface.aidl
================================================
// IEventInterface.aidl
package com.follow.clash.service;
import com.follow.clash.service.IAckInterface;
interface IEventInterface {
oneway void onEvent(in String id, in byte[] data,in boolean isSuccess, in IAckInterface ack);
}
================================================
FILE: android/service/src/main/aidl/com/follow/clash/service/IRemoteInterface.aidl
================================================
// IRemoteInterface.aidl
package com.follow.clash.service;
import com.follow.clash.service.ICallbackInterface;
import com.follow.clash.service.IEventInterface;
import com.follow.clash.service.IResultInterface;
import com.follow.clash.service.IVoidInterface;
import com.follow.clash.service.models.VpnOptions;
import com.follow.clash.service.models.NotificationParams;
interface IRemoteInterface {
void invokeAction(in String data, in ICallbackInterface callback);
void quickSetup(in String initParamsString, in String setupParamsString, in ICallbackInterface callback, in IVoidInterface onStarted);
void updateNotificationParams(in NotificationParams params);
void startService(in VpnOptions options, in long runTime, in IResultInterface result);
void stopService(in IResultInterface result);
void setEventListener(in IEventInterface event);
void setCrashlytics(in boolean enable);
long getRunTime();
}
================================================
FILE: android/service/src/main/aidl/com/follow/clash/service/IResultInterface.aidl
================================================
// IResultInterface.aidl
package com.follow.clash.service;
interface IResultInterface {
oneway void onResult(in long runTime);
}
================================================
FILE: android/service/src/main/aidl/com/follow/clash/service/IVoidInterface.aidl
================================================
// IVoidInterface.aidl
package com.follow.clash.service;
interface IVoidInterface {
oneway void invoke();
}
================================================
FILE: android/service/src/main/aidl/com/follow/clash/service/models/AccessControl.aidl
================================================
//AccessControl.aidl
package com.follow.clash.service.models;
parcelable AccessControl;
================================================
FILE: android/service/src/main/aidl/com/follow/clash/service/models/NotificationParams.aidl
================================================
//NotificationParams.aidl
package com.follow.clash.service.models;
parcelable NotificationParams;
================================================
FILE: android/service/src/main/aidl/com/follow/clash/service/models/VpnOptions.aidl
================================================
//VpnOptions.aidl
package com.follow.clash.service.models;
import com.follow.clash.service.models.AccessControl;
parcelable VpnOptions;
================================================
FILE: android/service/src/main/java/com/follow/clash/service/CommonService.kt
================================================
package com.follow.clash.service
import android.app.Service
import android.content.Intent
import android.os.Binder
import android.os.IBinder
import com.follow.clash.core.Core
import com.follow.clash.service.modules.NetworkObserveModule
import com.follow.clash.service.modules.NotificationModule
import com.follow.clash.service.modules.SuspendModule
import com.follow.clash.service.modules.moduleLoader
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
class CommonService : Service(), IBaseService,
CoroutineScope by CoroutineScope(Dispatchers.Default) {
private val self: CommonService
get() = this
private val loader = moduleLoader {
install(NetworkObserveModule(self))
install(NotificationModule(self))
install(SuspendModule(self))
}
override fun onCreate() {
super.onCreate()
handleCreate()
}
override fun onDestroy() {
handleDestroy()
super.onDestroy()
}
override fun onLowMemory() {
Core.forceGC()
super.onLowMemory()
}
private val binder = LocalBinder()
inner class LocalBinder : Binder() {
fun getService(): CommonService = this@CommonService
}
override fun onBind(intent: Intent): IBinder {
return binder
}
override fun start() {
try {
loader.load()
} catch (_: Exception) {
stop()
}
}
override fun stop() {
loader.cancel()
stopSelf()
}
}
================================================
FILE: android/service/src/main/java/com/follow/clash/service/FilesProvider.kt
================================================
package com.follow.clash.service
import android.database.Cursor
import android.database.MatrixCursor
import android.os.CancellationSignal
import android.os.ParcelFileDescriptor
import android.provider.DocumentsContract
import android.provider.DocumentsProvider
import java.io.File
import java.io.FileNotFoundException
class FilesProvider : DocumentsProvider() {
companion object {
private const val DEFAULT_ROOT_ID = "0"
private val DEFAULT_DOCUMENT_COLUMNS = arrayOf(
DocumentsContract.Document.COLUMN_DOCUMENT_ID,
DocumentsContract.Document.COLUMN_DISPLAY_NAME,
DocumentsContract.Document.COLUMN_MIME_TYPE,
DocumentsContract.Document.COLUMN_FLAGS,
DocumentsContract.Document.COLUMN_SIZE,
)
private val DEFAULT_ROOT_COLUMNS = arrayOf(
DocumentsContract.Root.COLUMN_ROOT_ID,
DocumentsContract.Root.COLUMN_FLAGS,
DocumentsContract.Root.COLUMN_ICON,
DocumentsContract.Root.COLUMN_TITLE,
DocumentsContract.Root.COLUMN_SUMMARY,
DocumentsContract.Root.COLUMN_DOCUMENT_ID
)
}
override fun onCreate(): Boolean {
return true
}
override fun queryRoots(projection: Array<String>?): Cursor {
return MatrixCursor(projection ?: DEFAULT_ROOT_COLUMNS).apply {
newRow().apply {
add(DocumentsContract.Root.COLUMN_ROOT_ID, DEFAULT_ROOT_ID)
add(DocumentsContract.Root.COLUMN_FLAGS, DocumentsContract.Root.FLAG_LOCAL_ONLY)
add(DocumentsContract.Root.COLUMN_ICON, R.drawable.ic_service)
add(DocumentsContract.Root.COLUMN_TITLE, "FlClash")
add(DocumentsContract.Root.COLUMN_SUMMARY, "Data")
add(DocumentsContract.Root.COLUMN_DOCUMENT_ID, "/")
}
}
}
override fun queryChildDocuments(
parentDocumentId: String,
projection: Array<String>?,
sortOrder: String?
): Cursor {
val result = MatrixCursor(resolveDocumentProjection(projection))
val parentFile = if (parentDocumentId == "/") {
context?.filesDir
} else {
File(parentDocumentId)
} ?: throw FileNotFoundException("Parent directory not found")
parentFile.listFiles()?.forEach { file ->
includeFile(result, file)
}
return result
}
override fun queryDocument(documentId: String, projection: Array<String>?): Cursor {
val result = MatrixCursor(resolveDocumentProjection(projection))
val file = File(documentId)
includeFile(result, file)
return result
}
override fun openDocument(
documentId: String,
mode: String,
signal: CancellationSignal?
): ParcelFileDescriptor {
val file = File(documentId)
val accessMode = ParcelFileDescriptor.parseMode(mode)
return ParcelFileDescriptor.open(file, accessMode)
}
private fun includeFile(result: MatrixCursor, file: File) {
result.newRow().apply {
add(DocumentsContract.Document.COLUMN_DOCUMENT_ID, file.absolutePath)
add(DocumentsContract.Document.COLUMN_DISPLAY_NAME, file.name)
add(DocumentsContract.Document.COLUMN_SIZE, file.length())
add(
DocumentsContract.Document.COLUMN_FLAGS,
DocumentsContract.Document.FLAG_SUPPORTS_WRITE or DocumentsContract.Document.FLAG_SUPPORTS_DELETE
)
add(DocumentsContract.Document.COLUMN_MIME_TYPE, getDocumentType(file))
}
}
private fun getDocumentType(file: File): String {
return if (file.isDirectory) {
DocumentsContract.Document.MIME_TYPE_DIR
} else {
"application/octet-stream"
}
}
private fun resolveDocumentProjection(projection: Array<String>?): Array<String> {
return projection ?: DEFAULT_DOCUMENT_COLUMNS
}
}
================================================
FILE: android/service/src/main/java/com/follow/clash/service/IBaseService.kt
================================================
package com.follow.clash.service
import com.follow.clash.common.BroadcastAction
import com.follow.clash.common.GlobalState
import com.follow.clash.common.sendBroadcast
interface IBaseService {
fun handleCreate() {
GlobalState.log("Service create")
BroadcastAction.SERVICE_CREATED.sendBroadcast()
}
fun handleDestroy() {
GlobalState.log("Service destroy")
BroadcastAction.SERVICE_DESTROYED.sendBroadcast()
}
fun start()
fun stop()
}
================================================
FILE: android/service/src/main/java/com/follow/clash/service/RemoteService.kt
================================================
package com.follow.clash.service
import android.app.Service
import android.content.Intent
import android.os.IBinder
import com.follow.clash.common.GlobalState
import com.follow.clash.common.ServiceDelegate
import com.follow.clash.common.chunkedForAidl
import com.follow.clash.common.intent
import com.follow.clash.core.Core
import com.follow.clash.service.State.delegate
import com.follow.clash.service.State.intent
import com.follow.clash.service.State.runLock
import com.follow.clash.service.models.NotificationParams
import com.follow.clash.service.models.VpnOptions
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.sync.withLock
import java.util.UUID
import kotlin.coroutines.resume
class RemoteService : Service(),
CoroutineScope by CoroutineScope(SupervisorJob() + Dispatchers.Default) {
private fun handleStopService(result: IResultInterface) {
launch {
runLock.withLock {
delegate?.useService { service ->
service.stop()
delegate?.unbind()
}
State.runTime = 0
result.onResult(0)
}
}
}
private fun handleServiceDisconnected(message: String) {
GlobalState.log("Background service disconnected: $message")
intent = null
delegate = null
}
private fun handleStartService(runTime: Long, result: IResultInterface) {
launch {
runLock.withLock {
val nextIntent = when (State.options?.enable == true) {
true -> VpnService::class.intent
false -> CommonService::class.intent
}
if (intent != nextIntent) {
delegate?.unbind()
delegate = ServiceDelegate(nextIntent, ::handleServiceDisconnected) { binder ->
when (binder) {
is VpnService.LocalBinder -> binder.getService()
is CommonService.LocalBinder -> binder.getService()
else -> throw IllegalArgumentException("Invalid binder type")
}
}
intent = nextIntent
delegate?.bind()
}
delegate?.useService { service ->
service.start()
}
State.runTime = when (runTime != 0L) {
true -> runTime
false -> System.currentTimeMillis()
}
result.onResult(State.runTime)
}
}
}
private val binder = object : IRemoteInterface.Stub() {
override fun invokeAction(data: String, callback: ICallbackInterface) {
Core.invokeAction(data) {
launch {
runCatching {
val chunks = it?.chunkedForAidl() ?: listOf()
for ((index, chunk) in chunks.withIndex()) {
suspendCancellableCoroutine { cont ->
callback.onResult(
chunk,
index == chunks.lastIndex,
object : IAckInterface.Stub() {
override fun onAck() {
cont.resume(Unit)
}
},
)
}
}
}
}
}
}
override fun quickSetup(
initParamsString: String,
setupParamsString: String,
callback: ICallbackInterface,
onStarted: IVoidInterface
) {
Core.quickSetup(initParamsString, setupParamsString) {
launch {
runCatching {
val chunks = it?.chunkedForAidl() ?: listOf()
for ((index, chunk) in chunks.withIndex()) {
suspendCancellableCoroutine { cont ->
callback.onResult(
chunk,
index == chunks.lastIndex,
object : IAckInterface.Stub() {
override fun onAck() {
cont.resume(Unit)
}
},
)
}
}
}
}
}
onStarted()
}
override fun updateNotificationParams(params: NotificationParams?) {
State.notificationParamsFlow.tryEmit(params)
}
override fun startService(
options: VpnOptions,
runtime: Long,
result: IResultInterface,
) {
GlobalState.log("remote startService")
State.options = options
handleStartService(runtime, result)
}
override fun stopService(result: IResultInterface) {
handleStopService(result)
}
override fun setEventListener(eventListener: IEventInterface?) {
GlobalState.log("RemoveEventListener ${eventListener == null}")
when (eventListener != null) {
true -> Core.callSetEventListener {
launch {
runCatching {
val id = UUID.randomUUID().toString()
val chunks = it?.chunkedForAidl() ?: listOf()
for ((index, chunk) in chunks.withIndex()) {
suspendCancellableCoroutine { cont ->
eventListener.onEvent(
id,
chunk,
index == chunks.lastIndex,
object : IAckInterface.Stub() {
override fun onAck() {
cont.resume(Unit)
}
},
)
}
}
}
}
}
false -> Core.callSetEventListener(null)
}
}
override fun setCrashlytics(enable: Boolean) {
GlobalState.setCrashlytics(enable)
}
override fun getRunTime(): Long {
return State.runTime
}
}
override fun onBind(intent: Intent?): IBinder {
return binder
}
override fun onDestroy() {
GlobalState.log("Remote service destroy")
super.onDestroy()
}
}
================================================
FILE: android/service/src/main/java/com/follow/clash/service/State.kt
================================================
package com.follow.clash.service
import android.content.Intent
import com.follow.clash.common.ServiceDelegate
import com.follow.clash.service.models.NotificationParams
import com.follow.clash.service.models.VpnOptions
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.sync.Mutex
object State {
var options: VpnOptions? = null
var notificationParamsFlow: MutableStateFlow<NotificationParams?> = MutableStateFlow(
NotificationParams()
)
val runLock = Mutex()
var runTime: Long = 0L
var delegate: ServiceDelegate<IBaseService>? = null
var intent: Intent? = null
}
================================================
FILE: android/service/src/main/java/com/follow/clash/service/VpnService.kt
================================================
package com.follow.clash.service
import android.content.Intent
import android.net.ConnectivityManager
import android.net.ProxyInfo
import android.os.Binder
import android.os.Build
import android.os.IBinder
import android.os.Parcel
import android.os.RemoteException
import android.util.Log
import androidx.core.content.getSystemService
import com.follow.clash.common.AccessControlMode
import com.follow.clash.common.GlobalState
import com.follow.clash.core.Core
import com.follow.clash.service.models.VpnOptions
import com.follow.clash.service.models.getIpv4RouteAddress
import com.follow.clash.service.models.getIpv6RouteAddress
import com.follow.clash.service.models.toCIDR
import com.follow.clash.service.modules.NetworkObserveModule
import com.follow.clash.service.modules.NotificationModule
import com.follow.clash.service.modules.SuspendModule
import com.follow.clash.service.modules.moduleLoader
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import java.net.InetSocketAddress
import android.net.VpnService as SystemVpnService
class VpnService : SystemVpnService(), IBaseService,
CoroutineScope by CoroutineScope(Dispatchers.Default) {
private val self: VpnService
get() = this
private val loader = moduleLoader {
install(NetworkObserveModule(self))
install(NotificationModule(self))
install(SuspendModule(self))
}
override fun onCreate() {
super.onCreate()
handleCreate()
}
override fun onDestroy() {
handleDestroy()
super.onDestroy()
}
private val connectivity by lazy {
getSystemService<ConnectivityManager>()
}
private val uidPageNameMap = mutableMapOf<Int, String>()
private fun resolverProcess(
protocol: Int,
source: InetSocketAddress,
target: InetSocketAddress,
uid: Int,
): String {
val nextUid = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
connectivity?.getConnectionOwnerUid(protocol, source, target) ?: -1
} else {
uid
}
if (nextUid == -1) {
return ""
}
if (!uidPageNameMap.containsKey(nextUid)) {
uidPageNameMap[nextUid] = this.packageManager?.getPackagesForUid(nextUid)?.first() ?: ""
}
return uidPageNameMap[nextUid] ?: ""
}
val VpnOptions.address
get(): String = buildString {
append(IPV4_ADDRESS)
if (ipv6) {
append(",")
append(IPV6_ADDRESS)
}
}
val VpnOptions.dns
get(): String {
if (dnsHijacking) {
return NET_ANY
}
return buildString {
append(DNS)
if (ipv6) {
append(",")
append(DNS6)
}
}
}
override fun onLowMemory() {
Core.forceGC()
super.onLowMemory()
}
private val binder = LocalBinder()
inner class LocalBinder : Binder() {
fun getService(): VpnService = this@VpnService
override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean {
try {
val isSuccess = super.
gitextract__scuca8o/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ └── feature_request.yml
│ ├── release_template.md
│ └── workflows/
│ └── build.yaml
├── .gitignore
├── .gitmodules
├── .metadata
├── .run/
│ └── main.dart.run.xml
├── CHANGELOG.md
├── LICENSE
├── README.md
├── README_zh_CN.md
├── analysis_options.yaml
├── android/
│ ├── .gitignore
│ ├── app/
│ │ ├── build.gradle.kts
│ │ ├── google-services.json
│ │ ├── proguard-rules.pro
│ │ └── src/
│ │ ├── debug/
│ │ │ └── AndroidManifest.xml
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin/
│ │ │ │ └── com/
│ │ │ │ └── follow/
│ │ │ │ └── clash/
│ │ │ │ ├── Application.kt
│ │ │ │ ├── BroadcastReceiver.kt
│ │ │ │ ├── Ext.kt
│ │ │ │ ├── MainActivity.kt
│ │ │ │ ├── Service.kt
│ │ │ │ ├── State.kt
│ │ │ │ ├── TempActivity.kt
│ │ │ │ ├── TileService.kt
│ │ │ │ ├── models/
│ │ │ │ │ ├── Package.kt
│ │ │ │ │ └── State.kt
│ │ │ │ └── plugins/
│ │ │ │ ├── AppPlugin.kt
│ │ │ │ ├── ServicePlugin.kt
│ │ │ │ └── TilePlugin.kt
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ └── ic_launcher_foreground.xml
│ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ ├── ic_launcher.xml
│ │ │ │ └── ic_launcher_round.xml
│ │ │ ├── values/
│ │ │ │ ├── ic_launcher_background.xml
│ │ │ │ └── styles.xml
│ │ │ ├── values-night/
│ │ │ │ └── styles.xml
│ │ │ ├── values-night-v27/
│ │ │ │ └── styles.xml
│ │ │ ├── values-v27/
│ │ │ │ └── styles.xml
│ │ │ └── xml/
│ │ │ ├── file_paths.xml
│ │ │ └── network_security_config.xml
│ │ └── profile/
│ │ └── AndroidManifest.xml
│ ├── build.gradle.kts
│ ├── common/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── follow/
│ │ │ └── clash/
│ │ │ └── common/
│ │ │ ├── Components.kt
│ │ │ ├── Enums.kt
│ │ │ ├── Ext.kt
│ │ │ ├── GlobalState.kt
│ │ │ ├── Service.kt
│ │ │ └── Utils.kt
│ │ └── res/
│ │ └── values/
│ │ └── strings.xml
│ ├── core/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ ├── cpp/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── core.cpp
│ │ │ ├── jni_helper.cpp
│ │ │ └── jni_helper.h
│ │ └── java/
│ │ └── com/
│ │ └── follow/
│ │ └── clash/
│ │ └── core/
│ │ ├── Core.kt
│ │ ├── InvokeInterface.kt
│ │ └── TunInterface.kt
│ ├── gradle/
│ │ ├── libs.versions.toml
│ │ └── wrapper/
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ ├── service/
│ │ ├── .gitignore
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ ├── aidl/
│ │ │ └── com/
│ │ │ └── follow/
│ │ │ └── clash/
│ │ │ └── service/
│ │ │ ├── IAckInterface.aidl
│ │ │ ├── ICallbackInterface.aidl
│ │ │ ├── IEventInterface.aidl
│ │ │ ├── IRemoteInterface.aidl
│ │ │ ├── IResultInterface.aidl
│ │ │ ├── IVoidInterface.aidl
│ │ │ └── models/
│ │ │ ├── AccessControl.aidl
│ │ │ ├── NotificationParams.aidl
│ │ │ └── VpnOptions.aidl
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── follow/
│ │ │ └── clash/
│ │ │ └── service/
│ │ │ ├── CommonService.kt
│ │ │ ├── FilesProvider.kt
│ │ │ ├── IBaseService.kt
│ │ │ ├── RemoteService.kt
│ │ │ ├── State.kt
│ │ │ ├── VpnService.kt
│ │ │ ├── models/
│ │ │ │ ├── NotificationParams.kt
│ │ │ │ ├── Traffic.kt
│ │ │ │ └── VpnOptions.kt
│ │ │ └── modules/
│ │ │ ├── Module.kt
│ │ │ ├── ModuleLoader.kt
│ │ │ ├── NetworkObserveModule.kt
│ │ │ ├── NotificationModule.kt
│ │ │ └── SuspendModule.kt
│ │ └── res/
│ │ └── drawable/
│ │ ├── ic.xml
│ │ └── ic_service.xml
│ └── settings.gradle.kts
├── arb/
│ ├── intl_en.arb
│ ├── intl_ja.arb
│ ├── intl_ru.arb
│ └── intl_zh_CN.arb
├── assets/
│ └── data/
│ ├── ASN.mmdb
│ └── GEOIP.metadb
├── build.yaml
├── core/
│ ├── action.go
│ ├── bride.c
│ ├── bride.go
│ ├── bride.h
│ ├── common.go
│ ├── constant.go
│ ├── go.mod
│ ├── go.sum
│ ├── hub.go
│ ├── lib.go
│ ├── main.go
│ ├── main_cgo.go
│ ├── platform/
│ │ ├── limit.go
│ │ └── procfs.go
│ ├── server.go
│ └── tun/
│ └── tun.go
├── distribute_options.yaml
├── lib/
│ ├── application.dart
│ ├── common/
│ │ ├── app_localizations.dart
│ │ ├── archive.dart
│ │ ├── cache.dart
│ │ ├── color.dart
│ │ ├── common.dart
│ │ ├── compute.dart
│ │ ├── constant.dart
│ │ ├── context.dart
│ │ ├── converter.dart
│ │ ├── datetime.dart
│ │ ├── dav_client.dart
│ │ ├── file.dart
│ │ ├── fixed.dart
│ │ ├── function.dart
│ │ ├── future.dart
│ │ ├── hive.dart
│ │ ├── http.dart
│ │ ├── icons.dart
│ │ ├── indexing.dart
│ │ ├── iterable.dart
│ │ ├── keyboard.dart
│ │ ├── launch.dart
│ │ ├── link.dart
│ │ ├── lock.dart
│ │ ├── measure.dart
│ │ ├── migration.dart
│ │ ├── mixin.dart
│ │ ├── navigation.dart
│ │ ├── navigator.dart
│ │ ├── network.dart
│ │ ├── num.dart
│ │ ├── package.dart
│ │ ├── path.dart
│ │ ├── picker.dart
│ │ ├── preferences.dart
│ │ ├── print.dart
│ │ ├── protocol.dart
│ │ ├── proxy.dart
│ │ ├── render.dart
│ │ ├── request.dart
│ │ ├── scroll.dart
│ │ ├── snowflake.dart
│ │ ├── store.dart
│ │ ├── string.dart
│ │ ├── system.dart
│ │ ├── task.dart
│ │ ├── text.dart
│ │ ├── theme.dart
│ │ ├── tray.dart
│ │ ├── utils.dart
│ │ ├── window.dart
│ │ └── yaml.dart
│ ├── controller.dart
│ ├── core/
│ │ ├── controller.dart
│ │ ├── core.dart
│ │ ├── event.dart
│ │ ├── interface.dart
│ │ ├── lib.dart
│ │ └── service.dart
│ ├── database/
│ │ ├── database.dart
│ │ ├── generated/
│ │ │ └── database.g.dart
│ │ ├── links.dart
│ │ ├── profiles.dart
│ │ ├── rules.dart
│ │ └── scripts.dart
│ ├── enum/
│ │ └── enum.dart
│ ├── features/
│ │ ├── features.dart
│ │ └── overwrite/
│ │ ├── overwrite.dart
│ │ └── rule.dart
│ ├── l10n/
│ │ ├── intl/
│ │ │ ├── messages_all.dart
│ │ │ ├── messages_en.dart
│ │ │ ├── messages_ja.dart
│ │ │ ├── messages_ru.dart
│ │ │ └── messages_zh_CN.dart
│ │ └── l10n.dart
│ ├── main.dart
│ ├── manager/
│ │ ├── android_manager.dart
│ │ ├── app_manager.dart
│ │ ├── connectivity_manager.dart
│ │ ├── core_manager.dart
│ │ ├── hotkey_manager.dart
│ │ ├── manager.dart
│ │ ├── proxy_manager.dart
│ │ ├── status_manager.dart
│ │ ├── theme_manager.dart
│ │ ├── tile_manager.dart
│ │ ├── tray_manager.dart
│ │ ├── vpn_manager.dart
│ │ └── window_manager.dart
│ ├── models/
│ │ ├── app.dart
│ │ ├── clash_config.dart
│ │ ├── common.dart
│ │ ├── config.dart
│ │ ├── core.dart
│ │ ├── generated/
│ │ │ ├── app.freezed.dart
│ │ │ ├── clash_config.freezed.dart
│ │ │ ├── clash_config.g.dart
│ │ │ ├── common.freezed.dart
│ │ │ ├── common.g.dart
│ │ │ ├── config.freezed.dart
│ │ │ ├── config.g.dart
│ │ │ ├── core.freezed.dart
│ │ │ ├── core.g.dart
│ │ │ ├── profile.freezed.dart
│ │ │ ├── profile.g.dart
│ │ │ ├── state.freezed.dart
│ │ │ └── state.g.dart
│ │ ├── models.dart
│ │ ├── profile.dart
│ │ └── state.dart
│ ├── pages/
│ │ ├── editor.dart
│ │ ├── error.dart
│ │ ├── home.dart
│ │ ├── pages.dart
│ │ └── scan.dart
│ ├── plugins/
│ │ ├── app.dart
│ │ ├── service.dart
│ │ └── tile.dart
│ ├── providers/
│ │ ├── app.dart
│ │ ├── config.dart
│ │ ├── database.dart
│ │ ├── generated/
│ │ │ ├── app.g.dart
│ │ │ ├── config.g.dart
│ │ │ ├── database.g.dart
│ │ │ └── state.g.dart
│ │ ├── providers.dart
│ │ └── state.dart
│ ├── state.dart
│ ├── views/
│ │ ├── about.dart
│ │ ├── access.dart
│ │ ├── application_setting.dart
│ │ ├── backup_and_restore.dart
│ │ ├── config/
│ │ │ ├── advanced.dart
│ │ │ ├── config.dart
│ │ │ ├── dns.dart
│ │ │ ├── general.dart
│ │ │ ├── network.dart
│ │ │ ├── rules.dart
│ │ │ └── scripts.dart
│ │ ├── connection/
│ │ │ ├── connections.dart
│ │ │ ├── item.dart
│ │ │ └── requests.dart
│ │ ├── dashboard/
│ │ │ ├── dashboard.dart
│ │ │ └── widgets/
│ │ │ ├── intranet_ip.dart
│ │ │ ├── memory_info.dart
│ │ │ ├── network_detection.dart
│ │ │ ├── network_speed.dart
│ │ │ ├── outbound_mode.dart
│ │ │ ├── quick_options.dart
│ │ │ ├── start_button.dart
│ │ │ ├── traffic_usage.dart
│ │ │ └── widgets.dart
│ │ ├── developer.dart
│ │ ├── hotkey.dart
│ │ ├── logs.dart
│ │ ├── profiles/
│ │ │ ├── add.dart
│ │ │ ├── edit.dart
│ │ │ ├── overwrite.dart
│ │ │ └── profiles.dart
│ │ ├── proxies/
│ │ │ ├── card.dart
│ │ │ ├── common.dart
│ │ │ ├── list.dart
│ │ │ ├── providers.dart
│ │ │ ├── proxies.dart
│ │ │ ├── setting.dart
│ │ │ └── tab.dart
│ │ ├── resources.dart
│ │ ├── theme.dart
│ │ ├── tools.dart
│ │ └── views.dart
│ └── widgets/
│ ├── activate_box.dart
│ ├── animate_grid.dart
│ ├── animated_cross_slide.dart
│ ├── bar_chart.dart
│ ├── builder.dart
│ ├── button.dart
│ ├── card.dart
│ ├── chip.dart
│ ├── color_scheme_box.dart
│ ├── container.dart
│ ├── dialog.dart
│ ├── disabled_mask.dart
│ ├── donut_chart.dart
│ ├── effect.dart
│ ├── fade_box.dart
│ ├── float_layout.dart
│ ├── grid.dart
│ ├── icon.dart
│ ├── inherited.dart
│ ├── input.dart
│ ├── keep_scope.dart
│ ├── line_chart.dart
│ ├── list.dart
│ ├── loading.dart
│ ├── notification.dart
│ ├── null_status.dart
│ ├── open_container.dart
│ ├── palette.dart
│ ├── pop_scope.dart
│ ├── popup.dart
│ ├── scaffold.dart
│ ├── scroll.dart
│ ├── setting.dart
│ ├── sheet.dart
│ ├── side_sheet.dart
│ ├── subscription_info_view.dart
│ ├── super_grid.dart
│ ├── tab.dart
│ ├── text.dart
│ ├── theme.dart
│ ├── view.dart
│ ├── wave.dart
│ └── widgets.dart
├── linux/
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── flutter/
│ │ ├── CMakeLists.txt
│ │ ├── generated_plugin_registrant.cc
│ │ ├── generated_plugin_registrant.h
│ │ └── generated_plugins.cmake
│ ├── packaging/
│ │ ├── appimage/
│ │ │ └── make_config.yaml
│ │ ├── deb/
│ │ │ └── make_config.yaml
│ │ └── rpm/
│ │ └── make_config.yaml
│ └── runner/
│ ├── CMakeLists.txt
│ ├── main.cc
│ ├── my_application.cc
│ └── my_application.h
├── macos/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── Flutter-Debug.xcconfig
│ │ ├── Flutter-Release.xcconfig
│ │ └── GeneratedPluginRegistrant.swift
│ ├── Podfile
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── MainMenu.xib
│ │ ├── Configs/
│ │ │ ├── AppInfo.xcconfig
│ │ │ ├── Debug.xcconfig
│ │ │ ├── Release.xcconfig
│ │ │ └── Warnings.xcconfig
│ │ ├── DebugProfile.entitlements
│ │ ├── Info.plist
│ │ ├── MainFlutterWindow.swift
│ │ └── Release.entitlements
│ ├── Runner.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Runner.xcscheme
│ ├── Runner.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ ├── RunnerTests/
│ │ └── RunnerTests.swift
│ └── packaging/
│ └── dmg/
│ └── make_config.yaml
├── plugins/
│ ├── proxy/
│ │ ├── .gitignore
│ │ ├── .metadata
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── analysis_options.yaml
│ │ ├── lib/
│ │ │ ├── proxy.dart
│ │ │ ├── proxy_method_channel.dart
│ │ │ └── proxy_platform_interface.dart
│ │ ├── pubspec.yaml
│ │ └── windows/
│ │ ├── .gitignore
│ │ ├── CMakeLists.txt
│ │ ├── include/
│ │ │ └── proxy/
│ │ │ └── proxy_plugin_c_api.h
│ │ ├── proxy_plugin.cpp
│ │ ├── proxy_plugin.h
│ │ ├── proxy_plugin_c_api.cpp
│ │ └── test/
│ │ └── proxy_plugin_test.cpp
│ └── window_ext/
│ ├── .gitignore
│ ├── .metadata
│ ├── CHANGELOG.md
│ ├── LICENSE
│ ├── README.md
│ ├── analysis_options.yaml
│ ├── lib/
│ │ ├── window_ext.dart
│ │ ├── window_ext_listener.dart
│ │ └── window_ext_manager.dart
│ ├── macos/
│ │ ├── Classes/
│ │ │ └── WindowExtPlugin.swift
│ │ └── window_ext.podspec
│ ├── pubspec.yaml
│ └── windows/
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── include/
│ │ └── window_ext/
│ │ └── window_ext_plugin_c_api.h
│ ├── test/
│ │ └── window_ext_plugin_test.cpp
│ ├── window_ext_plugin.cpp
│ ├── window_ext_plugin.h
│ └── window_ext_plugin_c_api.cpp
├── pubspec.yaml
├── release_telegram.py
├── services/
│ └── helper/
│ ├── Cargo.toml
│ ├── build.rs
│ └── src/
│ ├── main.rs
│ └── service/
│ ├── hub.rs
│ ├── mod.rs
│ └── windows.rs
├── setup.dart
└── windows/
├── .gitignore
├── CMakeLists.txt
├── flutter/
│ ├── CMakeLists.txt
│ ├── generated_plugin_registrant.cc
│ ├── generated_plugin_registrant.h
│ └── generated_plugins.cmake
├── packaging/
│ └── exe/
│ ├── ChineseSimplified.isl
│ ├── inno_setup.iss
│ └── make_config.yaml
└── runner/
├── CMakeLists.txt
├── Runner.rc
├── flutter_window.cpp
├── flutter_window.h
├── main.cpp
├── resource.h
├── runner.exe.manifest
├── utils.cpp
├── utils.h
├── win32_window.cpp
└── win32_window.h
Showing preview only (447K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5564 symbols across 241 files)
FILE: android/core/src/main/cpp/core.cpp
function JNIEXPORT (line 10) | JNIEXPORT void JNICALL
function JNIEXPORT (line 18) | JNIEXPORT void JNICALL
function JNIEXPORT (line 24) | JNIEXPORT void JNICALL
function JNIEXPORT (line 30) | JNIEXPORT void JNICALL
function JNIEXPORT (line 36) | JNIEXPORT void JNICALL
function JNIEXPORT (line 43) | JNIEXPORT void JNICALL
function JNIEXPORT (line 54) | JNIEXPORT jstring JNICALL
function JNIEXPORT (line 61) | JNIEXPORT jstring JNICALL
function JNIEXPORT (line 68) | JNIEXPORT void JNICALL
function JNIEXPORT (line 74) | JNIEXPORT void JNICALL
function release_jni_object_impl (line 87) | static void release_jni_object_impl(void *obj) {
function free_string_impl (line 92) | static void free_string_impl(char *str) {
function call_tun_interface_protect_impl (line 96) | static void call_tun_interface_protect_impl(void *tun_interface, const i...
function call_invoke_interface_result_impl (line 119) | static void call_invoke_interface_result_impl(void *invoke_interface, co...
function JNIEXPORT (line 127) | JNIEXPORT jint JNICALL
function JNIEXPORT (line 157) | JNIEXPORT void JNICALL
function JNIEXPORT (line 163) | JNIEXPORT void JNICALL
function JNIEXPORT (line 168) | JNIEXPORT void JNICALL
function JNIEXPORT (line 173) | JNIEXPORT void JNICALL
function JNIEXPORT (line 178) | JNIEXPORT void JNICALL
function JNIEXPORT (line 183) | JNIEXPORT void JNICALL
function JNIEXPORT (line 188) | JNIEXPORT jstring JNICALL
function JNIEXPORT (line 193) | JNIEXPORT jstring JNICALL
function JNIEXPORT (line 199) | JNIEXPORT void JNICALL
function JNIEXPORT (line 204) | JNIEXPORT void JNICALL
FILE: android/core/src/main/cpp/jni_helper.cpp
function initialize_jni (line 13) | void initialize_jni(JavaVM *vm, JNIEnv *env) {
function JavaVM (line 21) | JavaVM *global_java_vm() {
function jstring (line 34) | jstring jni_new_string(JNIEnv *env, const char *str) {
function jni_catch_exception (line 41) | int jni_catch_exception(JNIEnv *env) {
function jni_attach_thread (line 50) | void jni_attach_thread(scoped_jni *jni) {
function jni_detach_thread (line 62) | void jni_detach_thread(const scoped_jni *env) {
function release_string (line 69) | void release_string(char **str) {
FILE: android/core/src/main/cpp/jni_helper.h
type scoped_jni (line 5) | struct scoped_jni {
FILE: core/action.go
type Action (line 8) | type Action struct
type ActionResult (line 14) | type ActionResult struct
method Json (line 22) | func (result ActionResult) Json() ([]byte, error) {
method success (line 27) | func (result ActionResult) success(data interface{}) {
method error (line 33) | func (result ActionResult) error(data interface{}) {
function handleAction (line 39) | func handleAction(action *Action, result ActionResult) {
FILE: core/bride.c
function protect (line 13) | void protect(void *tun_interface, int fd) {
function release_object (line 21) | void release_object(void *obj) {
function free_string (line 25) | void free_string(char *data) {
function result (line 29) | void result(void *invoke_Interface, const char *data) {
FILE: core/bride.go
function protect (line 9) | func protect(callback unsafe.Pointer, fd int) {
function resolveProcess (line 13) | func resolveProcess(callback unsafe.Pointer, protocol int, source, targe...
function invokeResult (line 22) | func invokeResult(callback unsafe.Pointer, data string) {
function releaseObject (line 28) | func releaseObject(callback unsafe.Pointer) {
function takeCString (line 32) | func takeCString(s *C.char) string {
FILE: core/common.go
function getExternalProvidersRaw (line 40) | func getExternalProvidersRaw() map[string]cp.Provider {
function toExternalProvider (line 55) | func toExternalProvider(p cp.Provider) (*ExternalProvider, error) {
function sideUpdateExternalProvider (line 83) | func sideUpdateExternalProvider(p cp.Provider, bytes []byte) error {
function updateListeners (line 104) | func updateListeners() {
function stopListeners (line 136) | func stopListeners() {
function patchSelectGroup (line 140) | func patchSelectGroup(mapping map[string]string) {
function defaultSetupParams (line 161) | func defaultSetupParams() *SetupParams {
function readFile (line 168) | func readFile(path string) ([]byte, error) {
function updateConfig (line 180) | func updateConfig(params *UpdateParams) {
function applyConfig (line 238) | func applyConfig(params *SetupParams) error {
function UnmarshalJson (line 254) | func UnmarshalJson(data []byte, v any) error {
FILE: core/constant.go
type InitParams (line 14) | type InitParams struct
type SetupParams (line 19) | type SetupParams struct
type UpdateParams (line 24) | type UpdateParams struct
type tunSchema (line 39) | type tunSchema struct
type ChangeProxyParams (line 48) | type ChangeProxyParams struct
type TestDelayParams (line 53) | type TestDelayParams struct
type ExternalProvider (line 59) | type ExternalProvider struct
type ProxiesData (line 69) | type ProxiesData struct
constant messageMethod (line 75) | messageMethod Method = "message"
constant initClashMethod (line 76) | initClashMethod Method = "initClash"
constant getIsInitMethod (line 77) | getIsInitMethod Method = "getIsInit"
constant forceGcMethod (line 78) | forceGcMethod Method = "forceGc"
constant shutdownMethod (line 79) | shutdownMethod Method = "shutdown"
constant validateConfigMethod (line 80) | validateConfigMethod Method = "validateConfig"
constant updateConfigMethod (line 81) | updateConfigMethod Method = "updateConfig"
constant getProxiesMethod (line 82) | getProxiesMethod Method = "getProxies"
constant changeProxyMethod (line 83) | changeProxyMethod Method = "changeProxy"
constant getTrafficMethod (line 84) | getTrafficMethod Method = "getTraffic"
constant getTotalTrafficMethod (line 85) | getTotalTrafficMethod Method = "getTotalTraffic"
constant resetTrafficMethod (line 86) | resetTrafficMethod Method = "resetTraffic"
constant asyncTestDelayMethod (line 87) | asyncTestDelayMethod Method = "asyncTestDelay"
constant getConnectionsMethod (line 88) | getConnectionsMethod Method = "getConnections"
constant closeConnectionsMethod (line 89) | closeConnectionsMethod Method = "closeConnections"
constant resetConnectionsMethod (line 90) | resetConnectionsMethod Method = "resetConnectionsMethod"
constant closeConnectionMethod (line 91) | closeConnectionMethod Method = "closeConnection"
constant getExternalProvidersMethod (line 92) | getExternalProvidersMethod Method = "getExternalProviders"
constant getExternalProviderMethod (line 93) | getExternalProviderMethod Method = "getExternalProvider"
constant getCountryCodeMethod (line 94) | getCountryCodeMethod Method = "getCountryCode"
constant getMemoryMethod (line 95) | getMemoryMethod Method = "getMemory"
constant updateGeoDataMethod (line 96) | updateGeoDataMethod Method = "updateGeoData"
constant updateExternalProviderMethod (line 97) | updateExternalProviderMethod Method = "updateExternalProvider"
constant sideLoadExternalProviderMethod (line 98) | sideLoadExternalProviderMethod Method = "sideLoadExternalProvider"
constant startLogMethod (line 99) | startLogMethod Method = "startLog"
constant stopLogMethod (line 100) | stopLogMethod Method = "stopLog"
constant startListenerMethod (line 101) | startListenerMethod Method = "startListener"
constant stopListenerMethod (line 102) | stopListenerMethod Method = "stopListener"
constant updateDnsMethod (line 103) | updateDnsMethod Method = "updateDns"
constant crashMethod (line 104) | crashMethod Method = "crash"
constant setupConfigMethod (line 105) | setupConfigMethod Method = "setupConfig"
constant getConfigMethod (line 106) | getConfigMethod Method = "getConfig"
constant deleteFile (line 107) | deleteFile Method = "deleteFile"
type Method (line 110) | type Method
type MessageType (line 112) | type MessageType
type Delay (line 114) | type Delay struct
type Message (line 120) | type Message struct
method Json (line 132) | func (message *Message) Json() (string, error) {
constant LogMessage (line 126) | LogMessage MessageType = "log"
constant DelayMessage (line 127) | DelayMessage MessageType = "delay"
constant RequestMessage (line 128) | RequestMessage MessageType = "request"
constant LoadedMessage (line 129) | LoadedMessage MessageType = "loaded"
FILE: core/hub.go
function handleInitClash (line 38) | func handleInitClash(paramsString string) bool {
function handleStartListener (line 52) | func handleStartListener() bool {
function handleStopListener (line 61) | func handleStopListener() bool {
function handleGetIsInit (line 70) | func handleGetIsInit() bool {
function handleForceGC (line 74) | func handleForceGC() {
function handleShutdown (line 82) | func handleShutdown() bool {
function handleValidateConfig (line 90) | func handleValidateConfig(path string) string {
function handleGetProxies (line 99) | func handleGetProxies() ProxiesData {
function handleChangeProxy (line 147) | func handleChangeProxy(data string, fn func(string string)) {
function handleGetTraffic (line 186) | func handleGetTraffic(onlyStatisticsProxy bool) string {
function handleGetTotalTraffic (line 200) | func handleGetTotalTraffic(onlyStatisticsProxy bool) string {
function handleResetTraffic (line 214) | func handleResetTraffic() {
function handleAsyncTestDelay (line 218) | func handleAsyncTestDelay(paramsString string, fn func(string)) {
function handleGetConnections (line 272) | func handleGetConnections() string {
function handleCloseConnections (line 284) | func handleCloseConnections() bool {
function closeConnections (line 291) | func closeConnections() {
function handleResetConnections (line 301) | func handleResetConnections() bool {
function handleCloseConnection (line 308) | func handleCloseConnection(connectionId string) bool {
function handleGetExternalProviders (line 319) | func handleGetExternalProviders() string {
function handleGetExternalProvider (line 341) | func handleGetExternalProvider(externalProviderName string) string {
function handleUpdateGeoData (line 359) | func handleUpdateGeoData(geoType string, geoName string, fn func(value s...
function handleUpdateExternalProvider (line 392) | func handleUpdateExternalProvider(providerName string, fn func(value str...
function handleSideLoadExternalProvider (line 408) | func handleSideLoadExternalProvider(providerName string, data []byte, fn...
function handleSuspend (line 426) | func handleSuspend(suspended bool) bool {
function handleStartLog (line 435) | func handleStartLog() {
function handleStopLog (line 455) | func handleStopLog() {
function handleGetCountryCode (line 462) | func handleGetCountryCode(ip string, fn func(value string)) {
function handleGetMemory (line 475) | func handleGetMemory(fn func(value string)) {
function handleGetConfig (line 481) | func handleGetConfig(path string) (*config.RawConfig, error) {
function handleCrash (line 493) | func handleCrash() {
function handleUpdateConfig (line 497) | func handleUpdateConfig(bytes []byte) string {
function handleDelFile (line 507) | func handleDelFile(path string, result ActionResult) {
function handleSetupConfig (line 534) | func handleSetupConfig(bytes []byte) string {
function init (line 552) | func init() {
FILE: core/lib.go
type TunHandler (line 32) | type TunHandler struct
method start (line 39) | func (th *TunHandler) start(fd int, stack, address, dns string) {
method close (line 54) | func (th *TunHandler) close() {
method clear (line 60) | func (th *TunHandler) clear() {
method handleProtect (line 72) | func (th *TunHandler) handleProtect(fd int) {
method handleResolveProcess (line 83) | func (th *TunHandler) handleResolveProcess(source, target net.Addr) st...
method initHook (line 104) | func (th *TunHandler) initHook() {
method removeHook (line 122) | func (th *TunHandler) removeHook() {
function handleStopTun (line 133) | func handleStopTun() {
function handleStartTun (line 141) | func handleStartTun(callback unsafe.Pointer, fd int, stack, address, dns...
function handleUpdateDns (line 154) | func handleUpdateDns(value string) {
method send (line 162) | func (result ActionResult) send() {
function nextHandle (line 173) | func nextHandle(action *Action, result ActionResult) bool {
function invokeAction (line 185) | func invokeAction(callback unsafe.Pointer, paramsChar *C.char) {
function startTUN (line 202) | func startTUN(callback unsafe.Pointer, fd C.int, stackChar, addressChar,...
function quickSetup (line 213) | func quickSetup(callback unsafe.Pointer, initParamsChar *C.char, setupPa...
function setEventListener (line 228) | func setEventListener(listener unsafe.Pointer) {
function getTotalTraffic (line 236) | func getTotalTraffic(onlyStatisticsProxy bool) *C.char {
function getTraffic (line 243) | func getTraffic(onlyStatisticsProxy bool) *C.char {
function sendMessage (line 249) | func sendMessage(message Message) {
function stopTun (line 262) | func stopTun() {
function suspend (line 270) | func suspend(suspended bool) {
function forceGC (line 275) | func forceGC() {
function updateDns (line 280) | func updateDns(s *C.char) {
FILE: core/main.go
function main (line 10) | func main() {
FILE: core/main_cgo.go
function main (line 7) | func main() {
FILE: core/platform/limit.go
function init (line 10) | func init() {
function ShouldBlockConnection (line 29) | func ShouldBlockConnection() bool {
FILE: core/platform/procfs.go
function QuerySocketUidFromProcFs (line 22) | func QuerySocketUidFromProcFs(source, _ net.Addr) int {
function doQuery (line 66) | func doQuery(path string, sIP net.IP, sPort int) int {
function nativeEndianIP (line 107) | func nativeEndianIP(ip net.IP) []byte {
function init (line 119) | func init() {
function init (line 168) | func init() {
FILE: core/server.go
method send (line 15) | func (result ActionResult) send() {
function sendMessage (line 23) | func sendMessage(message Message) {
function send (line 31) | func send(data []byte) {
function startServer (line 38) | func startServer(arg string) {
function nextHandle (line 79) | func nextHandle(action *Action, result ActionResult) bool {
FILE: core/tun/tun.go
function Start (line 17) | func Start(fd int, stack string, address, dns string) *sing_tun.Listener {
FILE: lib/application.dart
class Application (line 20) | class Application extends ConsumerStatefulWidget {
method createState (line 24) | ConsumerState<Application> createState()
class ApplicationState (line 27) | class ApplicationState extends ConsumerState<Application> {
method _getAppColorScheme (line 40) | ColorScheme _getAppColorScheme({
method initState (line 48) | void initState()
method _autoUpdateProfilesTask (line 63) | void _autoUpdateProfilesTask()
method _buildPlatformState (line 70) | Widget _buildPlatformState({required Widget child})
method _buildState (line 81) | Widget _buildState({required Widget child})
method _buildPlatformApp (line 100) | Widget _buildPlatformApp({required Widget child})
method _buildApp (line 107) | Widget _buildApp({required Widget child})
method build (line 112) | Widget build(context)
method dispose (line 166) | Future<void> dispose()
FILE: lib/common/archive.dart
function addDirectoryToArchive (line 7) | void addDirectoryToArchive(String dirPath, String parentPath)
FILE: lib/common/cache.dart
class LocalImageCacheManager (line 7) | class LocalImageCacheManager extends CacheManager {
class _LocalImageCacheFileService (line 20) | class _LocalImageCacheFileService extends FileService {
method get (line 24) | Future<FileServiceResponse> get(
class _LocalImageResponse (line 36) | class _LocalImageResponse implements FileServiceResponse {
method _header (line 43) | String? _header(String name)
FILE: lib/common/color.dart
function _floatToInt8 (line 61) | int _floatToInt8(double x)
function lighten (line 65) | Color lighten([double amount = 10])
function darken (line 87) | Color darken([final int amount = 10])
function blendDarken (line 96) | Color blendDarken(
function blendLighten (line 108) | Color blendLighten(
function toPureBlack (line 122) | ColorScheme toPureBlack(bool isPrueBlack)
FILE: lib/common/compute.dart
function computeSort (line 5) | List<Group> computeSort({
function sortOfDelay (line 12) | List<Proxy> sortOfDelay({
function sortOfName (line 38) | List<Proxy> sortOfName(List<Proxy> proxies)
function getRealSelectedProxyState (line 59) | SelectedProxyState getRealSelectedProxyState(
function computeRealSelectedProxyState (line 82) | SelectedProxyState computeRealSelectedProxyState(
function computeProxyDelayState (line 94) | DelayState computeProxyDelayState({
FILE: lib/common/constant.dart
function getWidgetHeight (line 104) | double getWidgetHeight(num lines)
FILE: lib/common/context.dart
function showNotifier (line 12) | void showNotifier(String text, {MessageActionState? actionState})
function showSnackBar (line 19) | void showSnackBar(String message, {SnackBarAction? action})
function findLastStateOfType (line 52) | T? findLastStateOfType<T extends State>()
function visitor (line 55) | visitor(Element element)
class BackHandleInherited (line 72) | class BackHandleInherited extends InheritedWidget {
method of (line 81) | BackHandleInherited? of(BuildContext context)
method updateShouldNotify (line 85) | bool updateShouldNotify(BackHandleInherited oldWidget)
FILE: lib/common/converter.dart
class Uint8ListToListIntConverter (line 4) | class Uint8ListToListIntConverter extends Converter<Uint8List, List<int>> {
method convert (line 6) | List<int> convert(Uint8List input)
method startChunkedConversion (line 11) | Sink<Uint8List> startChunkedConversion(Sink<List<int>> sink)
class _Uint8ListToListIntConverterSink (line 16) | class _Uint8ListToListIntConverterSink implements Sink<Uint8List> {
method add (line 22) | void add(Uint8List data)
method close (line 27) | void close()
FILE: lib/common/datetime.dart
function isBeforeSecure (line 8) | bool isBeforeSecure(DateTime? dateTime)
FILE: lib/common/dav_client.dart
class DAVClient (line 7) | class DAVClient {
method _ping (line 22) | Future<bool> _ping()
method backup (line 35) | Future<bool> backup(String localFilePath)
method restore (line 41) | Future<bool> restore()
FILE: lib/common/file.dart
function safeCopy (line 4) | Future<void> safeCopy(String newPath)
function safeWriteAsString (line 16) | Future<File> safeWriteAsString(String str)
function safeWriteAsBytes (line 23) | Future<File> safeWriteAsBytes(List<int> bytes)
function safeDelete (line 32) | Future<void> safeDelete({bool recursive = false})
FILE: lib/common/fixed.dart
type ValueCallback (line 3) | typedef ValueCallback<T> = T Function();
class FixedList (line 5) | class FixedList<T> {
method add (line 12) | void add(T item)
method clear (line 17) | void clear()
method copyWith (line 27) | FixedList<T> copyWith()
class FixedMap (line 35) | class FixedMap<K, V> {
method updateCacheValue (line 43) | V updateCacheValue(K key, ValueCallback<V> callback)
method clear (line 52) | void clear()
method updateMaxLength (line 56) | void updateMaxLength(int size)
method updateMap (line 61) | void updateMap(Map<K, V> map)
method _adjustMap (line 66) | void _adjustMap()
method get (line 74) | V? get(K key)
method containsKey (line 76) | bool containsKey(K key)
FILE: lib/common/function.dart
class Debouncer (line 6) | class Debouncer {
method call (line 9) | void call(
method apply (line 22) | Function.apply(func, args)
method cancel (line 26) | void cancel(dynamic tag)
class Throttler (line 32) | class Throttler {
method call (line 35) | bool call(
method apply (line 47) | Function.apply(func, args)
method apply (line 54) | Function.apply(func, args)
method cancel (line 62) | void cancel(dynamic tag)
function retry (line 68) | Future<T> retry<T>({
FILE: lib/common/future.dart
function withTimeout (line 7) | Future<T> withTimeout({
function safeCompleter (line 33) | void safeCompleter(T value)
FILE: lib/common/http.dart
class FlClashHttpOverrides (line 6) | class FlClashHttpOverrides extends HttpOverrides {
method handleFindProxy (line 7) | String handleFindProxy(Uri url)
method createHttpClient (line 19) | HttpClient createHttpClient(SecurityContext? context)
FILE: lib/common/icons.dart
class IconsExt (line 3) | class IconsExt {
FILE: lib/common/indexing.dart
class Indexing (line 3) | class Indexing {
method _getIntegerLength (line 19) | int _getIntegerLength(String head)
method _validateInteger (line 29) | bool _validateInteger(String integer)
method _incrementInteger (line 36) | String? _incrementInteger(String x)
method _decrementInteger (line 72) | String? _decrementInteger(String x)
method _midpoint (line 108) | String _midpoint(String a, String? b)
method _getIntegerPart (line 153) | String _getIntegerPart(String key)
method _validateOrderKey (line 161) | bool _validateOrderKey(String key)
method generateKeyBetween (line 174) | String? generateKeyBetween(String? a, String? b)
method generateNKeysBetween (line 223) | List<String?> generateNKeysBetween(String? a, String? b, int n)
FILE: lib/common/iterable.dart
function separated (line 2) | Iterable<E> separated(E separator)
function chunks (line 14) | Iterable<List<E>> chunks(int size)
function fill (line 26) | Iterable<E> fill(int length, {required E Function(int count) filler})
function takeLast (line 39) | Iterable<E> takeLast({int count = 50})
function truncate (line 46) | void truncate(int maxLength)
function intersection (line 55) | List<T> intersection(List<T> list)
function batch (line 59) | List<List<T>> batch(int maxConcurrent)
function safeSublist (line 72) | List<T> safeSublist(int start, [int? end])
function safeGet (line 81) | T? safeGet(int index, {T? defaultValue})
function safeLast (line 88) | T safeLast(T defaultValue)
function addOrRemove (line 95) | void addOrRemove(T value)
function addOrRemove (line 105) | void addOrRemove(T value)
function findInterval (line 115) | int findInterval(num target)
function updateCacheValue (line 141) | V updateCacheValue(K key, V Function() callback)
function copyWitUpdate (line 148) | Map<K, V> copyWitUpdate(K key, V? value)
FILE: lib/common/launch.dart
class AutoLaunch (line 10) | class AutoLaunch {
method enable (line 29) | Future<bool> enable()
method disable (line 33) | Future<bool> disable()
method updateStatus (line 37) | Future<void> updateStatus(bool isAutoLaunch)
FILE: lib/common/link.dart
type InstallConfigCallBack (line 7) | typedef InstallConfigCallBack = void Function(String url);
class LinkManager (line 9) | class LinkManager {
method initAppLinksListen (line 18) | Future<void> initAppLinksListen(
method destroy (line 36) | void destroy()
FILE: lib/common/lock.dart
class SingleInstanceLock (line 5) | class SingleInstanceLock {
method acquire (line 16) | Future<bool> acquire()
FILE: lib/common/measure.dart
class Measure (line 5) | class Measure {
method computeTextSize (line 14) | Size computeTextSize(Text text, {double maxWidth = double.infinity})
FILE: lib/common/migration.dart
class Migration (line 4) | class Migration {
method migrationIfNeeded (line 17) | Future<Config> migrationIfNeeded(
method _oldToNow (line 48) | Future<MigrationData> _oldToNow(Map<String, Object?> configMap)
FILE: lib/common/mixin.dart
function equals (line 11) | bool equals(T previous, T next)
function updateShouldNotify (line 16) | bool updateShouldNotify(previous, next)
function onUpdate (line 26) | void onUpdate(T value)
function update (line 28) | void update(T? Function(T) builder)
FILE: lib/common/navigation.dart
class Navigation (line 6) | class Navigation {
method getItems (line 9) | List<NavigationItem> getItems({
FILE: lib/common/navigator.dart
class BaseNavigator (line 6) | class BaseNavigator {
method push (line 7) | Future<T?> push<T>(BuildContext context, Widget child)
class CommonDesktopRoute (line 39) | class CommonDesktopRoute<T> extends PageRoute<T> {
method buildPage (line 51) | Widget buildPage(
class CommonRoute (line 74) | class CommonRoute<T> extends PageRoute<T> {
method buildPage (line 89) | Widget buildPage(
class CommonPageTransitionsBuilder (line 124) | class CommonPageTransitionsBuilder extends PageTransitionsBuilder {
method buildTransitions (line 128) | Widget buildTransitions<T>(
class CommonPageTransition (line 145) | class CommonPageTransition extends StatefulWidget {
method delegatedTransition (line 165) | Widget? delegatedTransition(
method createState (line 193) | State<CommonPageTransition> createState()
class _CommonPageTransitionState (line 196) | class _CommonPageTransitionState extends State<CommonPageTransition> {
method initState (line 205) | void initState()
method didUpdateWidget (line 211) | void didUpdateWidget(covariant CommonPageTransition oldWidget)
method dispose (line 222) | void dispose()
method _disposeCurve (line 227) | void _disposeCurve()
method _setupAnimation (line 236) | void _setupAnimation()
method build (line 274) | Widget build(BuildContext context)
class _CommonEdgeShadowDecoration (line 293) | class _CommonEdgeShadowDecoration extends Decoration {
method createBoxPainter (line 299) | BoxPainter createBoxPainter([VoidCallback? onChanged])
class _CommonEdgeShadowPainter (line 304) | class _CommonEdgeShadowPainter extends BoxPainter {
method paint (line 311) | void paint(Canvas canvas, Offset offset, ImageConfiguration configurat...
FILE: lib/common/num.dart
function fixed (line 10) | String fixed({int decimals = 2})
function moreOrEqual (line 59) | bool moreOrEqual(double value)
function getCrossAxisOffset (line 65) | double getCrossAxisOffset(Axis direction)
function getMainAxisOffset (line 69) | double getMainAxisOffset(Axis direction)
function less (line 73) | bool less(Offset offset)
function doRectIntersect (line 85) | bool doRectIntersect(Rect rect)
FILE: lib/common/path.dart
class AppPath (line 8) | class AppPath {
method getProfilePath (line 109) | Future<String> getProfilePath(String fileName)
method getScriptPath (line 118) | Future<String> getScriptPath(String fileName)
method getIconsCacheDir (line 123) | Future<String> getIconsCacheDir()
method getProvidersRootPath (line 128) | Future<String> getProvidersRootPath()
method getProvidersDirPath (line 133) | Future<String> getProvidersDirPath(String id)
method getProvidersFilePath (line 138) | Future<String> getProvidersFilePath(
FILE: lib/common/picker.dart
class Picker (line 9) | class Picker {
method pickerFile (line 10) | Future<PlatformFile?> pickerFile({bool withData = true})
method saveFile (line 19) | Future<String?> saveFile(String fileName, Uint8List bytes)
method saveFileWithPath (line 32) | Future<String?> saveFileWithPath(String fileName, String localPath)
method pickerConfigQRCode (line 50) | Future<String?> pickerConfigQRCode()
FILE: lib/common/preferences.dart
class Preferences (line 9) | class Preferences {
method getVersion (line 27) | Future<int> getVersion()
method setVersion (line 32) | Future<void> setVersion(int version)
method saveShareState (line 37) | Future<void> saveShareState(SharedState shareState)
method getConfigMap (line 42) | Future<Map<String, Object?>?> getConfigMap()
method getClashConfigMap (line 54) | Future<Map<String, Object?>?> getClashConfigMap()
method clearClashConfig (line 65) | Future<void> clearClashConfig()
method getConfig (line 75) | Future<Config?> getConfig()
method saveConfig (line 83) | Future<bool> saveConfig(Config config)
method clearPreferences (line 88) | Future<void> clearPreferences()
FILE: lib/common/print.dart
class CommonPrint (line 6) | class CommonPrint {
method log (line 16) | void log(String? text, {LogLevel logLevel = LogLevel.info})
FILE: lib/common/protocol.dart
class Protocol (line 5) | class Protocol {
method register (line 15) | void register(String scheme)
FILE: lib/common/render.dart
class Render (line 5) | class Render {
method active (line 19) | void active()
method pause (line 24) | void pause()
method resume (line 32) | void resume()
method _pause (line 37) | void _pause()
method _resume (line 47) | void _resume()
FILE: lib/common/request.dart
class Request (line 15) | class Request {
method getFileResponseForUrl (line 35) | Future<Response<Uint8List>> getFileResponseForUrl(String url)
method getTextResponseForUrl (line 55) | Future<Response<String>> getTextResponseForUrl(String url)
method getImage (line 63) | Future<MemoryImage?> getImage(String url)
method checkForUpdate (line 74) | Future<Map<String, dynamic>?> checkForUpdate()
method checkIp (line 104) | Future<Result<IpInfo?>> checkIp({CancelToken? cancelToken})
method handleFailRes (line 109) | handleFailRes()
method pingHelper (line 145) | Future<bool> pingHelper()
method startCoreByHelper (line 162) | Future<bool> startCoreByHelper(String arg)
method stopCoreByHelper (line 181) | Future<bool> stopCoreByHelper()
FILE: lib/common/scroll.dart
class BaseScrollBehavior (line 8) | class BaseScrollBehavior extends MaterialScrollBehavior {
method buildScrollbar (line 20) | Widget buildScrollbar(
class HiddenBarScrollBehavior (line 47) | class HiddenBarScrollBehavior extends BaseScrollBehavior {
method buildScrollbar (line 49) | Widget buildScrollbar(
class ShowBarScrollBehavior (line 58) | class ShowBarScrollBehavior extends BaseScrollBehavior {
method buildScrollbar (line 60) | Widget buildScrollbar(
class NextClampingScrollPhysics (line 69) | class NextClampingScrollPhysics extends ClampingScrollPhysics {
method applyTo (line 73) | NextClampingScrollPhysics applyTo(ScrollPhysics? ancestor)
method createBallisticSimulation (line 78) | Simulation? createBallisticSimulation(
class ReverseScrollController (line 165) | class ReverseScrollController extends ScrollController {
method createScrollPosition (line 173) | ScrollPosition createScrollPosition(
class ReverseScrollPosition (line 189) | class ReverseScrollPosition extends ScrollPositionWithSingleContext {
method applyContentDimensions (line 202) | bool applyContentDimensions(double minScrollExtent, double maxScrollEx...
FILE: lib/common/snowflake.dart
class Snowflake (line 1) | class Snowflake {
method _getNextMillis (line 49) | int _getNextMillis(int lastTimestamp)
FILE: lib/common/store.dart
class Store (line 3) | class Store<T> {
method equals (line 13) | bool equals(T oldValue, T newValue)
method _add (line 17) | void _add(T value)
FILE: lib/common/string.dart
function compareToLower (line 20) | int compareToLower(String other)
function safeSubstring (line 24) | String safeSubstring(int start, [int? end])
function toMd5 (line 72) | String toMd5()
function commonToJSON (line 81) | Future<T> commonToJSON<T>()
function takeFirstValid (line 92) | String takeFirstValid(List<String?> others, {String defaultValue = ''})
FILE: lib/common/system.dart
class System (line 14) | class System {
method checkIsAdmin (line 44) | Future<bool> checkIsAdmin()
method authorizeCore (line 67) | Future<AuthorizeCode> authorizeCore()
method back (line 118) | Future<void> back()
method exit (line 123) | Future<void> exit()
class Windows (line 133) | class Windows {
method runas (line 146) | bool runas(String command, String arguments)
method checkService (line 210) | Future<WindowsHelperServiceStatus> checkService()
method registerService (line 227) | Future<bool> registerService()
method registerTask (line 270) | Future<bool> registerTask(String appName)
class MacOS (line 328) | class MacOS {
method updateDns (line 394) | Future<void> updateDns(bool restore)
FILE: lib/common/task.dart
function decodeJSONTask (line 15) | Future<T> decodeJSONTask<T>(String data)
function _decodeJSON (line 19) | Future<T> _decodeJSON<T>(String content)
function encodeJSONTask (line 23) | Future<String> encodeJSONTask<T>(T data)
function _encodeJSON (line 27) | Future<String> _encodeJSON<T>(T content)
function encodeYamlTask (line 31) | Future<String> encodeYamlTask<T>(T data)
function _encodeYaml (line 35) | Future<String> _encodeYaml<T>(T content)
function toGroupsTask (line 39) | Future<List<Group>> toGroupsTask(ComputeGroupsState data)
function _toGroupsTask (line 43) | Future<List<Group>> _toGroupsTask(ComputeGroupsState state)
function makeRealProfileTask (line 76) | Future<Map<String, dynamic>> makeRealProfileTask(
function _makeRealProfileTask (line 85) | Future<Map<String, dynamic>> _makeRealProfileTask(
function getProvidersFilePathInner (line 96) | String getProvidersFilePathInner(String type, String url)
function shakingProfileTask (line 261) | Future<List<String>> shakingProfileTask(
function _shakingProfileTask (line 270) | Future<List<String>> _shakingProfileTask(
function scanDirectory (line 281) | void scanDirectory(
function encodeLogsTask (line 309) | Future<String> encodeLogsTask(List<Log> data)
function _encodeLogsTask (line 313) | Future<String> _encodeLogsTask(List<Log> data)
function oldToNowTask (line 319) | Future<MigrationData> oldToNowTask(Map<String, Object?> data)
function _oldToNowTask (line 327) | Future<MigrationData> _oldToNowTask(
function backupTask (line 457) | Future<String> backupTask(
function _backupTask (line 467) | Future<String> _backupTask<T>(
function restoreTask (line 518) | Future<MigrationData> restoreTask()
function _restoreTask (line 525) | Future<MigrationData> _restoreTask(RootIsolateToken token)
function _copyWithMapList (line 600) | Future<void> _copyWithMapList(List<VM2<String, String>> copyMapList)
function _getScriptPath (line 606) | String _getScriptPath(String root, String fileName)
function _getProfilePath (line 610) | String _getProfilePath(String root, String fileName)
FILE: lib/common/text.dart
function adjustSize (line 18) | TextStyle adjustSize(int size)
FILE: lib/common/theme.dart
class CommonTheme (line 4) | class CommonTheme {
FILE: lib/common/tray.dart
class Tray (line 15) | class Tray {
method destroy (line 29) | Future<void> destroy()
method getTryIcon (line 33) | String getTryIcon({required bool isStart, required bool tunEnable})
method _updateSystemTray (line 43) | Future _updateSystemTray({
method update (line 59) | Future<void> update({
method updateTrayTitle (line 196) | Future<void> updateTrayTitle({
method _copyEnv (line 210) | Future<void> _copyEnv(int port)
FILE: lib/common/utils.dart
class Utils (line 12) | class Utils {
method getDelayColor (line 22) | Color? getDelayColor(int? delay)
method getDateStringLast2 (line 38) | String getDateStringLast2(int value)
method generateRandomString (line 43) | String generateRandomString({int minLength = 10, int maxLength = 100})
method getTimeDifference (line 78) | String getTimeDifference(DateTime dateTime)
method getTimeText (line 88) | String getTimeText(int? timeStamp)
method getLocaleForString (line 103) | Locale? getLocaleForString(String? localString)
method sortByChar (line 122) | int sortByChar(String a, String b)
method getOverwriteLabel (line 142) | String getOverwriteLabel(String label)
method compareVersions (line 159) | int compareVersions(String version1, String version2)
method getFileNameForDisposition (line 188) | String? getFileNameForDisposition(String? disposition)
method getScreen (line 210) | FlutterView getScreen()
method parseReleaseBody (line 214) | List<String> parseReleaseBody(String? body)
method getViewMode (line 225) | ViewMode getViewMode(double viewWidth)
method getProxiesColumns (line 231) | int getProxiesColumns(double viewWidth, ProxiesLayout proxiesLayout)
method getProfilesColumns (line 240) | int getProfilesColumns(double viewWidth)
method _createPrimarySwatch (line 246) | MaterialColor _createPrimarySwatch(Color color)
method getMaterialColorShades (line 272) | List<Color> getMaterialColorShades(Color color)
method getBackupFileName (line 289) | String getBackupFileName()
method getLocalIpAddress (line 297) | Future<String?> getLocalIpAddress()
method controlSingleActivator (line 322) | SingleActivator controlSingleActivator(LogicalKeyboardKey trigger)
method handleWatch (line 327) | FutureOr<T> handleWatch<T>({
method fastHash (line 341) | int fastHash(String string)
FILE: lib/common/window.dart
class Window (line 9) | class Window {
method init (line 19) | Future<void> init(int version, WindowProps props)
method _windowPosition (line 45) | Future<void> _windowPosition(WindowProps props)
method show (line 72) | Future<void> show()
method close (line 85) | Future<void> close()
method hide (line 90) | Future<void> hide()
FILE: lib/common/yaml.dart
class Yaml (line 3) | class Yaml {
method encode (line 13) | String encode(Object? value)
FILE: lib/controller.dart
class AppController (line 19) | class AppController {
method attach (line 33) | Future<void> attach(BuildContext context, WidgetRef ref)
function _init (line 42) | Future<void> _init()
function _handleFailedPreference (line 67) | Future<void> _handleFailedPreference()
function showDisclaimer (line 82) | Future<bool> showDisclaimer()
function _showCrashlyticsTip (line 107) | Future<void> _showCrashlyticsTip()
function _handlerDisclaimer (line 124) | Future<void> _handlerDisclaimer()
function _initStatus (line 140) | Future<void> _initStatus()
function autoCheckUpdate (line 159) | Future<void> autoCheckUpdate()
function checkUpdateResultHandle (line 165) | Future<void> checkUpdateResultHandle({
function getSelectedProxyName (line 229) | String? getSelectedProxyName(String groupName)
function getSetupState (line 233) | Future<SetupState> getSetupState(int profileId)
function getRealTestUrl (line 237) | String getRealTestUrl(String? url)
function getProxiesColumns (line 241) | int getProxiesColumns()
function getCurrentGroups (line 257) | List<Group> getCurrentGroups()
function getCurrentGroupName (line 261) | String? getCurrentGroupName()
function deleteProfile (line 270) | Future<void> deleteProfile(int id)
function autoUpdateProfiles (line 286) | Future<void> autoUpdateProfiles()
function putProfile (line 303) | void putProfile(Profile profile)
function updateProfiles (line 309) | Future<void> updateProfiles()
function updateProfile (line 318) | Future<void> updateProfile(
function addProfileFormURL (line 337) | Future<void> addProfileFormURL(String url)
function setProfileAndAutoApply (line 350) | void setProfileAndAutoApply(Profile profile)
function addProfileFormFile (line 357) | Future<void> addProfileFormFile()
function addProfileFormQrCode (line 374) | Future<void> addProfileFormQrCode()
function reorder (line 380) | void reorder(List<Profile> profiles)
function clearEffect (line 384) | Future<void> clearEffect(int profileId)
function addLog (line 399) | void addLog(Log log)
function exportLogs (line 403) | Future<bool> exportLogs()
function updateGroupsDebounce (line 415) | void updateGroupsDebounce([Duration? duration])
function changeProxyDebounce (line 419) | void changeProxyDebounce(String groupName, String proxyName)
function updateGroups (line 429) | Future<void> updateGroups()
function updateCurrentGroupName (line 459) | void updateCurrentGroupName(String groupName)
function updateCurrentSelectedMap (line 469) | void updateCurrentSelectedMap(String groupName, String proxyName)
function updateCurrentUnfoldSet (line 481) | void updateCurrentUnfoldSet(Set<String> value)
function setDelay (line 491) | void setDelay(Delay delay)
function changeProxy (line 495) | Future<void> changeProxy({
function setProvider (line 510) | void setProvider(ExternalProvider? provider)
function updateProviders (line 514) | Future<void> updateProviders()
function updateProvider (line 519) | Future<String> updateProvider(
function addSortNum (line 540) | int addSortNum()
function fullSetup (line 546) | void fullSetup()
function updateStatus (line 556) | Future<void> updateStatus(bool isStart, {bool isInit = false})
function needSetup (line 587) | Future<bool> needSetup()
function updateConfigDebounce (line 596) | Future<void> updateConfigDebounce()
function addCheckIp (line 613) | void addCheckIp()
function tryCheckIp (line 617) | void tryCheckIp()
function applyProfileDebounce (line 629) | void applyProfileDebounce({bool silence = false, bool force = false})
function changeMode (line 635) | void changeMode(Mode mode)
function autoApplyProfile (line 645) | void autoApplyProfile()
function applyProfile (line 651) | Future<void> applyProfile({
function getProfile (line 670) | Future<Map<String, dynamic>> getProfile({
function getProfileWithId (line 718) | Future<Map> getProfileWithId(int profileId)
function _setupConfig (line 733) | Future<void> _setupConfig([VoidCallback? preloadInvoke])
function _initCore (line 774) | Future<void> _initCore()
function _connectCore (line 784) | Future<void> _connectCore()
function _requestAdmin (line 801) | Future<Result<bool>> _requestAdmin(bool enableTun)
function restartCore (line 820) | Future<void> restartCore([bool start = false])
function tryStartCore (line 832) | Future<bool> tryStartCore([bool start = false])
function handleCoreDisconnected (line 840) | void handleCoreDisconnected()
function getPackages (line 846) | Future<List<Package>> getPackages()
function handleExit (line 857) | Future<void> handleExit([bool needSave = false])
function handleBackOrExit (line 875) | Future<void> handleBackOrExit()
function updateVisible (line 889) | Future<void> updateVisible()
function updateBrightness (line 898) | void updateBrightness()
function updateViewSize (line 905) | void updateViewSize(Size size)
function initLink (line 911) | void initLink()
function updateTun (line 940) | void updateTun()
function updateSystemProxy (line 946) | void updateSystemProxy()
function updateAutoLaunch (line 952) | void updateAutoLaunch()
function updateTray (line 958) | Future<void> updateTray()
function updateLocalIp (line 967) | Future<void> updateLocalIp()
function shakingStore (line 975) | Future<void> shakingStore()
function backup (line 1001) | Future<String> backup()
function restore (line 1018) | Future<void> restore(RestoreOption option)
function backBlock (line 1064) | void backBlock()
function unBackBlock (line 1068) | void unBackBlock()
function savePreferencesDebounce (line 1074) | void savePreferencesDebounce()
function handleClear (line 1080) | Future handleClear()
function toPage (line 1095) | void toPage(PageLabel pageLabel)
function toProfiles (line 1099) | void toProfiles()
function updateStart (line 1103) | void updateStart()
function updateSpeedStatistics (line 1107) | void updateSpeedStatistics()
function updateMode (line 1113) | void updateMode()
function updateRunTime (line 1124) | void updateRunTime()
function updateTraffic (line 1135) | Future<void> updateTraffic()
function loadingRun (line 1145) | Future<T?> loadingRun<T>(
function safeRun (line 1170) | Future<T?> safeRun<T>(
FILE: lib/core/controller.dart
class CoreController (line 13) | class CoreController {
method preload (line 32) | Future<String> preload()
method initGeo (line 36) | Future<void> initGeo()
method init (line 60) | Future<bool> init(int version)
method shutdown (line 68) | Future<void> shutdown(bool isUser)
method validateConfig (line 74) | Future<String> validateConfig(String path)
method validateConfigWithData (line 79) | Future<String> validateConfigWithData(String data)
method updateConfig (line 88) | Future<String> updateConfig(UpdateParams updateParams)
method setupConfig (line 92) | Future<String> setupConfig({
method getProxiesGroups (line 104) | Future<List<Group>> getProxiesGroups({
method changeProxy (line 122) | FutureOr<String> changeProxy(ChangeProxyParams changeProxyParams)
method getConnections (line 126) | Future<List<TrackerInfo>> getConnections()
method closeConnection (line 133) | void closeConnection(String id)
method closeConnections (line 137) | void closeConnections()
method resetConnections (line 141) | void resetConnections()
method getExternalProviders (line 145) | Future<List<ExternalProvider>> getExternalProviders()
method getExternalProvider (line 157) | Future<ExternalProvider?> getExternalProvider(
method updateGeoData (line 169) | Future<String> updateGeoData(UpdateGeoDataParams params)
method sideLoadExternalProvider (line 173) | Future<String> sideLoadExternalProvider({
method updateExternalProvider (line 183) | Future<String> updateExternalProvider({required String providerName})
method startListener (line 187) | Future<bool> startListener()
method stopListener (line 191) | Future<bool> stopListener()
method getDelay (line 195) | Future<Delay> getDelay(String url, String proxyName)
method getConfig (line 200) | Future<Map<String, dynamic>> getConfig(int id)
method getTraffic (line 213) | Future<Traffic> getTraffic(bool onlyStatisticsProxy)
method getCountryCode (line 221) | Future<IpInfo?> getCountryCode(String ip)
method getTotalTraffic (line 229) | Future<Traffic> getTotalTraffic(bool onlyStatisticsProxy)
method getMemory (line 239) | Future<int> getMemory()
method resetTraffic (line 247) | void resetTraffic()
method startLog (line 251) | void startLog()
method stopLog (line 255) | void stopLog()
method requestGc (line 259) | Future<void> requestGc()
method destroy (line 263) | Future<void> destroy()
method crash (line 267) | Future<void> crash()
method deleteFile (line 271) | Future<String> deleteFile(String path)
FILE: lib/core/event.dart
class CoreEventListener (line 7) | abstract mixin class CoreEventListener {
method onLog (line 8) | void onLog(Log log)
method onDelay (line 10) | void onDelay(Delay delay)
method onRequest (line 12) | void onRequest(TrackerInfo connection)
method onLoaded (line 14) | void onLoaded(String providerName)
method onCrash (line 16) | void onCrash(String message)
class CoreEventManager (line 19) | class CoreEventManager {
method sendEvent (line 55) | void sendEvent(CoreEvent event)
method addListener (line 59) | void addListener(CoreEventListener listener)
method removeListener (line 63) | void removeListener(CoreEventListener listener)
FILE: lib/core/interface.dart
function init (line 10) | Future<bool> init(InitParams params)
function preload (line 12) | Future<String> preload()
function shutdown (line 14) | Future<bool> shutdown(bool isUser)
function forceGc (line 18) | Future<bool> forceGc()
function validateConfig (line 20) | Future<String> validateConfig(String path)
function getConfig (line 22) | Future<Result> getConfig(String path)
function asyncTestDelay (line 24) | Future<String> asyncTestDelay(String url, String proxyName)
function updateConfig (line 26) | Future<String> updateConfig(UpdateParams updateParams)
function setupConfig (line 28) | Future<String> setupConfig(SetupParams setupParams)
function getProxies (line 30) | Future<ProxiesData> getProxies()
function changeProxy (line 32) | Future<String> changeProxy(ChangeProxyParams changeProxyParams)
function startListener (line 34) | Future<bool> startListener()
function stopListener (line 36) | Future<bool> stopListener()
function getExternalProviders (line 38) | Future<String> getExternalProviders()
function getExternalProvider (line 40) | Future<String>? getExternalProvider(String externalProviderName)
function updateGeoData (line 42) | Future<String> updateGeoData(UpdateGeoDataParams params)
function sideLoadExternalProvider (line 44) | Future<String> sideLoadExternalProvider({
function updateExternalProvider (line 49) | Future<String> updateExternalProvider(String providerName)
function getTraffic (line 51) | FutureOr<String> getTraffic(bool onlyStatisticsProxy)
function getTotalTraffic (line 53) | FutureOr<String> getTotalTraffic(bool onlyStatisticsProxy)
function getCountryCode (line 55) | FutureOr<String> getCountryCode(String ip)
function getMemory (line 57) | FutureOr<String> getMemory()
function resetTraffic (line 59) | FutureOr<void> resetTraffic()
function startLog (line 61) | FutureOr<void> startLog()
function stopLog (line 63) | FutureOr<void> stopLog()
function crash (line 65) | Future<bool> crash()
function getConnections (line 67) | FutureOr<String> getConnections()
function closeConnection (line 69) | FutureOr<bool> closeConnection(String id)
function deleteFile (line 71) | FutureOr<String> deleteFile(String path)
function closeConnections (line 73) | FutureOr<bool> closeConnections()
function resetConnections (line 75) | FutureOr<bool> resetConnections()
class CoreHandlerInterface (line 78) | abstract class CoreHandlerInterface with CoreInterface {
method destroy (line 81) | FutureOr<bool> destroy()
method _invoke (line 83) | Future<T?> _invoke<T>({
method invoke (line 111) | Future<T?> invoke<T>({
method parasResult (line 117) | Future<T> parasResult<T>(ActionResult result)
method init (line 125) | Future<bool> init(InitParams params)
method shutdown (line 134) | Future<bool> shutdown(bool isUser)
method forceGc (line 142) | Future<bool> forceGc()
method validateConfig (line 147) | Future<String> validateConfig(String path)
method updateConfig (line 156) | Future<String> updateConfig(UpdateParams updateParams)
method getConfig (line 165) | Future<Result> getConfig(String path)
method setupConfig (line 171) | Future<String> setupConfig(SetupParams setupParams)
method crash (line 180) | Future<bool> crash()
method getProxies (line 185) | Future<ProxiesData> getProxies()
method changeProxy (line 195) | Future<String> changeProxy(ChangeProxyParams changeProxyParams)
method getExternalProviders (line 204) | Future<String> getExternalProviders()
method getExternalProvider (line 210) | Future<String> getExternalProvider(String externalProviderName)
method updateGeoData (line 219) | Future<String> updateGeoData(UpdateGeoDataParams params)
method sideLoadExternalProvider (line 228) | Future<String> sideLoadExternalProvider({
method updateExternalProvider (line 240) | Future<String> updateExternalProvider(String providerName)
method getConnections (line 249) | Future<String> getConnections()
method closeConnections (line 254) | Future<bool> closeConnections()
method resetConnections (line 259) | Future<bool> resetConnections()
method closeConnection (line 264) | Future<bool> closeConnection(String id)
method getTotalTraffic (line 273) | Future<String> getTotalTraffic(bool onlyStatisticsProxy)
method getTraffic (line 282) | Future<String> getTraffic(bool onlyStatisticsProxy)
method deleteFile (line 291) | Future<String> deleteFile(String path)
method startListener (line 312) | Future<bool> startListener()
method stopListener (line 317) | Future<bool> stopListener()
method asyncTestDelay (line 322) | Future<String> asyncTestDelay(String url, String proxyName)
method getCountryCode (line 337) | Future<String> getCountryCode(String ip)
method getMemory (line 346) | Future<String> getMemory()
FILE: lib/core/lib.dart
class CoreLib (line 11) | class CoreLib extends CoreHandlerInterface {
method preload (line 19) | Future<String> preload()
method shutdown (line 40) | Future<bool> shutdown(_)
method invoke (line 49) | Future<T?> invoke<T>({
FILE: lib/core/service.dart
class CoreService (line 12) | class CoreService extends CoreHandlerInterface {
method handleResult (line 34) | Future<void> handleResult(ActionResult result)
method _initServer (line 46) | Future<void> _initServer()
method _attachSocket (line 71) | Future<void> _attachSocket(Socket socket)
method _handleInvokeCrashEvent (line 90) | void _handleInvokeCrashEvent()
method start (line 96) | Future<void> start()
method sendMessage (line 130) | Future<void> sendMessage(String message)
method _deleteSocketFile (line 135) | Future<void> _deleteSocketFile()
method _destroySocket (line 142) | Future<void> _destroySocket()
method _clearCompleter (line 170) | void _clearCompleter()
method preload (line 177) | Future<String> preload()
method invoke (line 184) | Future<T?> invoke<T>({
FILE: lib/database/database.dart
class Database (line 17) | @DriftDatabase(
method _openConnection (line 27) | LazyDatabase _openConnection()
method restore (line 34) | Future<void> restore(
function setAll (line 60) | void setAll(
function remove (line 69) | Future<int> remove(Expression<bool> Function(Tbl tbl) filter)
function put (line 73) | Future<int> put(Insertable<Row> item)
FILE: lib/database/generated/database.g.dart
class $ProfilesTable (line 6) | class $ProfilesTable extends Profiles
method validateIntegrity (line 165) | VerificationContext validateIntegrity(
method map (line 245) | RawProfile map(Map<String, dynamic> data, {String? tablePrefix})
method createAlias (line 312) | $ProfilesTable createAlias(String alias)
class RawProfile (line 328) | class RawProfile extends DataClass implements Insertable<RawProfile> {
method toColumns (line 358) | Map<String, Expression> toColumns(bool nullToAbsent)
method toCompanion (line 402) | ProfilesCompanion toCompanion(bool nullToAbsent)
method toJson (line 460) | Map<String, dynamic> toJson({ValueSerializer? serializer})
method copyWith (line 485) | RawProfile copyWith({
method copyWithCompanion (line 521) | RawProfile copyWithCompanion(ProfilesCompanion data)
method toString (line 554) | String toString()
class ProfilesCompanion (line 608) | class ProfilesCompanion extends UpdateCompanion<RawProfile> {
method custom (line 658) | Insertable<RawProfile> custom({
method copyWith (line 691) | ProfilesCompanion copyWith({
method toColumns (line 725) | Map<String, Expression> toColumns(bool nullToAbsent)
method toString (line 780) | String toString()
class $ScriptsTable (line 800) | class $ScriptsTable extends Scripts with TableInfo<$ScriptsTable, RawScr...
method validateIntegrity (line 843) | VerificationContext validateIntegrity(
method map (line 877) | RawScript map(Map<String, dynamic> data, {String? tablePrefix})
method createAlias (line 896) | $ScriptsTable createAlias(String alias)
class RawScript (line 901) | class RawScript extends DataClass implements Insertable<RawScript> {
method toColumns (line 911) | Map<String, Expression> toColumns(bool nullToAbsent)
method toCompanion (line 919) | ScriptsCompanion toCompanion(bool nullToAbsent)
method toJson (line 939) | Map<String, dynamic> toJson({ValueSerializer? serializer})
method copyWith (line 948) | RawScript copyWith({int? id, String? label, DateTime? lastUpdateTime})
method copyWithCompanion (line 954) | RawScript copyWithCompanion(ScriptsCompanion data)
method toString (line 965) | String toString()
class ScriptsCompanion (line 985) | class ScriptsCompanion extends UpdateCompanion<RawScript> {
method custom (line 1000) | Insertable<RawScript> custom({
method copyWith (line 1012) | ScriptsCompanion copyWith({
method toColumns (line 1025) | Map<String, Expression> toColumns(bool nullToAbsent)
method toString (line 1040) | String toString()
class $RulesTable (line 1050) | class $RulesTable extends Rules with TableInfo<$RulesTable, RawRule> {
method validateIntegrity (line 1081) | VerificationContext validateIntegrity(
method map (line 1104) | RawRule map(Map<String, dynamic> data, {String? tablePrefix})
method createAlias (line 1119) | $RulesTable createAlias(String alias)
class RawRule (line 1124) | class RawRule extends DataClass implements Insertable<RawRule> {
method toColumns (line 1129) | Map<String, Expression> toColumns(bool nullToAbsent)
method toCompanion (line 1136) | RulesCompanion toCompanion(bool nullToAbsent)
method toJson (line 1151) | Map<String, dynamic> toJson({ValueSerializer? serializer})
method copyWith (line 1159) | RawRule copyWith({int? id, String? value})
method copyWithCompanion (line 1161) | RawRule copyWithCompanion(RulesCompanion data)
method toString (line 1169) | String toString()
class RulesCompanion (line 1185) | class RulesCompanion extends UpdateCompanion<RawRule> {
method custom (line 1194) | Insertable<RawRule> custom({
method copyWith (line 1204) | RulesCompanion copyWith({Value<int>? id, Value<String>? value})
method toColumns (line 1209) | Map<String, Expression> toColumns(bool nullToAbsent)
method toString (line 1221) | String toString()
class $ProfileRuleLinksTable (line 1230) | class $ProfileRuleLinksTable extends ProfileRuleLinks
method validateIntegrity (line 1297) | VerificationContext validateIntegrity(
method map (line 1334) | RawProfileRuleLink map(Map<String, dynamic> data, {String? tablePrefix})
method createAlias (line 1363) | $ProfileRuleLinksTable createAlias(String alias)
class RawProfileRuleLink (line 1373) | class RawProfileRuleLink extends DataClass
method toColumns (line 1388) | Map<String, Expression> toColumns(bool nullToAbsent)
method toCompanion (line 1406) | ProfileRuleLinksCompanion toCompanion(bool nullToAbsent)
method toJson (line 1438) | Map<String, dynamic> toJson({ValueSerializer? serializer})
method copyWith (line 1451) | RawProfileRuleLink copyWith({
method copyWithCompanion (line 1464) | RawProfileRuleLink copyWithCompanion(ProfileRuleLinksCompanion data)
method toString (line 1475) | String toString()
class ProfileRuleLinksCompanion (line 1499) | class ProfileRuleLinksCompanion extends UpdateCompanion<RawProfileRuleLi...
method custom (line 1523) | Insertable<RawProfileRuleLink> custom({
method copyWith (line 1541) | ProfileRuleLinksCompanion copyWith({
method toColumns (line 1560) | Map<String, Expression> toColumns(bool nullToAbsent)
method toString (line 1586) | String toString()
class _$Database (line 1599) | abstract class _$Database extends GeneratedDatabase {
type $$ProfilesTableCreateCompanionBuilder (line 1645) | typedef $$ProfilesTableCreateCompanionBuilder =
type $$ProfilesTableUpdateCompanionBuilder (line 1661) | typedef $$ProfilesTableUpdateCompanionBuilder =
class $$ProfilesTableReferences (line 1678) | final class $$ProfilesTableReferences
method _profileRuleLinksRefsTable (line 1682) | MultiTypedResultKey<$ProfileRuleLinksTable, List<RawProfileRuleLink>>
class $$ProfilesTableFilterComposer (line 1706) | class $$ProfilesTableFilterComposer
method profileRuleLinksRefs (line 1788) | Expression<bool> profileRuleLinksRefs(
class $$ProfilesTableOrderingComposer (line 1814) | class $$ProfilesTableOrderingComposer
class $$ProfilesTableAnnotationComposer (line 1889) | class $$ProfilesTableAnnotationComposer
method profileRuleLinksRefs (line 1954) | Expression<T> profileRuleLinksRefs<T extends Object>(
class $$ProfilesTableTableManager (line 1980) | class $$ProfilesTableTableManager
type $$ProfilesTableProcessedTableManager (line 2111) | typedef $$ProfilesTableProcessedTableManager =
type $$ScriptsTableCreateCompanionBuilder (line 2125) | typedef $$ScriptsTableCreateCompanionBuilder =
type $$ScriptsTableUpdateCompanionBuilder (line 2131) | typedef $$ScriptsTableUpdateCompanionBuilder =
class $$ScriptsTableFilterComposer (line 2138) | class $$ScriptsTableFilterComposer extends Composer<_$Database, $Scripts...
class $$ScriptsTableOrderingComposer (line 2162) | class $$ScriptsTableOrderingComposer
class $$ScriptsTableAnnotationComposer (line 2187) | class $$ScriptsTableAnnotationComposer
class $$ScriptsTableTableManager (line 2208) | class $$ScriptsTableTableManager
type $$ScriptsTableProcessedTableManager (line 2262) | typedef $$ScriptsTableProcessedTableManager =
type $$RulesTableCreateCompanionBuilder (line 2276) | typedef $$RulesTableCreateCompanionBuilder =
type $$RulesTableUpdateCompanionBuilder (line 2278) | typedef $$RulesTableUpdateCompanionBuilder =
class $$RulesTableReferences (line 2281) | final class $$RulesTableReferences
method _profileRuleLinksRefsTable (line 2285) | MultiTypedResultKey<$ProfileRuleLinksTable, List<RawProfileRuleLink>>
class $$RulesTableFilterComposer (line 2306) | class $$RulesTableFilterComposer extends Composer<_$Database, $RulesTabl...
method profileRuleLinksRefs (line 2324) | Expression<bool> profileRuleLinksRefs(
class $$RulesTableOrderingComposer (line 2350) | class $$RulesTableOrderingComposer extends Composer<_$Database, $RulesTa...
class $$RulesTableAnnotationComposer (line 2369) | class $$RulesTableAnnotationComposer extends Composer<_$Database, $Rules...
method profileRuleLinksRefs (line 2383) | Expression<T> profileRuleLinksRefs<T extends Object>(
class $$RulesTableTableManager (line 2409) | class $$RulesTableTableManager
type $$RulesTableProcessedTableManager (line 2484) | typedef $$RulesTableProcessedTableManager =
type $$ProfileRuleLinksTableCreateCompanionBuilder (line 2498) | typedef $$ProfileRuleLinksTableCreateCompanionBuilder =
type $$ProfileRuleLinksTableUpdateCompanionBuilder (line 2507) | typedef $$ProfileRuleLinksTableUpdateCompanionBuilder =
class $$ProfileRuleLinksTableReferences (line 2517) | final class $$ProfileRuleLinksTableReferences
method _profileIdTable (line 2526) | $ProfilesTable _profileIdTable(_$Database db)
method _ruleIdTable (line 2545) | $RulesTable _ruleIdTable(_$Database db)
class $$ProfileRuleLinksTableFilterComposer (line 2564) | class $$ProfileRuleLinksTableFilterComposer
class $$ProfileRuleLinksTableOrderingComposer (line 2636) | class $$ProfileRuleLinksTableOrderingComposer
class $$ProfileRuleLinksTableAnnotationComposer (line 2707) | class $$ProfileRuleLinksTableAnnotationComposer
class $$ProfileRuleLinksTableTableManager (line 2772) | class $$ProfileRuleLinksTableTableManager
type $$ProfileRuleLinksTableProcessedTableManager (line 2902) | typedef $$ProfileRuleLinksTableProcessedTableManager =
class $DatabaseManager (line 2917) | class $DatabaseManager {
FILE: lib/database/links.dart
class ProfileRuleLinks (line 3) | @DataClassName('RawProfileRuleLink')
function toLink (line 32) | ProfileRuleLink toLink()
function toCompanion (line 43) | ProfileRuleLinksCompanion toCompanion()
FILE: lib/database/profiles.dart
class Profiles (line 3) | @DataClassName('RawProfile')
class SubscriptionInfoConverter (line 39) | class SubscriptionInfoConverter
method fromSql (line 44) | SubscriptionInfo? fromSql(String? fromDb)
method toSql (line 50) | String? toSql(SubscriptionInfo? value)
class ProfilesDao (line 56) | @DriftAccessor(tables: [Profiles])
method all (line 60) | Selectable<Profile> all()
method setAll (line 69) | Future<void> setAll(Iterable<Profile> profiles)
method putAll (line 75) | Future<void> putAll<T extends Table, D extends DataClass>(
method putAllWithBatch (line 83) | void putAllWithBatch<T extends Table, D extends DataClass>(
method setAllWithBatch (line 90) | void setAllWithBatch(Batch batch, Iterable<Profile> profiles)
class StringMapConverter (line 102) | class StringMapConverter extends TypeConverter<Map<String, String>, Stri...
method fromSql (line 106) | Map<String, String> fromSql(String fromDb)
method toSql (line 111) | String toSql(Map<String, String> value)
class StringSetConverter (line 116) | class StringSetConverter extends TypeConverter<Set<String>, String> {
method fromSql (line 120) | Set<String> fromSql(String fromDb)
method toSql (line 125) | String toSql(Set<String> value)
function toProfile (line 131) | Profile toProfile()
function toCompanion (line 151) | ProfilesCompanion toCompanion([int? order])
FILE: lib/database/rules.dart
class Rules (line 3) | @DataClassName('RawRule')
class RulesDao (line 16) | @DriftAccessor(tables: [Rules, ProfileRuleLinks])
method allGlobalAddedRules (line 20) | Selectable<Rule> allGlobalAddedRules()
method allProfileAddedRules (line 24) | Selectable<Rule> allProfileAddedRules(int profileId)
method allProfileDisabledRules (line 28) | Selectable<Rule> allProfileDisabledRules(int profileId)
method allAddedRules (line 32) | Selectable<Rule> allAddedRules(int profileId)
method restoreWithBatch (line 68) | void restoreWithBatch(
method delRules (line 87) | Future<void> delRules(Iterable<int> ruleIds)
method putGlobalRule (line 91) | Future<void> putGlobalRule(Rule rule)
method putProfileAddedRule (line 95) | Future<void> putProfileAddedRule(int profileId, Rule rule)
method putProfileDisabledRule (line 99) | Future<void> putProfileDisabledRule(int profileId, Rule rule)
method putGlobalRules (line 103) | Future<void> putGlobalRules(Iterable<Rule> rules)
method setGlobalRules (line 107) | Future<void> setGlobalRules(Iterable<Rule> rules)
method putDisabledLink (line 111) | Future<int> putDisabledLink(int profileId, int ruleId)
method delDisabledLink (line 121) | Future<bool> delDisabledLink(int profileId, int ruleId)
method orderGlobalRule (line 131) | Future<int> orderGlobalRule({
method orderProfileAddedRule (line 138) | Future<int> orderProfileAddedRule(
method _get (line 151) | Selectable<Rule> _get({int? profileId, RuleScene? scene})
method _order (line 173) | Future<int> _order({
method _put (line 190) | Future<int> _put(Rule rule, {int? profileId, RuleScene? scene})
method _delAll (line 206) | Future<void> _delAll(Iterable<int> ruleIds)
method _putAll (line 210) | Future<void> _putAll(
method _set (line 233) | Future<void> _set(
function toRule (line 274) | Rule toRule([String? order])
function toCompanion (line 280) | RulesCompanion toCompanion()
FILE: lib/database/scripts.dart
class Scripts (line 3) | @DataClassName('RawScript')
class ScriptsDao (line 18) | @DriftAccessor(tables: [Scripts])
method all (line 22) | Selectable<Script> all()
method get (line 26) | Selectable<Script> get(int scriptId)
method setAll (line 32) | Future<void> setAll(Iterable<Script> scripts)
method setAllWithBatch (line 38) | Future<void> setAllWithBatch(Batch batch, Iterable<Script> scripts)
function toScript (line 50) | Script toScript()
function toCompanion (line 56) | ScriptsCompanion toCompanion()
FILE: lib/enum/enum.dart
type SupportPlatform (line 14) | enum SupportPlatform {
type GroupType (line 40) | enum GroupType {
type GroupName (line 59) | enum GroupName { GLOBAL, Proxy, Auto, Fallback }
function getGroupType (line 69) | GroupType? getGroupType(String value)
type UsedProxy (line 78) | enum UsedProxy { GLOBAL, DIRECT, REJECT }
type Mode (line 87) | enum Mode { rule, global, direct }
type ViewMode (line 89) | enum ViewMode { mobile, laptop, desktop }
type LogLevel (line 91) | enum LogLevel { debug, info, warning, error, silent }
type TransportProtocol (line 105) | enum TransportProtocol { udp, tcp }
type TrafficUnit (line 107) | enum TrafficUnit { B, KB, MB, GB, TB }
type NavigationItemMode (line 109) | enum NavigationItemMode { mobile, desktop, more }
type Network (line 111) | enum Network { tcp, udp }
type ProxiesSortType (line 113) | enum ProxiesSortType { none, delay, name }
type TunStack (line 115) | enum TunStack { gvisor, system, mixed }
type AccessControlMode (line 117) | enum AccessControlMode { acceptSelected, rejectSelected }
type AccessSortType (line 119) | enum AccessSortType { none, name, time }
type ProfileType (line 121) | enum ProfileType { file, url }
type ResultType (line 123) | enum ResultType {
type CoreEventType (line 130) | enum CoreEventType { log, delay, request, loaded, crash }
type InvokeMessageType (line 132) | enum InvokeMessageType { protect, process }
type FindProcessMode (line 134) | enum FindProcessMode { always, off }
type RestoreOption (line 136) | enum RestoreOption { all, onlyProfiles }
type ChipType (line 138) | enum ChipType { action, delete }
type CommonCardType (line 140) | enum CommonCardType { plain, filled }
type ProxiesType (line 146) | enum ProxiesType { tab, list }
type ProxiesLayout (line 148) | enum ProxiesLayout { loose, standard, tight }
type ProxyCardType (line 150) | enum ProxyCardType { expand, shrink, min }
type DnsMode (line 152) | enum DnsMode {
type ExternalControllerStatus (line 161) | enum ExternalControllerStatus {
type KeyboardModifier (line 172) | enum KeyboardModifier {
function toHotKeyModifier (line 186) | HotKeyModifier toHotKeyModifier()
type HotAction (line 198) | enum HotAction { start, view, mode, proxy, tun }
type ProxiesIconStyle (line 200) | enum ProxiesIconStyle { none, standard, icon }
type FontFamily (line 202) | enum FontFamily {
type RouteMode (line 212) | enum RouteMode { bypassPrivate, config }
type ActionMethod (line 214) | enum ActionMethod {
type AuthorizeCode (line 258) | enum AuthorizeCode { none, success, error }
type WindowsHelperServiceStatus (line 260) | enum WindowsHelperServiceStatus { none, presence, running }
type FunctionTag (line 262) | enum FunctionTag {
type DashboardWidget (line 287) | enum DashboardWidget {
type GeodataLoader (line 322) | enum GeodataLoader { standard, memconservative }
type PageLabel (line 324) | enum PageLabel {
type RuleAction (line 335) | enum RuleAction {
type OverrideRuleType (line 399) | enum OverrideRuleType { override, added }
type OverwriteType (line 401) | enum OverwriteType {
type RuleTarget (line 408) | enum RuleTarget { DIRECT, REJECT, MATCH }
type RestoreStrategy (line 410) | enum RestoreStrategy { compatible, override }
type CacheTag (line 412) | enum CacheTag { logs, rules, requests, proxiesList }
type Language (line 414) | enum Language { yaml, javaScript, json }
type ImportOption (line 416) | enum ImportOption { file, url }
type ScrollPositionCacheKey (line 418) | enum ScrollPositionCacheKey { tools, profiles, proxiesList, proxiesTabLi...
type QueryTag (line 420) | enum QueryTag { proxies, access }
type LoadingTag (line 422) | enum LoadingTag { profiles, backup_restore, access, proxies }
type CoreStatus (line 424) | enum CoreStatus { connecting, connected, disconnected }
type RuleScene (line 426) | enum RuleScene { added, disabled, custom }
FILE: lib/features/overwrite/rule.dart
class RuleItem (line 13) | class RuleItem extends StatelessWidget {
method build (line 30) | Widget build(BuildContext context)
class RuleStatusItem (line 47) | class RuleStatusItem extends StatelessWidget {
method build (line 60) | Widget build(BuildContext context)
class AddOrEditRuleDialog (line 89) | class AddOrEditRuleDialog extends StatefulWidget {
method createState (line 95) | State<AddOrEditRuleDialog> createState()
class _AddOrEditRuleDialogState (line 98) | class _AddOrEditRuleDialogState extends State<AddOrEditRuleDialog> {
method initState (line 108) | void initState()
method _initState (line 113) | void _initState()
method didUpdateWidget (line 135) | void didUpdateWidget(AddOrEditRuleDialog oldWidget)
method _handleSubmit (line 142) | void _handleSubmit()
method build (line 161) | Widget build(BuildContext context)
FILE: lib/l10n/intl/messages_all.dart
type Future (line 24) | typedef Future<dynamic> LibraryLoader();
function _findExact (line 32) | MessageLookupByLibrary? _findExact(String localeName)
function initializeMessages (line 48) | Future<bool> initializeMessages(String localeName)
function _messagesExistFor (line 64) | bool _messagesExistFor(String locale)
function _findGeneratedMessagesFor (line 72) | MessageLookupByLibrary? _findGeneratedMessagesFor(String locale)
FILE: lib/l10n/intl/messages_en.dart
type String (line 18) | typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup (line 20) | class MessageLookup extends MessageLookupByLibrary {
method m0 (line 23) | String m0(count)
method m1 (line 26) | String m1(label)
method m2 (line 29) | String m2(label)
method m3 (line 32) | String m3(label)
method m4 (line 34) | String m4(label)
method m5 (line 36) | String m5(label)
method m6 (line 38) | String m6(count)
method m7 (line 41) | String m7(count)
method m8 (line 44) | String m8(count)
method m9 (line 47) | String m9(label)
method m10 (line 49) | String m10(label)
method m11 (line 51) | String m11(label)
method m12 (line 53) | String m12(count)
method m13 (line 55) | String m13(label)
method m14 (line 57) | String m14(count)
method _notInlinedMessages (line 61) | Map<String, Function> _notInlinedMessages(_)
FILE: lib/l10n/intl/messages_ja.dart
type String (line 18) | typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup (line 20) | class MessageLookup extends MessageLookupByLibrary {
method m0 (line 23) | String m0(count)
method m1 (line 25) | String m1(label)
method m2 (line 27) | String m2(label)
method m3 (line 29) | String m3(label)
method m4 (line 31) | String m4(label)
method m5 (line 33) | String m5(label)
method m6 (line 35) | String m6(count)
method m7 (line 37) | String m7(count)
method m8 (line 39) | String m8(count)
method m9 (line 41) | String m9(label)
method m10 (line 43) | String m10(label)
method m11 (line 45) | String m11(label)
method m12 (line 47) | String m12(count)
method m13 (line 49) | String m13(label)
method m14 (line 51) | String m14(count)
method _notInlinedMessages (line 54) | Map<String, Function> _notInlinedMessages(_)
FILE: lib/l10n/intl/messages_ru.dart
type String (line 18) | typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup (line 20) | class MessageLookup extends MessageLookupByLibrary {
method m0 (line 23) | String m0(count)
method m1 (line 26) | String m1(label)
method m2 (line 29) | String m2(label)
method m3 (line 31) | String m3(label)
method m4 (line 33) | String m4(label)
method m5 (line 35) | String m5(label)
method m6 (line 37) | String m6(count)
method m7 (line 40) | String m7(count)
method m8 (line 43) | String m8(count)
method m9 (line 46) | String m9(label)
method m10 (line 48) | String m10(label)
method m11 (line 50) | String m11(label)
method m12 (line 52) | String m12(count)
method m13 (line 54) | String m13(label)
method m14 (line 56) | String m14(count)
method _notInlinedMessages (line 60) | Map<String, Function> _notInlinedMessages(_)
FILE: lib/l10n/intl/messages_zh_CN.dart
type String (line 18) | typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup (line 20) | class MessageLookup extends MessageLookupByLibrary {
method m0 (line 23) | String m0(count)
method m1 (line 25) | String m1(label)
method m2 (line 27) | String m2(label)
method m3 (line 29) | String m3(label)
method m4 (line 31) | String m4(label)
method m5 (line 33) | String m5(label)
method m6 (line 35) | String m6(count)
method m7 (line 37) | String m7(count)
method m8 (line 39) | String m8(count)
method m9 (line 41) | String m9(label)
method m10 (line 43) | String m10(label)
method m11 (line 45) | String m11(label)
method m12 (line 47) | String m12(count)
method m13 (line 49) | String m13(label)
method m14 (line 51) | String m14(count)
method _notInlinedMessages (line 54) | Map<String, Function> _notInlinedMessages(_)
FILE: lib/l10n/l10n.dart
class AppLocalizations (line 15) | class AppLocalizations {
method load (line 30) | Future<AppLocalizations> load(Locale locale)
method of (line 44) | AppLocalizations of(BuildContext context)
method maybeOf (line 53) | AppLocalizations? maybeOf(BuildContext context)
method selectedCountTitle (line 2568) | String selectedCountTitle(Object count)
method emptyTip (line 2898) | String emptyTip(Object label)
method urlTip (line 2908) | String urlTip(Object label)
method numberTip (line 2918) | String numberTip(Object label)
method existsTip (line 2933) | String existsTip(Object label)
method deleteTip (line 2943) | String deleteTip(Object label)
method deleteMultipTip (line 2953) | String deleteMultipTip(Object label)
method nullTip (line 2963) | String nullTip(Object label)
method portTip (line 3033) | String portTip(Object label)
method details (line 3088) | String details(Object label)
method yearsAgo (line 3448) | String yearsAgo(num count)
method monthsAgo (line 3460) | String monthsAgo(num count)
method daysAgo (line 3472) | String daysAgo(num count)
method hoursAgo (line 3484) | String hoursAgo(num count)
method minutesAgo (line 3496) | String minutesAgo(num count)
class AppLocalizationDelegate (line 3753) | class AppLocalizationDelegate extends LocalizationsDelegate<AppLocalizat...
method isSupported (line 3766) | bool isSupported(Locale locale)
method load (line 3768) | Future<AppLocalizations> load(Locale locale)
method shouldReload (line 3770) | bool shouldReload(AppLocalizationDelegate old)
method _isSupported (line 3772) | bool _isSupported(Locale locale)
FILE: lib/main.dart
function main (line 12) | Future<void> main()
FILE: lib/manager/android_manager.dart
class AndroidManager (line 11) | class AndroidManager extends ConsumerStatefulWidget {
method createState (line 17) | ConsumerState<AndroidManager> createState()
class _AndroidContainerState (line 20) | class _AndroidContainerState extends ConsumerState<AndroidManager>
method initState (line 23) | void initState()
method dispose (line 45) | Future<void> dispose()
method onServiceEvent (line 51) | void onServiceEvent(CoreEvent event)
method onServiceCrash (line 57) | void onServiceCrash(String message)
method build (line 65) | Widget build(BuildContext context)
FILE: lib/manager/app_manager.dart
class AppStateManager (line 14) | class AppStateManager extends ConsumerStatefulWidget {
method createState (line 20) | ConsumerState<AppStateManager> createState()
class _AppStateManagerState (line 23) | class _AppStateManagerState extends ConsumerState<AppStateManager>
method initState (line 26) | void initState()
method dispose (line 60) | void dispose()
method didChangeAppLifecycleState (line 66) | Future<void> didChangeAppLifecycleState(AppLifecycleState state)
method didChangePlatformBrightness (line 80) | void didChangePlatformBrightness()
method build (line 85) | Widget build(BuildContext context)
class AppEnvManager (line 95) | class AppEnvManager extends StatelessWidget {
method build (line 101) | Widget build(BuildContext context)
class AppSidebarContainer (line 122) | class AppSidebarContainer extends ConsumerWidget {
method _buildBackground (line 142) | Widget _buildBackground({
method _updateSideBarWidth (line 159) | void _updateSideBarWidth(WidgetRef ref, double contentWidth)
method build (line 168) | Widget build(BuildContext context, WidgetRef ref)
FILE: lib/manager/connectivity_manager.dart
class ConnectivityManager (line 6) | class ConnectivityManager extends StatefulWidget {
method createState (line 17) | State<ConnectivityManager> createState()
class _ConnectivityManagerState (line 20) | class _ConnectivityManagerState extends State<ConnectivityManager> {
method initState (line 24) | void initState()
method dispose (line 34) | void dispose()
method build (line 40) | Widget build(BuildContext context)
FILE: lib/manager/core_manager.dart
class CoreManager (line 13) | class CoreManager extends ConsumerStatefulWidget {
method createState (line 19) | ConsumerState<CoreManager> createState()
class _CoreContainerState (line 22) | class _CoreContainerState extends ConsumerState<CoreManager>
method build (line 25) | Widget build(BuildContext context)
method initState (line 30) | void initState()
method dispose (line 59) | Future<void> dispose()
method onDelay (line 65) | Future<void> onDelay(Delay delay)
method onLog (line 74) | void onLog(Log log)
method onRequest (line 83) | void onRequest(TrackerInfo trackerInfo)
method onLoaded (line 89) | Future<void> onLoaded(String providerName)
method onCrash (line 100) | Future<void> onCrash(String message)
FILE: lib/manager/hotkey_manager.dart
class HotKeyManager (line 11) | class HotKeyManager extends ConsumerStatefulWidget {
method createState (line 17) | ConsumerState<HotKeyManager> createState()
class _HotKeyManagerState (line 20) | class _HotKeyManagerState extends ConsumerState<HotKeyManager> {
method initState (line 22) | void initState()
method _handleHotKeyAction (line 31) | Future<void> _handleHotKeyAction(HotAction action)
method _updateHotKeys (line 46) | Future<void> _updateHotKeys({
method _buildShortcuts (line 72) | Shortcuts _buildShortcuts(Widget child)
method build (line 93) | Widget build(BuildContext context)
FILE: lib/manager/proxy_manager.dart
class ProxyManager (line 7) | class ProxyManager extends ConsumerStatefulWidget {
method createState (line 13) | ConsumerState createState()
class _ProxyManagerState (line 16) | class _ProxyManagerState extends ConsumerState<ProxyManager> {
method _updateProxy (line 17) | Future<void> _updateProxy(ProxyState proxyState)
method initState (line 29) | void initState()
method build (line 43) | Widget build(BuildContext context)
FILE: lib/manager/status_manager.dart
class StatusManager (line 13) | class StatusManager extends StatefulWidget {
method createState (line 19) | State<StatusManager> createState()
class StatusManagerState (line 22) | class StatusManagerState extends State<StatusManager> {
method initState (line 29) | void initState()
method dispose (line 34) | void dispose()
method message (line 44) | void message(String text, {MessageActionState? actionState})
method _cancelMessage (line 55) | void _cancelMessage(String id)
method _processQueue (line 62) | void _processQueue()
method _removeMessage (line 75) | void _removeMessage(String id)
method build (line 85) | Widget build(BuildContext context)
FILE: lib/manager/theme_manager.dart
class ThemeManager (line 15) | class ThemeManager extends ConsumerWidget {
method _buildSystemUi (line 20) | Widget _buildSystemUi(Widget child)
method build (line 79) | Widget build(BuildContext context, ref)
FILE: lib/manager/tile_manager.dart
class TileManager (line 10) | class TileManager extends ConsumerStatefulWidget {
method createState (line 16) | ConsumerState<TileManager> createState()
class _TileContainerState (line 19) | class _TileContainerState extends ConsumerState<TileManager> with TileLi...
method build (line 21) | Widget build(BuildContext context)
method onStart (line 28) | Future<void> onStart()
method onStop (line 38) | Future<void> onStop()
method initState (line 48) | void initState()
method dispose (line 54) | void dispose()
FILE: lib/manager/tray_manager.dart
class TrayManager (line 8) | class TrayManager extends ConsumerStatefulWidget {
method createState (line 14) | ConsumerState<TrayManager> createState()
class _TrayContainerState (line 17) | class _TrayContainerState extends ConsumerState<TrayManager> with TrayLi...
method initState (line 19) | void initState()
method build (line 40) | Widget build(BuildContext context)
method onTrayIconRightMouseDown (line 45) | void onTrayIconRightMouseDown()
method onTrayMenuItemClick (line 51) | void onTrayMenuItemClick(MenuItem menuItem)
FILE: lib/manager/vpn_manager.dart
class VpnManager (line 10) | class VpnManager extends ConsumerStatefulWidget {
method createState (line 16) | ConsumerState<VpnManager> createState()
class _VpnContainerState (line 19) | class _VpnContainerState extends ConsumerState<VpnManager> {
method initState (line 21) | void initState()
method showTip (line 30) | void showTip(VpnState state)
method build (line 54) | Widget build(BuildContext context)
FILE: lib/manager/window_manager.dart
class WindowManager (line 12) | class WindowManager extends ConsumerStatefulWidget {
method createState (line 18) | ConsumerState<WindowManager> createState()
class _WindowContainerState (line 21) | class _WindowContainerState extends ConsumerState<WindowManager>
method build (line 24) | Widget build(BuildContext context)
method initState (line 29) | void initState()
method onWindowClose (line 46) | void onWindowClose()
method onWindowFocus (line 52) | void onWindowFocus()
method onShouldTerminate (line 59) | Future<void> onShouldTerminate()
method onWindowMoved (line 65) | void onWindowMoved()
method onWindowResized (line 74) | Future<void> onWindowResized()
method onWindowMinimize (line 85) | void onWindowMinimize()
method onWindowRestore (line 93) | void onWindowRestore()
method dispose (line 100) | Future<void> dispose()
class WindowHeaderContainer (line 107) | class WindowHeaderContainer extends StatelessWidget {
method build (line 113) | Widget build(BuildContext context)
class WindowHeader (line 138) | class WindowHeader extends StatefulWidget {
method createState (line 142) | State<WindowHeader> createState()
class _WindowHeaderState (line 145) | class _WindowHeaderState extends State<WindowHeader> {
method initState (line 150) | void initState()
method _initNotifier (line 155) | Future<void> _initNotifier()
method dispose (line 161) | void dispose()
method _updateMaximized (line 167) | Future<void> _updateMaximized()
method _updatePin (line 180) | Future<void> _updatePin()
method _buildActions (line 186) | Widget _buildActions()
method build (line 235) | Widget build(BuildContext context)
class AppIcon (line 266) | class AppIcon extends StatelessWidget {
method build (line 270) | Widget build(BuildContext context)
FILE: lib/models/app.dart
type DelayMap (line 11) | typedef DelayMap = Map<String, Map<String, int?>>;
class AppState (line 13) | @freezed
FILE: lib/models/clash_config.dart
class ProxyGroup (line 102) | @freezed
class RuleProvider (line 126) | @freezed
class Sniffer (line 134) | @freezed
function _formJsonPorts (line 154) | List<String> _formJsonPorts(List? ports)
class SnifferConfig (line 158) | @freezed
class Tun (line 169) | @freezed
function getRealTun (line 195) | Tun getRealTun(RouteMode routeMode)
class FallbackFilter (line 209) | @freezed
class Dns (line 224) | @freezed
class GeoXUrl (line 275) | @freezed
class ParsedRule (line 311) | @freezed
class Rule (line 376) | @freezed
function copyAndPut (line 389) | List<Rule> copyAndPut(Rule rule)
class SubRule (line 401) | @freezed
function _genRule (line 409) | List<Rule> _genRule(List<dynamic>? rules)
function _genRuleProviders (line 416) | List<RuleProvider> _genRuleProviders(Map<String, dynamic> json)
function _genSubRules (line 420) | List<SubRule> _genSubRules(Map<String, dynamic> json)
class ClashConfigSnippet (line 424) | @freezed
class ClashConfig (line 441) | @freezed
FILE: lib/models/common.dart
class NavigationItem (line 12) | @freezed
class Package (line 26) | @freezed
function getViewList (line 41) | List<Package> getViewList({
class Metadata (line 67) | @freezed
class TrackerInfo (line 93) | @freezed
function _logDateTime (line 134) | String _logDateTime(dynamic _)
class Log (line 142) | @freezed
class LogsState (line 162) | @freezed
class TrackerInfosState (line 184) | @freezed
class DAVProps (line 219) | @freezed
class FileInfo (line 232) | @freezed
class VersionInfo (line 243) | @freezed
class Traffic (line 254) | @freezed
class TrafficShow (line 278) | @freezed
class Proxy (line 288) | @freezed
class Group (line 299) | @freezed
function getGroup (line 315) | Group? getGroup(String groupName)
function getCurrentSelectedName (line 324) | String getCurrentSelectedName(String proxyName)
class ColorSchemes (line 332) | @freezed
function getColorSchemeForBrightness (line 341) | ColorScheme getColorSchemeForBrightness(
class IpInfo (line 370) | @freezed
method fromIpInfoIoJson (line 375) | IpInfo fromIpInfoIoJson(Map<String, dynamic> json)
method fromIpApiCoJson (line 385) | IpInfo fromIpApiCoJson(Map<String, dynamic> json)
method fromIpSbJson (line 393) | IpInfo fromIpSbJson(Map<String, dynamic> json)
method fromIpWhoIsJson (line 401) | IpInfo fromIpWhoIsJson(Map<String, dynamic> json)
method fromMyIpJson (line 409) | IpInfo fromMyIpJson(Map<String, dynamic> json)
method fromIpAPIJson (line 419) | IpInfo fromIpAPIJson(Map<String, dynamic> json)
method fromIdentMeJson (line 427) | IpInfo fromIdentMeJson(Map<String, dynamic> json)
class HotKeyAction (line 438) | @freezed
type Validator (line 450) | typedef Validator = String? Function(String? value);
class Field (line 452) | @freezed
class PopupMenuItemData (line 461) | class PopupMenuItemData {
class CloseWindowIntent (line 477) | class CloseWindowIntent extends Intent {
class Result (line 481) | @freezed
class Script (line 502) | @freezed
function get (line 522) | Script? get(int? id)
function save (line 547) | Future<Script> save(String content)
function saveWithPath (line 556) | Future<Script> saveWithPath(String copyPath)
class DelayState (line 566) | @freezed
function compareTo (line 579) | int compareTo(DelayState other)
class UpdatingMessage (line 592) | @freezed
FILE: lib/models/config.dart
function dashboardWidgetsSafeFormJson (line 49) | List<DashboardWidget> dashboardWidgetsSafeFormJson(
class AppSettingProps (line 62) | @freezed
class AccessControlProps (line 99) | @freezed
function copyWithNewList (line 121) | AccessControlProps copyWithNewList(List<String> value)
class WindowProps (line 127) | @freezed
class VpnProps (line 146) | @freezed
class NetworkProps (line 161) | @freezed
class ProxiesStyleProps (line 175) | @freezed
class TextScale (line 190) | @freezed
class ThemeProps (line 201) | @freezed
class Config (line 227) | @freezed
FILE: lib/models/core.dart
class SetupParams (line 8) | @freezed
class UpdateParams (line 19) | @freezed
class VpnOptions (line 40) | @freezed
class InitParams (line 59) | @freezed
class ChangeProxyParams (line 70) | @freezed
class UpdateGeoDataParams (line 81) | @freezed
class CoreEvent (line 92) | @freezed
class InvokeMessage (line 101) | @freezed
class Delay (line 110) | @freezed
class Now (line 118) | @freezed
class ProviderSubscriptionInfo (line 125) | @freezed
function subscriptionInfoFormCore (line 138) | SubscriptionInfo? subscriptionInfoFormCore(Map<String, Object?>? json)
class ExternalProvider (line 148) | @freezed
class Action (line 169) | @freezed
class ProxiesData (line 180) | @freezed
class ActionResult (line 191) | @freezed
FILE: lib/models/generated/app.freezed.dart
function _$identity (line 13) | T _$identity<T>(T value)
function toString (line 36) | String toString()
class $AppStateCopyWith (line 44) | abstract mixin class $AppStateCopyWith<$Res> {
method call (line 47) | $Res call({
class _$AppStateCopyWithImpl (line 56) | class _$AppStateCopyWithImpl<$Res>
method call (line 65) | $Res call({Object? isInit = null,Object? backBlock = null,Object? page...
function maybeMap (line 120) | TResult maybeMap<TResult extends Object?>(TResult Function( _AppState va...
function map (line 142) | TResult map<TResult extends Object?>(TResult Function( _AppState value) ...
function mapOrNull (line 163) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _AppState...
function maybeWhen (line 184) | TResult maybeWhen<TResult extends Object?>(TResult Function( bool isInit...
function when (line 205) | TResult when<TResult extends Object?>(TResult Function( bool isInit, bo...
function whenOrNull (line 225) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool isI...
class _AppState (line 239) | class _AppState implements AppState {
method toString (line 309) | String toString()
class _$AppStateCopyWith (line 317) | abstract mixin class _$AppStateCopyWith<$Res> implements $AppStateCopyWi...
method call (line 320) | $Res call({
class __$AppStateCopyWithImpl (line 329) | class __$AppStateCopyWithImpl<$Res>
method call (line 338) | $Res call({Object? isInit = null,Object? backBlock = null,Object? page...
FILE: lib/models/generated/clash_config.freezed.dart
function _$identity (line 13) | T _$identity<T>(T value)
function toJson (line 26) | Map<String, dynamic> toJson()
function toString (line 39) | String toString()
class $ProxyGroupCopyWith (line 47) | abstract mixin class $ProxyGroupCopyWith<$Res> {
method call (line 50) | $Res call({
class _$ProxyGroupCopyWithImpl (line 59) | class _$ProxyGroupCopyWithImpl<$Res>
method call (line 68) | $Res call({Object? name = null,Object? type = null,Object? proxies = f...
function maybeMap (line 106) | TResult maybeMap<TResult extends Object?>(TResult Function( _ProxyGroup ...
function map (line 128) | TResult map<TResult extends Object?>(TResult Function( _ProxyGroup value...
function mapOrNull (line 149) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _ProxyGro...
function maybeWhen (line 170) | TResult maybeWhen<TResult extends Object?>(TResult Function( String name...
function when (line 191) | TResult when<TResult extends Object?>(TResult Function( String name, @Js...
function whenOrNull (line 211) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String n...
class _ProxyGroup (line 223) | @JsonSerializable()
method toJson (line 268) | Map<String, dynamic> toJson()
method toString (line 282) | String toString()
class _$ProxyGroupCopyWith (line 290) | abstract mixin class _$ProxyGroupCopyWith<$Res> implements $ProxyGroupCo...
method call (line 293) | $Res call({
class __$ProxyGroupCopyWithImpl (line 302) | class __$ProxyGroupCopyWithImpl<$Res>
method call (line 311) | $Res call({Object? name = null,Object? type = null,Object? proxies = f...
function toJson (line 347) | Map<String, dynamic> toJson()
function toString (line 360) | String toString()
class $RuleProviderCopyWith (line 368) | abstract mixin class $RuleProviderCopyWith<$Res> {
method call (line 371) | $Res call({
class _$RuleProviderCopyWithImpl (line 380) | class _$RuleProviderCopyWithImpl<$Res>
method call (line 389) | $Res call({Object? name = null,})
function maybeMap (line 413) | TResult maybeMap<TResult extends Object?>(TResult Function( _RuleProvide...
function map (line 435) | TResult map<TResult extends Object?>(TResult Function( _RuleProvider val...
function mapOrNull (line 456) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _RuleProv...
function maybeWhen (line 477) | TResult maybeWhen<TResult extends Object?>(TResult Function( String name...
function when (line 498) | TResult when<TResult extends Object?>(TResult Function( String name) $d...
function whenOrNull (line 518) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String n...
class _RuleProvider (line 530) | @JsonSerializable()
method toJson (line 545) | Map<String, dynamic> toJson()
method toString (line 559) | String toString()
class _$RuleProviderCopyWith (line 567) | abstract mixin class _$RuleProviderCopyWith<$Res> implements $RuleProvid...
method call (line 570) | $Res call({
class __$RuleProviderCopyWithImpl (line 579) | class __$RuleProviderCopyWithImpl<$Res>
method call (line 588) | $Res call({Object? name = null,})
function toJson (line 610) | Map<String, dynamic> toJson()
function toString (line 623) | String toString()
class $SnifferCopyWith (line 631) | abstract mixin class $SnifferCopyWith<$Res> {
method call (line 634) | $Res call({
class _$SnifferCopyWithImpl (line 643) | class _$SnifferCopyWithImpl<$Res>
method call (line 652) | $Res call({Object? enable = null,Object? overrideDest = null,Object? s...
function maybeMap (line 686) | TResult maybeMap<TResult extends Object?>(TResult Function( _Sniffer val...
function map (line 708) | TResult map<TResult extends Object?>(TResult Function( _Sniffer value) ...
function mapOrNull (line 729) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Sniffer ...
function maybeWhen (line 750) | TResult maybeWhen<TResult extends Object?>(TResult Function( bool enable...
function when (line 771) | TResult when<TResult extends Object?>(TResult Function( bool enable, @Js...
function whenOrNull (line 791) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool ena...
class _Sniffer (line 803) | @JsonSerializable()
method toJson (line 870) | Map<String, dynamic> toJson()
method toString (line 884) | String toString()
class _$SnifferCopyWith (line 892) | abstract mixin class _$SnifferCopyWith<$Res> implements $SnifferCopyWith...
method call (line 895) | $Res call({
class __$SnifferCopyWithImpl (line 904) | class __$SnifferCopyWithImpl<$Res>
method call (line 913) | $Res call({Object? enable = null,Object? overrideDest = null,Object? s...
function toJson (line 945) | Map<String, dynamic> toJson()
function toString (line 958) | String toString()
class $SnifferConfigCopyWith (line 966) | abstract mixin class $SnifferConfigCopyWith<$Res> {
method call (line 969) | $Res call({
class _$SnifferConfigCopyWithImpl (line 978) | class _$SnifferConfigCopyWithImpl<$Res>
method call (line 987) | $Res call({Object? ports = null,Object? overrideDest = freezed,})
function maybeMap (line 1012) | TResult maybeMap<TResult extends Object?>(TResult Function( _SnifferConf...
function map (line 1034) | TResult map<TResult extends Object?>(TResult Function( _SnifferConfig va...
function mapOrNull (line 1055) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SnifferC...
function maybeWhen (line 1076) | TResult maybeWhen<TResult extends Object?>(TResult Function(@JsonKey(fro...
function when (line 1097) | TResult when<TResult extends Object?>(TResult Function(@JsonKey(fromJson...
function whenOrNull (line 1117) | TResult? whenOrNull<TResult extends Object?>(TResult? Function(@JsonKey(...
class _SnifferConfig (line 1129) | @JsonSerializable()
method toJson (line 1151) | Map<String, dynamic> toJson()
method toString (line 1165) | String toString()
class _$SnifferConfigCopyWith (line 1173) | abstract mixin class _$SnifferConfigCopyWith<$Res> implements $SnifferCo...
method call (line 1176) | $Res call({
class __$SnifferConfigCopyWithImpl (line 1185) | class __$SnifferConfigCopyWithImpl<$Res>
method call (line 1194) | $Res call({Object? ports = null,Object? overrideDest = freezed,})
function toJson (line 1217) | Map<String, dynamic> toJson()
function toString (line 1230) | String toString()
class $TunCopyWith (line 1238) | abstract mixin class $TunCopyWith<$Res> {
method call (line 1241) | $Res call({
class _$TunCopyWithImpl (line 1250) | class _$TunCopyWithImpl<$Res>
method call (line 1259) | $Res call({Object? enable = null,Object? device = null,Object? autoRou...
function maybeMap (line 1288) | TResult maybeMap<TResult extends Object?>(TResult Function( _Tun value)?...
function map (line 1310) | TResult map<TResult extends Object?>(TResult Function( _Tun value) $def...
function mapOrNull (line 1331) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Tun valu...
function maybeWhen (line 1352) | TResult maybeWhen<TResult extends Object?>(TResult Function( bool enable...
function when (line 1373) | TResult when<TResult extends Object?>(TResult Function( bool enable, St...
function whenOrNull (line 1393) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool ena...
class _Tun (line 1405) | @JsonSerializable()
method toJson (line 1437) | Map<String, dynamic> toJson()
method toString (line 1451) | String toString()
class _$TunCopyWith (line 1459) | abstract mixin class _$TunCopyWith<$Res> implements $TunCopyWith<$Res> {
method call (line 1462) | $Res call({
class __$TunCopyWithImpl (line 1471) | class __$TunCopyWithImpl<$Res>
method call (line 1480) | $Res call({Object? enable = null,Object? device = null,Object? autoRou...
function toJson (line 1507) | Map<String, dynamic> toJson()
function toString (line 1520) | String toString()
class $FallbackFilterCopyWith (line 1528) | abstract mixin class $FallbackFilterCopyWith<$Res> {
method call (line 1531) | $Res call({
class _$FallbackFilterCopyWithImpl (line 1540) | class _$FallbackFilterCopyWithImpl<$Res>
method call (line 1549) | $Res call({Object? geoip = null,Object? geoipCode = null,Object? geosi...
function maybeMap (line 1577) | TResult maybeMap<TResult extends Object?>(TResult Function( _FallbackFil...
function map (line 1599) | TResult map<TResult extends Object?>(TResult Function( _FallbackFilter v...
function mapOrNull (line 1620) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Fallback...
function maybeWhen (line 1641) | TResult maybeWhen<TResult extends Object?>(TResult Function( bool geoip,...
function when (line 1662) | TResult when<TResult extends Object?>(TResult Function( bool geoip, @Jso...
function whenOrNull (line 1682) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool geo...
class _FallbackFilter (line 1694) | @JsonSerializable()
method toJson (line 1731) | Map<String, dynamic> toJson()
method toString (line 1745) | String toString()
class _$FallbackFilterCopyWith (line 1753) | abstract mixin class _$FallbackFilterCopyWith<$Res> implements $Fallback...
method call (line 1756) | $Res call({
class __$FallbackFilterCopyWithImpl (line 1765) | class __$FallbackFilterCopyWithImpl<$Res>
method call (line 1774) | $Res call({Object? geoip = null,Object? geoipCode = null,Object? geosi...
function toJson (line 1800) | Map<String, dynamic> toJson()
function toString (line 1813) | String toString()
class $DnsCopyWith (line 1821) | abstract mixin class $DnsCopyWith<$Res> {
method call (line 1824) | $Res call({
class _$DnsCopyWithImpl (line 1833) | class _$DnsCopyWithImpl<$Res>
method call (line 1842) | $Res call({Object? enable = null,Object? listen = null,Object? preferH...
function maybeMap (line 1890) | TResult maybeMap<TResult extends Object?>(TResult Function( _Dns value)?...
function map (line 1912) | TResult map<TResult extends Object?>(TResult Function( _Dns value) $def...
function mapOrNull (line 1933) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Dns valu...
function maybeWhen (line 1954) | TResult maybeWhen<TResult extends Object?>(TResult Function( bool enable...
function when (line 1975) | TResult when<TResult extends Object?>(TResult Function( bool enable, St...
function whenOrNull (line 1995) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool ena...
class _Dns (line 2007) | @JsonSerializable()
method toJson (line 2073) | Map<String, dynamic> toJson()
method toString (line 2087) | String toString()
class _$DnsCopyWith (line 2095) | abstract mixin class _$DnsCopyWith<$Res> implements $DnsCopyWith<$Res> {
method call (line 2098) | $Res call({
class __$DnsCopyWithImpl (line 2107) | class __$DnsCopyWithImpl<$Res>
method call (line 2116) | $Res call({Object? enable = null,Object? listen = null,Object? preferH...
function toJson (line 2162) | Map<String, dynamic> toJson()
function toString (line 2175) | String toString()
class $GeoXUrlCopyWith (line 2183) | abstract mixin class $GeoXUrlCopyWith<$Res> {
method call (line 2186) | $Res call({
class _$GeoXUrlCopyWithImpl (line 2195) | class _$GeoXUrlCopyWithImpl<$Res>
method call (line 2204) | $Res call({Object? mmdb = null,Object? asn = null,Object? geoip = null...
function maybeMap (line 2231) | TResult maybeMap<TResult extends Object?>(TResult Function( _GeoXUrl val...
function map (line 2253) | TResult map<TResult extends Object?>(TResult Function( _GeoXUrl value) ...
function mapOrNull (line 2274) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _GeoXUrl ...
function maybeWhen (line 2295) | TResult maybeWhen<TResult extends Object?>(TResult Function( String mmdb...
function when (line 2316) | TResult when<TResult extends Object?>(TResult Function( String mmdb, St...
function whenOrNull (line 2336) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String m...
class _GeoXUrl (line 2348) | @JsonSerializable()
method toJson (line 2366) | Map<String, dynamic> toJson()
method toString (line 2380) | String toString()
class _$GeoXUrlCopyWith (line 2388) | abstract mixin class _$GeoXUrlCopyWith<$Res> implements $GeoXUrlCopyWith...
method call (line 2391) | $Res call({
class __$GeoXUrlCopyWithImpl (line 2400) | class __$GeoXUrlCopyWithImpl<$Res>
method call (line 2409) | $Res call({Object? mmdb = null,Object? asn = null,Object? geoip = null...
function toString (line 2444) | String toString()
class $ParsedRuleCopyWith (line 2452) | abstract mixin class $ParsedRuleCopyWith<$Res> {
method call (line 2455) | $Res call({
class _$ParsedRuleCopyWithImpl (line 2464) | class _$ParsedRuleCopyWithImpl<$Res>
method call (line 2473) | $Res call({Object? ruleAction = null,Object? content = freezed,Object?...
function maybeMap (line 2503) | TResult maybeMap<TResult extends Object?>(TResult Function( _ParsedRule ...
function map (line 2525) | TResult map<TResult extends Object?>(TResult Function( _ParsedRule value...
function mapOrNull (line 2546) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _ParsedRu...
function maybeWhen (line 2567) | TResult maybeWhen<TResult extends Object?>(TResult Function( RuleAction ...
function when (line 2588) | TResult when<TResult extends Object?>(TResult Function( RuleAction ruleA...
function whenOrNull (line 2608) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( RuleActi...
class _ParsedRule (line 2622) | class _ParsedRule implements ParsedRule {
method toString (line 2652) | String toString()
class _$ParsedRuleCopyWith (line 2660) | abstract mixin class _$ParsedRuleCopyWith<$Res> implements $ParsedRuleCo...
method call (line 2663) | $Res call({
class __$ParsedRuleCopyWithImpl (line 2672) | class __$ParsedRuleCopyWithImpl<$Res>
method call (line 2681) | $Res call({Object? ruleAction = null,Object? content = freezed,Object?...
function toJson (line 2709) | Map<String, dynamic> toJson()
function toString (line 2722) | String toString()
class $RuleCopyWith (line 2730) | abstract mixin class $RuleCopyWith<$Res> {
method call (line 2733) | $Res call({
class _$RuleCopyWithImpl (line 2742) | class _$RuleCopyWithImpl<$Res>
method call (line 2751) | $Res call({Object? id = null,Object? value = null,Object? order = free...
function maybeMap (line 2777) | TResult maybeMap<TResult extends Object?>(TResult Function( _Rule value)...
function map (line 2799) | TResult map<TResult extends Object?>(TResult Function( _Rule value) $de...
function mapOrNull (line 2820) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Rule val...
function maybeWhen (line 2841) | TResult maybeWhen<TResult extends Object?>(TResult Function( int id, St...
function when (line 2862) | TResult when<TResult extends Object?>(TResult Function( int id, String ...
function whenOrNull (line 2882) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( int id, ...
class _Rule (line 2894) | @JsonSerializable()
method toJson (line 2911) | Map<String, dynamic> toJson()
method toString (line 2925) | String toString()
class _$RuleCopyWith (line 2933) | abstract mixin class _$RuleCopyWith<$Res> implements $RuleCopyWith<$Res> {
method call (line 2936) | $Res call({
class __$RuleCopyWithImpl (line 2945) | class __$RuleCopyWithImpl<$Res>
method call (line 2954) | $Res call({Object? id = null,Object? value = null,Object? order = free...
function toJson (line 2978) | Map<String, dynamic> toJson()
function toString (line 2991) | String toString()
class $SubRuleCopyWith (line 2999) | abstract mixin class $SubRuleCopyWith<$Res> {
method call (line 3002) | $Res call({
class _$SubRuleCopyWithImpl (line 3011) | class _$SubRuleCopyWithImpl<$Res>
method call (line 3020) | $Res call({Object? name = null,})
function maybeMap (line 3044) | TResult maybeMap<TResult extends Object?>(TResult Function( _SubRule val...
function map (line 3066) | TResult map<TResult extends Object?>(TResult Function( _SubRule value) ...
function mapOrNull (line 3087) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SubRule ...
function maybeWhen (line 3108) | TResult maybeWhen<TResult extends Object?>(TResult Function( String name...
function when (line 3129) | TResult when<TResult extends Object?>(TResult Function( String name) $d...
function whenOrNull (line 3149) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String n...
class _SubRule (line 3161) | @JsonSerializable()
method toJson (line 3176) | Map<String, dynamic> toJson()
method toString (line 3190) | String toString()
class _$SubRuleCopyWith (line 3198) | abstract mixin class _$SubRuleCopyWith<$Res> implements $SubRuleCopyWith...
method call (line 3201) | $Res call({
class __$SubRuleCopyWithImpl (line 3210) | class __$SubRuleCopyWithImpl<$Res>
method call (line 3219) | $Res call({Object? name = null,})
function toJson (line 3241) | Map<String, dynamic> toJson()
function toString (line 3254) | String toString()
class $ClashConfigSnippetCopyWith (line 3262) | abstract mixin class $ClashConfigSnippetCopyWith<$Res> {
method call (line 3265) | $Res call({
class _$ClashConfigSnippetCopyWithImpl (line 3274) | class _$ClashConfigSnippetCopyWithImpl<$Res>
method call (line 3283) | $Res call({Object? proxyGroups = null,Object? rule = null,Object? rule...
function maybeMap (line 3310) | TResult maybeMap<TResult extends Object?>(TResult Function( _ClashConfig...
function map (line 3332) | TResult map<TResult extends Object?>(TResult Function( _ClashConfigSnipp...
function mapOrNull (line 3353) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _ClashCon...
function maybeWhen (line 3374) | TResult maybeWhen<TResult extends Object?>(TResult Function(@JsonKey(nam...
function when (line 3395) | TResult when<TResult extends Object?>(TResult Function(@JsonKey(name: 'p...
function whenOrNull (line 3415) | TResult? whenOrNull<TResult extends Object?>(TResult? Function(@JsonKey(...
class _ClashConfigSnippet (line 3427) | @JsonSerializable()
method toJson (line 3469) | Map<String, dynamic> toJson()
method toString (line 3483) | String toString()
class _$ClashConfigSnippetCopyWith (line 3491) | abstract mixin class _$ClashConfigSnippetCopyWith<$Res> implements $Clas...
method call (line 3494) | $Res call({
class __$ClashConfigSnippetCopyWithImpl (line 3503) | class __$ClashConfigSnippetCopyWithImpl<$Res>
method call (line 3512) | $Res call({Object? proxyGroups = null,Object? rule = null,Object? rule...
function toJson (line 3537) | Map<String, dynamic> toJson()
function toString (line 3550) | String toString()
class $ClashConfigCopyWith (line 3558) | abstract mixin class $ClashConfigCopyWith<$Res> {
method call (line 3561) | $Res call({
class _$ClashConfigCopyWithImpl (line 3570) | class _$ClashConfigCopyWithImpl<$Res>
method call (line 3579) | $Res call({Object? mixedPort = null,Object? socksPort = null,Object? p...
function maybeMap (line 3651) | TResult maybeMap<TResult extends Object?>(TResult Function( _ClashConfig...
function map (line 3673) | TResult map<TResult extends Object?>(TResult Function( _ClashConfig valu...
function mapOrNull (line 3694) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _ClashCon...
function maybeWhen (line 3715) | TResult maybeWhen<TResult extends Object?>(TResult Function(@JsonKey(nam...
function when (line 3736) | TResult when<TResult extends Object?>(TResult Function(@JsonKey(name: 'm...
function whenOrNull (line 3756) | TResult? whenOrNull<TResult extends Object?>(TResult? Function(@JsonKey(...
class _ClashConfig (line 3768) | @JsonSerializable()
method toJson (line 3822) | Map<String, dynamic> toJson()
method toString (line 3836) | String toString()
class _$ClashConfigCopyWith (line 3844) | abstract mixin class _$ClashConfigCopyWith<$Res> implements $ClashConfig...
method call (line 3847) | $Res call({
class __$ClashConfigCopyWithImpl (line 3856) | class __$ClashConfigCopyWithImpl<$Res>
method call (line 3865) | $Res call({Object? mixedPort = null,Object? socksPort = null,Object? p...
FILE: lib/models/generated/clash_config.g.dart
function _$ProxyGroupFromJson (line 9) | _ProxyGroup _$ProxyGroupFromJson(Map<String, dynamic> json)
function _$ProxyGroupToJson (line 29) | Map<String, dynamic> _$ProxyGroupToJson(_ProxyGroup instance)
function _$RuleProviderFromJson (line 56) | _RuleProvider _$RuleProviderFromJson(Map<String, dynamic> json)
function _$RuleProviderToJson (line 59) | Map<String, dynamic> _$RuleProviderToJson(_RuleProvider instance)
function _$SnifferFromJson (line 62) | _Sniffer _$SnifferFromJson(Map<String, dynamic> json)
function _$SnifferToJson (line 103) | Map<String, dynamic> _$SnifferToJson(_Sniffer instance)
function _$SnifferConfigFromJson (line 117) | _SnifferConfig _$SnifferConfigFromJson(Map<String, dynamic> json)
function _$SnifferConfigToJson (line 125) | Map<String, dynamic> _$SnifferConfigToJson(_SnifferConfig instance)
function _$TunFromJson (line 131) | _Tun _$TunFromJson(Map<String, dynamic> json)
function _$TunToJson (line 149) | Map<String, dynamic> _$TunToJson(_Tun instance)
function _$FallbackFilterFromJson (line 164) | _FallbackFilter _$FallbackFilterFromJson(
function _$FallbackFilterToJson (line 180) | Map<String, dynamic> _$FallbackFilterToJson(_FallbackFilter instance)
function _$DnsFromJson (line 189) | _Dns _$DnsFromJson(Map<String, dynamic> json)
function _$DnsToJson (line 240) | Map<String, dynamic> _$DnsToJson(_Dns instance)
function _$GeoXUrlFromJson (line 266) | _GeoXUrl _$GeoXUrlFromJson(Map<String, dynamic> json)
function _$GeoXUrlToJson (line 281) | Map<String, dynamic> _$GeoXUrlToJson(_GeoXUrl instance)
function _$RuleFromJson (line 288) | _Rule _$RuleFromJson(Map<String, dynamic> json)
function _$RuleToJson (line 294) | Map<String, dynamic> _$RuleToJson(_Rule instance)
function _$SubRuleFromJson (line 300) | _SubRule _$SubRuleFromJson(Map<String, dynamic> json)
function _$SubRuleToJson (line 303) | Map<String, dynamic> _$SubRuleToJson(_SubRule instance)
function _$ClashConfigSnippetFromJson (line 307) | _ClashConfigSnippet _$ClashConfigSnippetFromJson(Map<String, dynamic> json)
function _$ClashConfigSnippetToJson (line 323) | Map<String, dynamic> _$ClashConfigSnippetToJson(_ClashConfigSnippet inst...
function _$ClashConfigFromJson (line 331) | _ClashConfig _$ClashConfigFromJson(Map<String, dynamic> json)
function _$ClashConfigToJson (line 389) | Map<String, dynamic> _$ClashConfigToJson(_ClashConfig instance)
FILE: lib/models/generated/common.freezed.dart
function _$identity (line 13) | T _$identity<T>(T value)
function toString (line 36) | String toString()
class $NavigationItemCopyWith (line 44) | abstract mixin class $NavigationItemCopyWith<$Res> {
method call (line 47) | $Res call({
class _$NavigationItemCopyWithImpl (line 56) | class _$NavigationItemCopyWithImpl<$Res>
method call (line 65) | $Res call({Object? icon = null,Object? label = null,Object? descriptio...
function maybeMap (line 95) | TResult maybeMap<TResult extends Object?>(TResult Function( _NavigationI...
function map (line 117) | TResult map<TResult extends Object?>(TResult Function( _NavigationItem v...
function mapOrNull (line 138) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Navigati...
function maybeWhen (line 159) | TResult maybeWhen<TResult extends Object?>(TResult Function( Icon icon, ...
function when (line 180) | TResult when<TResult extends Object?>(TResult Function( Icon icon, Page...
function whenOrNull (line 200) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( Icon ico...
class _NavigationItem (line 214) | class _NavigationItem implements NavigationItem {
method toString (line 250) | String toString()
class _$NavigationItemCopyWith (line 258) | abstract mixin class _$NavigationItemCopyWith<$Res> implements $Navigati...
method call (line 261) | $Res call({
class __$NavigationItemCopyWithImpl (line 270) | class __$NavigationItemCopyWithImpl<$Res>
method call (line 279) | $Res call({Object? icon = null,Object? label = null,Object? descriptio...
function toJson (line 307) | Map<String, dynamic> toJson()
function toString (line 320) | String toString()
class $PackageCopyWith (line 328) | abstract mixin class $PackageCopyWith<$Res> {
method call (line 331) | $Res call({
class _$PackageCopyWithImpl (line 340) | class _$PackageCopyWithImpl<$Res>
method call (line 349) | $Res call({Object? packageName = null,Object? label = null,Object? sys...
function maybeMap (line 377) | TResult maybeMap<TResult extends Object?>(TResult Function( _Package val...
function map (line 399) | TResult map<TResult extends Object?>(TResult Function( _Package value) ...
function mapOrNull (line 420) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Package ...
function maybeWhen (line 441) | TResult maybeWhen<TResult extends Object?>(TResult Function( String pack...
function when (line 462) | TResult when<TResult extends Object?>(TResult Function( String packageNa...
function whenOrNull (line 482) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String p...
class _Package (line 494) | @JsonSerializable()
method toJson (line 513) | Map<String, dynamic> toJson()
method toString (line 527) | String toString()
class _$PackageCopyWith (line 535) | abstract mixin class _$PackageCopyWith<$Res> implements $PackageCopyWith...
method call (line 538) | $Res call({
class __$PackageCopyWithImpl (line 547) | class __$PackageCopyWithImpl<$Res>
method call (line 556) | $Res call({Object? packageName = null,Object? label = null,Object? sys...
function toJson (line 582) | Map<String, dynamic> toJson()
function toString (line 595) | String toString()
class $MetadataCopyWith (line 603) | abstract mixin class $MetadataCopyWith<$Res> {
method call (line 606) | $Res call({
class _$MetadataCopyWithImpl (line 615) | class _$MetadataCopyWithImpl<$Res>
method call (line 624) | $Res call({Object? uid = null,Object? network = null,Object? sourceIP ...
function maybeMap (line 664) | TResult maybeMap<TResult extends Object?>(TResult Function( _Metadata va...
function map (line 686) | TResult map<TResult extends Object?>(TResult Function( _Metadata value) ...
function mapOrNull (line 707) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Metadata...
function maybeWhen (line 728) | TResult maybeWhen<TResult extends Object?>(TResult Function( int uid, S...
function when (line 749) | TResult when<TResult extends Object?>(TResult Function( int uid, String...
function whenOrNull (line 769) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( int uid,...
class _Metadata (line 781) | @JsonSerializable()
method toJson (line 824) | Map<String, dynamic> toJson()
method toString (line 838) | String toString()
class _$MetadataCopyWith (line 846) | abstract mixin class _$MetadataCopyWith<$Res> implements $MetadataCopyWi...
method call (line 849) | $Res call({
class __$MetadataCopyWithImpl (line 858) | class __$MetadataCopyWithImpl<$Res>
method call (line 867) | $Res call({Object? uid = null,Object? network = null,Object? sourceIP ...
function toJson (line 905) | Map<String, dynamic> toJson()
function toString (line 918) | String toString()
class $TrackerInfoCopyWith (line 926) | abstract mixin class $TrackerInfoCopyWith<$Res> {
method call (line 929) | $Res call({
class _$TrackerInfoCopyWithImpl (line 938) | class _$TrackerInfoCopyWithImpl<$Res>
method call (line 947) | $Res call({Object? id = null,Object? upload = null,Object? download = ...
function maybeMap (line 989) | TResult maybeMap<TResult extends Object?>(TResult Function( _TrackerInfo...
function map (line 1011) | TResult map<TResult extends Object?>(TResult Function( _TrackerInfo valu...
function mapOrNull (line 1032) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _TrackerI...
function maybeWhen (line 1053) | TResult maybeWhen<TResult extends Object?>(TResult Function( String id, ...
function when (line 1074) | TResult when<TResult extends Object?>(TResult Function( String id, int ...
function whenOrNull (line 1094) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String i...
class _TrackerInfo (line 1106) | @JsonSerializable()
method toJson (line 1136) | Map<String, dynamic> toJson()
method toString (line 1150) | String toString()
class _$TrackerInfoCopyWith (line 1158) | abstract mixin class _$TrackerInfoCopyWith<$Res> implements $TrackerInfo...
method call (line 1161) | $Res call({
class __$TrackerInfoCopyWithImpl (line 1170) | class __$TrackerInfoCopyWithImpl<$Res>
method call (line 1179) | $Res call({Object? id = null,Object? upload = null,Object? download = ...
function toJson (line 1220) | Map<String, dynamic> toJson()
function toString (line 1233) | String toString()
class $LogCopyWith (line 1241) | abstract mixin class $LogCopyWith<$Res> {
method call (line 1244) | $Res call({
class _$LogCopyWithImpl (line 1253) | class _$LogCopyWithImpl<$Res>
method call (line 1262) | $Res call({Object? logLevel = null,Object? payload = null,Object? date...
function maybeMap (line 1288) | TResult maybeMap<TResult extends Object?>(TResult Function( _Log value)?...
function map (line 1310) | TResult map<TResult extends Object?>(TResult Function( _Log value) $def...
function mapOrNull (line 1331) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Log valu...
function maybeWhen (line 1352) | TResult maybeWhen<TResult extends Object?>(TResult Function(@JsonKey(nam...
function when (line 1373) | TResult when<TResult extends Object?>(TResult Function(@JsonKey(name: 'L...
function whenOrNull (line 1393) | TResult? whenOrNull<TResult extends Object?>(TResult? Function(@JsonKey(...
class _Log (line 1405) | @JsonSerializable()
method toJson (line 1423) | Map<String, dynamic> toJson()
method toString (line 1437) | String toString()
class _$LogCopyWith (line 1445) | abstract mixin class _$LogCopyWith<$Res> implements $LogCopyWith<$Res> {
method call (line 1448) | $Res call({
class __$LogCopyWithImpl (line 1457) | class __$LogCopyWithImpl<$Res>
method call (line 1466) | $Res call({Object? logLevel = null,Object? payload = null,Object? date...
function toString (line 1500) | String toString()
class $LogsStateCopyWith (line 1508) | abstract mixin class $LogsStateCopyWith<$Res> {
method call (line 1511) | $Res call({
class _$LogsStateCopyWithImpl (line 1520) | class _$LogsStateCopyWithImpl<$Res>
method call (line 1529) | $Res call({Object? logs = null,Object? keywords = null,Object? query =...
function maybeMap (line 1556) | TResult maybeMap<TResult extends Object?>(TResult Function( _LogsState v...
function map (line 1578) | TResult map<TResult extends Object?>(TResult Function( _LogsState value)...
function mapOrNull (line 1599) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _LogsStat...
function maybeWhen (line 1620) | TResult maybeWhen<TResult extends Object?>(TResult Function( List<Log> l...
function when (line 1641) | TResult when<TResult extends Object?>(TResult Function( List<Log> logs, ...
function whenOrNull (line 1661) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( List<Log...
class _LogsState (line 1675) | class _LogsState implements LogsState {
method toString (line 1714) | String toString()
class _$LogsStateCopyWith (line 1722) | abstract mixin class _$LogsStateCopyWith<$Res> implements $LogsStateCopy...
method call (line 1725) | $Res call({
class __$LogsStateCopyWithImpl (line 1734) | class __$LogsStateCopyWithImpl<$Res>
method call (line 1743) | $Res call({Object? logs = null,Object? keywords = null,Object? query =...
function toString (line 1778) | String toString()
class $TrackerInfosStateCopyWith (line 1786) | abstract mixin class $TrackerInfosStateCopyWith<$Res> {
method call (line 1789) | $Res call({
class _$TrackerInfosStateCopyWithImpl (line 1798) | class _$TrackerInfosStateCopyWithImpl<$Res>
method call (line 1807) | $Res call({Object? trackerInfos = null,Object? keywords = null,Object?...
function maybeMap (line 1834) | TResult maybeMap<TResult extends Object?>(TResult Function( _TrackerInfo...
function map (line 1856) | TResult map<TResult extends Object?>(TResult Function( _TrackerInfosStat...
function mapOrNull (line 1877) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _TrackerI...
function maybeWhen (line 1898) | TResult maybeWhen<TResult extends Object?>(TResult Function( List<Tracke...
function when (line 1919) | TResult when<TResult extends Object?>(TResult Function( List<TrackerInfo...
function whenOrNull (line 1939) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( List<Tra...
class _TrackerInfosState (line 1953) | class _TrackerInfosState implements TrackerInfosState {
method toString (line 1992) | String toString()
class _$TrackerInfosStateCopyWith (line 2000) | abstract mixin class _$TrackerInfosStateCopyWith<$Res> implements $Track...
method call (line 2003) | $Res call({
class __$TrackerInfosStateCopyWithImpl (line 2012) | class __$TrackerInfosStateCopyWithImpl<$Res>
method call (line 2021) | $Res call({Object? trackerInfos = null,Object? keywords = null,Object?...
function toJson (line 2046) | Map<String, dynamic> toJson()
function toString (line 2059) | String toString()
class $DAVPropsCopyWith (line 2067) | abstract mixin class $DAVPropsCopyWith<$Res> {
method call (line 2070) | $Res call({
class _$DAVPropsCopyWithImpl (line 2079) | class _$DAVPropsCopyWithImpl<$Res>
method call (line 2088) | $Res call({Object? uri = null,Object? user = null,Object? password = n...
function maybeMap (line 2115) | TResult maybeMap<TResult extends Object?>(TResult Function( _DAVProps va...
function map (line 2137) | TResult map<TResult extends Object?>(TResult Function( _DAVProps value) ...
function mapOrNull (line 2158) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _DAVProps...
function maybeWhen (line 2179) | TResult maybeWhen<TResult extends Object?>(TResult Function( String uri,...
function when (line 2200) | TResult when<TResult extends Object?>(TResult Function( String uri, Str...
function whenOrNull (line 2220) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String u...
class _DAVProps (line 2232) | @JsonSerializable()
method toJson (line 2250) | Map<String, dynamic> toJson()
method toString (line 2264) | String toString()
class _$DAVPropsCopyWith (line 2272) | abstract mixin class _$DAVPropsCopyWith<$Res> implements $DAVPropsCopyWi...
method call (line 2275) | $Res call({
class __$DAVPropsCopyWithImpl (line 2284) | class __$DAVPropsCopyWithImpl<$Res>
method call (line 2293) | $Res call({Object? uri = null,Object? user = null,Object? password = n...
function toString (line 2328) | String toString()
class $FileInfoCopyWith (line 2336) | abstract mixin class $FileInfoCopyWith<$Res> {
method call (line 2339) | $Res call({
class _$FileInfoCopyWithImpl (line 2348) | class _$FileInfoCopyWithImpl<$Res>
method call (line 2357) | $Res call({Object? size = null,Object? lastModified = null,})
function maybeMap (line 2382) | TResult maybeMap<TResult extends Object?>(TResult Function( _FileInfo va...
function map (line 2404) | TResult map<TResult extends Object?>(TResult Function( _FileInfo value) ...
function mapOrNull (line 2425) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _FileInfo...
function maybeWhen (line 2446) | TResult maybeWhen<TResult extends Object?>(TResult Function( int size, ...
function when (line 2467) | TResult when<TResult extends Object?>(TResult Function( int size, DateT...
function whenOrNull (line 2487) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( int size...
class _FileInfo (line 2501) | class _FileInfo implements FileInfo {
method toString (line 2526) | String toString()
class _$FileInfoCopyWith (line 2534) | abstract mixin class _$FileInfoCopyWith<$Res> implements $FileInfoCopyWi...
method call (line 2537) | $Res call({
class __$FileInfoCopyWithImpl (line 2546) | class __$FileInfoCopyWithImpl<$Res>
method call (line 2555) | $Res call({Object? size = null,Object? lastModified = null,})
function toJson (line 2578) | Map<String, dynamic> toJson()
function toString (line 2591) | String toString()
class $VersionInfoCopyWith (line 2599) | abstract mixin class $VersionInfoCopyWith<$Res> {
method call (line 2602) | $Res call({
class _$VersionInfoCopyWithImpl (line 2611) | class _$VersionInfoCopyWithImpl<$Res>
method call (line 2620) | $Res call({Object? clashName = null,Object? version = null,})
function maybeMap (line 2645) | TResult maybeMap<TResult extends Object?>(TResult Function( _VersionInfo...
function map (line 2667) | TResult map<TResult extends Object?>(TResult Function( _VersionInfo valu...
function mapOrNull (line 2688) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _VersionI...
function maybeWhen (line 2709) | TResult maybeWhen<TResult extends Object?>(TResult Function( String clas...
function when (line 2730) | TResult when<TResult extends Object?>(TResult Function( String clashName...
function whenOrNull (line 2750) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String c...
class _VersionInfo (line 2762) | @JsonSerializable()
method toJson (line 2778) | Map<String, dynamic> toJson()
method toString (line 2792) | String toString()
class _$VersionInfoCopyWith (line 2800) | abstract mixin class _$VersionInfoCopyWith<$Res> implements $VersionInfo...
method call (line 2803) | $Res call({
class __$VersionInfoCopyWithImpl (line 2812) | class __$VersionInfoCopyWithImpl<$Res>
method call (line 2821) | $Res call({Object? clashName = null,Object? version = null,})
function toJson (line 2844) | Map<String, dynamic> toJson()
function toString (line 2857) | String toString()
class $TrafficCopyWith (line 2865) | abstract mixin class $TrafficCopyWith<$Res> {
method call (line 2868) | $Res call({
class _$TrafficCopyWithImpl (line 2877) | class _$TrafficCopyWithImpl<$Res>
method call (line 2886) | $Res call({Object? up = null,Object? down = null,})
function maybeMap (line 2911) | TResult maybeMap<TResult extends Object?>(TResult Function( _Traffic val...
function map (line 2933) | TResult map<TResult extends Object?>(TResult Function( _Traffic value) ...
function mapOrNull (line 2954) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Traffic ...
function maybeWhen (line 2975) | TResult maybeWhen<TResult extends Object?>(TResult Function( num up, nu...
function when (line 2996) | TResult when<TResult extends Object?>(TResult Function( num up, num dow...
function whenOrNull (line 3016) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( num up, ...
class _Traffic (line 3028) | @JsonSerializable()
method toJson (line 3044) | Map<String, dynamic> toJson()
method toString (line 3058) | String toString()
class _$TrafficCopyWith (line 3066) | abstract mixin class _$TrafficCopyWith<$Res> implements $TrafficCopyWith...
method call (line 3069) | $Res call({
class __$TrafficCopyWithImpl (line 3078) | class __$TrafficCopyWithImpl<$Res>
method call (line 3087) | $Res call({Object? up = null,Object? down = null,})
function toString (line 3120) | String toString()
class $TrafficShowCopyWith (line 3128) | abstract mixin class $TrafficShowCopyWith<$Res> {
method call (line 3131) | $Res call({
class _$TrafficShowCopyWithImpl (line 3140) | class _$TrafficShowCopyWithImpl<$Res>
method call (line 3149) | $Res call({Object? value = null,Object? unit = null,})
function maybeMap (line 3174) | TResult maybeMap<TResult extends Object?>(TResult Function( _TrafficShow...
function map (line 3196) | TResult map<TResult extends Object?>(TResult Function( _TrafficShow valu...
function mapOrNull (line 3217) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _TrafficS...
function maybeWhen (line 3238) | TResult maybeWhen<TResult extends Object?>(TResult Function( String valu...
function when (line 3259) | TResult when<TResult extends Object?>(TResult Function( String value, S...
function whenOrNull (line 3279) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String v...
class _TrafficShow (line 3293) | class _TrafficShow implements TrafficShow {
method toString (line 3318) | String toString()
class _$TrafficShowCopyWith (line 3326) | abstract mixin class _$TrafficShowCopyWith<$Res> implements $TrafficShow...
method call (line 3329) | $Res call({
class __$TrafficShowCopyWithImpl (line 3338) | class __$TrafficShowCopyWithImpl<$Res>
method call (line 3347) | $Res call({Object? value = null,Object? unit = null,})
function toJson (line 3370) | Map<String, dynamic> toJson()
function toString (line 3383) | String toString()
class $ProxyCopyWith (line 3391) | abstract mixin class $ProxyCopyWith<$Res> {
method call (line 3394) | $Res call({
class _$ProxyCopyWithImpl (line 3403) | class _$ProxyCopyWithImpl<$Res>
method call (line 3412) | $Res call({Object? name = null,Object? type = null,Object? now = freez...
function maybeMap (line 3438) | TResult maybeMap<TResult extends Object?>(TResult Function( _Proxy value...
function map (line 3460) | TResult map<TResult extends Object?>(TResult Function( _Proxy value) $d...
function mapOrNull (line 3481) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Proxy va...
function maybeWhen (line 3502) | TResult maybeWhen<TResult extends Object?>(TResult Function( String name...
function when (line 3523) | TResult when<TResult extends Object?>(TResult Function( String name, St...
function whenOrNull (line 3543) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String n...
class _Proxy (line 3555) | @JsonSerializable()
method toJson (line 3572) | Map<String, dynamic> toJson()
method toString (line 3586) | String toString()
class _$ProxyCopyWith (line 3594) | abstract mixin class _$ProxyCopyWith<$Res> implements $ProxyCopyWith<$Re...
method call (line 3597) | $Res call({
class __$ProxyCopyWithImpl (line 3606) | class __$ProxyCopyWithImpl<$Res>
method call (line 3615) | $Res call({Object? name = null,Object? type = null,Object? now = freez...
function toJson (line 3639) | Map<String, dynamic> toJson()
function toString (line 3652) | String toString()
class $GroupCopyWith (line 3660) | abstract mixin class $GroupCopyWith<$Res> {
method call (line 3663) | $Res call({
class _$GroupCopyWithImpl (line 3672) | class _$GroupCopyWithImpl<$Res>
method call (line 3681) | $Res call({Object? type = null,Object? all = null,Object? now = freeze...
function maybeMap (line 3711) | TResult maybeMap<TResult extends Object?>(TResult Function( _Group value...
function map (line 3733) | TResult map<TResult extends Object?>(TResult Function( _Group value) $d...
function mapOrNull (line 3754) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Group va...
function maybeWhen (line 3775) | TResult maybeWhen<TResult extends Object?>(TResult Function( GroupType t...
function when (line 3796) | TResult when<TResult extends Object?>(TResult Function( GroupType type, ...
function whenOrNull (line 3816) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( GroupTyp...
class _Group (line 3828) | @JsonSerializable()
method toJson (line 3855) | Map<String, dynamic> toJson()
method toString (line 3869) | String toString()
class _$GroupCopyWith (line 3877) | abstract mixin class _$GroupCopyWith<$Res> implements $GroupCopyWith<$Re...
method call (line 3880) | $Res call({
class __$GroupCopyWithImpl (line 3889) | class __$GroupCopyWithImpl<$Res>
method call (line 3898) | $Res call({Object? type = null,Object? all = null,Object? now = freeze...
function toString (line 3936) | String toString()
class $ColorSchemesCopyWith (line 3944) | abstract mixin class $ColorSchemesCopyWith<$Res> {
method call (line 3947) | $Res call({
class _$ColorSchemesCopyWithImpl (line 3956) | class _$ColorSchemesCopyWithImpl<$Res>
method call (line 3965) | $Res call({Object? lightColorScheme = freezed,Object? darkColorScheme ...
function maybeMap (line 3990) | TResult maybeMap<TResult extends Object?>(TResult Function( _ColorScheme...
function map (line 4012) | TResult map<TResult extends Object?>(TResult Function( _ColorSchemes val...
function mapOrNull (line 4033) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _ColorSch...
function maybeWhen (line 4054) | TResult maybeWhen<TResult extends Object?>(TResult Function( ColorScheme...
function when (line 4075) | TResult when<TResult extends Object?>(TResult Function( ColorScheme? lig...
function whenOrNull (line 4095) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( ColorSch...
class _ColorSchemes (line 4109) | class _ColorSchemes implements ColorSchemes {
method toString (line 4134) | String toString()
class _$ColorSchemesCopyWith (line 4142) | abstract mixin class _$ColorSchemesCopyWith<$Res> implements $ColorSchem...
method call (line 4145) | $Res call({
class __$ColorSchemesCopyWithImpl (line 4154) | class __$ColorSchemesCopyWithImpl<$Res>
method call (line 4163) | $Res call({Object? lightColorScheme = freezed,Object? darkColorScheme ...
function toString (line 4196) | String toString()
class $IpInfoCopyWith (line 4204) | abstract mixin class $IpInfoCopyWith<$Res> {
method call (line 4207) | $Res call({
class _$IpInfoCopyWithImpl (line 4216) | class _$IpInfoCopyWithImpl<$Res>
method call (line 4225) | $Res call({Object? ip = null,Object? countryCode = null,})
function maybeMap (line 4250) | TResult maybeMap<TResult extends Object?>(TResult Function( _IpInfo valu...
function map (line 4272) | TResult map<TResult extends Object?>(TResult Function( _IpInfo value) $...
function mapOrNull (line 4293) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _IpInfo v...
function maybeWhen (line 4314) | TResult maybeWhen<TResult extends Object?>(TResult Function( String ip, ...
function when (line 4335) | TResult when<TResult extends Object?>(TResult Function( String ip, Stri...
function whenOrNull (line 4355) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String i...
class _IpInfo (line 4369) | class _IpInfo implements IpInfo {
method toString (line 4394) | String toString()
class _$IpInfoCopyWith (line 4402) | abstract mixin class _$IpInfoCopyWith<$Res> implements $IpInfoCopyWith<$...
method call (line 4405) | $Res call({
class __$IpInfoCopyWithImpl (line 4414) | class __$IpInfoCopyWithImpl<$Res>
method call (line 4423) | $Res call({Object? ip = null,Object? countryCode = null,})
function toJson (line 4446) | Map<String, dynamic> toJson()
function toString (line 4459) | String toString()
class $HotKeyActionCopyWith (line 4467) | abstract mixin class $HotKeyActionCopyWith<$Res> {
method call (line 4470) | $Res call({
class _$HotKeyActionCopyWithImpl (line 4479) | class _$HotKeyActionCopyWithImpl<$Res>
method call (line 4488) | $Res call({Object? action = null,Object? key = freezed,Object? modifie...
function maybeMap (line 4514) | TResult maybeMap<TResult extends Object?>(TResult Function( _HotKeyActio...
function map (line 4536) | TResult map<TResult extends Object?>(TResult Function( _HotKeyAction val...
function mapOrNull (line 4557) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _HotKeyAc...
function maybeWhen (line 4578) | TResult maybeWhen<TResult extends Object?>(TResult Function( HotAction a...
function when (line 4599) | TResult when<TResult extends Object?>(TResult Function( HotAction action...
function whenOrNull (line 4619) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( HotActio...
class _HotKeyAction (line 4631) | @JsonSerializable()
method toJson (line 4654) | Map<String, dynamic> toJson()
method toString (line 4668) | String toString()
class _$HotKeyActionCopyWith (line 4676) | abstract mixin class _$HotKeyActionCopyWith<$Res> implements $HotKeyActi...
method call (line 4679) | $Res call({
class __$HotKeyActionCopyWithImpl (line 4688) | class __$HotKeyActionCopyWithImpl<$Res>
method call (line 4697) | $Res call({Object? action = null,Object? key = freezed,Object? modifie...
function toString (line 4731) | String toString()
class $FieldCopyWith (line 4739) | abstract mixin class $FieldCopyWith<$Res> {
method call (line 4742) | $Res call({
class _$FieldCopyWithImpl (line 4751) | class _$FieldCopyWithImpl<$Res>
method call (line 4760) | $Res call({Object? label = null,Object? value = null,Object? validator...
function maybeMap (line 4786) | TResult maybeMap<TResult extends Object?>(TResult Function( _Field value...
function map (line 4808) | TResult map<TResult extends Object?>(TResult Function( _Field value) $d...
function mapOrNull (line 4829) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Field va...
function maybeWhen (line 4850) | TResult maybeWhen<TResult extends Object?>(TResult Function( String labe...
function when (line 4871) | TResult when<TResult extends Object?>(TResult Function( String label, S...
function whenOrNull (line 4891) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String l...
class _Field (line 4905) | class _Field implements Field {
method toString (line 4931) | String toString()
class _$FieldCopyWith (line 4939) | abstract mixin class _$FieldCopyWith<$Res> implements $FieldCopyWith<$Re...
method call (line 4942) | $Res call({
class __$FieldCopyWithImpl (line 4951) | class __$FieldCopyWithImpl<$Res>
method call (line 4960) | $Res call({Object? label = null,Object? value = null,Object? validator...
function toString (line 4994) | String toString()
class $ResultCopyWith (line 5002) | abstract mixin class $ResultCopyWith<T,$Res> {
method call (line 5005) | $Res call({
class _$ResultCopyWithImpl (line 5014) | class _$ResultCopyWithImpl<T,$Res>
method call (line 5023) | $Res call({Object? data = freezed,Object? type = null,Object? message ...
function maybeMap (line 5049) | TResult maybeMap<TResult extends Object?>(TResult Function( _Result<T> v...
function map (line 5071) | TResult map<TResult extends Object?>(TResult Function( _Result<T> value)...
function mapOrNull (line 5092) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Result<T...
function maybeWhen (line 5113) | TResult maybeWhen<TResult extends Object?>(TResult Function( T? data, R...
function when (line 5134) | TResult when<TResult extends Object?>(TResult Function( T? data, Result...
function whenOrNull (line 5154) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( T? data,...
class _Result (line 5168) | class _Result<T> implements Result<T> {
method toString (line 5194) | String toString()
class _$ResultCopyWith (line 5202) | abstract mixin class _$ResultCopyWith<T,$Res> implements $ResultCopyWith...
method call (line 5205) | $Res call({
class __$ResultCopyWithImpl (line 5214) | class __$ResultCopyWithImpl<T,$Res>
method call (line 5223) | $Res call({Object? data = freezed,Object? type = null,Object? message ...
function toJson (line 5247) | Map<String, dynamic> toJson()
function toString (line 5260) | String toString()
class $ScriptCopyWith (line 5268) | abstract mixin class $ScriptCopyWith<$Res> {
method call (line 5271) | $Res call({
class _$ScriptCopyWithImpl (line 5280) | class _$ScriptCopyWithImpl<$Res>
method call (line 5289) | $Res call({Object? id = null,Object? label = null,Object? lastUpdateTi...
function maybeMap (line 5315) | TResult maybeMap<TResult extends Object?>(TResult Function( _Script valu...
function map (line 5337) | TResult map<TResult extends Object?>(TResult Function( _Script value) $...
function mapOrNull (line 5358) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Script v...
function maybeWhen (line 5379) | TResult maybeWhen<TResult extends Object?>(TResult Function( int id, St...
function when (line 5400) | TResult when<TResult extends Object?>(TResult Function( int id, String ...
function whenOrNull (line 5420) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( int id, ...
class _Script (line 5432) | @JsonSerializable()
method toJson (line 5449) | Map<String, dynamic> toJson()
method toString (line 5463) | String toString()
class _$ScriptCopyWith (line 5471) | abstract mixin class _$ScriptCopyWith<$Res> implements $ScriptCopyWith<$...
method call (line 5474) | $Res call({
class __$ScriptCopyWithImpl (line 5483) | class __$ScriptCopyWithImpl<$Res>
method call (line 5492) | $Res call({Object? id = null,Object? label = null,Object? lastUpdateTi...
function toString (line 5526) | String toString()
class $DelayStateCopyWith (line 5534) | abstract mixin class $DelayStateCopyWith<$Res> {
method call (line 5537) | $Res call({
class _$DelayStateCopyWithImpl (line 5546) | class _$DelayStateCopyWithImpl<$Res>
method call (line 5555) | $Res call({Object? delay = null,Object? group = null,})
function maybeMap (line 5580) | TResult maybeMap<TResult extends Object?>(TResult Function( _DelayState ...
function map (line 5602) | TResult map<TResult extends Object?>(TResult Function( _DelayState value...
function mapOrNull (line 5623) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _DelaySta...
function maybeWhen (line 5644) | TResult maybeWhen<TResult extends Object?>(TResult Function( int delay, ...
function when (line 5665) | TResult when<TResult extends Object?>(TResult Function( int delay, bool...
function whenOrNull (line 5685) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( int dela...
class _DelayState (line 5699) | class _DelayState implements DelayState {
method toString (line 5724) | String toString()
class _$DelayStateCopyWith (line 5732) | abstract mixin class _$DelayStateCopyWith<$Res> implements $DelayStateCo...
method call (line 5735) | $Res call({
class __$DelayStateCopyWithImpl (line 5744) | class __$DelayStateCopyWithImpl<$Res>
method call (line 5753) | $Res call({Object? delay = null,Object? group = null,})
function toString (line 5786) | String toString()
class $UpdatingMessageCopyWith (line 5794) | abstract mixin class $UpdatingMessageCopyWith<$Res> {
method call (line 5797) | $Res call({
class _$UpdatingMessageCopyWithImpl (line 5806) | class _$UpdatingMessageCopyWithImpl<$Res>
method call (line 5815) | $Res call({Object? label = null,Object? message = null,})
function maybeMap (line 5840) | TResult maybeMap<TResult extends Object?>(TResult Function( _UpdatingMes...
function map (line 5862) | TResult map<TResult extends Object?>(TResult Function( _UpdatingMessage ...
function mapOrNull (line 5883) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Updating...
function maybeWhen (line 5904) | TResult maybeWhen<TResult extends Object?>(TResult Function( String labe...
function when (line 5925) | TResult when<TResult extends Object?>(TResult Function( String label, S...
function whenOrNull (line 5945) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String l...
class _UpdatingMessage (line 5959) | class _UpdatingMessage implements UpdatingMessage {
method toString (line 5984) | String toString()
class _$UpdatingMessageCopyWith (line 5992) | abstract mixin class _$UpdatingMessageCopyWith<$Res> implements $Updatin...
method call (line 5995) | $Res call({
class __$UpdatingMessageCopyWithImpl (line 6004) | class __$UpdatingMessageCopyWithImpl<$Res>
method call (line 6013) | $Res call({Object? label = null,Object? message = null,})
FILE: lib/models/generated/common.g.dart
function _$PackageFromJson (line 9) | _Package _$PackageFromJson(Map<String, dynamic> json)
function _$PackageToJson (line 17) | Map<String, dynamic> _$PackageToJson(_Package instance)
function _$MetadataFromJson (line 25) | _Metadata _$MetadataFromJson(Map<String, dynamic> json)
function _$MetadataToJson (line 53) | Map<String, dynamic> _$MetadataToJson(_Metadata instance)
function _$TrackerInfoFromJson (line 80) | _TrackerInfo _$TrackerInfoFromJson(Map<String, dynamic> json)
function _$TrackerInfoToJson (line 93) | Map<String, dynamic> _$TrackerInfoToJson(_TrackerInfo instance)
function _$LogFromJson (line 107) | _Log _$LogFromJson(Map<String, dynamic> json)
function _$LogToJson (line 114) | Map<String, dynamic> _$LogToJson(_Log instance)
function _$DAVPropsFromJson (line 128) | _DAVProps _$DAVPropsFromJson(Map<String, dynamic> json)
function _$DAVPropsToJson (line 135) | Map<String, dynamic> _$DAVPropsToJson(_DAVProps instance)
function _$VersionInfoFromJson (line 142) | _VersionInfo _$VersionInfoFromJson(Map<String, dynamic> json)
function _$VersionInfoToJson (line 147) | Map<String, dynamic> _$VersionInfoToJson(_VersionInfo instance)
function _$TrafficFromJson (line 153) | _Traffic _$TrafficFromJson(Map<String, dynamic> json)
function _$TrafficToJson (line 156) | Map<String, dynamic> _$TrafficToJson(_Traffic instance)
function _$ProxyFromJson (line 161) | _Proxy _$ProxyFromJson(Map<String, dynamic> json)
function _$ProxyToJson (line 167) | Map<String, dynamic> _$ProxyToJson(_Proxy instance)
function _$GroupFromJson (line 173) | _Group _$GroupFromJson(Map<String, dynamic> json)
function _$GroupToJson (line 187) | Map<String, dynamic> _$GroupToJson(_Group instance)
function _$HotKeyActionFromJson (line 205) | _HotKeyAction _$HotKeyActionFromJson(Map<String, dynamic> json)
function _$HotKeyActionToJson (line 216) | Map<String, dynamic> _$HotKeyActionToJson(_HotKeyAction instance)
function _$ScriptFromJson (line 242) | _Script _$ScriptFromJson(Map<String, dynamic> json)
function _$ScriptToJson (line 248) | Map<String, dynamic> _$ScriptToJson(_Script instance)
FILE: lib/models/generated/config.freezed.dart
function _$identity (line 13) | T _$identity<T>(T value)
function toJson (line 26) | Map<String, dynamic> toJson()
function toString (line 39) | String toString()
class $AppSettingPropsCopyWith (line 47) | abstract mixin class $AppSettingPropsCopyWith<$Res> {
method call (line 50) | $Res call({
class _$AppSettingPropsCopyWithImpl (line 59) | class _$AppSettingPropsCopyWithImpl<$Res>
method call (line 68) | $Res call({Object? locale = freezed,Object? dashboardWidgets = null,Ob...
function maybeMap (line 111) | TResult maybeMap<TResult extends Object?>(TResult Function( _AppSettingP...
function map (line 133) | TResult map<TResult extends Object?>(TResult Function( _AppSettingProps ...
function mapOrNull (line 154) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _AppSetti...
function maybeWhen (line 175) | TResult maybeWhen<TResult extends Object?>(TResult Function( String? loc...
function when (line 196) | TResult when<TResult extends Object?>(TResult Function( String? locale, ...
function whenOrNull (line 216) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String? ...
class _AppSettingProps (line 228) | @JsonSerializable()
method toJson (line 268) | Map<String, dynamic> toJson()
method toString (line 282) | String toString()
class _$AppSettingPropsCopyWith (line 290) | abstract mixin class _$AppSettingPropsCopyWith<$Res> implements $AppSett...
method call (line 293) | $Res call({
class __$AppSettingPropsCopyWithImpl (line 302) | class __$AppSettingPropsCopyWithImpl<$Res>
method call (line 311) | $Res call({Object? locale = freezed,Object? dashboardWidgets = null,Ob...
function toJson (line 352) | Map<String, dynamic> toJson()
function toString (line 365) | String toString()
class $AccessControlPropsCopyWith (line 373) | abstract mixin class $AccessControlPropsCopyWith<$Res> {
method call (line 376) | $Res call({
class _$AccessControlPropsCopyWithImpl (line 385) | class _$AccessControlPropsCopyWithImpl<$Res>
method call (line 394) | $Res call({Object? enable = null,Object? mode = null,Object? acceptLis...
function maybeMap (line 424) | TResult maybeMap<TResult extends Object?>(TResult Function( _AccessContr...
function map (line 446) | TResult map<TResult extends Object?>(TResult Function( _AccessControlPro...
function mapOrNull (line 467) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _AccessCo...
function maybeWhen (line 488) | TResult maybeWhen<TResult extends Object?>(TResult Function( bool enable...
function when (line 509) | TResult when<TResult extends Object?>(TResult Function( bool enable, Ac...
function whenOrNull (line 529) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool ena...
class _AccessControlProps (line 541) | @JsonSerializable()
method toJson (line 574) | Map<String, dynamic> toJson()
method toString (line 588) | String toString()
class _$AccessControlPropsCopyWith (line 596) | abstract mixin class _$AccessControlPropsCopyWith<$Res> implements $Acce...
method call (line 599) | $Res call({
class __$AccessControlPropsCopyWithImpl (line 608) | class __$AccessControlPropsCopyWithImpl<$Res>
method call (line 617) | $Res call({Object? enable = null,Object? mode = null,Object? acceptLis...
function toJson (line 645) | Map<String, dynamic> toJson()
function toString (line 658) | String toString()
class $WindowPropsCopyWith (line 666) | abstract mixin class $WindowPropsCopyWith<$Res> {
method call (line 669) | $Res call({
class _$WindowPropsCopyWithImpl (line 678) | class _$WindowPropsCopyWithImpl<$Res>
method call (line 687) | $Res call({Object? width = null,Object? height = null,Object? top = fr...
function maybeMap (line 714) | TResult maybeMap<TResult extends Object?>(TResult Function( _WindowProps...
function map (line 736) | TResult map<TResult extends Object?>(TResult Function( _WindowProps valu...
function mapOrNull (line 757) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _WindowPr...
function maybeWhen (line 778) | TResult maybeWhen<TResult extends Object?>(TResult Function( double widt...
function when (line 799) | TResult when<TResult extends Object?>(TResult Function( double width, d...
function whenOrNull (line 819) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( double w...
class _WindowProps (line 831) | @JsonSerializable()
method toJson (line 849) | Map<String, dynamic> toJson()
method toString (line 863) | String toString()
class _$WindowPropsCopyWith (line 871) | abstract mixin class _$WindowPropsCopyWith<$Res> implements $WindowProps...
method call (line 874) | $Res call({
class __$WindowPropsCopyWithImpl (line 883) | class __$WindowPropsCopyWithImpl<$Res>
method call (line 892) | $Res call({Object? width = null,Object? height = null,Object? top = fr...
function toJson (line 917) | Map<String, dynamic> toJson()
function toString (line 930) | String toString()
class $VpnPropsCopyWith (line 938) | abstract mixin class $VpnPropsCopyWith<$Res> {
method call (line 941) | $Res call({
class _$VpnPropsCopyWithImpl (line 950) | class _$VpnPropsCopyWithImpl<$Res>
method call (line 959) | $Res call({Object? enable = null,Object? systemProxy = null,Object? ip...
function maybeMap (line 997) | TResult maybeMap<TResult extends Object?>(TResult Function( _VpnProps va...
function map (line 1019) | TResult map<TResult extends Object?>(TResult Function( _VpnProps value) ...
function mapOrNull (line 1040) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _VpnProps...
function maybeWhen (line 1061) | TResult maybeWhen<TResult extends Object?>(TResult Function( bool enable...
function when (line 1082) | TResult when<TResult extends Object?>(TResult Function( bool enable, bo...
function whenOrNull (line 1102) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool ena...
class _VpnProps (line 1114) | @JsonSerializable()
method toJson (line 1134) | Map<String, dynamic> toJson()
method toString (line 1148) | String toString()
class _$VpnPropsCopyWith (line 1156) | abstract mixin class _$VpnPropsCopyWith<$Res> implements $VpnPropsCopyWi...
method call (line 1159) | $Res call({
class __$VpnPropsCopyWithImpl (line 1168) | class __$VpnPropsCopyWithImpl<$Res>
method call (line 1177) | $Res call({Object? enable = null,Object? systemProxy = null,Object? ip...
function toJson (line 1213) | Map<String, dynamic> toJson()
function toString (line 1226) | String toString()
class $NetworkPropsCopyWith (line 1234) | abstract mixin class $NetworkPropsCopyWith<$Res> {
method call (line 1237) | $Res call({
class _$NetworkPropsCopyWithImpl (line 1246) | class _$NetworkPropsCopyWithImpl<$Res>
method call (line 1255) | $Res call({Object? systemProxy = null,Object? bypassDomain = null,Obje...
function maybeMap (line 1283) | TResult maybeMap<TResult extends Object?>(TResult Function( _NetworkProp...
function map (line 1305) | TResult map<TResult extends Object?>(TResult Function( _NetworkProps val...
function mapOrNull (line 1326) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _NetworkP...
function maybeWhen (line 1347) | TResult maybeWhen<TResult extends Object?>(TResult Function( bool system...
function when (line 1368) | TResult when<TResult extends Object?>(TResult Function( bool systemProxy...
function whenOrNull (line 1388) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool sys...
class _NetworkProps (line 1400) | @JsonSerializable()
method toJson (line 1425) | Map<String, dynamic> toJson()
method toString (line 1439) | String toString()
class _$NetworkPropsCopyWith (line 1447) | abstract mixin class _$NetworkPropsCopyWith<$Res> implements $NetworkPro...
method call (line 1450) | $Res call({
class __$NetworkPropsCopyWithImpl (line 1459) | class __$NetworkPropsCopyWithImpl<$Res>
method call (line 1468) | $Res call({Object? systemProxy = null,Object? bypassDomain = null,Obje...
function toJson (line 1494) | Map<String, dynamic> toJson()
function toString (line 1507) | String toString()
class $ProxiesStylePropsCopyWith (line 1515) | abstract mixin class $ProxiesStylePropsCopyWith<$Res> {
method call (line 1518) | $Res call({
class _$ProxiesStylePropsCopyWithImpl (line 1527) | class _$ProxiesStylePropsCopyWithImpl<$Res>
method call (line 1536) | $Res call({Object? type = null,Object? sortType = null,Object? layout ...
function maybeMap (line 1564) | TResult maybeMap<TResult extends Object?>(TResult Function( _ProxiesStyl...
function map (line 1586) | TResult map<TResult extends Object?>(TResult Function( _ProxiesStyleProp...
function mapOrNull (line 1607) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _ProxiesS...
function maybeWhen (line 1628) | TResult maybeWhen<TResult extends Object?>(TResult Function( ProxiesType...
function when (line 1649) | TResult when<TResult extends Object?>(TResult Function( ProxiesType type...
function whenOrNull (line 1669) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( ProxiesT...
class _ProxiesStyleProps (line 1681) | @JsonSerializable()
method toJson (line 1700) | Map<String, dynamic> toJson()
method toString (line 1714) | String toString()
class _$ProxiesStylePropsCopyWith (line 1722) | abstract mixin class _$ProxiesStylePropsCopyWith<$Res> implements $Proxi...
method call (line 1725) | $Res call({
class __$ProxiesStylePropsCopyWithImpl (line 1734) | class __$ProxiesStylePropsCopyWithImpl<$Res>
method call (line 1743) | $Res call({Object? type = null,Object? sortType = null,Object? layout ...
function toJson (line 1769) | Map<String, dynamic> toJson()
function toString (line 1782) | String toString()
class $TextScaleCopyWith (line 1790) | abstract mixin class $TextScaleCopyWith<$Res> {
method call (line 1793) | $Res call({
class _$TextScaleCopyWithImpl (line 1802) | class _$TextScaleCopyWithImpl<$Res>
method call (line 1811) | $Res call({Object? enable = null,Object? scale = null,})
function maybeMap (line 1836) | TResult maybeMap<TResult extends Object?>(TResult Function( _TextScale v...
function map (line 1858) | TResult map<TResult extends Object?>(TResult Function( _TextScale value)...
function mapOrNull (line 1879) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _TextScal...
function maybeWhen (line 1900) | TResult maybeWhen<TResult extends Object?>(TResult Function( bool enable...
function when (line 1921) | TResult when<TResult extends Object?>(TResult Function( bool enable, do...
function whenOrNull (line 1941) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool ena...
class _TextScale (line 1953) | @JsonSerializable()
method toJson (line 1969) | Map<String, dynamic> toJson()
method toString (line 1983) | String toString()
class _$TextScaleCopyWith (line 1991) | abstract mixin class _$TextScaleCopyWith<$Res> implements $TextScaleCopy...
method call (line 1994) | $Res call({
class __$TextScaleCopyWithImpl (line 2003) | class __$TextScaleCopyWithImpl<$Res>
method call (line 2012) | $Res call({Object? enable = null,Object? scale = null,})
function toJson (line 2035) | Map<String, dynamic> toJson()
function toString (line 2048) | String toString()
class $ThemePropsCopyWith (line 2056) | abstract mixin class $ThemePropsCopyWith<$Res> {
method call (line 2059) | $Res call({
class _$ThemePropsCopyWithImpl (line 2068) | class _$ThemePropsCopyWithImpl<$Res>
method call (line 2077) | $Res call({Object? primaryColor = freezed,Object? primaryColors = null...
function maybeMap (line 2115) | TResult maybeMap<TResult extends Object?>(TResult Function( _ThemeProps ...
function map (line 2137) | TResult map<TResult extends Object?>(TResult Function( _ThemeProps value...
function mapOrNull (line 2158) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _ThemePro...
function maybeWhen (line 2179) | TResult maybeWhen<TResult extends Object?>(TResult Function( int? primar...
function when (line 2200) | TResult when<TResult extends Object?>(TResult Function( int? primaryColo...
function whenOrNull (line 2220) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( int? pri...
class _ThemeProps (line 2232) | @JsonSerializable()
method toJson (line 2258) | Map<String, dynamic> toJson()
method toString (line 2272) | String toString()
class _$ThemePropsCopyWith (line 2280) | abstract mixin class _$ThemePropsCopyWith<$Res> implements $ThemePropsCo...
method call (line 2283) | $Res call({
class __$ThemePropsCopyWithImpl (line 2292) | class __$ThemePropsCopyWithImpl<$Res>
method call (line 2301) | $Res call({Object? primaryColor = freezed,Object? primaryColors = null...
function toJson (line 2337) | Map<String, dynamic> toJson()
function toString (line 2350) | String toString()
class $ConfigCopyWith (line 2358) | abstract mixin class $ConfigCopyWith<$Res> {
method call (line 2361) | $Res call({
class _$ConfigCopyWithImpl (line 2370) | class _$ConfigCopyWithImpl<$Res>
method call (line 2379) | $Res call({Object? currentProfileId = freezed,Object? overrideDns = nu...
function maybeMap (line 2488) | TResult maybeMap<TResult extends Object?>(TResult Function( _Config valu...
function map (line 2510) | TResult map<TResult extends Object?>(TResult Function( _Config value) $...
function mapOrNull (line 2531) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Config v...
function maybeWhen (line 2552) | TResult maybeWhen<TResult extends Object?>(TResult Function( int? curren...
function when (line 2573) | TResult when<TResult extends Object?>(TResult Function( int? currentProf...
function whenOrNull (line 2593) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( int? cur...
class _Config (line 2605) | @JsonSerializable()
method toJson (line 2636) | Map<String, dynamic> toJson()
method toString (line 2650) | String toString()
class _$ConfigCopyWith (line 2658) | abstract mixin class _$ConfigCopyWith<$Res> implements $ConfigCopyWith<$...
method call (line 2661) | $Res call({
class __$ConfigCopyWithImpl (line 2670) | class __$ConfigCopyWithImpl<$Res>
method call (line 2679) | $Res call({Object? currentProfileId = freezed,Object? overrideDns = nu...
FILE: lib/models/generated/config.g.dart
function _$AppSettingPropsFromJson (line 9) | _AppSettingProps _$AppSettingPropsFromJson(Map<String, dynamic> json)
function _$AppSettingPropsToJson (line 40) | Map<String, dynamic> _$AppSettingPropsToJson(_AppSettingProps instance)
function _$AccessControlPropsFromJson (line 84) | _AccessControlProps _$AccessControlPropsFromJson(Map<String, dynamic> json)
function _$AccessControlPropsToJson (line 107) | Map<String, dynamic> _$AccessControlPropsToJson(_AccessControlProps inst...
function _$WindowPropsFromJson (line 129) | _WindowProps _$WindowPropsFromJson(Map<String, dynamic> json)
function _$WindowPropsToJson (line 136) | Map<String, dynamic> _$WindowPropsToJson(_WindowProps instance)
function _$VpnPropsFromJson (line 144) | _VpnProps _$VpnPropsFromJson(Map<String, dynamic> json)
function _$VpnPropsToJson (line 157) | Map<String, dynamic> _$VpnPropsToJson(_VpnProps instance)
function _$NetworkPropsFromJson (line 166) | _NetworkProps _$NetworkPropsFromJson(Map<String, dynamic> json)
function _$NetworkPropsToJson (line 181) | Map<String, dynamic> _$NetworkPropsToJson(_NetworkProps instance)
function _$ProxiesStylePropsFromJson (line 195) | _ProxiesStyleProps _$ProxiesStylePropsFromJson(Map<String, dynamic> json)
function _$ProxiesStylePropsToJson (line 214) | Map<String, dynamic> _$ProxiesStylePropsToJson(_ProxiesStyleProps instance)
function _$TextScaleFromJson (line 249) | _TextScale _$TextScaleFromJson(Map<String, dynamic> json)
function _$TextScaleToJson (line 254) | Map<String, dynamic> _$TextScaleToJson(_TextScale instance)
function _$ThemePropsFromJson (line 257) | _ThemeProps _$ThemePropsFromJson(Map<String, dynamic> json)
function _$ThemePropsToJson (line 279) | Map<String, dynamic> _$ThemePropsToJson(_ThemeProps instance)
function _$ConfigFromJson (line 307) | _Config _$ConfigFromJson(Map<String, dynamic> json)
function _$ConfigToJson (line 345) | Map<String, dynamic> _$ConfigToJson(_Config instance)
FILE: lib/models/generated/core.freezed.dart
function _$identity (line 13) | T _$identity<T>(T value)
function toJson (line 26) | Map<String, dynamic> toJson()
function toString (line 39) | String toString()
class $SetupParamsCopyWith (line 47) | abstract mixin class $SetupParamsCopyWith<$Res> {
method call (line 50) | $Res call({
class _$SetupParamsCopyWithImpl (line 59) | class _$SetupParamsCopyWithImpl<$Res>
method call (line 68) | $Res call({Object? selectedMap = null,Object? testUrl = null,})
function maybeMap (line 93) | TResult maybeMap<TResult extends Object?>(TResult Function( _SetupParams...
function map (line 115) | TResult map<TResult extends Object?>(TResult Function( _SetupParams valu...
function mapOrNull (line 136) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SetupPar...
function maybeWhen (line 157) | TResult maybeWhen<TResult extends Object?>(TResult Function(@JsonKey(nam...
function when (line 178) | TResult when<TResult extends Object?>(TResult Function(@JsonKey(name: 's...
function whenOrNull (line 198) | TResult? whenOrNull<TResult extends Object?>(TResult? Function(@JsonKey(...
class _SetupParams (line 210) | @JsonSerializable()
method toJson (line 232) | Map<String, dynamic> toJson()
method toString (line 246) | String toString()
class _$SetupParamsCopyWith (line 254) | abstract mixin class _$SetupParamsCopyWith<$Res> implements $SetupParams...
method call (line 257) | $Res call({
class __$SetupParamsCopyWithImpl (line 266) | class __$SetupParamsCopyWithImpl<$Res>
method call (line 275) | $Res call({Object? selectedMap = null,Object? testUrl = null,})
function toJson (line 298) | Map<String, dynamic> toJson()
function toString (line 311) | String toString()
class $UpdateParamsCopyWith (line 319) | abstract mixin class $UpdateParamsCopyWith<$Res> {
method call (line 322) | $Res call({
class _$UpdateParamsCopyWithImpl (line 331) | class _$UpdateParamsCopyWithImpl<$Res>
method call (line 340) | $Res call({Object? tun = null,Object? mixedPort = null,Object? allowLa...
function maybeMap (line 382) | TResult maybeMap<TResult extends Object?>(TResult Function( _UpdateParam...
function map (line 404) | TResult map<TResult extends Object?>(TResult Function( _UpdateParams val...
function mapOrNull (line 425) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _UpdatePa...
function maybeWhen (line 446) | TResult maybeWhen<TResult extends Object?>(TResult Function( Tun tun, @J...
function when (line 467) | TResult when<TResult extends Object?>(TResult Function( Tun tun, @JsonKe...
function whenOrNull (line 487) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( Tun tun,...
class _UpdateParams (line 499) | @JsonSerializable()
method toJson (line 523) | Map<String, dynamic> toJson()
method toString (line 537) | String toString()
class _$UpdateParamsCopyWith (line 545) | abstract mixin class _$UpdateParamsCopyWith<$Res> implements $UpdatePara...
method call (line 548) | $Res call({
class __$UpdateParamsCopyWithImpl (line 557) | class __$UpdateParamsCopyWithImpl<$Res>
method call (line 566) | $Res call({Object? tun = null,Object? mixedPort = null,Object? allowLa...
function toJson (line 606) | Map<String, dynamic> toJson()
function toString (line 619) | String toString()
class $VpnOptionsCopyWith (line 627) | abstract mixin class $VpnOptionsCopyWith<$Res> {
method call (line 630) | $Res call({
class _$VpnOptionsCopyWithImpl (line 639) | class _$VpnOptionsCopyWithImpl<$Res>
method call (line 648) | $Res call({Object? enable = null,Object? port = null,Object? ipv6 = nu...
function maybeMap (line 690) | TResult maybeMap<TResult extends Object?>(TResult Function( _VpnOptions ...
function map (line 712) | TResult map<TResult extends Object?>(TResult Function( _VpnOptions value...
function mapOrNull (line 733) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _VpnOptio...
function maybeWhen (line 754) | TResult maybeWhen<TResult extends Object?>(TResult Function( bool enable...
function when (line 775) | TResult when<TResult extends Object?>(TResult Function( bool enable, in...
function whenOrNull (line 795) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool ena...
class _VpnOptions (line 807) | @JsonSerializable()
method toJson (line 843) | Map<String, dynamic> toJson()
method toString (line 857) | String toString()
class _$VpnOptionsCopyWith (line 865) | abstract mixin class _$VpnOptionsCopyWith<$Res> implements $VpnOptionsCo...
method call (line 868) | $Res call({
class __$VpnOptionsCopyWithImpl (line 877) | class __$VpnOptionsCopyWithImpl<$Res>
method call (line 886) | $Res call({Object? enable = null,Object? port = null,Object? ipv6 = nu...
function toJson (line 926) | Map<String, dynamic> toJson()
function toString (line 939) | String toString()
class $InitParamsCopyWith (line 947) | abstract mixin class $InitParamsCopyWith<$Res> {
method call (line 950) | $Res call({
class _$InitParamsCopyWithImpl (line 959) | class _$InitParamsCopyWithImpl<$Res>
method call (line 968) | $Res call({Object? homeDir = null,Object? version = null,})
function maybeMap (line 993) | TResult maybeMap<TResult extends Object?>(TResult Function( _InitParams ...
function map (line 1015) | TResult map<TResult extends Object?>(TResult Function( _InitParams value...
function mapOrNull (line 1036) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _InitPara...
function maybeWhen (line 1057) | TResult maybeWhen<TResult extends Object?>(TResult Function(@JsonKey(nam...
function when (line 1078) | TResult when<TResult extends Object?>(TResult Function(@JsonKey(name: 'h...
function whenOrNull (line 1098) | TResult? whenOrNull<TResult extends Object?>(TResult? Function(@JsonKey(...
class _InitParams (line 1110) | @JsonSerializable()
method toJson (line 1126) | Map<String, dynamic> toJson()
method toString (line 1140) | String toString()
class _$InitParamsCopyWith (line 1148) | abstract mixin class _$InitParamsCopyWith<$Res> implements $InitParamsCo...
method call (line 1151) | $Res call({
class __$InitParamsCopyWithImpl (line 1160) | class __$InitParamsCopyWithImpl<$Res>
method call (line 1169) | $Res call({Object? homeDir = null,Object? version = null,})
function toJson (line 1192) | Map<String, dynamic> toJson()
function toString (line 1205) | String toString()
class $ChangeProxyParamsCopyWith (line 1213) | abstract mixin class $ChangeProxyParamsCopyWith<$Res> {
method call (line 1216) | $Res call({
class _$ChangeProxyParamsCopyWithImpl (line 1225) | class _$ChangeProxyParamsCopyWithImpl<$Res>
method call (line 1234) | $Res call({Object? groupName = null,Object? proxyName = null,})
function maybeMap (line 1259) | TResult maybeMap<TResult extends Object?>(TResult Function( _ChangeProxy...
function map (line 1281) | TResult map<TResult extends Object?>(TResult Function( _ChangeProxyParam...
function mapOrNull (line 1302) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _ChangePr...
function maybeWhen (line 1323) | TResult maybeWhen<TResult extends Object?>(TResult Function(@JsonKey(nam...
function when (line 1344) | TResult when<TResult extends Object?>(TResult Function(@JsonKey(name: 'g...
function whenOrNull (line 1364) | TResult? whenOrNull<TResult extends Object?>(TResult? Function(@JsonKey(...
class _ChangeProxyParams (line 1376) | @JsonSerializable()
method toJson (line 1392) | Map<String, dynamic> toJson()
method toString (line 1406) | String toString()
class _$ChangeProxyParamsCopyWith (line 1414) | abstract mixin class _$ChangeProxyParamsCopyWith<$Res> implements $Chang...
method call (line 1417) | $Res call({
class __$ChangeProxyParamsCopyWithImpl (line 1426) | class __$ChangeProxyParamsCopyWithImpl<$Res>
method call (line 1435) | $Res call({Object? groupName = null,Object? proxyName = null,})
function toJson (line 1458) | Map<String, dynamic> toJson()
function toString (line 1471) | String toString()
class $UpdateGeoDataParamsCopyWith (line 1479) | abstract mixin class $UpdateGeoDataParamsCopyWith<$Res> {
method call (line 1482) | $Res call({
class _$UpdateGeoDataParamsCopyWithImpl (line 1491) | class _$UpdateGeoDataParamsCopyWithImpl<$Res>
method call (line 1500) | $Res call({Object? geoType = null,Object? geoName = null,})
function maybeMap (line 1525) | TResult maybeMap<TResult extends Object?>(TResult Function( _UpdateGeoDa...
function map (line 1547) | TResult map<TResult extends Object?>(TResult Function( _UpdateGeoDataPar...
function mapOrNull (line 1568) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _UpdateGe...
function maybeWhen (line 1589) | TResult maybeWhen<TResult extends Object?>(TResult Function(@JsonKey(nam...
function when (line 1610) | TResult when<TResult extends Object?>(TResult Function(@JsonKey(name: 'g...
function whenOrNull (line 1630) | TResult? whenOrNull<TResult extends Object?>(TResult? Function(@JsonKey(...
class _UpdateGeoDataParams (line 1642) | @JsonSerializable()
method toJson (line 1658) | Map<String, dynamic> toJson()
method toString (line 1672) | String toString()
class _$UpdateGeoDataParamsCopyWith (line 1680) | abstract mixin class _$UpdateGeoDataParamsCopyWith<$Res> implements $Upd...
method call (line 1683) | $Res call({
class __$UpdateGeoDataParamsCopyWithImpl (line 1692) | class __$UpdateGeoDataParamsCopyWithImpl<$Res>
method call (line 1701) | $Res call({Object? geoType = null,Object? geoName = null,})
function toJson (line 1724) | Map<String, dynamic> toJson()
function toString (line 1737) | String toString()
class $CoreEventCopyWith (line 1745) | abstract mixin class $CoreEventCopyWith<$Res> {
method call (line 1748) | $Res call({
class _$CoreEventCopyWithImpl (line 1757) | class _$CoreEventCopyWithImpl<$Res>
method call (line 1766) | $Res call({Object? type = null,Object? data = freezed,})
function maybeMap (line 1791) | TResult maybeMap<TResult extends Object?>(TResult Function( _CoreEvent v...
function map (line 1813) | TResult map<TResult extends Object?>(TResult Function( _CoreEvent value)...
function mapOrNull (line 1834) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _CoreEven...
function maybeWhen (line 1855) | TResult maybeWhen<TResult extends Object?>(TResult Function( CoreEventTy...
function when (line 1876) | TResult when<TResult extends Object?>(TResult Function( CoreEventType ty...
function whenOrNull (line 1896) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( CoreEven...
class _CoreEvent (line 1908) | @JsonSerializable()
method toJson (line 1924) | Map<String, dynamic> toJson()
method toString (line 1938) | String toString()
class _$CoreEventCopyWith (line 1946) | abstract mixin class _$CoreEventCopyWith<$Res> implements $CoreEventCopy...
method call (line 1949) | $Res call({
class __$CoreEventCopyWithImpl (line 1958) | class __$CoreEventCopyWithImpl<$Res>
method call (line 1967) | $Res call({Object? type = null,Object? data = freezed,})
function toJson (line 1990) | Map<String, dynamic> toJson()
function toString (line 2003) | String toString()
class $InvokeMessageCopyWith (line 2011) | abstract mixin class $InvokeMessageCopyWith<$Res> {
method call (line 2014) | $Res call({
class _$InvokeMessageCopyWithImpl (line 2023) | class _$InvokeMessageCopyWithImpl<$Res>
method call (line 2032) | $Res call({Object? type = null,Object? data = freezed,})
function maybeMap (line 2057) | TResult maybeMap<TResult extends Object?>(TResult Function( _InvokeMessa...
function map (line 2079) | TResult map<TResult extends Object?>(TResult Function( _InvokeMessage va...
function mapOrNull (line 2100) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _InvokeMe...
function maybeWhen (line 2121) | TResult maybeWhen<TResult extends Object?>(TResult Function( InvokeMessa...
function when (line 2142) | TResult when<TResult extends Object?>(TResult Function( InvokeMessageTyp...
function whenOrNull (line 2162) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( InvokeMe...
class _InvokeMessage (line 2174) | @JsonSerializable()
method toJson (line 2190) | Map<String, dynamic> toJson()
method toString (line 2204) | String toString()
class _$InvokeMessageCopyWith (line 2212) | abstract mixin class _$InvokeMessageCopyWith<$Res> implements $InvokeMes...
method call (line 2215) | $Res call({
class __$InvokeMessageCopyWithImpl (line 2224) | class __$InvokeMessageCopyWithImpl<$Res>
method call (line 2233) | $Res call({Object? type = null,Object? data = freezed,})
function toJson (line 2256) | Map<String, dynamic> toJson()
function toString (line 2269) | String toString()
class $DelayCopyWith (line 2277) | abstract mixin class $DelayCopyWith<$Res> {
method call (line 2280) | $Res call({
class _$DelayCopyWithImpl (line 2289) | class _$DelayCopyWithImpl<$Res>
method call (line 2298) | $Res call({Object? name = null,Object? url = null,Object? value = free...
function maybeMap (line 2324) | TResult maybeMap<TResult extends Object?>(TResult Function( _Delay value...
function map (line 2346) | TResult map<TResult extends Object?>(TResult Function( _Delay value) $d...
function mapOrNull (line 2367) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Delay va...
function maybeWhen (line 2388) | TResult maybeWhen<TResult extends Object?>(TResult Function( String name...
function when (line 2409) | TResult when<TResult extends Object?>(TResult Function( String name, St...
function whenOrNull (line 2429) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String n...
class _Delay (line 2441) | @JsonSerializable()
method toJson (line 2458) | Map<String, dynamic> toJson()
method toString (line 2472) | String toString()
class _$DelayCopyWith (line 2480) | abstract mixin class _$DelayCopyWith<$Res> implements $DelayCopyWith<$Re...
method call (line 2483) | $Res call({
class __$DelayCopyWithImpl (line 2492) | class __$DelayCopyWithImpl<$Res>
method call (line 2501) | $Res call({Object? name = null,Object? url = null,Object? value = free...
function toJson (line 2525) | Map<String, dynamic> toJson()
function toString (line 2538) | String toString()
class $NowCopyWith (line 2546) | abstract mixin class $NowCopyWith<$Res> {
method call (line 2549) | $Res call({
class _$NowCopyWithImpl (line 2558) | class _$NowCopyWithImpl<$Res>
method call (line 2567) | $Res call({Object? name = null,Object? value = null,})
function maybeMap (line 2592) | TResult maybeMap<TResult extends Object?>(TResult Function( _Now value)?...
function map (line 2614) | TResult map<TResult extends Object?>(TResult Function( _Now value) $def...
function mapOrNull (line 2635) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Now valu...
function maybeWhen (line 2656) | TResult maybeWhen<TResult extends Object?>(TResult Function( String name...
function when (line 2677) | TResult when<TResult extends Object?>(TResult Function( String name, St...
function whenOrNull (line 2697) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String n...
class _Now (line 2709) | @JsonSerializable()
method toJson (line 2725) | Map<String, dynamic> toJson()
method toString (line 2739) | String toString()
class _$NowCopyWith (line 2747) | abstract mixin class _$NowCopyWith<$Res> implements $NowCopyWith<$Res> {
method call (line 2750) | $Res call({
class __$NowCopyWithImpl (line 2759) | class __$NowCopyWithImpl<$Res>
method call (line 2768) | $Res call({Object? name = null,Object? value = null,})
function toJson (line 2791) | Map<String, dynamic> toJson()
function toString (line 2804) | String toString()
class $ProviderSubscriptionInfoCopyWith (line 2812) | abstract mixin class $ProviderSubscriptionInfoCopyWith<$Res> {
method call (line 2815) | $Res call({
class _$ProviderSubscriptionInfoCopyWithImpl (line 2824) | class _$ProviderSubscriptionInfoCopyWithImpl<$Res>
method call (line 2833) | $Res call({Object? upload = null,Object? download = null,Object? total...
function maybeMap (line 2860) | TResult maybeMap<TResult extends Object?>(TResult Function( _ProviderSub...
function map (line 2882) | TResult map<TResult extends Object?>(TResult Function( _ProviderSubscrip...
function mapOrNull (line 2903) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Provider...
function maybeWhen (line 2924) | TResult maybeWhen<TResult extends Object?>(TResult Function(@JsonKey(nam...
function when (line 2945) | TResult when<TResult extends Object?>(TResult Function(@JsonKey(name: 'U...
function whenOrNull (line 2965) | TResult? whenOrNull<TResult extends Object?>(TResult? Function(@JsonKey(...
class _ProviderSubscriptionInfo (line 2977) | @JsonSerializable()
method toJson (line 2995) | Map<String, dynamic> toJson()
method toString (line 3009) | String toString()
class _$ProviderSubscriptionInfoCopyWith (line 3017) | abstract mixin class _$ProviderSubscriptionInfoCopyWith<$Res> implements...
method call (line 3020) | $Res call({
class __$ProviderSubscriptionInfoCopyWithImpl (line 3029) | class __$ProviderSubscriptionInfoCopyWithImpl<$Res>
method call (line 3038) | $Res call({Object? upload = null,Object? download = null,Object? total...
function toJson (line 3063) | Map<String, dynamic> toJson()
function toString (line 3076) | String toString()
class $ExternalProviderCopyWith (line 3084) | abstract mixin class $ExternalProviderCopyWith<$Res> {
method call (line 3087) | $Res call({
class _$ExternalProviderCopyWithImpl (line 3096) | class _$ExternalProviderCopyWithImpl<$Res>
method call (line 3105) | $Res call({Object? name = null,Object? type = null,Object? path = free...
function maybeMap (line 3147) | TResult maybeMap<TResult extends Object?>(TResult Function( _ExternalPro...
function map (line 3169) | TResult map<TResult extends Object?>(TResult Function( _ExternalProvider...
function mapOrNull (line 3190) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _External...
function maybeWhen (line 3211) | TResult maybeWhen<TResult extends Object?>(TResult Function( String name...
function when (line 3232) | TResult when<TResult extends Object?>(TResult Function( String name, St...
function whenOrNull (line 3252) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( String n...
class _ExternalProvider (line 3264) | @JsonSerializable()
method toJson (line 3285) | Map<String, dynamic> toJson()
method toString (line 3299) | String toString()
class _$ExternalProviderCopyWith (line 3307) | abstract mixin class _$ExternalProviderCopyWith<$Res> implements $Extern...
method call (line 3310) | $Res call({
class __$ExternalProviderCopyWithImpl (line 3319) | class __$ExternalProviderCopyWithImpl<$Res>
method call (line 3328) | $Res call({Object? name = null,Object? type = null,Object? path = free...
function toJson (line 3368) | Map<String, dynamic> toJson()
function toString (line 3381) | String toString()
class $ActionCopyWith (line 3389) | abstract mixin class $ActionCopyWith<$Res> {
method call (line 3392) | $Res call({
class _$ActionCopyWithImpl (line 3401) | class _$ActionCopyWithImpl<$Res>
method call (line 3410) | $Res call({Object? method = null,Object? data = freezed,Object? id = n...
function maybeMap (line 3436) | TResult maybeMap<TResult extends Object?>(TResult Function( _Action valu...
function map (line 3458) | TResult map<TResult extends Object?>(TResult Function( _Action value) $...
function mapOrNull (line 3479) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Action v...
function maybeWhen (line 3500) | TResult maybeWhen<TResult extends Object?>(TResult Function( ActionMetho...
function when (line 3521) | TResult when<TResult extends Object?>(TResult Function( ActionMethod met...
function whenOrNull (line 3541) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( ActionMe...
class _Action (line 3553) | @JsonSerializable()
method toJson (line 3570) | Map<String, dynamic> toJson()
method toString (line 3584) | String toString()
class _$ActionCopyWith (line 3592) | abstract mixin class _$ActionCopyWith<$Res> implements $ActionCopyWith<$...
method call (line 3595) | $Res call({
class __$ActionCopyWithImpl (line 3604) | class __$ActionCopyWithImpl<$Res>
method call (line 3613) | $Res call({Object? method = null,Object? data = freezed,Object? id = n...
function toJson (line 3637) | Map<String, dynamic> toJson()
function toString (line 3650) | String toString()
class $ProxiesDataCopyWith (line 3658) | abstract mixin class $ProxiesDataCopyWith<$Res> {
method call (line 3661) | $Res call({
class _$ProxiesDataCopyWithImpl (line 3670) | class _$ProxiesDataCopyWithImpl<$Res>
method call (line 3679) | $Res call({Object? proxies = null,Object? all = null,})
function maybeMap (line 3704) | TResult maybeMap<TResult extends Object?>(TResult Function( _ProxiesData...
function map (line 3726) | TResult map<TResult extends Object?>(TResult Function( _ProxiesData valu...
function mapOrNull (line 3747) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _ProxiesD...
function maybeWhen (line 3768) | TResult maybeWhen<TResult extends Object?>(TResult Function( Map<String,...
function when (line 3789) | TResult when<TResult extends Object?>(TResult Function( Map<String, dyna...
function whenOrNull (line 3809) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( Map<Stri...
class _ProxiesData (line 3821) | @JsonSerializable()
method toJson (line 3849) | Map<String, dynamic> toJson()
method toString (line 3863) | String toString()
class _$ProxiesDataCopyWith (line 3871) | abstract mixin class _$ProxiesDataCopyWith<$Res> implements $ProxiesData...
method call (line 3874) | $Res call({
class __$ProxiesDataCopyWithImpl (line 3883) | class __$ProxiesDataCopyWithImpl<$Res>
method call (line 3892) | $Res call({Object? proxies = null,Object? all = null,})
function toJson (line 3915) | Map<String, dynamic> toJson()
function toString (line 3928) | String toString()
class $ActionResultCopyWith (line 3936) | abstract mixin class $ActionResultCopyWith<$Res> {
method call (line 3939) | $Res call({
class _$ActionResultCopyWithImpl (line 3948) | class _$ActionResultCopyWithImpl<$Res>
method call (line 3957) | $Res call({Object? method = null,Object? data = freezed,Object? id = f...
function maybeMap (line 3984) | TResult maybeMap<TResult extends Object?>(TResult Function( _ActionResul...
function map (line 4006) | TResult map<TResult extends Object?>(TResult Function( _ActionResult val...
function mapOrNull (line 4027) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _ActionRe...
function maybeWhen (line 4048) | TResult maybeWhen<TResult extends Object?>(TResult Function( ActionMetho...
function when (line 4069) | TResult when<TResult extends Object?>(TResult Function( ActionMethod met...
function whenOrNull (line 4089) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( ActionMe...
class _ActionResult (line 4101) | @JsonSerializable()
method toJson (line 4119) | Map<String, dynamic> toJson()
method toString (line 4133) | String toString()
class _$ActionResultCopyWith (line 4141) | abstract mixin class _$ActionResultCopyWith<$Res> implements $ActionResu...
method call (line 4144) | $Res call({
class __$ActionResultCopyWithImpl (line 4153) | class __$ActionResultCopyWithImpl<$Res>
method call (line 4162) | $Res call({Object? method = null,Object? data = freezed,Object? id = f...
FILE: lib/models/generated/core.g.dart
function _$SetupParamsFromJson (line 9) | _SetupParams _$SetupParamsFromJson(Map<String, dynamic> json)
function _$SetupParamsToJson (line 14) | Map<String, dynamic> _$SetupParamsToJson(_SetupParams instance)
function _$UpdateParamsFromJson (line 20) | _UpdateParams _$UpdateParamsFromJson(Map<String, dynamic> json)
function _$UpdateParamsToJson (line 40) | Map<String, dynamic> _$UpdateParamsToJson(_UpdateParams instance)
function _$VpnOptionsFromJson (line 79) | _VpnOptions _$VpnOptionsFromJson(Map<String, dynamic> json)
function _$VpnOptionsToJson (line 100) | Map<String, dynamic> _$VpnOptionsToJson(_VpnOptions instance)
function _$InitParamsFromJson (line 114) | _InitParams _$InitParamsFromJson(Map<String, dynamic> json)
function _$InitParamsToJson (line 119) | Map<String, dynamic> _$InitParamsToJson(_InitParams instance)
function _$ChangeProxyParamsFromJson (line 125) | _ChangeProxyParams _$ChangeProxyParamsFromJson(Map<String, dynamic> json)
function _$ChangeProxyParamsToJson (line 131) | Map<String, dynamic> _$ChangeProxyParamsToJson(_ChangeProxyParams instance)
function _$UpdateGeoDataParamsFromJson (line 137) | _UpdateGeoDataParams _$UpdateGeoDataParamsFromJson(Map<String, dynamic> ...
function _$UpdateGeoDataParamsToJson (line 143) | Map<String, dynamic> _$UpdateGeoDataParamsToJson(
function _$CoreEventFromJson (line 150) | _CoreEvent _$CoreEventFromJson(Map<String, dynamic> json)
function _$CoreEventToJson (line 155) | Map<String, dynamic> _$CoreEventToJson(_CoreEvent instance)
function _$InvokeMessageFromJson (line 169) | _InvokeMessage _$InvokeMessageFromJson(Map<String, dynamic> json)
function _$InvokeMessageToJson (line 175) | Map<String, dynamic> _$InvokeMessageToJson(_InvokeMessage instance)
function _$DelayFromJson (line 186) | _Delay _$DelayFromJson(Map<String, dynamic> json)
function _$DelayToJson (line 192) | Map<String, dynamic> _$DelayToJson(_Delay instance)
function _$NowFromJson (line 198) | _Now _$NowFromJson(Map<String, dynamic> json)
function _$NowToJson (line 201) | Map<String, dynamic> _$NowToJson(_Now instance)
function _$ProviderSubscriptionInfoFromJson (line 206) | _ProviderSubscriptionInfo _$ProviderSubscriptionInfoFromJson(
function _$ProviderSubscriptionInfoToJson (line 215) | Map<String, dynamic> _$ProviderSubscriptionInfoToJson(
function _$ExternalProviderFromJson (line 224) | _ExternalProvider _$ExternalProviderFromJson(Map<String, dynamic> json)
function _$ExternalProviderToJson (line 237) | Map<String, dynamic> _$ExternalProviderToJson(_ExternalProvider instance)
function _$ActionFromJson (line 248) | _Action _$ActionFromJson(Map<String, dynamic> json)
function _$ActionToJson (line 254) | Map<String, dynamic> _$ActionToJson(_Action instance)
function _$ProxiesDataFromJson (line 302) | _ProxiesData _$ProxiesDataFromJson(Map<String, dynamic> json)
function _$ProxiesDataToJson (line 307) | Map<String, dynamic> _$ProxiesDataToJson(_ProxiesData instance)
function _$ActionResultFromJson (line 310) | _ActionResult _$ActionResultFromJson(Map<String, dynamic> json)
function _$ActionResultToJson (line 320) | Map<String, dynamic> _$ActionResultToJson(_ActionResult instance)
FILE: lib/models/generated/profile.freezed.dart
function _$identity (line 13) | T _$identity<T>(T value)
function toJson (line 26) | Map<String, dynamic> toJson()
function toString (line 39) | String toString()
class $SubscriptionInfoCopyWith (line 47) | abstract mixin class $SubscriptionInfoCopyWith<$Res> {
method call (line 50) | $Res call({
class _$SubscriptionInfoCopyWithImpl (line 59) | class _$SubscriptionInfoCopyWithImpl<$Res>
method call (line 68) | $Res call({Object? upload = null,Object? download = null,Object? total...
function maybeMap (line 95) | TResult maybeMap<TResult extends Object?>(TResult Function( _Subscriptio...
function map (line 117) | TResult map<TResult extends Object?>(TResult Function( _SubscriptionInfo...
function mapOrNull (line 138) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Subscrip...
function maybeWhen (line 159) | TResult maybeWhen<TResult extends Object?>(TResult Function( int upload,...
function when (line 180) | TResult when<TResult extends Object?>(TResult Function( int upload, int...
function whenOrNull (line 200) | TResult? whenOrNull<TResult extends Object?>(TResult? Function( int uplo...
class _SubscriptionInfo (line 212) | @JsonSerializable()
method toJson (line 230) | Map<String, dynamic> toJson()
method toString (line 244) | String toString()
class _$SubscriptionInfoCopyWith (line 252) | abstract mixin class _$SubscriptionInfoCopyWith<$Res> implements $Subscr...
method call (line 255) | $Res call({
class __$SubscriptionInfoCopyWithImpl (line 264) | class __$SubscriptionInfoCopyWithImpl<$Res>
method call (line 273) | $Res call({Object? upload = null,Object? download = null,Object? total...
function toJson (line 298) | Map<String, dynamic> toJson()
function toString (line 311) | String toString()
class $ProfileCopyWith (line 319) | abstract mixin class $ProfileCopyWith<$Res> {
method call (line 322) | $Res call({
class _$ProfileCopyWithImpl (line 331) | class _$ProfileCopyWithImpl<$Res>
method call (line 340) | $Res call({Object? id = null,Object? label = null,Object? currentGroup...
function maybeMap (line 388) | TResult maybeMap<TResult extends Object?>(TResult Function( _Profile val...
function map (line 410) | TResult map<TResult extends Object?>(TResult Function( _Profile value) ...
function mapOrNull (line 431) | TResult? mapOrNull<TResult extends Object?>(TResult? Function( _Profile ...
function maybeWhen (line 452) | TResult maybeWhen<TResult exten
Condensed preview — 437 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,372K chars).
[
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 2322,
"preview": "name: 问题反馈 / Bug report\ntitle: \"[BUG] \"\ndescription: 反馈你遇到的问题 / Report the issue you are experiencing\n\nbody:\n - type: m"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 173,
"preview": "contact_links:\n - name: 讨论交流 / Communication\n url: https://t.me/+G-veVtwBOl4wODc1\n about: 在 Telegram 群组中与其他用户讨论交流"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yml",
"chars": 1674,
"preview": "name: 功能请求 / Feature request\ntitle: \"[Feature] \"\ndescription: 提出你的功能请求 / Propose your feature request\n\nbody:\n - type: m"
},
{
"path": ".github/release_template.md",
"chars": 3033,
"preview": "<div align=center>\n\n[ }}\n\njobs:\n build:\n "
},
{
"path": ".gitignore",
"chars": 1086,
"preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.build/\n.buildlog/\n.history\n.svn/\n.swiftpm/\nmigrate_working_d"
},
{
"path": ".gitmodules",
"chars": 401,
"preview": "[submodule \"core/Clash.Meta\"]\n\tpath = core/Clash.Meta\n\turl = git@github.com:chen08209/Clash.Meta.git\n\tbranch = FlClash\n["
},
{
"path": ".metadata",
"chars": 968,
"preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
},
{
"path": ".run/main.dart.run.xml",
"chars": 355,
"preview": "<component name=\"ProjectRunConfigurationManager\">\n <configuration default=\"false\" name=\"main.dart\" type=\"FlutterRunConf"
},
{
"path": "CHANGELOG.md",
"chars": 12664,
"preview": "## v0.8.92\n\n- Add sqlite store\n\n- Optimize android quick action\n\n- Optimize backup and restore\n\n- Optimize more details\n"
},
{
"path": "LICENSE",
"chars": 35149,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 3216,
"preview": "<div>\n\n[**简体中文**](README_zh_CN.md)\n\n</div>\n\n## FlClash\n\n[\n\n</div>\n\n## FlClash\n\n[\n mavenCentral()\n }\n}\n\nval newBuildDir: Directory =\n rootP"
},
{
"path": "android/common/.gitignore",
"chars": 6,
"preview": "/build"
},
{
"path": "android/common/build.gradle.kts",
"chars": 987,
"preview": "import org.jetbrains.kotlin.gradle.dsl.JvmTarget\n\nplugins {\n id(\"com.android.library\")\n id(\"org.jetbrains.kotlin.a"
},
{
"path": "android/common/src/main/AndroidManifest.xml",
"chars": 341,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n <permi"
},
{
"path": "android/common/src/main/java/com/follow/clash/common/Components.kt",
"chars": 462,
"preview": "package com.follow.clash.common\n\nimport android.content.ComponentName\n\nobject Components {\n const val PACKAGE_NAME = "
},
{
"path": "android/common/src/main/java/com/follow/clash/common/Enums.kt",
"chars": 373,
"preview": "package com.follow.clash.common\n\nimport com.google.gson.annotations.SerializedName\n\n\nenum class QuickAction {\n STOP,\n"
},
{
"path": "android/common/src/main/java/com/follow/clash/common/Ext.kt",
"chars": 7756,
"preview": "package com.follow.clash.common\n\nimport android.annotation.SuppressLint\nimport android.app.ActivityManager\nimport androi"
},
{
"path": "android/common/src/main/java/com/follow/clash/common/GlobalState.kt",
"chars": 1190,
"preview": "package com.follow.clash.common\n\n\nimport android.app.Application\nimport android.util.Log\nimport com.google.firebase.Fire"
},
{
"path": "android/common/src/main/java/com/follow/clash/common/Service.kt",
"chars": 2487,
"preview": "package com.follow.clash.common\n\nimport android.content.Intent\nimport android.os.IBinder\nimport kotlinx.coroutines.Corou"
},
{
"path": "android/common/src/main/java/com/follow/clash/common/Utils.kt",
"chars": 336,
"preview": "package com.follow.clash.common\n\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coro"
},
{
"path": "android/common/src/main/res/values/strings.xml",
"chars": 108,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"FlClash\">FlClash</string>\n</resources>\n"
},
{
"path": "android/core/.gitignore",
"chars": 6,
"preview": "/build"
},
{
"path": "android/core/build.gradle.kts",
"chars": 1676,
"preview": "import org.jetbrains.kotlin.gradle.dsl.JvmTarget\n\nplugins {\n id(\"com.android.library\")\n id(\"org.jetbrains.kotlin.a"
},
{
"path": "android/core/src/main/AndroidManifest.xml",
"chars": 188,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n <uses-"
},
{
"path": "android/core/src/main/cpp/CMakeLists.txt",
"chars": 1176,
"preview": "cmake_minimum_required(VERSION 3.22.1)\n\nproject(\"core\")\n\nmessage(\"CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR}\")\n\nmessage(\"CMAKE"
},
{
"path": "android/core/src/main/cpp/core.cpp",
"chars": 6513,
"preview": "#include <jni.h>\n\n#ifdef LIBCLASH\n\n#include \"jni_helper.h\"\n#include \"libclash.h\"\n#include \"bride.h\"\n\nextern \"C\"\nJNIEXPOR"
},
{
"path": "android/core/src/main/cpp/jni_helper.cpp",
"chars": 1998,
"preview": "#include \"jni_helper.h\"\n\n#include <cstdlib>\n#include <malloc.h>\n#include <cstring>\n\nstatic JavaVM *global_vm;\n\nstatic jc"
},
{
"path": "android/core/src/main/cpp/jni_helper.h",
"chars": 1066,
"preview": "#pragma once\n\n#include <jni.h>\n\nstruct scoped_jni {\n JNIEnv *env;\n int require_release;\n};\n\nextern void initialize"
},
{
"path": "android/core/src/main/java/com/follow/clash/core/Core.kt",
"chars": 3255,
"preview": "package com.follow.clash.core\n\nimport java.net.InetAddress\nimport java.net.InetSocketAddress\nimport java.net.URL\n\ndata o"
},
{
"path": "android/core/src/main/java/com/follow/clash/core/InvokeInterface.kt",
"chars": 133,
"preview": "package com.follow.clash.core\n\nimport androidx.annotation.Keep\n\n@Keep\ninterface InvokeInterface {\n fun onResult(resul"
},
{
"path": "android/core/src/main/java/com/follow/clash/core/TunInterface.kt",
"chars": 210,
"preview": "package com.follow.clash.core\n\nimport androidx.annotation.Keep\n\n@Keep\ninterface TunInterface {\n fun protect(fd: Int)\n"
},
{
"path": "android/gradle/libs.versions.toml",
"chars": 1384,
"preview": "[versions]\n#agp = \"8.10.1\"\nfirebaseBom = \"34.2.0\"\nminSdk = \"23\"\ntargetSdk = \"36\"\ncompileSdk = \"36\"\nndkVersion = \"28.0.13"
},
{
"path": "android/gradle/wrapper/gradle-wrapper.properties",
"chars": 202,
"preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dist"
},
{
"path": "android/gradle.properties",
"chars": 79,
"preview": "org.gradle.jvmargs=-Xmx4G\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n"
},
{
"path": "android/service/.gitignore",
"chars": 6,
"preview": "/build"
},
{
"path": "android/service/build.gradle.kts",
"chars": 940,
"preview": "import org.jetbrains.kotlin.gradle.dsl.JvmTarget\n\nplugins {\n id(\"com.android.library\")\n id(\"org.jetbrains.kotlin.a"
},
{
"path": "android/service/src/main/AndroidManifest.xml",
"chars": 1764,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n <uses-"
},
{
"path": "android/service/src/main/aidl/com/follow/clash/service/IAckInterface.aidl",
"chars": 156,
"preview": "// IAckInterface.aidl\npackage com.follow.clash.service;\n\nimport com.follow.clash.service.IAckInterface;\n\ninterface IAckI"
},
{
"path": "android/service/src/main/aidl/com/follow/clash/service/ICallbackInterface.aidl",
"chars": 227,
"preview": "// ICallbackInterface.aidl\npackage com.follow.clash.service;\n\nimport com.follow.clash.service.IAckInterface;\n\ninterface "
},
{
"path": "android/service/src/main/aidl/com/follow/clash/service/IEventInterface.aidl",
"chars": 234,
"preview": "// IEventInterface.aidl\npackage com.follow.clash.service;\n\nimport com.follow.clash.service.IAckInterface;\n\ninterface IEv"
},
{
"path": "android/service/src/main/aidl/com/follow/clash/service/IRemoteInterface.aidl",
"chars": 936,
"preview": "// IRemoteInterface.aidl\npackage com.follow.clash.service;\n\nimport com.follow.clash.service.ICallbackInterface;\nimport c"
},
{
"path": "android/service/src/main/aidl/com/follow/clash/service/IResultInterface.aidl",
"chars": 133,
"preview": "// IResultInterface.aidl\npackage com.follow.clash.service;\n\ninterface IResultInterface {\n oneway void onResult(in lon"
},
{
"path": "android/service/src/main/aidl/com/follow/clash/service/IVoidInterface.aidl",
"chars": 112,
"preview": "// IVoidInterface.aidl\npackage com.follow.clash.service;\n\ninterface IVoidInterface {\n oneway void invoke();\n}"
},
{
"path": "android/service/src/main/aidl/com/follow/clash/service/models/AccessControl.aidl",
"chars": 88,
"preview": "//AccessControl.aidl\npackage com.follow.clash.service.models;\n\nparcelable AccessControl;"
},
{
"path": "android/service/src/main/aidl/com/follow/clash/service/models/NotificationParams.aidl",
"chars": 98,
"preview": "//NotificationParams.aidl\npackage com.follow.clash.service.models;\n\nparcelable NotificationParams;"
},
{
"path": "android/service/src/main/aidl/com/follow/clash/service/models/VpnOptions.aidl",
"chars": 137,
"preview": "//VpnOptions.aidl\npackage com.follow.clash.service.models;\n\nimport com.follow.clash.service.models.AccessControl;\n\nparce"
},
{
"path": "android/service/src/main/java/com/follow/clash/service/CommonService.kt",
"chars": 1524,
"preview": "package com.follow.clash.service\n\nimport android.app.Service\nimport android.content.Intent\nimport android.os.Binder\nimpo"
},
{
"path": "android/service/src/main/java/com/follow/clash/service/FilesProvider.kt",
"chars": 4001,
"preview": "package com.follow.clash.service\n\nimport android.database.Cursor\nimport android.database.MatrixCursor\nimport android.os."
},
{
"path": "android/service/src/main/java/com/follow/clash/service/IBaseService.kt",
"chars": 492,
"preview": "package com.follow.clash.service\n\nimport com.follow.clash.common.BroadcastAction\nimport com.follow.clash.common.GlobalSt"
},
{
"path": "android/service/src/main/java/com/follow/clash/service/RemoteService.kt",
"chars": 7278,
"preview": "package com.follow.clash.service\n\nimport android.app.Service\nimport android.content.Intent\nimport android.os.IBinder\nimp"
},
{
"path": "android/service/src/main/java/com/follow/clash/service/State.kt",
"chars": 625,
"preview": "package com.follow.clash.service\n\nimport android.content.Intent\nimport com.follow.clash.common.ServiceDelegate\nimport co"
},
{
"path": "android/service/src/main/java/com/follow/clash/service/VpnService.kt",
"chars": 8461,
"preview": "package com.follow.clash.service\n\nimport android.content.Intent\nimport android.net.ConnectivityManager\nimport android.ne"
},
{
"path": "android/service/src/main/java/com/follow/clash/service/models/NotificationParams.kt",
"chars": 278,
"preview": "package com.follow.clash.service.models\n\nimport android.os.Parcelable\nimport kotlinx.parcelize.Parcelize\n\n@Parcelize\ndat"
},
{
"path": "android/service/src/main/java/com/follow/clash/service/models/Traffic.kt",
"chars": 661,
"preview": "package com.follow.clash.service.models\n\nimport com.follow.clash.common.GlobalState\nimport com.follow.clash.common.forma"
},
{
"path": "android/service/src/main/java/com/follow/clash/service/models/VpnOptions.kt",
"chars": 2151,
"preview": "package com.follow.clash.service.models\n\nimport android.os.Parcelable\nimport com.follow.clash.common.AccessControlMode\ni"
},
{
"path": "android/service/src/main/java/com/follow/clash/service/modules/Module.kt",
"chars": 341,
"preview": "package com.follow.clash.service.modules\n\nabstract class Module {\n\n private var isInstall: Boolean = false\n\n prote"
},
{
"path": "android/service/src/main/java/com/follow/clash/service/modules/ModuleLoader.kt",
"chars": 1409,
"preview": "package com.follow.clash.service.modules\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers"
},
{
"path": "android/service/src/main/java/com/follow/clash/service/modules/NetworkObserveModule.kt",
"chars": 5252,
"preview": "package com.follow.clash.service.modules\n\nimport android.app.Service\nimport android.net.ConnectivityManager\nimport andro"
},
{
"path": "android/service/src/main/java/com/follow/clash/service/modules/NotificationModule.kt",
"chars": 4491,
"preview": "package com.follow.clash.service.modules\n\nimport android.app.Notification.FOREGROUND_SERVICE_IMMEDIATE\nimport android.ap"
},
{
"path": "android/service/src/main/java/com/follow/clash/service/modules/SuspendModule.kt",
"chars": 1694,
"preview": "package com.follow.clash.service.modules\n\nimport android.app.Service\nimport android.content.Intent\nimport android.os.Pow"
},
{
"path": "android/service/src/main/res/drawable/ic.xml",
"chars": 1120,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:tools=\"http://schemas.android.com/tools\"\n "
},
{
"path": "android/service/src/main/res/drawable/ic_service.xml",
"chars": 1120,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:tools=\"http://schemas.android.com/tools\"\n "
},
{
"path": "android/settings.gradle.kts",
"chars": 973,
"preview": "pluginManagement {\n val flutterSdkPath =\n run {\n val properties = java.util.Properties()\n "
},
{
"path": "arb/intl_en.arb",
"chars": 19197,
"preview": "{\n \"rule\": \"Rule\",\n \"global\": \"Global\",\n \"direct\": \"Direct\",\n \"dashboard\": \"Dashboard\",\n \"proxies\": \"Proxies\",\n \"p"
},
{
"path": "arb/intl_ja.arb",
"chars": 14552,
"preview": "{\n \"rule\": \"ルール\",\n \"global\": \"グローバル\",\n \"direct\": \"ダイレクト\",\n \"dashboard\": \"ダッシュボード\",\n \"proxies\": \"プロキシ\",\n \"profile\":"
},
{
"path": "arb/intl_ru.arb",
"chars": 21998,
"preview": "{\n \"rule\": \"Правило\",\n \"global\": \"Глобальный\",\n \"direct\": \"Прямой\",\n \"dashboard\": \"Панель управления\",\n \"proxies\": "
},
{
"path": "arb/intl_zh_CN.arb",
"chars": 13039,
"preview": "{\n \"rule\": \"规则\",\n \"global\": \"全局\",\n \"direct\": \"直连\",\n \"dashboard\": \"仪表盘\",\n \"proxies\": \"代理\",\n \"profile\": \"配置\",\n \"pro"
},
{
"path": "build.yaml",
"chars": 479,
"preview": "targets:\n $default:\n builders:\n source_gen:combining_builder:\n options:\n build_extensions:\n "
},
{
"path": "core/action.go",
"chars": 4590,
"preview": "package main\n\nimport (\n\t\"encoding/json\"\n\t\"unsafe\"\n)\n\ntype Action struct {\n\tId string `json:\"id\"`\n\tMethod Method"
},
{
"path": "core/bride.c",
"chars": 838,
"preview": "#include \"bride.h\"\n\nvoid (*release_object_func)(void *obj);\n\nvoid (*free_string_func)(char *data);\n\nvoid (*protect_func)"
},
{
"path": "core/bride.go",
"chars": 787,
"preview": "//go:build android && cgo\n\npackage main\n\n//#include \"bride.h\"\nimport \"C\"\nimport \"unsafe\"\n\nfunc protect(callback unsafe.P"
},
{
"path": "core/bride.h",
"chars": 688,
"preview": "#pragma once\n\n#include <stdlib.h>\n\nextern void (*release_object_func)(void *obj);\n\nextern void (*free_string_func)(char "
},
{
"path": "core/common.go",
"chars": 6867,
"preview": "package main\n\nimport (\n\tb \"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"github.com/metacubex/mihomo/adapter\"\n\t\"github."
},
{
"path": "core/constant.go",
"chars": 4936,
"preview": "package main\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/metacubex/mihomo/adapter/provider\"\n\tP \"github.com/metacubex/mihomo/"
},
{
"path": "core/go.mod",
"chars": 5793,
"preview": "module core\n\ngo 1.20\n\nreplace github.com/metacubex/mihomo => ./Clash.Meta\n\nrequire (\n\tgithub.com/metacubex/mihomo v0.0.0"
},
{
"path": "core/go.sum",
"chars": 23843,
"preview": "filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=\nfilippo.io/edwards25519 v1.1.0/go.mod h1:"
},
{
"path": "core/hub.go",
"chars": 11725,
"preview": "package main\n\nimport (\n\t\"cmp\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"github.com/metacubex/mihomo/adapter\"\n\t\"github.com/metacubex/"
},
{
"path": "core/lib.go",
"chars": 6068,
"preview": "//go:build cgo\n\npackage main\n\n/*\n#include <stdlib.h>\n*/\nimport \"C\"\n\nimport (\n\t\"context\"\n\t\"core/platform\"\n\tt \"core/tun\"\n\t"
},
{
"path": "core/main.go",
"chars": 181,
"preview": "//go:build !cgo\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n)\n\nfunc main() {\n\targs := os.Args\n\tif len(args) <= 1 {\n\t\tfmt.Printl"
},
{
"path": "core/main_cgo.go",
"chars": 58,
"preview": "//go:build cgo\n\npackage main\n\nimport \"C\"\n\nfunc main() {\n}\n"
},
{
"path": "core/platform/limit.go",
"chars": 614,
"preview": "//go:build android && cgo\n\npackage platform\n\nimport \"syscall\"\n\nvar nullFd int\nvar maxFdCount int\n\nfunc init() {\n\tfd, err"
},
{
"path": "core/platform/procfs.go",
"chars": 2792,
"preview": "//go:build linux\n\npackage platform\n\nimport (\n\t\"bufio\"\n\t\"encoding/binary\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"net\"\n\t\"os\"\n\t\"strconv\"\n"
},
{
"path": "core/server.go",
"chars": 1159,
"preview": "//go:build !cgo\n\npackage main\n\nimport (\n\t\"bufio\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net\"\n\t\"strconv\"\n)\n\nvar conn net.Conn\n\nfunc (r"
},
{
"path": "core/tun/tun.go",
"chars": 1546,
"preview": "//go:build android && cgo\n\npackage tun\n\nimport \"C\"\nimport (\n\t\"github.com/metacubex/mihomo/constant\"\n\tLC \"github.com/meta"
},
{
"path": "distribute_options.yaml",
"chars": 36,
"preview": "app_name: 'FlClash'\noutput: 'dist/'\n"
},
{
"path": "lib/application.dart",
"chars": 5382,
"preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:connectivity_plus/connectivity_plus.dart';\nimport 'package:fl_cl"
},
{
"path": "lib/common/app_localizations.dart",
"chars": 94,
"preview": "import 'package:fl_clash/l10n/l10n.dart';\n\nfinal appLocalizations = AppLocalizations.current;\n"
},
{
"path": "lib/common/archive.dart",
"chars": 778,
"preview": "import 'dart:io';\n\nimport 'package:archive/archive_io.dart';\nimport 'package:path/path.dart';\n\nextension ArchiveExt on A"
},
{
"path": "lib/common/cache.dart",
"chars": 5447,
"preview": "import 'dart:io';\n\nimport 'package:dio/dio.dart';\nimport 'package:fl_clash/common/common.dart';\nimport 'package:flutter_"
},
{
"path": "lib/common/color.dart",
"chars": 2901,
"preview": "import 'dart:math';\n\nimport 'package:flutter/material.dart';\n\nextension ColorExtension on Color {\n Color get opacity80 "
},
{
"path": "lib/common/common.dart",
"chars": 1055,
"preview": "export 'app_localizations.dart';\nexport 'cache.dart';\nexport 'color.dart';\nexport 'compute.dart';\nexport 'constant.dart'"
},
{
"path": "lib/common/compute.dart",
"chars": 3223,
"preview": "import 'package:fl_clash/common/common.dart';\nimport 'package:fl_clash/enum/enum.dart';\nimport 'package:fl_clash/models/"
},
{
"path": "lib/common/constant.dart",
"chars": 4199,
"preview": "// ignore_for_file: constant_identifier_names\n\nimport 'dart:math';\nimport 'dart:ui';\n\nimport 'package:collection/collect"
},
{
"path": "lib/common/context.dart",
"chars": 2275,
"preview": "import 'package:fl_clash/l10n/l10n.dart';\nimport 'package:fl_clash/manager/manager.dart';\nimport 'package:fl_clash/model"
},
{
"path": "lib/common/converter.dart",
"chars": 705,
"preview": "import 'dart:convert';\nimport 'dart:typed_data';\n\nclass Uint8ListToListIntConverter extends Converter<Uint8List, List<in"
},
{
"path": "lib/common/datetime.dart",
"chars": 1250,
"preview": "import 'package:fl_clash/common/app_localizations.dart';\n\nextension DateTimeExtension on DateTime {\n bool get isBeforeN"
},
{
"path": "lib/common/dav_client.dart",
"chars": 1217,
"preview": "import 'dart:async';\n\nimport 'package:fl_clash/common/common.dart';\nimport 'package:fl_clash/models/models.dart';\nimport"
},
{
"path": "lib/common/file.dart",
"chars": 881,
"preview": "import 'dart:io';\n\nextension FileExt on File {\n Future<void> safeCopy(String newPath) async {\n if (!await exists()) "
},
{
"path": "lib/common/fixed.dart",
"chars": 1417,
"preview": "import 'iterable.dart';\n\ntypedef ValueCallback<T> = T Function();\n\nclass FixedList<T> {\n final int maxLength;\n final L"
},
{
"path": "lib/common/function.dart",
"chars": 1907,
"preview": "import 'dart:async';\n\nimport 'package:fl_clash/common/common.dart';\nimport 'package:fl_clash/enum/enum.dart';\n\nclass Deb"
},
{
"path": "lib/common/future.dart",
"chars": 831,
"preview": "import 'dart:async';\nimport 'dart:ui';\n\nimport 'package:fl_clash/common/common.dart';\n\nextension FutureExt<T> on Future<"
},
{
"path": "lib/common/hive.dart",
"chars": 0,
"preview": ""
},
{
"path": "lib/common/http.dart",
"chars": 750,
"preview": "import 'dart:io';\n\nimport 'package:fl_clash/common/common.dart';\nimport 'package:fl_clash/controller.dart';\n\nclass FlCla"
},
{
"path": "lib/common/icons.dart",
"chars": 132,
"preview": "import 'package:flutter/material.dart';\n\nclass IconsExt {\n static const IconData target = IconData(0xe900, fontFamily: "
},
{
"path": "lib/common/indexing.dart",
"chars": 6464,
"preview": "import 'dart:math';\n\nclass Indexing {\n static const String digits =\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgh"
},
{
"path": "lib/common/iterable.dart",
"chars": 3431,
"preview": "extension IterableExt<E> on Iterable<E> {\n Iterable<E> separated(E separator) sync* {\n final iterator = this.iterato"
},
{
"path": "lib/common/keyboard.dart",
"chars": 3587,
"preview": "import 'package:flutter/services.dart';\nimport 'package:uni_platform/uni_platform.dart';\n\nimport 'system.dart';\n\nfinal M"
},
{
"path": "lib/common/launch.dart",
"chars": 1014,
"preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:launch_at_startup/laun"
},
{
"path": "lib/common/link.dart",
"chars": 1086,
"preview": "import 'dart:async';\n\nimport 'package:app_links/app_links.dart';\n\nimport 'print.dart';\n\ntypedef InstallConfigCallBack = "
},
{
"path": "lib/common/lock.dart",
"chars": 700,
"preview": "import 'dart:io';\n\nimport 'package:fl_clash/common/common.dart';\n\nclass SingleInstanceLock {\n static SingleInstanceLock"
},
{
"path": "lib/common/measure.dart",
"chars": 2425,
"preview": "import 'package:fl_clash/common/common.dart';\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material."
},
{
"path": "lib/common/migration.dart",
"chars": 1493,
"preview": "import 'package:fl_clash/common/common.dart';\nimport 'package:fl_clash/models/models.dart';\n\nclass Migration {\n static "
},
{
"path": "lib/common/mixin.dart",
"chars": 826,
"preview": "import 'package:riverpod/riverpod.dart';\nimport 'package:riverpod_annotation/riverpod_annotation.dart';\n\nmixin AutoDispo"
},
{
"path": "lib/common/navigation.dart",
"chars": 2735,
"preview": "import 'package:fl_clash/enum/enum.dart';\nimport 'package:fl_clash/models/models.dart';\nimport 'package:fl_clash/views/v"
},
{
"path": "lib/common/navigator.dart",
"chars": 9723,
"preview": "import 'package:animations/animations.dart';\nimport 'package:fl_clash/common/common.dart';\nimport 'package:fl_clash/cont"
},
{
"path": "lib/common/network.dart",
"chars": 533,
"preview": "import 'dart:io';\n\nextension NetworkInterfaceExt on NetworkInterface {\n bool get isWifi {\n final nameLowCase = name."
},
{
"path": "lib/common/num.dart",
"chars": 2196,
"preview": "import 'dart:math';\n\nimport 'package:fl_clash/enum/enum.dart';\nimport 'package:fl_clash/models/common.dart';\nimport 'pac"
},
{
"path": "lib/common/package.dart",
"chars": 293,
"preview": "import 'dart:io';\n\nimport 'package:package_info_plus/package_info_plus.dart';\n\nimport 'common.dart';\n\nextension PackageI"
},
{
"path": "lib/common/path.dart",
"chars": 4069,
"preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:fl_clash/common/common.dart';\nimport 'package:path/path.dart';\ni"
},
{
"path": "lib/common/picker.dart",
"chars": 2057,
"preview": "import 'dart:io';\nimport 'dart:typed_data';\n\nimport 'package:file_picker/file_picker.dart';\nimport 'package:fl_clash/com"
},
{
"path": "lib/common/preferences.dart",
"chars": 2765,
"preview": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:fl_clash/models/models.dart';\nimport 'package:shared_prefer"
},
{
"path": "lib/common/print.dart",
"chars": 645,
"preview": "import 'package:fl_clash/controller.dart';\nimport 'package:fl_clash/enum/enum.dart';\nimport 'package:fl_clash/models/mod"
},
{
"path": "lib/common/protocol.dart",
"chars": 826,
"preview": "import 'dart:io';\n\nimport 'package:win32_registry/win32_registry.dart';\n\nclass Protocol {\n static Protocol? _instance;\n"
},
{
"path": "lib/common/proxy.dart",
"chars": 131,
"preview": "import 'package:fl_clash/common/system.dart';\nimport 'package:proxy/proxy.dart';\n\nfinal proxy = system.isDesktop ? Proxy"
},
{
"path": "lib/common/render.dart",
"chars": 1256,
"preview": "import 'package:fl_clash/common/common.dart';\nimport 'package:fl_clash/enum/enum.dart';\nimport 'package:flutter/schedule"
},
{
"path": "lib/common/request.dart",
"chars": 6171,
"preview": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\nimport 'dart:typed_data';\n\nimport 'package:dio/dio.dart';\n"
},
{
"path": "lib/common/scroll.dart",
"chars": 5335,
"preview": "import 'dart:math';\nimport 'dart:ui';\n\nimport 'package:fl_clash/common/common.dart';\nimport 'package:fl_clash/widgets/sc"
},
{
"path": "lib/common/snowflake.dart",
"chars": 1503,
"preview": "class Snowflake {\n static Snowflake? _instance;\n\n Snowflake._internal();\n\n factory Snowflake() {\n _instance ??= Sn"
},
{
"path": "lib/common/store.dart",
"chars": 589,
"preview": "import 'dart:async';\n\nclass Store<T> {\n late T _data;\n\n Store(Stream stream, T defaultValue) {\n stream.listen((data"
},
{
"path": "lib/common/string.dart",
"chars": 2391,
"preview": "import 'dart:convert';\nimport 'dart:typed_data';\n\nimport 'package:crypto/crypto.dart';\nimport 'package:fl_clash/common/c"
},
{
"path": "lib/common/system.dart",
"chars": 12005,
"preview": "import 'dart:ffi';\nimport 'dart:io';\n\nimport 'package:device_info_plus/device_info_plus.dart';\nimport 'package:ffi/ffi.d"
},
{
"path": "lib/common/task.dart",
"chars": 20875,
"preview": "import 'dart:convert';\nimport 'dart:io';\n\nimport 'package:archive/archive_io.dart';\nimport 'package:drift/drift.dart';\ni"
},
{
"path": "lib/common/text.dart",
"chars": 612,
"preview": "import 'package:fl_clash/enum/enum.dart';\nimport 'package:flutter/material.dart';\nimport 'color.dart';\n\nextension TextSt"
},
{
"path": "lib/common/theme.dart",
"chars": 1211,
"preview": "import 'package:fl_clash/common/common.dart';\nimport 'package:flutter/material.dart';\n\nclass CommonTheme {\n final Build"
},
{
"path": "lib/common/tray.dart",
"chars": 5870,
"preview": "import 'dart:io';\n\nimport 'package:fl_clash/controller.dart';\nimport 'package:fl_clash/enum/enum.dart';\nimport 'package:"
},
{
"path": "lib/common/utils.dart",
"chars": 10611,
"preview": "import 'dart:async';\nimport 'dart:io';\nimport 'dart:math';\nimport 'dart:ui';\n\nimport 'package:fl_clash/common/common.dar"
},
{
"path": "lib/common/window.dart",
"chars": 2781,
"preview": "import 'dart:io';\n\nimport 'package:fl_clash/common/common.dart';\nimport 'package:fl_clash/models/config.dart';\nimport 'p"
},
{
"path": "lib/common/yaml.dart",
"chars": 293,
"preview": "import 'package:yaml_writer/yaml_writer.dart';\n\nclass Yaml {\n static Yaml? _instance;\n\n Yaml._internal();\n\n factory Y"
},
{
"path": "lib/controller.dart",
"chars": 35810,
"preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:fl_clash/core/core.dart';\nimport 'package:fl_clash/enum/enum.dar"
},
{
"path": "lib/core/controller.dart",
"chars": 7424,
"preview": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\n\nimport 'package:fl_clash/common/common.dart';\nimport 'pac"
},
{
"path": "lib/core/core.dart",
"chars": 109,
"preview": "export 'controller.dart';\nexport 'core.dart';\nexport 'event.dart';\nexport 'lib.dart';\nexport 'service.dart';\n"
},
{
"path": "lib/core/event.dart",
"chars": 1703,
"preview": "import 'dart:async';\n\nimport 'package:fl_clash/enum/enum.dart';\nimport 'package:fl_clash/models/models.dart';\nimport 'pa"
},
{
"path": "lib/core/interface.dart",
"chars": 8523,
"preview": "import 'dart:async';\nimport 'dart:convert';\n\nimport 'package:fl_clash/common/common.dart';\nimport 'package:fl_clash/enum"
},
{
"path": "lib/core/lib.dart",
"chars": 1593,
"preview": "import 'dart:async';\n\nimport 'package:fl_clash/common/common.dart';\nimport 'package:fl_clash/controller.dart';\nimport 'p"
},
{
"path": "lib/core/service.dart",
"chars": 5462,
"preview": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:io';\n\nimport 'package:fl_clash/common/common.dart';\nimport 'pac"
},
{
"path": "lib/database/database.dart",
"chars": 2126,
"preview": "import 'dart:convert';\nimport 'dart:io';\n\nimport 'package:collection/collection.dart';\nimport 'package:drift/drift.dart'"
},
{
"path": "lib/database/generated/database.g.dart",
"chars": 97005,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\n\npart of '../database.dart';\n\n// ignore_for_file: type=lint\nclass $ProfilesTab"
},
{
"path": "lib/database/links.dart",
"chars": 1183,
"preview": "part of 'database.dart';\n\n@DataClassName('RawProfileRuleLink')\n@TableIndex(\n name: 'idx_profile_scene_order',\n columns"
},
{
"path": "lib/database/profiles.dart",
"chars": 4383,
"preview": "part of 'database.dart';\n\n@DataClassName('RawProfile')\nclass Profiles extends Table {\n @override\n String get tableName"
},
{
"path": "lib/database/rules.dart",
"chars": 7467,
"preview": "part of 'database.dart';\n\n@DataClassName('RawRule')\nclass Rules extends Table {\n @override\n String get tableName => 'r"
},
{
"path": "lib/database/scripts.dart",
"chars": 1558,
"preview": "part of 'database.dart';\n\n@DataClassName('RawScript')\nclass Scripts extends Table {\n @override\n String get tableName ="
},
{
"path": "lib/enum/enum.dart",
"chars": 9749,
"preview": "// ignore_for_file: constant_identifier_names\n\nimport 'dart:io';\n\nimport 'package:fl_clash/common/color.dart';\nimport 'p"
},
{
"path": "lib/features/features.dart",
"chars": 35,
"preview": "export 'overwrite/overwrite.dart';\n"
},
{
"path": "lib/features/overwrite/overwrite.dart",
"chars": 20,
"preview": "export 'rule.dart';\n"
},
{
"path": "lib/features/overwrite/rule.dart",
"chars": 9586,
"preview": "library;\n\nimport 'package:fl_clash/common/common.dart';\nimport 'package:fl_clash/enum/enum.dart';\nimport 'package:fl_cla"
},
{
"path": "lib/l10n/intl/messages_all.dart",
"chars": 2567,
"preview": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that looks up messa"
},
{
"path": "lib/l10n/intl/messages_en.dart",
"chars": 41621,
"preview": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that provides messa"
},
{
"path": "lib/l10n/intl/messages_ja.dart",
"chars": 35591,
"preview": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that provides messa"
},
{
"path": "lib/l10n/intl/messages_ru.dart",
"chars": 44351,
"preview": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that provides messa"
},
{
"path": "lib/l10n/intl/messages_zh_CN.dart",
"chars": 33616,
"preview": "// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart\n// This is a library that provides messa"
},
{
"path": "lib/l10n/l10n.dart",
"chars": 82381,
"preview": "// GENERATED CODE - DO NOT MODIFY BY HAND\nimport 'package:flutter/material.dart';\nimport 'package:intl/intl.dart';\nimpor"
},
{
"path": "lib/main.dart",
"chars": 765,
"preview": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:fl_clash/pages/error.dart';\nimport 'package:fl_clash/state.dart'"
},
{
"path": "lib/manager/android_manager.dart",
"chars": 1904,
"preview": "import 'package:fl_clash/common/common.dart';\nimport 'package:fl_clash/core/core.dart';\nimport 'package:fl_clash/enum/en"
},
{
"path": "lib/manager/app_manager.dart",
"chars": 8248,
"preview": "import 'dart:async';\n\nimport 'package:fl_clash/common/common.dart';\nimport 'package:fl_clash/controller.dart';\nimport 'p"
},
{
"path": "lib/manager/connectivity_manager.dart",
"chars": 1002,
"preview": "import 'dart:async';\n\nimport 'package:connectivity_plus/connectivity_plus.dart';\nimport 'package:flutter/material.dart';"
},
{
"path": "lib/manager/core_manager.dart",
"chars": 3147,
"preview": "import 'package:fl_clash/common/common.dart';\nimport 'package:fl_clash/controller.dart';\nimport 'package:fl_clash/core/c"
}
]
// ... and 237 more files (download for full content)
About this extraction
This page contains the full source code of the chen08209/FlClash GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 437 files (13.4 MB), approximately 826.1k tokens, and a symbol index with 5564 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.